MySQL复制功能,可以让一台服务器的数据与其他服务器保持同步,一台主库可以同步到多台备库,而一台备库只能有一台主库。
MySQL支持的两种复制方式:基于行的复制和基于语句的复制。
MySQL的复制步骤:
1.主库将数据更新记录到二进制日志(BinLog);
2.主库通知备库有数据更新;
3.备库将主库的BinLog复制到自己的中断日志(Relay log);
4.备库读取中断日志,重放到备库上。
slave节点的配置文件
主库和备库都创建账号用于复制功能
看Last_IO_Error项有错误信息,这个错误一般出现在master5.6,slave在低版本的情况下。这是由于5.6使用了crc32做binlog的checksum;我主库版本是5.6.34-log,备库版本是5.5.44-log,刚好就是这个问题。
当一个event被写入binary log(二进制日志)的时候,checksum也同时写入binary log,然后在event通过网络传输到从服务器(slave)之后,再在从服务器中对其进行验证并写入从服务器的relay log.
由于每一步都记录了event和checksum,所以我们可以很快地找出问题所在。
在master1中设置binlog_checksum =none;
重启mysql后,slave再去复制master,往后master的数据更新都会复制到slave。
看master的线程
Id: 1
User: root
Host: localhost
db: sky
Command: Query
Time: 0
State: init
Info: show processlist
*************************** 2. row ***************************
Id: 2
User: repl
Host: 192.168.204.107:53389
db: NULL
Command: Binlog Dump
Time: 838
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
2 rows in set (0.00 sec)
master线程2(Id:2)将更新到biglog的数据发送给slave节点。
看slave的线程
Id: 3
User: root
Host: localhost:65047
db: sky
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 6
User: system user
Host:
db: NULL
Command: Connect
Time: 986
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 8
User: system user
Host:
db: NULL
Command: Connect
Time: 844
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3 rows in set (0.00 sec)
slave节点的线程(Id: 6)等待接近master节点发送过来的event数据,保存到中断日志。
Log_name: mysql-bin.000006
Pos: 350
Event_type: Query
Server_id: 1
End_log_pos: 427
Info: BEGIN
*************************** 4. row ***************************
Log_name: mysql-bin.000006
Pos: 427
Event_type: Query
Server_id: 1
End_log_pos: 538
Info: use `sky`; insert into user values(3, 'skyskysky')
*************************** 5. row ***************************
Log_name: mysql-bin.000006
Pos: 538
Event_type: Xid
Server_id: 1
End_log_pos: 569
Info: COMMIT /* xid=15 */
MySQL支持的两种复制方式:基于行的复制和基于语句的复制。
MySQL的复制步骤:
1.主库将数据更新记录到二进制日志(BinLog);
2.主库通知备库有数据更新;
3.备库将主库的BinLog复制到自己的中断日志(Relay log);
4.备库读取中断日志,重放到备库上。
slave节点的配置文件
port=3306
log_bin=mysql-bin
server_id=2
#设置slave节点的中断日志(用来接收master节点发送过来的数据)
relay_log=/usr/local/mysql/mysql_relay_bin
log_slave_updates=1
read_only=1
#表示需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。
binlog-do-db=sky
replicate-do-db=sky
其中,slave的配置项log_slave_updates=1也保存了数据到BinLog,这样slave也可以作为另外节点的master,另外节点可以根据slave的BinLog来复制数据
主库和备库都创建账号用于复制功能
grant replication slave, replication client on *.* to repl@'192.168.204.%' identified by 'p4ssword';
备库开始复制的命令
mysql> change master to master_host='192.168.204.79', master_port=3305, master_user='repl', master_password='p4ssword', master_log_file='mysql-bin.000006', master_log_pos=0;
Query OK, 0 rows affected (0.02 sec)
备库开始复制
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
如果需要重新执行复制命令,则需要先关闭复制
mysql> stop slave;
然后再执行开始复制的命令
查看备库复制的状态
mysql> show slave status\G
看Last_IO_Error项有错误信息,这个错误一般出现在master5.6,slave在低版本的情况下。这是由于5.6使用了crc32做binlog的checksum;我主库版本是5.6.34-log,备库版本是5.5.44-log,刚好就是这个问题。
当一个event被写入binary log(二进制日志)的时候,checksum也同时写入binary log,然后在event通过网络传输到从服务器(slave)之后,再在从服务器中对其进行验证并写入从服务器的relay log.
由于每一步都记录了event和checksum,所以我们可以很快地找出问题所在。
在master1中设置binlog_checksum =none;
重启mysql后,slave再去复制master,往后master的数据更新都会复制到slave。
看master的线程
mysql> show processlist\G
*************************** 1. row ***************************
Id: 1
User: root
Host: localhost
db: sky
Command: Query
Time: 0
State: init
Info: show processlist
*************************** 2. row ***************************
Id: 2
User: repl
Host: 192.168.204.107:53389
db: NULL
Command: Binlog Dump
Time: 838
State: Master has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
2 rows in set (0.00 sec)
master线程2(Id:2)将更新到biglog的数据发送给slave节点。
看slave的线程
mysql> show processlist\G
*************************** 1. row ***************************
Id: 3
User: root
Host: localhost:65047
db: sky
Command: Query
Time: 0
State: NULL
Info: show processlist
*************************** 2. row ***************************
Id: 6
User: system user
Host:
db: NULL
Command: Connect
Time: 986
State: Waiting for master to send event
Info: NULL
*************************** 3. row ***************************
Id: 8
User: system user
Host:
db: NULL
Command: Connect
Time: 844
State: Slave has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
3 rows in set (0.00 sec)
slave节点的线程(Id: 6)等待接近master节点发送过来的event数据,保存到中断日志。
slave节点的线程(Id: 8)将中断日志中的新数据重放到slave节点的数据库中。
MySQL的BinLog是二进制的,但可以通过命令来查看内容
mysql> show binlog events in 'mysql-bin.000006'\G
*************************** 3. row ***************************
Log_name: mysql-bin.000006
Pos: 350
Event_type: Query
Server_id: 1
End_log_pos: 427
Info: BEGIN
*************************** 4. row ***************************
Log_name: mysql-bin.000006
Pos: 427
Event_type: Query
Server_id: 1
End_log_pos: 538
Info: use `sky`; insert into user values(3, 'skyskysky')
*************************** 5. row ***************************
Log_name: mysql-bin.000006
Pos: 538
Event_type: Xid
Server_id: 1
End_log_pos: 569
Info: COMMIT /* xid=15 */