一、环境的准备

1、准备2台机器,安装好MySQL

机器名

IP

系统版本

数据库版本

jfdb

192.168.232.35

RedHat 6.7

5.7.22

jfdb2

192.168.232.36

RedHat 6.7

5.7.22

  2、工作原理

    依赖二进制日志(BinaryLog)和中继日志(RelayLog)来实现,主节点Master会把自己每次的改动都记录到BinaryLog中,从节点slave通过读取Master上的BinaryLog,把记录写到自己的RelayLog日志中,然后从服务器上的SQL线程会负责读取这个RelayLog日志,并执行一遍,来保持自己和主节点上的数据同步。

    简单来说就是从节点通过读取主节点上的日志,把主节点上执行的SQL在自己这边也执行一遍,只要保持数据库的初始状态是一致的,就能保证数据一直同步下去。

    3、该种同步方式不仅可以同步数据,也可以同步存储过程、视图、函数等系统资源。

二、搭建的步骤

1、开启主节点上的BinaryLog

 打开/etc/my.cnf文件,添加如下内容

log-bin = mysql-bin
binlog_format = mixed
server-id = 1

read-only=0
binlog-do-db=test
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
auto-increment-increment=10
auto-increment-offset=1

 

mysql relay log格式 mysql-relay-bin_数据

 参数含义: 

  binlog-do-db:用来表示把哪些数据库的改动记录到binary日志中,可以写多行,表示同步多个数据库,注释掉,表示除去忽略的数据库,都同步。

  binlog-ignore-db:表示要忽略的数据库,我这里把4个系统数据库忽略了。

  auto-increment-increment:是用于双主同步时,解决自增主键冲突的问题的,每次增加10。

  auto-increment-offset:表示这台服务器的序号,从1开始。这样做的话,在这台服务器上插入的第一条数据的id就是1,第二条就是11了。

2、在主节点上创建用于同步数据的用户

  命令:grant replication slave on *.* to 'repl_user1'@'192.168.232.36' identified by '123456';

     

mysql relay log格式 mysql-relay-bin_数据库_02

  注:上面的IP写的是从节点的IP,意思是只用从节点用,只用于同步数据。

 3、创建test库和测试的表

  命令:create database test default character set utf8;

    

mysql relay log格式 mysql-relay-bin_mysql relay log格式_03

 4、导出test数据库中的数据

 (1)先锁定test数据库

  命令: FLUSH TABLES WITH READ LOCK;

     

mysql relay log格式 mysql-relay-bin_数据_04

 (2)导出test库的数据

    命令:./mysqldump --master-data -uroot -p test >/mysql/test.sql

   

mysql relay log格式 mysql-relay-bin_mysql relay log格式_05

  5、查看主节点的binary日志位置

  命令:show master status\G

   

mysql relay log格式 mysql-relay-bin_数据库_06

含义:  

   File: mysql-bin.000001  -------  表示当前正在记录的binarylog文件名。

    Position: 154    -----表示当前文件的偏移量,就是写在该mysql-bin.000001文件的位置, 配置从节点的时候,需要用到上面的2个值,并且从节点就是从这个文件的这个位置开始同步的。

   Binlog_Do_DB: test  ----------表示需要同步的数据库时test。

   Binlog_Ignore_DB: mysql,information_schema,performance_schema,sys   ---------表示需要忽略的数据库。

   注:如果显示是空的(如下图),则需要重启服务器

  

mysql relay log格式 mysql-relay-bin_mysql relay log格式_07

 6、解除表的锁定

   命令: UNLOCK TABLES;

   

mysql relay log格式 mysql-relay-bin_mysql_08

 7、始设置从节点的数据库

 (1) 打开/etc/my.cnf文件,添加如下内容,重启mysql服务

log-bin = mysql-bin
binlog_format = mixed
server-id = 2

replicate-do-db=test
replicate-ignore-db=mysql
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=sys
relay_log=mysql-relay-bin
log-slave-updates = ON

   

