MySQL 在线开启 GTID

文若2年前技术文章538

描述

生产环境上也会遇到需要开启 GTID ,有什么风险?如何在线开启?本篇 SOP 将介绍。

GTID 限制

由于基于 GTID 复制依赖于事务,所有开启 GTID 时,有些 MySQL 特性不支持:

  • 事务中混合多个存储引擎。

  • 主从库表引擎不一致,会导致数据不一致。

  • 不支持 CREATE. TABL...SELECT。

  • 不支持 CREATE TEMPORARY TABLE 和 DROP EMPORARY TABLE。

PS:详细可参考 Restrictions on Replication with GTIDs

参数介绍

开启 GTID 我们一般会关注 gtid_modeenforce_gtid_consistency两个参数。

enforce_gtid_consistency

当 GTID 开启后,一个事物分配一个 GTID 保护 GTID 一致性,对某些 SQL 会有限制,例如 CREATE TABLE .. SELECT 必须得分成两条语句执行。该参数有三个有效值:OFF / ON / WARN

  • OFF:表示事务允许违反 GTID 一致性。

  • ON:表示事务不允许违反 GTID 一致性,有相关 SQL 会直接返回异常。

  • WARN:表示事务允许违反 GTID 一致性,但会将警告信息记录到 ERROR LOG。

gtid_mode

GTID 模式设置,该参数有四个有效值:

  • OFF:表示生成的是匿名事务,从库只能应用匿名事务。

  • OFF_PERMISSIVE:新产生的事务都是匿名事务,但也允许有 GTID 事务被复制同步。

  • ON_PERMISSIVE:新产生的都是 GTID 事务,但也允许有匿名事务被复制同步。

  • ON:新生成的是 GTID 事务,从库只能应用 GTID 事务。

从参数给出的有效值来看,可以使用其平滑开启 GTID 模式,OFF_PERMISSIVE就是为平滑关闭 GTID 准备的。只有当 enforce_gtid_consistency = ON才允许 gtid_mode被设置为 ON。每一次修改 gtid_mode都会导致 binary log 发生一次切换,建议业务低峰操作。

在线开启

校验是否可以开启

首先你需要在每台实例上执行该命令,然后观察错误日志,是否有异常。业务有使用违反 GTID 一致性的语法会被记录到错误日志中,如果直接改为 ON 发现时可能已经影响到了业务。

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;

观察一段时间,确认错误日志无警告信息,即可开启该参数。

SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON;

开启该参数后,所有违反 GTID 一致性的 SQL 都会被拒绝。

设置 GTID_MODE

如果直接修改 GTID_MODE = ON 会报如下错误:

ERROR 1788 (HY000): The value of @@GLOBAL.GTID_MODE can only be changed one step at a time: OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON. Also note that this value must be stepped up or down simultaneously on all servers. See the Manual for instructions.

我们需要先设置 GTID_MODE 为 OFF_PERMISSIVE:

如刚才对该值的描述,是一个关闭 GITD 的过渡属性,执行完可快速进入下一步。

-- 该操作在主从库均执行
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

再设置 GTID_MODE 为 ON_PERMISSIVE:

该操作依旧是一个过渡属性,其表示的则是新产生的都是 GTID 事务,但也允许有匿名事务被复制,从这个阶段开始就已经是一个正式转化的过程,但依旧是对两种事务做兼容。

-- 该操作在主从库均执行
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

确认匿名事务回放完毕:

确保该状态值输出的匿名事务数显示为 0 只要出现过 0 即可表示转换完成。

-- 该操作在从库执行
SHOW STATUS LIKE 'ONGOING_ANONYMOUS_TRANSACTION_COUNT';

刷新 BINLOG:

触发 BINLOG 切换,保证一个 BINLOG 文件中只包含一种事物类型。

-- 该操作仅在主库执行即可
FLUSH LOGS;

设置 GTID_MODE 为 ON:

SET @@GLOBAL.GTID_MODE = ON;

修改复制模式为 GTID:

-- 停止复制
STOP SLAVE;

-- 修改为 GTID 模式
CHANGE MASTER TO MASTER_AUTO_POSITION = 1;

-- 开启复制
START SLAVE;

-- 复制同步状态
SHOW SLAVE STATUS\G

写入配置文件

gtid_mode = on
enforce_gtid_consistency = on

总结

开启 GTID_MODE 必须设置 enforce_gtid_consistency = ON评估该参数对业务是否有影响,非常重要。


相关文章

MySQL运维实战(7)建立复制

建立复制的基本步骤1、主库开启binlog主库需要配置的关键参数server_id:主备库需要设置为不同。log_bin:binlog文件的前缀,可以指定绝对路径,也可以只指定文件名。若不指定路径,b...

PostgreSQL 锁等待排查

PostgreSQL 锁等待排查

说明在数据库中,常用 锁 和 MVCC 来保障事务的一致性及提高并发性。锁问题的定位和排查也是数据库运维人员必会的技能,本篇文章介绍 PostgreSQL 如何排查定位锁堵塞问题。1. Postgre...

PromQL语法

PromQL语法

一、PromQL语法1.1、什么是PromQLPromQL(Prometheus Query Language)是 Prometheus 自己开发的表达式语言,语言表现力很丰富,内置函数也很多。使用它...

大数据自动化巡检系统使用说明

大数据自动化巡检系统使用说明

1. 大数据自动化巡检系统首页显示巡检集群数量、巡检模版、巡检指标、当日巡检情况等,如下图所示2. 自动化巡检提供基础配置,提供给两种巡检集群对接方式,一种是可以对接外部集群,通过系统接口调用,一种是...

 MySQL性能优化(十)in参数列表过长导致的性能问题

MySQL性能优化(十)in参数列表过长导致的性能问题

有时候可能有人会问:where条件中使用in和or有什么区别,哪种写法性能更好?in参数个数有没有限制?下面就是一个由于in参数列表过长导致的性能问题。一个例子当时使用的是mysql 5.6版本SEL...

MongoDB复制原理

一、Initial Sync大体来说,MongoDB副本集同步主要包含两个步骤: 1. Initial Sync,全量同步 2. Replication,即sync oplog 先通过init syn...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。