Mysql集群——主从复制(下)

详细介绍了级联复制,半同步复制等。以及介绍了主从复制的常见问题

5.1.4实现级联复制

为什么需要级联复制
因为主从复制的特性,单向复制,所以我们的写操作都是在服务器上执行的,那么此时如果有多个从服务器,每在主服务器上进行写都要分别向从进行复制这很影响主服务器的性能,所以我们可以使用级联。将主服务器的数据辅助给级联设备,再通过级联设备复制给其他的从设备,因为级联设备不涉及写操作慢慢复制即可不会影响级联设备的性能

需要在中间的从服务器启用以下配置 ,实现中间slave节点能将master的二进制日志在本机进行数据库更新,并且也同时更新本机的二进制,从而实现级联复制

[mysqld]
server-id=18
log_bin
log_slave_updates           #级联复制中间节点的必选项,MySQL8.0此为默认值,可以不要人为添加
read-only

5.1.4.1案例:三台主机实现级联复制

##主设备使用上述实验的主设备

##级联设备使用上述实验的从设备
#修改配置文件
因为默认开启所以无需修改,这个根据系统自行判断

#做完全备份,并发送到slave设备上
[root@localhost ~]#mysqldump -A -F --master-data=1 --single-transaction > /data/all1.sql
[root@localhost ~]#scp /data/all1.sql 10.0.0.10:/data/



##从设备为一个新的服务器
#修改级联设备的备份文件
[root@Centos7 ~]# vim /data/all1.sql 
CHANGE MASTER TO 
  MASTER_HOST='10.0.0.8',
  MASTER_USER='haha',
  MASTER_PASSWORD='sunxiang',
  MASTER_PORT=3306,
 MASTER_LOG_FILE='mysql-bin.000003', MASTER_LOG_POS=156;

#启动服务
[root@localhost ~]#systemctl restart mysqld.service

#连接数据库
[root@Centos7 ~]# mysql -uroot -p'sunxiang'

#如果开启二进制日志则手动关闭
mysql> select @@sql_log_bin;
+---------------+
| @@sql_log_bin |
+---------------+
|             1 |
+---------------+
1 row in set (0.00 sec)

mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)

#导入修改后的备份文件
mysql> source /data/all1.sql

#查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| hellodb            |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

#查看主从状态
mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: 
                  Master_Host: 10.0.0.8
                  Master_User: haha
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000003
          Read_Master_Log_Pos: 156
               Relay_Log_File: Centos7-relay-bin.000001
                Relay_Log_Pos: 4
        Relay_Master_Log_File: mysql-bin.000003
             Slave_IO_Running: No
            Slave_SQL_Running: No

#开启主从复制
mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

##在主服务器上创建一个test库mysql> create database test;Query OK, 1 row affected (0.01 sec)mysql> show databases;+--------------------+| Database           |+--------------------+| hellodb            || information_schema || mysql              || performance_schema || sys                || test               |+--------------------+6 rows in set (0.01 sec)##在级联设备上查看                       #成功复制mysql> show databases;+--------------------+| Database           |+--------------------+| hellodb            || information_schema || mysql              || performance_schema || sys                || test               |+--------------------+6 rows in set (0.00 sec)##在从设备上查看                        #成功复制mysql> show databases;+--------------------+| Database           |+--------------------+| hellodb            || information_schema || mysql              || performance_schema || sys                || test               |+--------------------+6 rows in set (0.00 sec)

5.1.5主主复制

主主复制:两个节点,都可以更新数据,并且互为主从

一出现双主就不得不说的一个问题。同步,数据库的同步问题很多,所以不建议直接使用。但是可以配置双主,然后向其中的一个进行写入,另一个只做备份,和从不同,从不能复制数据给主。而这个只做备份的主是可以向从和另一个主进行复制的,这样在其中一个主设备出现故障时,由这个只做备份的主顶上大大降低了数据终端的风险

主主复制的配置步骤:
(1) 各节点使用一个惟一server_id
(2) 都启动binary log和relay log
(3) 创建拥有复制权限的用户账号
(4) 定义自动增长id字段的数值范围各为奇偶
(5) 均把对方指定为主节点,并启动复制线程

