MySQL 主从复制使用 GTID(Global Transaction Identifier)模式是新版本MySQL(版本>=5.7) 高可用架构中的推荐方式。相比传统的基于 binlog file + position 的复制,GTID 提供了更强的一致性、自动定位同步点、简化故障切换等优势。
配置GTID模式
主库配置(/etc/my.cnf)
1
2
3
4
5
6
7
8
| # 服务id,主从库不能重复
server-id=1
# 设置同步的binary log二进制日志文件名前缀,默认为binlog
log-bin=mysql-bin
#开启GTID
gtid_mode=on
enforce_gtid_consistency=true
|
重启mysql
1
| systemctl restart mysqld
|
从库配置(/etc/my.cnf)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| # 服务id,主从库不能重复
server-id=2
# 设置同步的binary log二进制日志文件名前缀,默认为binlog
log-bin=mysql-bin
#开启GTID
gtid_mode=on
enforce_gtid_consistency=true
###可选配置
# 需要主从复制的数据库
#replicate-do-db=test
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
#binlog-ignore-db=mysql
# 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
# 设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件
relay_log=replicas-mysql-relay-bin
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
# 防止改变数据(只读操作,除了特殊的线程)
read_only=1
|
重启mysql
1
| systemctl restart mysqld
|
主库创建复制用户
1
2
3
4
| # 在主库中创建复制用户
create user 'repl'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges;
|
备份主库数据
1
2
3
| # --source-data=2 mysql8.0 采用source
# --set-gtid-purged=ON 包含 GTID 信息
mysqldump --single-transaction --source-data=2 --routines --triggers --all-databases --set-gtid-purged=ON -u root -p > gtid_backup.sql
|
恢复主库数据
1
2
| # 在从库中恢复主库数据
mysql -u root -p < /home/data/gtid_backup.sql
|
从库和主库建立联系
1
2
3
4
| # 在从库中执行
change master to MASTER_HOST='主库IP', MASTER_PORT=3306,
MASTER_USER='repl', MASTER_PASSWORD='123456',
MASTER_AUTO_POSITION = 1; -- 启用 GTID 自动定位
|
查看状态
1
2
| show slave status
# 假如显示 Slave_IO_Running 和 Slave_SQL_Running 为 Yes ,以及Slave_IO_State 为 Waiting for master to send event,则证明主从复制成功!
|
错误
MySQL报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded
1
2
3
| # 修改配置(/etc/my.cnf),添加一下内容
# MySQL8.4版本及以上添加,启用验证密码插件(非8.4及以上无需添加)
mysql_native_password=on
|
MySQL中使用备份文件恢复数据时出现Error 2013: Lost connection during query
使用mysql做数据库还原的时候,由于有些数据很大,会出现这样的错误
1
2
3
| # 修改配置(/etc/my.cnf),添加一下内容
# 通信缓冲区的最大长度
max_allowed_packet = 100M
|
MySQL中使用备份文件恢复数据时出现ERROR 3546 (HY000)
MySQL的GTID机制要求全局唯一事务标识符。如果备份文件中的GTID与目标数据库已有的GTID重叠,MySQL会拒绝恢复,以防止数据不一致。重装备份mysql后,再恢复数据。
参考
mysql主从复制GTID模式
mysql8.0主从复制