Skip to content

gtid_mode

xiaoboluo768 edited this page Jun 14, 2020 · 2 revisions
  • 是否开启gtid复制模式,该参数有如下几个有效值
    • ON:设置为ON时,表示启用全局唯一事务ID(GTIDS)来唯一识别一个事务,开启这个参数还需要同时开启log-bin=mysql-bin、log_slave_updates=1(5.7.7开始的版本在启用GTID复制时不再必须打开这个参数,而是使用gtid_executed表来记录从库执行过的事务的GTID)、enfoce_gtid_consystency=1三个参数。
    • OFF:设置为OFF时,binlog中将不记录GTID,要注意:设置为OFF时,从库的binlog或者relay log中出现了GTID,那么将导致复制出错。另外show slave status\G;输出结果中的gtid_purged和gtid_executed两个值不是持久化的,一旦在开启GTID之后再关闭,且清理了包含GTID的binlog之后,则这两个值将丢失。
    • UPGRADE_STEP_1和UPGRADE_STEP_2:这两个值为预留功能值,目前还不能使用,如果你不想在启动的时候报错拒绝启动,那就不要尝试设置这两个值(5.7.6开始,这两个值被OFF_PERMISSIVE和ON_PERMISSIVE取代,且ON和OFF值的对应的功能有变化,详见5.7的参考手册)
    • 在MySQL 5.7.5及其之前的版本中,使用--gtid-mode = ON参数只能在启动的时候开启,且启动server时,还需要使用--log-bin,--log-slave-updates选项启动。在MySQL 5.7.6及更高版本中,log-bin和log_slave_updates参数在开启GTID时也可以关闭,因为5.7增加了一个表gtid_executed来保存GTID,只有当gtid_mode为ON或ON_PERMISSIVE时,GTID才会存储在mysql.gtid_executed表中。 GTID是否存储在此表中,与是否启用二进制日志记录没关系。但是,存储GTID到这个表的时机取决于log_bin是ON还是OFF:
      • 如果禁用二进制日志记录(log_bin为OFF),则server会将每个事务的GTID与表数据中的事务一起提交并存储(注意,这里每个事务执行时实时更新GTID到gtid_executed表指的是拉取主库binlog重放时的事务,而不是在从库自身写入的事务,自身写入的事务不会记录在这个表中),另外,禁用二进制日志记录时,会以用户可配置的速率周期性地压缩该表;有关详细信息(参数gtid_executed_compression_period控制,默认为1000个事务压缩一次表)
      • 如果启用二进制日志记录(log_bin为ON),则会将GTID存储在mysql.gtid_executed中,但是写入时机是当二进制日志被旋转或server关闭时,将写入最后一个binlog的GTID和前一个binlog中所有的GTID到表中
      • 在server意外停止的情况下,GTID集来不及保存在mysql.gtid_executed表中。在这种情况下,在崩溃恢复期间,这些GTID将被重新添加到表中以及被用于更新gtid_executed系统变量中的GTID事务号范围
      • mysql.gtid_executed表在执行RESET MASTER语句时会被重置
    • 全局变量,只读变量,默认值为OFF,枚举类型(5.7.6开始可动态修改),要注意,该值类型是枚举类型,不是布尔型,所以不要使用0和1来设置,否则可能导致意外的结果。

上一篇:sync_binlog | 下一篇:enforce_gtid_consistency

Clone this wiki locally