MySQL5.7 GTID 运维实战
Updated:
GTID 和 START SLAVE
- START SLAVE 语法
|
|
- 如何从multi-threaded slave 转化成 single-threaded mode
|
|
GTID 和 upgrade
|
|
GTID 和 mysql.gtid_executed
- gtid_mode = (ON|ON_PERMISSIVE), bin_log = off
|
|
- gtid_mode = (ON|ON_PERMISSIVE), bin_log = on
|
|
GTID 和 gtid_next
http://dev.mysql.com/doc/refman/5.7/en/replication-options-gtids.html#sysvar_gtid_next
- 三种取值
|
|
- QA: GTID 0923e916-3c36-11e6-82a5-ecf4bbf1f518:1-50 对应的事务顺序,从小到大,一定是顺序执行的吗?
答案:错,一般情况下事务是从小到大,顺序执行的。 但是如果再MTS场景,或者是人工设置gtid_next的情况下,就可能不是顺序执行了
|
|
GTID 和 MHA
请参考MHA源码解析
- GTID模式下,需要relay-log吗?purge_relay_log设置为on可以吗?
|
|
GTID 和 备份(物理备份+逻辑备份)
物理备份:xtrabackup,其他等
逻辑备份:mysqldump,mydumper,mysqlpump等
- 物理备份
|
|
- 逻辑备份
|
|
GTID 和 crash safe slave
slave relay log 不完整怎么办?(relay-log-recover=0)
relay-log-recover=1 不考虑,因为它会舍弃掉relay log
- 为何要讨论这个
|
|
- 模拟relay log不完整的情况
从上面可以知道,relay log的记录非常重要,那么relay log 不完整,会怎么样呢?
|
|
总结: relay log不完整,mysql起来后,会重新获取不完整的这个events,sql_thread在回放的时候,如果发现events不完整,会跳过,不会影响到同步。
GTID 和 MTS
MTS_GAPS
- 如果MTS遇到Gap transction怎么办?
|
|
GTID 生产环境中必须考虑的问题
Migration to GTID replication
Non transactionally safe statement will raise errors now
MySQL Performance in GTID
mysql_upgrade script
Errant transactions
Filtration on the slave
Injecting empty transactions
以上问题请参考 GTID原理与实战
GTID 和 online升级
online升级丢数据?
online升级会报错吗?
online升级步骤请参考 GTID原理与实战
- 故障案例一
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: ‘Cannot replicate anonymous transaction when @@GLOBAL.GTID_MODE = ON …’
|
|
- 故障案例二
Last_IO_Error: The replication receiver thread cannot start because the master has GTID_MODE = ON and this server has GTID_MODE = OFF.
|
|
GTID 和 mysqlbinlog
mysqlbinlog 参数:
|
|
GTID 和 重要函数
gtid_set 用引号扩起来
Name | Description |
---|---|
GTID_SUBSET(subset,set) | returns true (1) if all GTIDs in subset are also in set |
GTID_SUBTRACT(set,subset) | returns only those GTIDs from set that are not in subset |
WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout]) | Wait until the given GTIDs have executed on slave. |
WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout][,channel]) | Wait until the given GTIDs have executed on slave |
- GTID_SUBSET(subset,set)
subset 是否是 set 的子集,如果是返回1,不是返回0
|
|
- GTID_SUBTRACT(set,subset)
哪些gtids仅仅是set独有的,subset没有的
|
|
以上两个函数可以用来干嘛呢?
通过GTID_SUBSET,master可以知道slave是否是自己的子集,可以很方便的检查数据一致性
通过GTID_SUBTRACT,假设slave是master的子集,那么可以很轻松的将slave没有,master有的gtid发送给slave,以便达到最终一致性
- WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS(gtid_set[, timeout][,channel])
timeout 默认为0,表示无限等待slave gtid_set全部执行完毕
如果全部执行完毕,会返回执行的gtid的数量。如果没有执行完,会等待timeout秒。如果slave没有起来,或者没有开启gtid,会返回NULL
|
|
- WAIT_FOR_EXECUTED_GTID_SET(gtid_set[, timeout])
含义跟WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS一样,唯一一个区别就是:如果slave 的replication 线程没有起来,不会返回NULL。
|
|
GTID 的限制和缺点
1) 同事更新nontransactional和transactional的表,会导致gtid问题
2) CREATE TABLE … SELECT statements 语法对GTID来说是不安全的
3) CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE 对GTID也是不安全的
4) —enforce-gtid-consistency 必须设置on,可以避免以上2,3 不安全的statement
5) sql_slave_skip_counter 不允许执行,可以通过 Injecting empty transactions 来解决
6) GTID 和 mysqldump的问题,mysqldump 中 sql_log_bin 默认是关闭的.会导致导入master后,不会写入gtid到binlog. ( 可以通过 —set-gtid-purged=OFF 避免 )
7) GTID and mysql_upgrade, 因为部分系统表是myisam引擎的,会有问题。 (可以通过—write-binlog=off来避免 )
参考文档
- 官方资料:
|
|
- 第三方资料
|
|