mysql relay log格式 mysql-relay-bin_mysql_09

 含义:

  server_id:必须保证每台服务器不一样。

  replicate-do-db:指定需要同步的数据库。

       replicate-ignore-db:指定需要忽略的数据库。

       relay_log:中继日志的名称。

       log-slave-updates:意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。当从节点需要作为另一个服务器的主节点时,这个需要打开。后面搭建的主-主互备,就需要打开。

 (2)保存后重启mysql

  命令:service mysql restart

    

mysql relay log格式 mysql-relay-bin_数据_10

 8、导入主节点上导出的数据到从节点

(1)从主节点传到从节点

  命令:scp test.sql root@192.168.232.36:/mysql 

  

mysql relay log格式 mysql-relay-bin_数据_11

(2)在从节点上修改文件的权限

  命令:chown -R mysql:mysql test.sql 

  

mysql relay log格式 mysql-relay-bin_mysql relay log格式_12

  (3)导入数据

  命令:mysql -uroot -p test  < test.sql 

   

mysql relay log格式 mysql-relay-bin_mysql_13

 9、从节点上开启同步

命令:

mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.232.35',
-> MASTER_USER='repl_user1',
-> MASTER_PASSWORD='123456',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=154;

mysql relay log格式 mysql-relay-bin_数据库_14

 含义:

  MASTER_HOST:主节点的IP。

       MASTER_USER:主节点上创建的用户同步的用户。

       MASTER_PASSWORD:用户的密码。

  MASTER_LOG_FILE:主节点正在写入binarylog日志的文件。

      MASTER_LOG_POS:文件的偏移量。

      MASTER_PORT=3308:不是默认端口时,需要指定

mysql relay log格式 mysql-relay-bin_数据_15

 

 

 10、重启MySQL服务,查看slave的状态

   命令:show slave status\G

   

mysql relay log格式 mysql-relay-bin_数据库_16

  注意:如果遇到这2个线程有为NO的情况,要去查错误日志排查,如发现我的Slave_IO_Running线程为NO,查看错误日志,具体解决方法见下面第三部分。

   

mysql relay log格式 mysql-relay-bin_数据_17

  含义:

  Slave_IO_Running:从服务器上读取主服务器BinaryLog日志的线程,并把日志拷贝回来。

  Slave_SQL_Running:专门执行SQL的线程。负责把复制回来的的RelayLog执行到自己的数据库中。

  在从节点上这2个参数必须都为Yes,才能表明数据能正常同步。

11、测试数据是否同步

(1)主节点新增数据

    

mysql relay log格式 mysql-relay-bin_mysql relay log格式_18

注意:我们可以看到第二条的数据的id是11,这也就是我们主节点的my.cnf文件的auto-increment-increment参数,起到了作用,下一条数据的id就会是21、31、41.。。。。。

(2)从节点查看数据已经同步过来了

 

mysql relay log格式 mysql-relay-bin_数据库_19

 12、测试存储过程是否可以同步

(1)主节点创建一个存储过程

   

mysql relay log格式 mysql-relay-bin_mysql relay log格式_20

(2)从节点查看是否有该存储过程

    

mysql relay log格式 mysql-relay-bin_mysql relay log格式_21

三、遇到的错误

1、导出数据库数据时报Binloging on server not active的错误

(1)错误截图如下:

   

mysql relay log格式 mysql-relay-bin_mysql relay log格式_22

 (2)问题描述

  因为我的MySQL的my.cnf文件里是没有log-bin = mysql-bin(或者是注释掉的),修改完这个文件后没有重启服务,重启一下就好了。

 (3)解决办法

   

mysql relay log格式 mysql-relay-bin_mysql_23

 2、查看从节点slave的状态Slave_IO_Running线程为NO的错误

(1)错误截图如下:

  

mysql relay log格式 mysql-relay-bin_数据库_24

  (2)查看错误日志的详细描述

   

mysql relay log格式 mysql-relay-bin_mysql relay log格式_25

   

mysql relay log格式 mysql-relay-bin_数据库_26

 发现主节点和从节点有相同的UUID,这是因为我的从节点是通过主节点的虚拟机快照生成的,所以UUID相同

(3)解决办法

删除该UUID的文件,重启mysql即可

mysql relay log格式 mysql-relay-bin_mysql_27

 

mysql relay log格式 mysql-relay-bin_数据库_28