5.1.5.1案例:两台主机互为主备

##在第一个master上配置#修改配置文件[root@localhost ~]#vim /etc/my.cnf.d/mysql-server.cnf [mysqld]datadir=/var/lib/mysqllog-bin=/data/mysql/mysql-binserver_id=11            #重启服务[root@localhost ~]#systemctl restart mysqld.service#登录数据库[root@localhost ~]#mysql#查看二进制位置mysql> select master status;ERROR 1054 (42S22): Unknown column 'master' in 'field list'mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000002 |      156 |              |                  |                   |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)#创建用于主从复制的用户mysql> create user haha@'10.0.0.%' identified by 'sunxiang';Query OK, 0 rows affected (0.01 sec)mysql> grant replication slave on *.* to haha@'10.0.0.%';Query OK, 0 rows affected (0.00 sec)
##在第二个master上配置#修改配置文件[root@localhost ~]#vim /etc/my.cnf.d/mysql-server.cnf [mysqld]datadir=/var/lib/mysqllog-bin=/data/mysql/mysql-binbinlog_format=ROWserver_id=8#重启服务[root@localhost ~]#systemctl restart mysqld.service#登录数据库[root@localhost ~]#mysql#配置主从mysql> CHANGE MASTER TO    ->   MASTER_HOST='10.0.0.11',    ->   MASTER_USER='haha',    ->   MASTER_PASSWORD='sunxiang',    ->   MASTER_PORT=3306,    ->   MASTER_LOG_FILE='mysql-bin.000002',    ->   MASTER_LOG_POS=156,    ->   MASTER_CONNECT_RETRY=10;Query OK, 0 rows affected, 10 warnings (0.02 sec)#查看主从状态mysql> show slave status\G;*************************** 1. row ***************************               Slave_IO_State:                   Master_Host: 10.0.0.11                  Master_User: haha                  Master_Port: 3306                Connect_Retry: 10              Master_Log_File: mysql-bin.000002          Read_Master_Log_Pos: 156               Relay_Log_File: localhost-relay-bin.000001                Relay_Log_Pos: 4        Relay_Master_Log_File: mysql-bin.000002             Slave_IO_Running: No            Slave_SQL_Running: No#开启主从复制mysql> start slave;Query OK, 0 rows affected, 1 warning (0.01 sec)#查看二进制节点mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000002 |      687 |              |                  |                   |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)
##在第一个主设备上配置#配置主从mysql> CHANGE MASTER TO    ->   MASTER_HOST='10.0.0.8',    ->   MASTER_USER='haha',    ->   MASTER_PASSWORD='sunxiang',    ->   MASTER_PORT=3306,    ->   MASTER_LOG_FILE='mysql-bin.000002',    ->   MASTER_LOG_POS=687,    ->   MASTER_CONNECT_RETRY=10;Query OK, 0 rows affected, 10 warnings (0.01 sec)#开启主从复制mysql> start slave;Query OK, 0 rows affected, 1 warning (0.00 sec)
##在主设备1上创建数据库test1mysql> create database test1;Query OK, 1 row affected (0.01 sec)mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                || test1              |+--------------------+5 rows in set (0.01 sec)#在主设备2上查看,有test1数据库复制成功mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                || test1              |+--------------------+5 rows in set (0.00 sec)##在主设备2上创建数据库test2mysql> create database test2;Query OK, 1 row affected (0.00 sec)mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                || test1              || test2              |+--------------------+6 rows in set (0.00 sec)#在主设备1上查看,有test2数据库复制成功mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || mysql              || performance_schema || sys                || test1              || test2              |+--------------------+6 rows in set (0.00 sec)##至此双主配置完成
##找个茬#同时在两个主设备上创建一张表mysql> create table lala(id int);Query OK, 0 rows affected (0.02 sec)#查看主从复制状态         #GG直接报错mysql> show slave status \G;*************************** 1. row ***************************               Slave_IO_State: Waiting for source to send event                  Master_Host: 10.0.0.8                  Master_User: haha                  Master_Port: 3306                Connect_Retry: 10              Master_Log_File: mysql-bin.000002          Read_Master_Log_Pos: 1262               Relay_Log_File: localhost-relay-bin.000002                Relay_Log_Pos: 512        Relay_Master_Log_File: mysql-bin.000002             Slave_IO_Running: Yes            Slave_SQL_Running: No              Replicate_Do_DB:           Replicate_Ignore_DB:            Replicate_Do_Table:        Replicate_Ignore_Table:       Replicate_Wild_Do_Table:   Replicate_Wild_Ignore_Table:                    Last_Errno: 1050                   Last_Error: Error 'Table 'lala' already exists' on query. Default database: 'test1'. Query: 'create table lala(id int)'##直接使用慎用!!

