没开启GTID的MySQL数据库增加从库请看:优雅地给正在运行的MySQL添加从库

自动同步连接主库(方法一)

适用于master也是新建不久的情况,如果你的master所有的binlog还在,可以安装slave,slave直接change master to到master端。原理是直接获取master所有的GTID并执行。

优点:简单方便。不需要备份主库再在从库还原。
缺点:如果binlog太多,数据完全同步需要时间较长。如果旧的binlog已经被清理了,则不能正常同步。

在从库执行:

1
2
3
4
5
6
7
CHANGE MASTER TO
MASTER_HOST='10.0.0.11',
MASTER_USER='root',
MASTER_PASSWORD='Vb6CAEJqqtcmKndiAkEl',
MASTER_PORT=3306,
MASTER_CONNECT_RETRY=10,
MASTER_AUTO_POSITION=1;

master_auto_position=1 从库自动找同步点

备份导入连接主库(方法二)

适用于拥有较大数据的情况。(推荐)

通过master或者其他slave的备份搭建新的slave。
原理:获取master的数据和这些数据对应的GTID范围,然后通过slave设置master_auto_position=1,自动同步,跳过备份包含的gtid。
缺点:相对来说有点麻烦。

主库使用mysqldump导出

1
mysqldump  -uroot -pVb6CAEJqqtcmKndiAkEl -hlocalhost -P3306 --triggers --routines --events --hex-blob --single-transaction --skip-tz-utc --all-databases > backup.sql

SQL文件最后有一条:

1
SET @@GLOBAL.GTID_PURGED='aab83329-fb19-11ee-85e8-4e5363c108f2:1-689';

这是记录了当前的SQL对应的GTID位置?

从库数据导入数据

1
mysql -uroot -pVb6CAEJqqtcmKndiAkEl -hlocalhost -P3306 < backup.sql

如果导入报错 @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty , 需要在从库执行:

1
2
3
4
5
6
7
8
-- 查看当前的GTID
select @@global.gtid_executed\G;

stop slave;
reset slave all;

-- 清空本地的GTID
reset master;

从库连接主库

1
2
3
4
5
6
7
CHANGE MASTER TO
MASTER_HOST='10.0.0.11',
MASTER_USER='root',
MASTER_PASSWORD='Vb6CAEJqqtcmKndiAkEl',
MASTER_PORT=3306,
MASTER_CONNECT_RETRY=10,
MASTER_AUTO_POSITION=1;

从库启动复制线程

1
mysql> start slave;

从库查看复制状态

1
mysql> show slave status \G;

主库查看状态

1
2
3
show master status;
show slave hosts;
show global variables like '%gtid%';

其他命令

1
2
3
4
5
show binlog events;
show binlog events in 'master-bin.000001';
show master logs;
show processlist
show full processlist;