mysql主从(master-slave)复制安装配置

Posted by 机器人 on 6th 一月 2010 in mysql

一. 环境准备

准备两台服务器,IP分别为
192.168.1.119 (主数据库服务器)
192.168.1.120 (从数据库服务器)

分别装好mysql数据库服务器

二. 安装配置

1. 在主数据库服务器上设置一个复制使用的账户,并授予replication slave权限,这里创建一个复制用户rep1,可以从IP为192.168.1.120的主机进行连接.

mysql > grant replication slave on *.* to 'rep'@'192.168.1.120' identified by '123';

2. 修改主数据库服务器的配置文件my.cnf,开启binlog,并设置server-id的值。

[mysqld]
server-id=1
log-bin=/var/lib/mysql/mysql-bin.log

数据库重启后生效

3. 在主服务器上,设置读锁有效,这个操作是为了确保没有数据库操作,以便获得一个一致性的快照。

mysql > flush tables with read lock;

4. 然后得到主服务器上当前的二进制日志名的偏移量值。这个操作的目的是为了在从数据库启动以后,从这个点开始进行数据的恢复。

mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |     2122 |              |                  | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

5. 建立测试数据库test1

mysql> create database test1;
Query OK, 1 row affected (0.01 sec)

6. 备份一份数据库文件,将其恢复到从服务器上,可以通过mysqldump或者直接拷贝文件的方式。这里采用直接copy文件的方式。

[~@master]# cd /var/lib/mysql
[~@master]# tar cvf test1.tar test1
test1/
test1/db.opt
[~@master]# scp test1.tar root@192.168.1.120:/var/lib/mysql/
...
[~@slave]# tar xvf test1.tar
 
 
7. 备份完毕后,主数据库恢复被写操作
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

8. 修改从数据库的配置文件my.cnf,添加server-id参数,注意这里的server-id参数必须唯一,不能和主数据库的配置相同.复制使用的用户、主数据库服务器的IP、端口以及连接丢失时,重试的时间

[mysqld]
server-id=2
master-host=192.168.1.119
master-user=rep1
master-password=123456
master-connect-retry=60

9. 在从服务器上,使用–skip-slave-start 选项启动从数据库,这样就不会立即启动从数据库上的复制进程,方便对数据库的服务进程进行进一步的配置

[~@slave]# /usr/bin/mysqld_safe --skip-slave-start &
[~@slave]# Starting mysqld daemon with databases from /var/lib/mysql

10. 指定开始执行复制的日志文件和位置

mysql> change master to
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=2207;
Query OK, 0 rows affected (0.01 sec)

这里的log_file和log_pos是通过主服务器中执行

mysql > show master stauts;

得到

11. 在从服务器上,启动slave进程

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

12. 这时在slave上执行show processlist 命令将显示类似如下进程

mysql> show processlist \G
*************************** 1. row ***************************
     Id: 2
   User: root
   Host: localhost
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: show processlist
*************************** 2. row ***************************
     Id: 3
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 29
  State: Waiting for master to send event
   Info: NULL
*************************** 3. row ***************************
     Id: 4
   User: system user
   Host: 
     db: NULL
Command: Connect
   Time: 29
  State: Has read all relay log; waiting for the slave I/O thread to update it
   Info: NULL
3 rows in set (0.01 sec)

这表明slave已经连接上master,并开始接受并执行日志.

13.测试复制服务器的正确性,在主数据库上执行一个更新操作,观察是否在从数据库上同步.

mysql> use test1;
Database changed
mysql> create table rep(id int);
Query OK, 0 rows affected (0.00 sec)
 
