在GTID-based复制中,如何扩容一个只读实例?

这里使用mysqldump工具在Master节点上进行数据备份,注意一个关键参数:--set-gtid-purged[=name],该参数代表在备份文件中,哪些GTID已执行过了,在change master时,复制将从这些GTID之后进行。

--set-gtid-purged[=name]

Add 'SET @@GLOBAL.GTID_PURGED' to the output. Possible

values for this option are ON, OFF and AUTO. If ON is

used and GTIDs are not enabled on the server, an error is

generated. If OFF is used, this option does nothing. If

AUTO is used and GTIDs are enabled on the server, 'SET

@@GLOBAL.GTID_PURGED' is added to the output. If GTIDs

are disabled, AUTO does nothing. If no value is supplied

then the default (AUTO) value will be considered.

mysqldump命令如下:

$ bin/mysqldump --user=root --password='123456' --socket=/home/mysql/mysql3309/tmp/mysql.sock --default-character-set=utf8mb4 --events --routines --triggers --force --hex-blob --quick --single-transaction --set-gtid-purged=ON --databases db1 lg > /tmp/bak/data.sql

Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions, even those that changed suppressed parts of the database. If you don't want to restore GTIDs, pass --set-gtid-purged=OFF. To make a complete dump, pass --all-databases --triggers --routines --events.

观察备份文件data.sql,会发现两处值得注意的地方:

·使用备份文件导入数据时,将会话级系统变量@@SESSION.SQL_LOG_BIN设置为了0,即不产生二进制日志。

SET @MYSQLDUMP_TEMP_LOG_BIN = @@SESSION.SQL_LOG_BIN;

SET @@SESSION.SQL_LOG_BIN= 0;

...

SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

·设置了全局系统变量@@GLOBAL.GTID_PURGED。

SET @@GLOBAL.GTID_PURGED='0c34233d-b2e1-11e9-85cf-080027f22add:1-2,

32a0c858-b59f-11e9-b069-0800270c3d91:1-2,

447e96e1-b59f-11e9-95fe-0800270c3d91:1-2,

4fdc13e1-b59e-11e9-b5e0-080027f22add:1-9,

b8282f18-b59e-11e9-83b0-0800270c3d91:1-5';

同时也设置了@@GLOBAL.GTID_EXECUTED,这就是复制从何处开始的依据。确切的说是,@@GLOBAL.GTID_EXECUTED为空时,才能设置@@GLOBAL.GTID_PURGED,否则报错如下。同时@@GLOBAL.GTID_EXECUTED会设置成和@@GLOBAL.GTID_PURGED具有相同的值。

ERROR 1840 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.

Query OK, 1 row affected (0.00 sec)

导入备份数据前,观察新Slave节点上@@GLOBAL.GTID_PURGED,和@@GLOBAL.GTID_EXECUTED的值。

[root@mysql.sock][(none)]> select @@GLOBAL.GTID_PURGED;

+----------------------+

| @@GLOBAL.GTID_PURGED |

+----------------------+

|                      |

+----------------------+

1 row in set (0.00 sec)

[root@mysql.sock][(none)]>

[root@mysql.sock][(none)]> select @@GLOBAL.GTID_EXECUTED;

+------------------------+

| @@GLOBAL.GTID_EXECUTED |

+------------------------+

|                        |

+------------------------+

1 row in set (0.00 sec)

导入数据后,再观察。

[root@mysql.sock][(none)]> source /tmp/bak/data.sql;

...

[root@mysql.sock][lg]> select @@GLOBAL.GTID_PURGED;

+-------------------------------------------------+

| @@GLOBAL.GTID_PURGED |

+-------------------------------------------------+

| 0c34233d-b2e1-11e9-85cf-080027f22add:1-2,

32a0c858-b59f-11e9-b069-0800270c3d91:1-2,

447e96e1-b59f-11e9-95fe-0800270c3d91:1-2,

4fdc13e1-b59e-11e9-b5e0-080027f22add:1-9,

b8282f18-b59e-11e9-83b0-0800270c3d91:1-5 |

+-------------------------------------------------+

1 row in set (0.00 sec)

[root@mysql.sock][lg]> select @@GLOBAL.GTID_EXECUTED;

+-------------------------------------------------+

| @@GLOBAL.GTID_EXECUTED |

+-------------------------------------------------+

| 0c34233d-b2e1-11e9-85cf-080027f22add:1-2,

32a0c858-b59f-11e9-b069-0800270c3d91:1-2,

447e96e1-b59f-11e9-95fe-0800270c3d91:1-2,

4fdc13e1-b59e-11e9-b5e0-080027f22add:1-9,

b8282f18-b59e-11e9-83b0-0800270c3d91:1-5 |

+-------------------------------------------------+

1 row in set (0.00 sec)

最后change master即可。

CHANGE MASTER TO

MASTER_HOST='10.0.2.6',

MASTER_USER='repl',

MASTER_PASSWORD='123456',

MASTER_PORT=3309,

MASTER_AUTO_POSITION = 1;

注意,在一些特殊场景下,可能需要手动设置@@GLOBAL.GTID_PURGED。

在GTID-based的复制中,如何设置级联复制呢,要求复制拓扑如下,其中箭头代表数据的复制方向,括号中的部分还不存在。

S M' -> S')

若先建立M' -> S'的复制关系,使用mysqldump在M上备份数据,然后导入M',数据会从M'复制到S'吗,通过上面知道,导入数据时设置了@@SESSION.SQL_LOG_BIN= 0,所以数据不会从M'复制到S',这点是和Position-based复制不一样的,即如下方式不会设置SQL_LOG_BIN。

