MYSQL5.7 复制模式的概念
https://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-concepts.html
为了安全的配置复制模式,必须要懂得一些复制的关键概念。这节解释了这些概念并且在修改在线系统之前必须要知道的事情。
用于MYSQL的复制模式依赖于被记录的事务标识符。被复制的事务类型如下所示:
- GTID事务由GTID标识,它的格式UUID:NUMBER。每一个在日志中记录的GTID事务,都是由
Gtid_log_event
开头。GTID事务即可以使用GTID,也可以使用文件名和位置定位。 - 匿名事务没有GTID,并且MYSQL中的每个匿名事务都以
Anonymous_gtid_log_event
开头记录到日志中。
当使用GTID你能使用auto-positioning功能和自动的失效转移(fail-over),也可以使用WAIT_FOR_EXECUTED_GTID_SET()
, session_track_gtids
,并且可以使用 Performance Schema 表监控复制。使用GTID时不能使用 sql_slave_skip_counter
,而使用空事务代替。
在relay log中的事务,在主服务器上运行时可能没以任何特定事务开头,但是在备机上重放后并被记录到备机上的binary log中后它们会以Anonymous_gtid_log_event
开头。
账户拥有SUPER权限可以动态的设置gtid_mode
和 enforce_gtid_consistency
两个变量。在之前的版本中这两个变量只能在服务启动时设置。在所有的版本中 gtid_mode
参数都与是否使用GTID保持一致。当gtid_mode=ON时不可能复制匿名事务,而当gtid_mod=OFF时,只有匿名事务可以被复制。MYSQL5.7.6的gtid_mode变量有两个额外的状态,OFF_PERMISSIVE和ON_PERMISSIVE。当gtid_mode=OFF_PERMISSIVE
时,那么新的事务是匿名的同时,允许复制GTID或匿名事务。当 gtid_mode=ON_PERMISSIVE
时,那么新的事务使用GTID的同时,允许复制GTID或匿名事务。这意味着服务器使用了匿名和GTID两种事务。例如一个主服务器使用了gtid_mode=ON,备机使用gtid_mode=ON_PERMISSIVE。对于gtid_mode的有效值顺序如下:
- OFF
- OFF_PERMISSIVE
- ON_PERMISSIVE
- ON
改变gtid_mode状态的顺序非常重要,只能按上面的顺序一次一步的改变。例如,如果gtid_mode当前设置成OFF_PERMISSIVE,它可能在下一次改变成OFF或ON_PERMISSIVE,但是不能设置成ON。这为了保证从匿名事务在线改变到GTID事务,能被服务器正确处理。当gtid_mode的模式在ON和OFF之间切换时,GTID的状态(换句话说就是 gtid_executed
的值)是连续的。这确保GTID集已经被服务器应用,无论gtid_mode的值是什么。
作为MYSQL5.7.6改变的一部分,关联到GTID的字段已经被修改,以至于无论gtid_mode当前的值被选择成什么,都能显示正确的信息。这意味着像是在 replication_connection_status
Performance Schema表中的gtid_executed
, gtid_purged
, RECEIVED_TRANSACTION_SET
显示GTID集的字段,和 SHOW SLAVE STATUS
显示相关GTID结果的字段,当没有提供GTID时返回空字符串。当没使用GTID事务时,显示单条GTID的字段现在显示ANONYMOUS。如在 replication_applier_status_by_worker
Performance Schema表中的CURRENT_TRANSCTION。
在主服务器上使用gtid_mode=ON提供使用auto-positoning的能力,方法是在配置时使用CHANGE MASTER TO MASTER_AUTO_POSITION = 1;
语句。复制的拓扑结构影响是否开启auto-positioning,这个功能依赖于GTID和是否兼容匿名事务。如果auto-positioning开启并且使用了匿名事务,那么会发生错误。强烈建议在使用auto-positioning之前,先确认没有使用匿名事务( see Section 16.1.5.2, “Enabling GTID Transactions Online”)。在主从服务器上gtid_mode和auto-positioning的兼容表如下所示,在表中gtid_mode水平显示的是主服务器,从服务器的gtid_mode垂直显示:
MASTER/SLAVE GTID_MODE | OFF | OFF_PERMISSIVE | ON_PERMISSIVE | ON |
OFF | Y | Y | N | N |
OFF_PERMISSIVE | Y | Y | Y | Y* |
ON_PERMISSIVE | Y | Y | Y | Y* |
ON | N | N | Y | Y* |
在上面的表中:
- Y:代表主从服务器的gtid_mode是兼容的。
- N:代表主从服务器的gtid_mode是不兼容的。
- *可以使用auto-positioning。
当前选择的gtid_mode同样能影响 gtid_next
变量。下面的表显示了服务器上不同的gtid_mode和gtid_next值的行为:
ON_PERMISSIVENEW GTIDANONYMOUSANONYMOUSUUID:NUMBER
gtid_next | AUTOMATIC BINARY LOG ON | AUTOMATIC BINARY LOG OFF | ANONYMOUS | UUID:NUMBER |
OFF | ANONYMOUS | ANONYMOUS | ANONYMOUS | ERROR |
OFF_PERMISSIVE | ANONYMOUS | ANONYMOUS | ANONYMOUS | UUID:NUMBER |
ON | NEW GTID | ANONYMOUS | ERROR | UUID:NUMBER |
在上面的表中:
- ANONYMOUS:产生匿名事务。
- ERROR:产生错误并且会在执行SET GTID_NEXT时失败。
- UUID:NUMBER:代一个指定的UUID:NUMBER的GTID。
- NEW GTID:自动产生一个GTID。
当binary log关闭并且gtid_next设置成AUTOMATIC时,那么没有GTID产生。这个行为和之前的版本一致。