从一个案例看mysqldump的复制选项

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 一个简单的案例,引发出对mysqldump一点全新的认识。

写在前面

 背景其实出现在两周前了,当时只是简单地排查了下原因就草草了事,今天再次仔细研究了下官方文档,发现还是有些嚼头的,多半是自己之前没有去刻意的思考,其实一点点小特性,有时候还是可以让我们的工作简化很多的。

奇怪的小案例

 这个小案例可能对于某些人来说并不陌生,当时的情境是给一个客户执行一个dump文件,就这么一个小小的操作,后来尽然让客户发现了蹊跷:导入的数据备库上没有。
 同事告知给我的情况,我也是觉得蛮不可思议,立马与客户配合客户再次确认,发现确实是操作没有同步过去,马上检查了主备复制状况,一切正常。
 同事怀着侥幸的心理打开dump文件,发现了如下一个明显的SET指令:

SET @@SESSION.SQL_LOG_BIN= 0;

 这个指令大家一看便知,就是在会话级临时禁掉binlog的产生,看来这个蹊跷的问题就是由它所致。那么为什么mysqldump的导出文件会出现这个set指令呢?

 马上就在官方文档上找到了答案。

The --set-gtid-purged option has the following effect on binary logging when the dump file is reloaded:
● --set-gtid-purged=OFF: SET @@SESSION.SQL_

LOG_BIN=0; is not added to the output.
● --set-gtid-purged=ON: SET @@SESSION.SQL_LOG_BIN=0; is added to the output.
● --set-gtid-purged=AUTO: SET @@SESSION.SQL_LOG_BIN=0; is added to the output if GTIDs are enabled on the server you are backing up (that is, if AUTO evaluates to ON).
This option was added in MySQL 5.6.9.

 那么再来概述一下事情的原由。这个导出文件的源数据库开启了gtid mode,因此默认的dump选项导致了dump文件中添加指令'SET @@SESSION.SQL_LOG_BIN= 0;',然后在客户的另一个主备环境进行导入,由于主库导入的操作没有产生任何binlog,因此备库上没有主库新导入的数据。
 人工补完数据后,告知客户可以通过--set-gtid-purged这个参数来控制导入操作是否被复制。
 故事卒。

mysqldump的复制支持选项

 案例过后,除了诧异,便是对mysqldump的复制选项重新研究了一番,稍微总结了下,发现还是有点收获。接下来简单归类,聊一下基于mysqldump的特性,如何简单的做复制架构搭建。

1.主从结构

 这种场景最简单,就是从一个生产库通过mysqldump来复制出一个从库的需求,结构如下
clipboard1

1)非gtid mode

master-data选项:

If the option value is 2, the CHANGE MASTER TO statement is written as an SQL comment, and thus is informative only; it has no effect when the dump file is reloaded. If the option value is 1, the statement is not written as a comment and takes effect when the dump file is reloaded.

 从这里可以看到,在非gtid模式下,通过--master-data选项,可以将主库dump时的binlog file以及position记录下来,那么change master就会变得很简单,甚至在innodb引擎下,在线添加从库根本不需要对主库形成任何阻塞。
 如下,
 # mysqldump -h127.0.0.1 -uroot -p -P3301 --single-transaction --master-data=2 test t1
1

2)gtid mode

set-gtid-purged选项

This option enables control over global transaction ID (GTID) information written to the dump file, by indicating whether to add a SET @@global.gtid_purged statement to the output. This option may also cause a statement to be written to the output that disables binary logging while the dump file is being reloaded.

 而在gtid模式下,这个操作变得更加简单,设置这个参数为ON(或者默认值),我们甚至不需要关心从库执行到了哪个主库上的transaction id,因为dump命令执行时的gtid被记录下来,并且直接用来设置从库的gtid_purged参数,这个就是为什么gtid模式下在线添加从库如此简单的原因。
 如下,
 # mysqldump -h127.0.0.1 -uroot -p -P3301 --single-transaction --set-gtid-purged=ON test t1
2

2.主主结构

 即从一个生产库通过mysqldump复制出一个从库,并且与当前实例互为主备,结构如下。
clipboard2
 这里不讨论非gtid模式了,和前面所说的使用方式一致。
 而在讨论gtid模式下的这种场景之前,这里先回归到这个案例,为什么mysql默认会有这个举动,自动禁掉导入操作的binlog生成?先回顾下gtid特性的使用方式,一个实例的全局事务id,不管在哪个实例上被使用,标识方式都是server_uuid:tran_id,其中server_uuid标识角色,tran_id标识执行的事务,而gtid_purge参数标识已经执行过的某个实例上的事务。因此,dump文件导入意味着从实例执行了主库上id为m--n的事务,而这些更新默认不被认为是从实例上的行为,这种思维是很科学的,因为复制,即代表接受某个实例对数据的变更。
 而主库只需要做一个简单的change master指令就够了,因为新添加的从库并没有任何更新操作。或许有些人曾经有过困惑,在线做这么奇葩的事情,本来很紧张,然后莫名其妙的很简单就搞定了。。