5.1.6半同步复制

默认情况下,MySQL的复制功能是异步的,异步复制可以提供最佳的性能,主库把binlog日志发送给从库即结束,并不验证从库是否接收完毕。这意味着当主服务器或从服务器端发生故障时,有可能从服务器没有接收到主服务器发送过来的binlog日志,这就会造成主服务器和从服务器的数据不一致,甚至在恢复时造成数据的丢失

同步复制为主库把binlog日志发送给从库,并验证从库是否接收完毕。这样当主服务器或者从服务器发生故障时,主服务器收不到应答消息就会一直保持这种状态,同时因为mysql的复制为串行复制,如果这个复制没有成功后续的也不会复制,所以这样虽然安全但是效率低下。

半同步复制,这是一种折中的选择,既不会毫无安全性,也不会因为要等待每一个从服务器都复制成功才会进行后续的操作,而是只要有复制成功的就会给主服务器发送应答消息,主服务器就会进行后续的操作了。如果等待了一定时间后没有从服务回复应答消息就会作异步复制处理。

半同步复制实现:
官方文档:

https://dev.mysql.com/doc/refman/8.0/en/replication-semisync.htmlhttps://dev.mysql.com/doc/refman/5.7/en/replication-semisync.htmlhttps://mariadb.com/kb/en/library/semisynchronous-replication/

5.1.6.1案例:在Mysql8.0实现半同步复制

