MySQL(三)复制

来源:转载

MySQL复制功能,可以让一台服务器的数据与其他服务器保持同步,一台主库可以同步到多台备库,而一台备库只能有一台主库。
MySQL支持的两种复制方式:基于行的复制和基于语句的复制。

MySQL的复制步骤:
1.主库将数据更新记录到二进制日志(BinLog);
2.主库通知备库有数据更新;
3.备库将主库的BinLog复制到自己的中断日志(Relay log);
4.备库读取中断日志,重放到备库上。

slave节点的配置文件

port=3306log_bin=mysql-binserver_id=2#设置slave节点的中断日志(用来接收master节点发送过来的数据)relay_log=/usr/local/mysql/mysql_relay_binlog_slave_updates=1read_only=1#表示需要同步的数据库名字,如果是多个数据库,就以此格式再写一行即可。binlog-do-db=skyreplicate-do-db=sky
其中,slave的配置项log_slave_updates=1也保存了数据到BinLog,这样slave也可以作为另外节点的master,另外节点可以根据slave的BinLog来复制数据

主库和备库都创建账号用于复制功能
grant replication slave, replication client on *.* to [email protected]'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 */

分享给朋友:
您可能感兴趣的文章:
随机阅读: