08 May 2015

MySQL 复制需要把一个一致的数据基线,与该基线对应的 binlog 位置衔接起来。只写好主机地址、启动两个线程,并不代表已有数据和后续变化就一定完整。

下面使用 MySQL 5.6 的文件与位置复制语法。MySQL 8.x 的账户、复制命令及参数名称有变化,不能直接将这里的旧命令用于所有版本。

配置不同的 server-id

源库启用 binlog,并为复制链路中的实例设置不同的 server-id:

[mysqld]
server-id=1
log-bin=mysql-bin
binlog-format=ROW

副本设置 server-id=2。其他内存、SQL mode 和表名大小写参数应按实例原有约定评估,不能为了配置复制就随意覆盖。跨库事务和过滤规则也会影响复制范围,入门环境先避免叠加复杂过滤。

源库应创建只供指定副本主机连接的专用复制账户,授予所需的 REPLICATION SLAVE 权限。账户创建语法随版本变化,真实密码不写入共享脚本或文章。

获取匹配的数据与日志坐标

对于全部使用 InnoDB 的目标库,可以在禁止结构变更的窗口使用一致性逻辑备份:

mysqldump -h source-host -u backup_user -p --single-transaction --master-data=2 --databases appdb > appdb.sql

该命令要求账户具有相应权限,--master-data 在获取位置时仍会涉及短暂的全局锁。备份必须成功完成,并保留输出中记录的 binlog 文件与位置。混用非事务表、期间发生 DDL 等情况不能直接套用这个一致性假设,应停写或选用合适的备份方案。

将备份导入隔离的副本实例。确认目标内容可被替换后再操作,避免覆盖已有独立数据;源库也必须保留备份位置之后的 binlog。

从备份坐标开始复制

使用 CHANGE MASTER TO 设置源库地址、复制账户以及备份中的 MASTER_LOG_FILE、MASTER_LOG_POS。连接凭据按部署方式管理,不能直接复制他人文章中的文件名和位置数字。

START SLAVE;
SHOW SLAVE STATUS\G

验证要超过两个 Yes

Slave_IO_Running 和 Slave_SQL_Running 都为 Yes,是必要的运行检查,但还要查看错误字段、日志位置和延迟,并在目标库验证新增、更新与删除。延迟指标也不能独立证明全部数据一致。

只读副本需要限制业务写入;源库误删同样会复制过去,因此副本不能替代独立备份。实际运维还要安排重启恢复、断连追赶与日志保留策略。

参考:MySQL 5.6 复制文档。





blog comments powered by Disqus
Fork me on GitHub