##master服务器配置#进入数据库安装插件mysql> install plugin rpl_semi_sync_master SONAME 'semisync_master.so';Query OK, 0 rows affected, 1 warning (0.04 sec)#查看插件mysql> show plugins;+---------------------------------+----------+--------------------+--------------------+---------+| Name                            | Status   | Type               | Library            | License |+---------------------------------+----------+--------------------+--------------------+---------+| rpl_semi_sync_master            | ACTIVE   | REPLICATION        | semisync_master.so | GPL     |+---------------------------------+----------+--------------------+--------------------+---------+46 rows in set (0.00 sec)#修改配置文件[root@localhost ~]#vim /etc/my.cnf.d/mysql-server.cnf [mysqld]datadir=/var/lib/mysqllog-bin=/data/mysql/mysql-binserver_id=11binlog_format=ROWrpl_semi_sync_master_enabled=ON  #修改此行,需要先安装semisync_master.so插件后,再重启,否则无法启动rpl_semi_sync_master_timeout=3000    #设置3s内无法同步,也将返回成功信息给客户端#重启服务[root@localhost ~]#systemctl restart mysqld.service #查看关于半同步复制的变量的信息mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';+-------------------------------------------+------------+| Variable_name                             | Value      |+-------------------------------------------+------------+| rpl_semi_sync_master_enabled              | ON         || rpl_semi_sync_master_timeout              | 3000       || rpl_semi_sync_master_trace_level          | 32         || rpl_semi_sync_master_wait_for_slave_count | 1          || rpl_semi_sync_master_wait_no_slave        | ON         || rpl_semi_sync_master_wait_point           | AFTER_SYNC |+-------------------------------------------+------------+6 rows in set (0.00 sec)#查看关于半同步复制的状态信息mysql> show global status like '%semi%';+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 0     || Rpl_semi_sync_master_net_avg_wait_time     | 0     || Rpl_semi_sync_master_net_wait_time         | 0     || Rpl_semi_sync_master_net_waits             | 0     || Rpl_semi_sync_master_no_times              | 0     || Rpl_semi_sync_master_no_tx                 | 0     || Rpl_semi_sync_master_status                | ON    || Rpl_semi_sync_master_timefunc_failures     | 0     || Rpl_semi_sync_master_tx_avg_wait_time      | 0     || Rpl_semi_sync_master_tx_wait_time          | 0     || Rpl_semi_sync_master_tx_waits              | 0     || Rpl_semi_sync_master_wait_pos_backtraverse | 0     || Rpl_semi_sync_master_wait_sessions         | 0     || Rpl_semi_sync_master_yes_tx                | 0     |+--------------------------------------------+-------+14 rows in set (0.00 sec)#下面就是主从复制的内容了#查看二进制日志节点mysql> show master status;+------------------+----------+--------------+------------------+-------------------+| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |+------------------+----------+--------------+------------------+-------------------+| mysql-bin.000005 |      156 |              |                  |                   |+------------------+----------+--------------+------------------+-------------------+1 row in set (0.00 sec)#创建用于主从复制的账号mysql> create user papa@'10.0.0.%' identified by 'sunxiang';Query OK, 0 rows affected (3.04 sec)            #发现这里创建用户很慢,那是因为开启了半同步复制所以想向从服务进行复制,但是因为没有配置从服务器,所以等待三秒后作为异步复制反馈结果给客户端mysql> grant replication slave on *.* to papa@'10.0.0.%';Query OK, 0 rows affected (0.00 sec)
##slave服务器配置(配置两个验证现象,一毛一样的操作)#进入数据库安装插件mysql> INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';Query OK, 0 rows affected, 1 warning (0.06 sec)#修改配置文件[root@Centos7 ~]# vim /etc/my.cnf[mysqld]server-id=10rpl_semi_sync_slave_enabled=ON#重启服务[root@Centos7 ~]# systemctl restart mysqld.service #查看关于半同步复制的变量的信息mysql> SHOW GLOBAL VARIABLES LIKE '%semi%';+---------------------------------+-------+| Variable_name                   | Value |+---------------------------------+-------+| rpl_semi_sync_slave_enabled     | ON    || rpl_semi_sync_slave_trace_level | 32    |+---------------------------------+-------+2 rows in set (0.09 sec)#查看关于半同步复制的状态信息mysql> show global status like '%semi%';+----------------------------+-------+| Variable_name              | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | OFF   |         #此时还是off的,因为还没有配置主从+----------------------------+-------+1 row in set (0.00 sec)#下面进行主从的配置mysql> CHANGE MASTER TO    ->   MASTER_HOST='10.0.0.11',    ->   MASTER_USER='papa',    ->   MASTER_PASSWORD='sunxiang',    ->   MASTER_PORT=3306,    ->   MASTER_LOG_FILE='mysql-bin.000005',    ->   MASTER_LOG_POS=156,    ->   MASTER_CONNECT_RETRY=10;Query OK, 0 rows affected, 10 warnings (0.01 sec)#开启主从复制mysql> start slave;Query OK, 0 rows affected, 1 warning (0.00 sec)#再次查看半同步复制的状态mysql> show global status like '%semi%';+----------------------------+-------+| Variable_name              | Value |+----------------------------+-------+| Rpl_semi_sync_slave_status | ON    |            #此时半同步复制已经开启+----------------------------+-------+1 row in set (0.00 sec)CHANGE MASTER TO  MASTER_HOST='10.0.0.11',  MASTER_USER='papa',  MASTER_PASSWORD='sunxiang',  MASTER_PORT=3306,  MASTER_LOG_FILE='mysql-bin.000005',  MASTER_LOG_POS=156,  MASTER_CONNECT_RETRY=10;
##master服务器#查看半同步复制状态mysql> show global status like '%semi%';+--------------------------------------------+-------+| Variable_name                              | Value |+--------------------------------------------+-------+| Rpl_semi_sync_master_clients               | 1     || Rpl_semi_sync_master_net_avg_wait_time     | 0     || Rpl_semi_sync_master_net_wait_time         | 0     || Rpl_semi_sync_master_net_waits             | 1     || Rpl_semi_sync_master_no_times              | 1     || Rpl_semi_sync_master_no_tx                 | 2     || Rpl_semi_sync_master_status                | ON    || Rpl_semi_sync_master_timefunc_failures     | 0     || Rpl_semi_sync_master_tx_avg_wait_time      | 0     || Rpl_semi_sync_master_tx_wait_time          | 0     || Rpl_semi_sync_master_tx_waits              | 0     || Rpl_semi_sync_master_wait_pos_backtraverse | 0     || Rpl_semi_sync_master_wait_sessions         | 0     || Rpl_semi_sync_master_yes_tx                | 0     |+--------------------------------------------+-------+14 rows in set (0.00 sec)#创建一个数据库mysql> create database test4;Query OK, 1 row affected (0.01 sec)##Slave服务器#两台Slave服务器都可以同步test4mysql> show databases;+--------------------+| Database           |+--------------------+| hellodb            || information_schema || mysql              || performance_schema || sys                || test               || test4              |+--------------------+7 rows in set (0.01 sec)#停止其中一台Slave服务器的主从复制mysql> stop slave;Query OK, 0 rows affected, 1 warning (0.01 sec)##master服务器#创建一个数据库mysql> create database test5;Query OK, 1 row affected (0.01 sec)          #验证结论,只要有一台服务器进行应答则响应客户端##Slave服务器#正常运行的Slave服务器可以看到同步的数据mysql> show databases;+--------------------+| Database           |+--------------------+| hellodb            || information_schema || mysql              || performance_schema || sys                || test               || test4              || test5              |+--------------------+8 rows in set (0.01 sec)#再将另外一台Slave服务器的主从复制停止mysql> stop slave;Query OK, 0 rows affected, 1 warning (0.01 sec)##master服务器#创建数据库mysql> create database test6;Query OK, 1 row affected (3.00 sec)     #验证结论,当超时时间内没有应答则在超时时间之后做异步复制处理##Slave服务器#启用主从复制mysql> start slave;Query OK, 0 rows affected, 1 warning (0.01 sec)#查看数据库mysql> show databases;+--------------------+| Database           |+--------------------+| hellodb            || information_schema || mysql              || performance_schema || sys                || test               || test4              || test5              || test6              |          #在再次启用主从复制之后,之前未能同步的主服务器的数据会正常同步过来+--------------------+9 rows in set (0.01 sec)

