MySQL 5.7.6: 如何不停服务开启复制拓扑内的GTID

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:
Gtid作为5.6版本以来的杀手级特性,却因为不支持拓扑结构内开关而饱受诟病。如果你需要从未开启GTID的环境升级到开启GTID,需要把这个复制结构里的实例shutdown后,再重启。相信这对于任何24小时服务的互联网应用都是不可接受的。

从5.7.6开始,终于支持在线动态设置gtid_mode和enforce_gtid_consistency了。在介绍如何通过动态设置GTID MODE来开启主备复制结构的GTID之前,我们先介绍几组概念。
匿名事务:对于一个匿名事务,在主库上是不带GTID的,其传递到备库执行也不应该产生GTID。
GTID_MODE
OFF
彻底关闭GTID,如果关闭状态的备库接受到带GTID的事务,则复制中断
OFF_PERMISSIVE
可以认为是关闭GTID前的过渡阶段,主库在设置成该值后不再生成GTID,备库在接受到带GTID 和不带GTID的事务都可以容忍
主库在关闭GTID时,执行事务会产生一个Anonymous_Gtid事件,会在备库执行:
SET @@SESSION.GTID_NEXT= ‘ANONYMOUS’
备库在执行匿名事务时,就不会去尝试生成本地GTID了
ON_PERMISSIVE
可以认为是打开GTID前的过渡阶段,主库在设置成该值后会产生GTID,同时备库依然容忍带GTID和不带GTID的事务
ON
完全打开GTID,如果打开状态的备库接受到不带GTID的事务,则复制中断
配置的兼容性矩阵(从worklog上抄的。。):
   Master GTID_MODE    OFF  OFF_PERMISSIVE  ON_PERMISSIVE  ON
    Slave GTID_MODE
                OFF     Y           Y           N          N
     OFF_PERMISSIVE     Y           Y           Y          Y*
      ON_PERMISSIVE     Y           Y           Y          Y*
                 ON     N           N           Y          Y*

   N - Slave thread will stop with an error instead of connect
   Y - GTID_MODEs are compatible
   * - AUTO_POSITION can be used
        GTID_NEXT    AUTOMATIC  AUTOMATIC   ANONYMOUS  UUID:NUMBER
                     binlog on  binlog off
        GTID_MODE
              OFF    anonymous  anonymous   anonymous  error
   OFF_PERMISSIVE    anonymous  anonymous   anonymous  UUID:NUMBER
    ON_PERMISSIVE    new GTID   anonymous   anonymous  UUID:NUMBER
               ON    new GTID   anonymous   error      UUID:NUMBER

  Legend:
    anonymous - Generate an anonymous transaction.
        error - Generate an error and fail to execute 'SET GTID_NEXT'.
  UUID:NUMBER - Generate a GTID with the specified UUID:NUMBER.
     new GTID - Generate a GTID with an automatically generated number.
