今天主要介绍一下mysql数据库GITD涉及的三个系统参数以及常用的一些命令~
1、gtid_next
需要注意的是如果你手动的将@@session.gtid_next设为一个GTID值,那么在执行完事务后请务必重新将其设置为AUTOMATIC。
当slave的SQL thread进程应用事务时,他们会根据binlog日志的记载将自己的@@SESSION.gtid_next设为即将要重放的事务的GTID,等到重放完毕后,还会把这个GTID加入@@global.gtid_executed。
总结下就是:此参数在事实上提供了手动跳过事务的方法,在主从同步需要跳过错误事务时很有用。
2、gtid_purged和gtid_executed
此参数表示所有已经被提交但是在所有binlog中都找不到相关GTID的事务们,gtid_purged是gtid_executed的一个子集,其涉及到的场景主要是:
可以通过修改@@GLOBAL.gtid_purged的值告诉slave:虽然已经无法在binlog中找到相关的GTID记录了,但这些gtid set内的事务已经被应用过了。
此参数一个经典的应用场景是:你在搭建主从时使用mysqldump在slave server上恢复了备份,但是因为备份前未开启GTID导致恢复后的数据库并没有gtid_executed和gtid_purged信息,因此指定gtid_mode=ON以及master_auto_position=1开启GTID同步时slave尝试同步master从uuid:1开始的所有GTID事务,这当然不是我们想要的也肯定会遇到错误。在mysql 5.7之后你可以通过只修改@@GLOBAL.gtid_purged的值来为slave同步的master_auto_position=1指明起始GTID。
gtid_executed和gtid_purged的值是在数据库服务启动时初始化的,每个binlog的初始event(其实是第2个啦,第一个是pos=4的Format_desc)都是Previous_gtids_log_event(通过SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]查看),这个event包含了之前所有binlog files的GTID set(一般是uuid:1-<最新的事务序列号>),gtid_executed只需要看最新一个binlog的Previous_gtids_log_event的值即可,gtid_purged的值则是最新的binlog文件的Previous_gtids_log_event的值减去最老binlog文件的Previous_gtids_log_event的值。
gtid_executed的值会随着事务的生成不断更新,但不包含@@GLOBAL.gtid_owned的GTID,@@GLOBAL.gtid_owned表示当前数据库正在执行的GTID事务。
在MySQL5.7.7版本之前,gtid_executed和gtid_purged的值可能会错误的生成,这姑且一个BUG,你可能需要将
binlog_gtid_simple_recovery 设为FALSE重新启动DB服务器来处理这个BUG,将此参数设为FALSE后,DB server在启动时会遍历所有binlog文件以便正确计算gtid_executed和gtid_purged的值,如果你有很多未开启GTID模式时就存在的binlog,可能会导致重启花费很长时间。
因此还是推荐在mysql5.7.8之后的版本上启用GTID复制,以前的版本能用传统复制就用传统复制吧。
下表整理了GTID常用的查看命令,以及变量的描述及原理
觉得有用的朋友多帮忙转发哦!后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注下~