5.1.7复制过滤器

让从节点仅复制指定的数据库,或指定数据库的指定表

复制过滤器两种实现方式:
(1) 服务器选项:主服务器仅向二进制日志中记录与特定数据库相关的事件
缺点:基于二进制还原将无法实现;不建议使用
优点: 只需要在主节点配置一次即可
注意:此项和 binlog_format相关
参看:https://mariadb.com/kb/en/library/mysqld-options/#-binlog-ignore-db

vim /etc/my.cnfbinlog-do-db=db1 #数据库白名单列表,不支持同时指定多个值,如果想实现多个数据库需多行实现binlog-do-db=db2binlog-ignore-db= #数据库黑名单列表
注意:在配置文件中设置只能一行一个官方文档说明:This option will not work with cross-database updates with statement-based logging. See the Statement-Based Logging section for more information.This option can not be set dynamically.When setting it on the command-line or in a server option group in an option file, the option does not accept a comma-separated list. If you would like to specify multiple filters, then you need to specify the option multiple times.

(2) 从服务器SQL_THREAD在relay log中的事件时,仅读取与特定数据库(特定表)相关的事件并应用于本地
缺点:会造成网络及磁盘IO浪费,在所有从节点都要配置
优点: 不影响二进制备份还原
从服务器上的复制过滤器相关变量

replicate_do_db="db1,db2,db3"   #指定复制库的白名单,变量可以指定逗号分隔的多个值,选项不支持多值,只能分别写多行实现replicate_ignore_db=             #指定复制库黑名单replicate_do_table=            #指定复制表的白名单replicate_ignore_table=       #指定复制表的黑名单replicate_wild_do_table= foo%.bar%   #支持通配符replicate_wild_ignore_table=
官方文档说明:When setting it dynamically with SET GLOBAL, the system variable accepts a comma-separated list of filters.When setting it on the command-line or in a server option group in an option file, the system variable does not accept a comma-separated list. If you would like to specify multiple filters, then you need to specify the system variable multiple times.

