MySQL复制总结

 

MySQL复制总结

 

1、MySQL复制原理

MySQL的复制涉及到三个线程,主库的DUMP线程,从库的IO线程和SQL线程。

主从同步的详细过程如下:

1、slave端执行start slave后,连接主服务器,主服务器验证连接后,为从服务器开启一个binlog dump线程。

2. 主库的binlog dump线程根据从库IO线程的请求将binlog中的内容发送到从库。

3. 从库的IO线程接受到主库binlog dump线程发送的binlog事件后,将其写到本地的relay-log。

4. 从库的SQL线程重放relay-log中的事件。

 

2、ySQL三种复制方式

2.1、异步复制

MySQL异步复制是默认方式,即主库执行完Commit后,在主库写入Binlog日志后即可成功返回客户端,无需等等Binlog日志传送给从库,一旦主库宕机,有可能会丢失日志。

异步复制的优缺点

性能好,可能丢失数据。

 

2.2、半同步复制

半同步复制,是等待其中一个从库也接收到Binlog事务并成功写入Relay Log之后,才返回Commit操作成功给客户端;如此半同步就保证了事务成功提交后至少有两份日志记录,一份在主库Binlog上,另一份在从库的Relay Log上,从而进一步保证数据完整性;半同步复制很大程度取决于主从网络RTT(往返时延)。

 

参数设置:rpl_semi_sync_master_wait_point=after_commit

 

存在的问题:

 

缺点1: 幻读

当用户发起一个事务,该事务已经写入redo日志和binlog日志,但该事务还没写入从库,此时处在waiting slave dump处,此时另一个用户可以读取到这条数据,而他自己却不能。

 

缺点2:数据丢失

一个事务在waiting slave dump处crash后,主库将比从库多一条数据。

 

2.3、强半同步复制

增强半同步通过调整写Storage Commit和Waiting Slave dump的顺序,解决幻读和数据丢失的风险。

参数设置:rpl_semi_sync_master_wait_point=after_sync

特定:

改善1:解决幻读

当用户发起一个事务,该事务写入二进制后,便向从库进行同步,此时其他用户无法读取到该数据,解决了幻读

 

改善2:解决数据丢失

一个事务在waiting slave dump处crash掉后,可以通过观察从库上是否存在主库的last gtid值,如果存在,这条数据正常恢复,如果不存在则删除主库的那条多余的GTID值,然后恢复,保证了数据的完整性;

 

3、主从配置

 

mysql_5.6下的主从复制

试验环境:

主服务器:Linux 5.4  5.6.28 源码 IP:10.100.1.220

从服务器:Linux 5.4  5.6.28 源码 IP:10.100.1.221

配置:

一、主服务器

1.1、创建一个复制用户,具有replication slave 权限。

mysql> grant replication slave on *.* to 'slave001'@'10.100.1.221' identified by 'slave001';

1.2、编辑my.cnf文件

vi /etc/my.cnf

添加:

server-id=1

1.3、并开启log-bin二进制日志文件

log-bin=mysql-bin

1.4、启动mysql数据库

service mysql start

1.5、得到binlog日志文件名和偏移量

mysql>show master status;  

+——————+———-+————–+——————+  

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |  

+——————+———-+————–+——————+  

| mysql-bin.0000010 | 106| | |  

+——————+———-+————–+——————+

1.6、备份要同步的数据库

mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases xtra_test > /tmp/backup/db.sql

或:

mysqldump --master-data=2 --single-transaction --events -R --flush-logs --triggers --databases xtra_test > all.sql

1.7、查看position

[root@mytest01 data]# grep MASTER /tmp/backup/db.sql

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.0000010', MASTER_LOG_POS=106;

[root@mytest01 data]#

二、从服务器

2.1、编辑my.cnf文件

vi /etc/my.cnf

添加

server-id=2

注:需要把默认的server-id=1去掉

不要尝试把master配置属性写在my.cnf 中,5.1.7以后,mysql已经不支持这样做了

2.2、启动从数据库

service mysql start

2.3、把生产的数据导进从服务器:

mysql -uroot -proot123</tmp/backup/db.sql

2.3、对从数据库进行相应设置

mysql> change master to  

master_host='10.100.1.220',

master_user='slave001',

master_password='slave001',

master_log_file='mysql-bin.000010',

master_log_pos=106;

2.4、启动从服务器slave线程

mysql>start slave;

执行show processlist命令显示以下进程:

mysql>show processlist\G  

 

*************************** 2. row ***************************  

Id: 2  

User: system user  

Host:  

db: NULL  

Command: Connect  

Time: 2579  

State: Has read all relay log; waiting for the slave I/O thread to update it

Info: NULL表示slave已经连接上master,开始接受并执行日志

2.5、查看slave线程状态

mysql>show slave status;  

*************************** 1. row ***************************  

Slave_IO_State: Waiting for master to send event  

Master_Host: 10.100.1.220

Master_User: repl  

Master_Port: 3306  

Connect_Retry: 60  

Master_Log_File: mysql-bin.0000010  

Read_Master_Log_Pos: 106  

Relay_Log_File: centos-relay-bin.000002  

Relay_Log_Pos: 529  

Relay_Master_Log_File: mysql-bin.0000010  

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: 106  

Relay_Log_Space: 830  

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  

Master_SSL_Verify_Server_Cert: No  

Last_IO_Errno: 0  

Last_IO_Error:  

Last_SQL_Errno: 0  

Last_SQL_Error:  

1 row in set (0.00 sec)

验证是否配置正确

在从服务器上执行

mysql> show slave status\G

Waiting for master to send event  

Slave_IO_Running: Yes  

Slave_SQL_Running: Yes