$ bin/mysqldump --user=root --password='123456' --socket=/home/mysql/mysql3309/tmp/mysql.sock --default-character-set=utf8mb4 --events --routines --triggers --force --hex-blob --quick --single-transaction --set-gtid-purged=OFF --master-data=2 --databases db1 lg > /tmp/bak/2data.sql

所以正确的思路是,用备份数据同时恢复M'和S',然后建立M' -> S',最后建立M -> M'。

对于Failover,由于不需要指定位点信息,直接change master即可,比Position-based复制简洁很多。另,通过前面几篇文章的介绍,也可以发现GTID-based的复制比Position-based复制在数据一致性方面更加严格,不像Position-based复制随便指定个位点,若复制过程无报错,就可以继续。

PS:使用xtrabackup备份数据时,上面的思路是完全成立的。

gtid mysql failover_说GTID - Failover and Scaleout相关推荐

  1. gtid mysql failover_Keepalived + MySQLfailover + GTIDs 高可用

    配置基于GTIDs的主从 本实验在GTIDs主从的基础上进行,GTIDs配置步骤省略.但不懂的可以参考如下步骤配置 比较简单 1. 修改Master配置文件 1 2 3 4 5 6 vim /etc/ ...

  2. mysql 5.6 gtid mha_MySQL MHA--故障切换模式(GTID模式和非GTID模式)

    GTID和非GTID故障切换模式选择 MySQL 5.6版本引入GTID来解决主从切换时BINLOG位置点难定位的问题,MHA从0.56版本开始支持基于GTID的复制,在切换时可以采用GTID模式和非 ...

  3. (5.7)mysql高可用系列——MySQL中的GTID复制(理论篇)【转】

    转自:https://blog.csdn.net/wmq880204/article/details/53160078 一.GTID的概述: 1.全局事物标识:global transaction i ...

  4. mysql gtid复制优缺点_MySQL GTID复制

    备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL 的主从GTID复制 Table of Contents 概述 GTID复制又叫全局事物ID(global transacti ...

  5. mysql gtid 容灾_mysql GTID

    最近在学习mysql45讲这门课的时候,老师在27节讲到主库出问题了,从库怎么办? 在解决的过程中提到了GTID,是mysql5.6版本引入的,这个是哥什么呢? GTID是master生产的自增ID, ...

  6. mysql slave lock 跳过_处理 MySQL 因为 SLAVE 崩溃导致需要手动跳过 GTID 的问题 | 关于 GTID...

    今天发生了与之前某篇博客相似的问题,有同学在不同步的 binlog 库中使用语句 database.table 命令对表进行 drop 导致 master 丢弃该表但是从库并未能同步到该操作.并且后续 ...

  7. [MySQL 5.6] GTID实现、运维变化及存在的bug

    [MySQL 5.6] GTID实现.运维变化及存在的bug http://www.tuicool.com/articles/NjqQju 由于之前没太多深入关注gtid,这里给自己补补课,本文是我看 ...

  8. mysql gtid是什么_mysql gtid初探

    什么是GTID 什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ) GTID的格式类似于: 7a07cd08-ac1b-11e2-9fcf- ...

  9. mysql gtid寻找位置_【MySQL】UUID与GTID以及如何根据GTID找寻filename和position

    Open Group于1997年10月发布,UUID遵从此协议. UUID被设计成一个在空间和时间上的唯一值.两次调用的UUID将产生两个不同的值,即使这些调用是在两个不连接的,彼此独立的计算机. 由 ...

  10. Mysql Replication 之 GTID 实战

    准备工作 Mysql 单机多实例详解 What is the GTID of the replication 实验环境 Os: CentOS 6.X Mysql: 5.6 单机多实例 [3306,33 ...

最新文章

  1. 【异步爬虫】【aiohttp】不需要手动指定aiohttp中的encoding编码
  2. 将dos格式文件转换为unix格式
  3. android webview tel:,Android WebView“tel:”和“mailto:”链接显示未找到网页
  4. 【慢慢学算法】:查找第k小数
  5. js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...
  6. linux下修改当前目录下图像文件并删除
  7. elasticsearch中集群选举中的ping源码解析
  8. wps电脑版_用好WPS这5个远程协同功能,“宅”家办公啥都不耽误,工作全搞定...
  9. div加载异步加载html,初始化页面,异步加载组件的问题
  10. nginx开发从入门到精通【淘宝核心系统服务器】
  11. 学校能效管理系统解决方案-校园能源管理之智慧消防(安科瑞-须静燕)
  12. Typora官网下载慢,用这个镜像
  13. MacBook Air 2013全新安装Win7
  14. matlab在solver,matlab的solver
  15. 【自用错题集】C语言 基础错题整理
  16. Apollo Routing拓扑地图生成源码学习
  17. 我对嵌入式软件的理解
  18. 论文 | 图理论 | 2020年明尼苏达大学博士论文《学习强大的深度图神经网络和嵌入》
  19. 《动手学深度学习》学习之路01-- Kaggle⽐赛:房价预测
  20. append()函数

热门文章

  1. JSON解析(C++)
  2. Leetcode2. Add Two Numbers
  3. jQuery实现倒计时重新发送短信验证码功能示例
  4. css3中的文字效果
  5. 朱恒志20135314实验2 实验报告
  6. linux下打印用户态段错误信息的一种方法
  7. asp编程实例:通过表单创建word的一个例子
  8. C#一个FTP操作封装类FTPHelper
  9. 医疗健康领域的短文本解析探索 ----文本纠错
  10. 教育部建议采纳:给予导师决定硕博士能否毕业的自主权!