3

3.一主多从结构

 这种场景也是我们平时工作中比较常见的,即需要在线新增一个从库。结构如下
clipboard3

--dump-slave

This option is similar to --master-data except that it is used to dump a replication slave server to produce a dump file that can be used to set up another server as a slave that has the same master as the dumped server. It causes the dump output to include a CHANGE MASTER TO statement that indicates the binary log coordinates (file name and position) of the dumped slave's master.

--include-master-host-port

For the CHANGE MASTER TO statement in a slave dump produced with the --dump-slave option, add MASTER_HOST and MASTER_PORT options for the host name and TCP/IP port number of the slave's master.

 从这里可以看到,这两个选项可以让你从一个从库上复制实例的时候,即获取到一个数据副本,同时收获需要做的change master语句,轻松地从A→B复制出一个A→C。也就是从当前从库,复制出一个新的从库,两个从库同时指向一个主库。这样不管是否为gtid模式,都能够在完全不影响主库的前提下扩展从库。

 gtid模式如下,
 # mysqldump -h127.0.0.1 -uroot -p -P3302 --single-transaction --set-gtid-purged=ON --dump-slave=2 --include-master-host-port liu testb
4

 非gtid模式如下,
 # mysqldump -h127.0.0.1 -uroot -p -P3302 --single-transaction --set-gtid-purged=OFF --dump-slave=2 --include-master-host-port liu testb
5

结语

 虽然只是一个小小的案例,却能带来很多思考,看来真正理解一款产品,对于平时的运维工作还是十分重要的。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
2天前
|
弹性计算 运维 搜索推荐
三翼鸟携手阿里云ECS g9i:智慧家庭场景的效能革命与未来生活新范式
三翼鸟是海尔智家旗下全球首个智慧家庭场景品牌,致力于提供覆盖衣、食、住、娱的一站式全场景解决方案。截至2025年,服务近1亿家庭,连接设备超5000万台。面对高并发、低延迟与稳定性挑战,全面升级为阿里云ECS g9i实例,实现连接能力提升40%、故障率下降90%、响应速度提升至120ms以内,成本降低20%,推动智慧家庭体验全面跃迁。
|
2天前
|
数据采集 人工智能 自然语言处理
3分钟采集134篇AI文章!深度解析如何通过云无影AgentBay实现25倍并发 + LlamaIndex智能推荐
结合阿里云无影 AgentBay 云端并发采集与 LlamaIndex 智能分析,3分钟高效抓取134篇 AI Agent 文章,实现 AI 推荐、智能问答与知识沉淀,打造从数据获取到价值提炼的完整闭环。
343 90
|
9天前
|
人工智能 自然语言处理 前端开发
Qoder全栈开发实战指南:开启AI驱动的下一代编程范式
Qoder是阿里巴巴于2025年发布的AI编程平台,首创“智能代理式编程”,支持自然语言驱动的全栈开发。通过仓库级理解、多智能体协同与云端沙箱执行,实现从需求到上线的端到端自动化,大幅提升研发效率,重塑程序员角色,引领AI原生开发新范式。
820 156
|
2天前
|
数据采集 缓存 数据可视化
Android 无侵入式数据采集:从手动埋点到字节码插桩的演进之路
本文深入探讨Android无侵入式埋点技术,通过AOP与字节码插桩(如ASM)实现数据采集自动化,彻底解耦业务代码与埋点逻辑。涵盖页面浏览、点击事件自动追踪及注解驱动的半自动化方案,提升数据质量与研发效率,助力团队迈向高效、稳定的智能化埋点体系。(238字)
244 156
|
3天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
10天前
|
机器人 API 调度
基于 DMS Dify+Notebook+Airflow 实现 Agent 的一站式开发
本文提出“DMS Dify + Notebook + Airflow”三位一体架构,解决 Dify 在代码执行与定时调度上的局限。通过 Notebook 扩展 Python 环境,Airflow实现任务调度,构建可扩展、可运维的企业级智能 Agent 系统,提升大模型应用的工程化能力。
|
人工智能 前端开发 API
前端接入通义千问(Qwen)API:5 分钟实现你的 AI 问答助手
本文介绍如何在5分钟内通过前端接入通义千问(Qwen)API,快速打造一个AI问答助手。涵盖API配置、界面设计、流式响应、历史管理、错误重试等核心功能,并提供安全与性能优化建议,助你轻松集成智能对话能力到前端应用中。
796 154