mysql> insert into rep values(1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

15. 在从数据库上检查新表是否被创建,数据是否被同步.

mysql> use test1;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
Database changed
mysql> show tables;
+-----------------+
| Tables_in_test1 |
+-----------------+
| rep             | 
+-----------------+
1 row in set (0.00 sec)
 
mysql> select * from rep;
+------+
| id   |
+------+
|    1 | 
|    2 | 
|    3 | 
|    4 | 
|    5 | 
+------+
5 rows in set (0.00 sec)

可以看到数据可以正确同步到从数据库上,复制服务配置成功完成.

三 复制启动选项

这些选项可以在启动时加入,也可以直接写在my.cnf里

1. log-slave-updates
这个参数用来配置从服务器上的更新操作是否写进进制日志,默认不打开,但是,如果这个从服务器同时也要作为其它服务器的主服务器时,就需要启动.
这个参数需要和log-bin一起使用.

2. master-connect-retry
这个参数用来设置在和主服务器连接丢失的时候,重度的时间间隔.

3. read-only
这个参数用来设置从服务器只能接受超级用户的更新操作,从而限制应用程序错误的对从服务器的更新操作.

4. 指定复制的数据库或者表
可以使用replicate-do-db、replicate-do-table、replicate-ignore-db、replicate-ignore-table或replicate-wild-do-table来指定从主数据库复制到从从数据库的数据库或者表。

四 日常管理维护

1. 查看从服务器状态

mysql> show slave status \G;
*************************** 1. row ***************************
             Slave_IO_State: Waiting for master to send event
                Master_Host: 192.168.1.119
                Master_User: rep1
                Master_Port: 3306
              Connect_Retry: 60
            Master_Log_File: mysql-bin.000001
        Read_Master_Log_Pos: 2400
             Relay_Log_File: mysqld-relay-bin.000002
              Relay_Log_Pos: 428
      Relay_Master_Log_File: mysql-bin.000001
           Slave_IO_Running: Yes
          Slave_SQL_Running: Yes
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
         Replicate_Do_Table: 
     Replicate_Ignore_Table: 
    Replicate_Wild_Do_Table: 
Replicate_Wild_Ignore_Table: 
                 Last_Errno: 0
                 Last_Error: 
               Skip_Counter: 0
        Exec_Master_Log_Pos: 2400
            Relay_Log_Space: 428
            Until_Condition: None
             Until_Log_File: 
              Until_Log_Pos: 0
         Master_SSL_Allowed: No
         Master_SSL_CA_File: 
         Master_SSL_CA_Path: 
            Master_SSL_Cert: 
          Master_SSL_Cipher: 
             Master_SSL_Key: 
      Seconds_Behind_Master: 0
1 row in set (0.00 sec)
 
ERROR: 
No query specified

主要关心”Slave_IO_Running”和“Slave_SQL_Running”这两个进程的状态是否为”yes”。只要其中一个进程状态为no,则表示复制进程停止,错误原因可以从“Last_Errno”字段中的值看到。

2. 主从服务器手工同步
从服务器由于各种原因导致更新速度较慢,从而是主从服务器之间的数据差距越来越大,最终对某些应用产生影响,这种情况下,就需要定期地进行主从服务器的数据同步,使得主从服务器差距能够减到最小。常用方法是:在负载较低的时候暂时阻塞主数据库的更新,强制主从数据库更新同步。

阻塞更新

mysql> flush tables with read lock;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show master status;
+------------------+----------+--------------+------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |     2400 |              |                  | 
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

在从服务器上,执行下面语句,其中master_pos_wait()函数的参数是前面步骤中得到的复制坐标值。

mysql> select master_pos_wait('mysql-bin.000001','2400');
+--------------------------------------------+
| master_pos_wait('mysql-bin.000001','2400') |
+--------------------------------------------+
|                                          0 | 
+--------------------------------------------+
1 row in set (0.00 sec)

这个语句会阻塞直到从服务器达到指定的日志文件和偏移量后,返回0,如果返回-1。

在主服务器上,执行下面语句允许主服务器重新开始处理更新

mysql>  unlock tables;
Query OK, 0 rows affected (0.00 sec)

3. log event entry exceeded max_allowed_packet的处理

mysql> show variables like 'max_allowed_packet';
+--------------------+---------+
| Variable_name      | Value   |
+--------------------+---------+
| max_allowed_packet | 1048576 | 
+--------------------+---------+
1 row in set (0.01 sec)
mysql> set @@global.max_allowed_packet=16777216

同时在my.cnf里设置max_allowed_packet=16M,保证下次数据库重新启动后参数继续有效。

好了,暂时总结这么多.

机器人 2010年01月06日 17:24 于 北京 晴 -10℃.

分享到: 新浪微博

One Response to “mysql主从(master-slave)复制安装配置”

Leave a Reply