可动态配置的ENFORCE_GTID_CONSISTENCY:
WARN
在开启GTID之前,可以设置成WARN来观察实例负载中是否存在不兼容GTID的语句,当前包括:
CREATE TABLE ..SELECT
混合非事务和事务引擎的事务
在开启的事务中执行CREATE/DROP TEMPORARY TABLE
设置成WARN时,用户负载能保证正常,错误日志里会记录下来这些语句信息
ON
打开选项,上述的几种语句将给客户端返回错误。
由于动态设置该选项,我们考虑如下序列,
trx1 begin;
trx1 由于当前选项off,可以执行混合非事务引擎的事务
——另外一个session打开该选项
trx1 commit
为了解决这个问题,在内部检测到GTID不安全的语句时,使用一个计数器统计,只有该值为0时,才允许打开该选项
OFF
关闭该选项,则无法打开GTID_MODE
不管GTID_MODE是否打开还是关闭,总是在ROTATE时产生Previous_gtid_event,其目的是为了防止在反复切换GTID_MODE的过程中,不丢失之前的GTID_EXECUTED和GTID_PURGED。(WL#7592)
CREATE TABLE AS SEELCT这样的SQL,在gtid 打开时,依然不允许执行,但在enforce_gtid_consistency刮泥时, 格式发生了变化,在之前的版本中的binlog格式为:
BEGIN;CREATE TABLE;INSERT;COMMIT;
新的版本修改成了:
Anonymous_Gtid;
CREATE;
Anonymous_Gtid;
BEGIN;INSERT;COMMIT
步骤:
我们来看看如何通过动态设置升级主备。(注意你的复制结构里的实例必须全部先升级到5.7.6及之后的版本)
(你也可以从官方文档 http://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-enable-gtids.html 来获得开启gtid的流程)
我们假定你的workload 是和Gtid相兼容的,因此跳过设置enforce_gtid_consistency=warn这个步骤以观察不兼容gtid的负载
Step 1:
在每台实例上执行:SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = ON
Step 2:
在每台实例上执行:SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE
当设成OFF_PERMISSIVE时,备库可以接受任何带GTID或不带GTID的事务,但此时还没有事务拥有GTID
Step 3:
在每台实例上执行:SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE
当设成ON_PERMISSIVE时,主库开始生成GTID,备库依然容忍带GTID和不带GTID的事务。
Step 4:
检查实例上的status变量ONGOING_ANONYMOUS_TRANSACTION_COUNT值为0
假定这种场景:
a.事务设置GTID_NEXT=‘ANONYMOUS’,然后执行事务,这是允许的,因为当前GITD_MODE为ON_PERMISSIVE
b.另外一个session设置GTID_MODE = ON;
c.事务提交
这可能产生不一致的状态,即打开GTID后,依然存在匿名事务,因此在内部维持了一个计数器ONGOING_ANONYMOUS_TRANSACTION_COUNT来维持匿名事务的数量,只有这个值为0时,再去设置GIT_MODE为ON
Step 5:
等待所有的复制完成,没有延迟,做一次flush logs,然后将前面的日志purge掉, 这些日志包含带GTID和不带GTID的事务。
Step 6:
在每台实例上执行:SET @@GLOBAL.GTID_MODE = ON
当然这些配置需要写入配置文件中,防止重启后丢失
基本上和开启的步骤是互逆的。
Step 1:
通过change master关闭MASTER_AUTO_POSITION
Step 2:
在每台实例上执行:
SET @@GLOBAL.GTID_MODE = ON_PERMISSIVE;
Step 3:
在每台实例上执行:
SET @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;
Step 4:
确认所有的gtid_owned集合为空,通过show variables查看
Step5:
等待当前日志已完全被备库复制完成,关闭GTID,设置GTID_MODE=OFF
同样的,这些混合了GTID和非GTID的事务也需要被purge掉。
关于如何确认匿名事务(没有gtid的事务)被完全执行完成,参考文档 http://dev.mysql.com/doc/refman/5.7/en/replication-mode-change-online-verify-transactions.html
另外强烈推荐阅读worklog: http://dev.mysql.com/worklog/task/?id=7083 在这个worklog中以大篇幅的字数介绍了所有可能遇到的情况及处理策略。。
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
10011
分享
相关文章
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
44 18
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
121 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
数据管理服务DMS支持MySQL数据库的无锁结构变更
本文介绍了使用Sysbench准备2000万数据并进行全表字段更新的操作。通过DMS的无锁变更功能,可在不锁定表的情况下完成结构修改,避免了传统方法中可能产生的锁等待问题。具体步骤包括:准备数据、提交审批、执行变更及检查表结构,确保变更过程高效且不影响业务运行。
76 2
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
237 11
【揭秘】MySQL binlog日志与GTID:如何让数据库备份恢复变得轻松简单?
【8月更文挑战第22天】MySQL的binlog日志记录数据变更,用于恢复、复制和点恢复;GTID为每笔事务分配唯一ID,简化复制和恢复流程。开启binlog和GTID后,可通过`mysqldump`进行逻辑备份,包含binlog位置信息,或用`xtrabackup`做物理备份。恢复时,使用`mysql`命令执行备份文件,或通过`innobackupex`恢复物理备份。GTID模式下的主从复制配置更简便。
888 2
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
390 1
MySQL主从复制原理和使用
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
314 3
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
450 2
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
270 0
Mysql中搭建主从复制原理和配置
vertx 的http服务表单提交与mysql验证
本文介绍了如何使用Vert.x处理HTTP服务中的表单提交,并通过集成MySQL数据库进行验证,包括项目依赖配置、表单HTML代码和完整的Vert.x服务代码。
54 2
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等