MySQL复制功能,可以让一台服务器的数据与其他服务器保持同步,一台主库可以同步到多台备库,而一台备库只能有一台主库。
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


mysql 数据库怎么复制一条数据 mysql复制一条记录_mysql 数据库怎么复制一条数据



看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 */