如以上二行同时为Yes 说明配置成功

PS:show slave status\G 后不要添加 ;号, 不然会出 ERROR

 

测试:

1、在主服务器test数据库中创建user表

mysql>use xtra_test;  

mysql>create table user(id int);

2、在从服务器中查看user表

mysql>use xtra_test;

mysql> show tables like ‘user’;  

+———————-+  

| Tables_in_test(user) |  

+———————-+  

| user |  

+———————-+  

1 row in set (0.00 sec)

说明主从数据同步成功。

常见问题归纳:

1.在从数据库中查看slave状态时出现

The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the –replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it)

说明主从服务器里my.cnf中的server-id有相同的。

解决办法:

修改my.cnf里的server-id,并重启数据库服务。my.cnf文件默认有server-id=1

其它说明

主服务器my.cnf

#binlog-do-db=需要备份的数据库名,可写多行

#binlog-ignore-db=不需要备份的数据库名,可写多行

从服务器my.cnf

配置已经无用,要在mysql中执行

 

三、手动更新

 

在主服务器上执行

mysql>flush tables with read lock;  

Query OK,rows affected (0.01 sec)  

mysql>show master status;  

+——————+———-+————–+——————+  

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |  

+——————+———-+————–+——————+  

| mysql-bin.0000011 | 260| | |  

+——————+———-+————–+——————

在从服务器上执行

 

mysql>select master_pos_wait(‘mysql-bin.0000011′,’260′);  

+————————————————–+  

| master_pos_wait(‘mysql-bin.0000011′,’260′) |  

+————————————————–+  

| 0 |  

+————————————————–+  

1 row in set (0.01 sec)

注意,执行这条语句的时候,可能会有MySQL server has gone away 错误,木有关系,多执行几次就好了

 

同步完成后,在主服务器上执行解锁

mysql>unlock tables;

四、只复制特定数据库

主数据库:

vi /etc/my.cnf添加以下配置

binlog-do-db    =test

binlog-ignore-db = mysql

 

从数据库:

vi /etc/my.cnf添加以下配置

replicate-do-db=test

replicate-ignore-db=mysql

 

重启主、从数据库。

service  mysql  restart

 

 

4、配置半同步

 

查询mysql复制有没有使用半同步,

 

mysql> show variables like 'rpl%';

 

+-------------------+-------+

 

| Variable_name    | Value |

 

+-------------------+-------+

 

| rpl_recovery_rank | 0    |

 

+-------------------+-------+

 

1 row in set (0.00 sec)

 

或者使用show status like  'rpl%';

 

启用半同步模式:

 

在master执行

 

mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';

 

Query OK, 0 rows affected (0.03 sec)

 

mysql> set global rpl_semi_sync_master_enabled=0;

 

Query OK, 0 rows affected (0.00 sec)

 

 

mysql> show variables like 'rpl%';

 

+------------------------------------+-------+

 

| Variable_name                      | Value |

 

+------------------------------------+-------+

 

| rpl_recovery_rank                  | 0    |

 

| rpl_semi_sync_master_enabled      | OFF  |

 

| rpl_semi_sync_master_timeout      | 10000 |

 

| rpl_semi_sync_master_trace_level  | 32    |

 

| rpl_semi_sync_master_wait_no_slave | ON    |

 

+------------------------------------+-------+

 

5 rows in set (0.00 sec)

 

 

mysql> set global rpl_semi_sync_master_enabled=1;

 

Query OK, 0 rows affected (0.00 sec)

 

mysql> show variables like 'rpl%';

 

+------------------------------------+-------+

 

| Variable_name                      | Value |

 

+------------------------------------+-------+

 

| rpl_recovery_rank                  | 0    |

 

| rpl_semi_sync_master_enabled      | ON    |

 

| rpl_semi_sync_master_timeout      | 10000 |

 

| rpl_semi_sync_master_trace_level  | 32    |

 

| rpl_semi_sync_master_wait_no_slave | ON    |

 

+------------------------------------+-------+

 

rpl_semi_sync_master_enabled 的值是0(off)或者1(on),默认是0.

 

rpl_semi_sync_master_timeout的值默认是10000(10s)

 

5 rows in set (0.00 sec)

 

/etc/my.cnf 添加参数

rpl_semi_sync_master_enabled    = 1

 

在slave执行如下操作:

 

mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';

 

Query OK, 0 rows affected (0.03 sec)

 

 

 

mysql> set global rpl_semi_sync_slave_enabled=1;

 

Query OK, 0 rows affected (0.00 sec)

 

 

 

mysql> show variables like 'rpl%';

 

+---------------------------------+-------+

 

| Variable_name                  | Value |

 

+---------------------------------+-------+

 

| rpl_recovery_rank              | 0    |

 

| rpl_semi_sync_slave_enabled    | ON    |

 

| rpl_semi_sync_slave_trace_level | 32    |

 

+---------------------------------+-------+

 

3 rows in set (0.00 sec)

 

 

mysql> show status like 'rpl%';

 

+----------------------------+-------------+

 

| Variable_name              | Value      |

 

+----------------------------+-------------+

 

| Rpl_semi_sync_slave_status | ON          |

 

| Rpl_status                | AUTH_MASTER |

 

+----------------------------+-------------+

 

2 rows in set (0.01 sec)

 

mysql> stop slave io_thread;

 

Query OK, 0 rows affected (0.00 sec)

 

mysql> start slave io_thread;

 

Query OK, 0 rows affected (0.00 sec)

 

 

rpl_semi_sync_slave_enabled的值是0(off)或者1(on),默认是0.

在/etc/my.cnf 添加参数

rpl_semi_sync_slave_enabled    = 1

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章