5.1.8 复制的监控和维护

5.1.8.1 清理日志

PURGE { BINARY | MASTER } LOGS  { TO 'log_name' | BEFORE datetime_expr }RESET MASTER TO # #mysql 不支持RESET SLAVE [ALL]

5.1.8.2 复制监控

SHOW MASTER STATUSSHOW BINARY LOGSSHOW BINLOG EVENTSSHOW SLAVE STATUSSHOW PROCESSLIST

5.1.8.3 从服务器是否落后于主服务

SHOW SLAVE STATUS\G;    Seconds_Behind_Master:0

5.1.8.4 如何确定主从节点数据是否一致

percona-toolkit

5.1.9★★复制的问题和解决方案★★

5.1.9.1 数据损坏或丢失

  • Master:MHA + semisync replication
  • Slave: 重新复制

5.1.9.2 不惟一的 server id

重新复制

5.1.9.3 复制延迟

  • 需要额外的监控工具的辅助
  • 一从多主:mariadb10 版后支持
  • 多线程复制:对多个数据库复制

5.1.9.4 MySQL 主从数据不一致

5.1.9.4.1 造成主从不一致的原因
  • 主库binlog格式为Statement,同步到从库执行后可能造成主从不一致。
  • 主库执行更改前有执行set sql_log_bin=0,会使主库不记录binlog,从库也无法变更这部分数据。
  • 从节点未设置只读,误操作写入数据
  • 主库或从库意外宕机,宕机可能会造成binlog或者relaylog文件出现损坏,导致主从不一致
  • 主从实例版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面可能不支持该功能
  • MySQL自身bug导致
5.1.9.4.2 主从不一致修复方法
  • 将从库重新实现虽然这也是一种解决方法,但是这个方案恢复时间比较慢,而且有时候从库也是承担一部分的查询操作的,不能贸然重建。
  • 使用percona-toolkit工具辅助

    PT工具包中包含pt-table-checksum和pt-table-sync两个工具,主要用于检测主从是否一致以及修复数据不一致情况。这种方案优点是修复速度快,不需要停止主从辅助,缺点是需要知识积累,需要时间去学习,去测试,特别是在生产环境,还是要小心使用
    关于使用方法,可以参考下面链接:https://www.cnblogs.com/feiren/p/7777218.html

  • 手动重建不一致的表

    在从库发现某几张表与主库数据不一致,而这几张表数据量也比较大,手工比对数据不现实,并且重做整个库也比较慢,这个时候可以只重做这几张表来修复主从不一致这种方案缺点是在执行导入期间需要暂时停止从库复制,不过也是可以接受的

范例:A,B,C这三张表主从数据不一致

1、从库停止Slave复制
mysql>stop slave;

2、在主库上dump这三张表,并记录下同步的binlog和POS点
mysqldump -uroot -p'sunxiang' -q --single-transaction --master-data=2 testdb A B C >/backup/A_B_C.sql

3、查看A_B_C.sql文件,找出记录的binlog和POS点
head A_B_C.sql
例如:MASTERLOGFILE='mysql-bin.888888', MASTERLOGPOS=666666;

#以下指令是为了保障其他表的数据不丢失,一直同步直到那个点结束,A,B,C表的数据在之前的备份已经生成了一份快照,只需要导入进入,然后开启同步即可
4、把A_B_C.sql拷贝到Slave机器上,并做指向新位置
mysql>start slave until MASTERLOGFILE='mysql-bin.888888',
MASTERLOGPOS=666666;

5、在Slave机器上导入A_B_C.sql
mysql -uroot -pmagedu testdb
mysql>set sql_log_bin=0;
mysql>source /backup/A_B_C.sql
mysql>set sql_log_bin=1;

6、导入完毕后,从库开启同步即可。
mysql>start slave;
5.1.9.4.3 如何避免主从不一致
  • 主库binlog采用ROW格式
  • 主从实例数据库版本保持一致
  • 主库做好账号权限把控,不可以执行set sql_log_bin=0
  • 从库开启只读,不允许人为写入
  • 定期进行主从一致性检验