CHANGE MASTER TO
MASTER_HOST=$host_name
MASTER_PORT=$port
MASTER_USER=$user_name
MASTER_PASSWORD=$password
MASTER_LOG_FILE=$master_log_name
MASTER_LOG_POS=$master_log_pos
最后两个参数 MASTER_LOG_FILE 和 MASTER_LOG_POS 表示,要从主库的
master_log_name 文件的 master_log_pos 这个位置的日志继续同步。而这个位置就是我们
所说的同步位点,也就是主库对应的文件名和日志偏移量。异步复制基本无法精确的找到位置,
只能取大概的位置。
常见的取位点做法:
等待新主库 A’把中转日志(relay log)全部同步完成;在 A’上执行 show master status 命令,
得到当前 A’上最新的 File 和 Position;取原主库 A 故障的时刻 T;用 mysqlbinlog 工具解
析 A’的 File,得到 T 时刻的位点。
然而异步复制主从切换,取到的位点经常有问题,常见的切换后的错误:主键冲突(取的位点
靠前)
Duplicate entry ‘id_of_R’ for key ‘PRIMARY’,同步停止。这时候怎么办呢。
悲观的解决:跳过错误
set global sql_slave_skip_counter=1;
start slave;
另一种更暴力:通过设置 slave_skip_errors 参数,直接设置跳过指定的错误。在执行主备切
换时,有这么两类错误,是经常会遇到的:
1062 错误是插入数据时唯一键冲突;
1032 错误是删除数据时找不到行。
因此,我们可以把 slave_skip_errors 设置为 “1032,1062”,这样中间碰到这两个错误时就直
接跳过。
这种方式是不是太粗糙了。
2.GTID 模式
上面的找位点的坑怎么办?
MySQL 5.6 版本引入了 GTID,彻底解决了异步复制找位点的难题。
启用 GTID:加入两个参数
gtid_mode=on
enforce_gtid_consistency=on
基于 GTID 切换(GTID 内容后续在深入说明)
GTID 模式下,备库 B 要设置为新主库 A’的从库的语法如下:
CHANGE MASTER TO
评论