mysql主从复制

总结摘要
mysql主从复制

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主从复制