MYSQL实战45讲
--林晓斌
背景
binlog可以用来归档,也可以用来做主备同步
问题
如何做到主备一致呢?
一个主库,一个备库,主库的根新都会同步过来,然后在本地执行,这样保持主备一致
将备库设置为只读状态
主要是:
将查询语句放在备库执行,设置只读可以防止数据操作
防止逻辑有bug,比如切换出现双写,主备不一致
用readonly状态,方便判断节点的角色
readonly对 root用户是无效的,用于更新的线程,就拥有超级权限
主库A更新至备库B的流程
1 两次提交过程
2 备库B与备库A之间维持一个长连接
3 备库B通过change master命令,设置主库A 的ip 用户,密码,以及binlog的其实位置,和偏移量
4 备库执行start slave命令,备库启动线程, 一个io_thread负责连接 sql_thread负责执行
5 主库校检之后,开始按照备库传过来的位置,从本地读取Binlog,发送给B
6 备库B拿到binlog之后写在本地,称为中转日志
7 sql读取中转日至,解析命令然后执行
Binlog的三种格式
Statement
语句
row
当使用row格式时 binlog里面记录了真实行的主键id,这样binlog传到备库时候,就会删除Id=4的行,不会有主备删除不同
行的问题
mixed
为什么有Mixed的存在
statement会导致主备库不一致
row格式浪费很大空间,而且数据量大也将耗费IO资源
mix采取折中的方式
自动判断语句是否会引起主备是否不一致
如果可能则用row
不可能则用statement
如何解决循环复制问题
记录serverid 判断是否相同