技术分享 | Xtrabackup 备份中 Xtrabackup_binlog_info 文件记录的 GTID 信息是否准确?
大家好,今天本人给大家带来文章《技术分享 | Xtrabackup 备份中 Xtrabackup_binlog_info 文件记录的 GTID 信息是否准确?》,文中内容主要涉及到MySQL,如果你对数据库方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你们,谢谢!
作者:何政
本文来源:原创投稿
*原创内容未经授权不得随意使用,转载请联系小编并注明来源。
Xtrabackup 是由 percona 开源的免费数据库热备份软件,它能对 InnoDB 和 XtraDB 存储引擎的数据库非阻塞地备份。
为了方便建立从库,Xtrabackup 在备份完成后会将 binlog position 与 GTID 的相关信息保存于 xtrabackup_binlog_info 文件中。
但是当你使用 Xtrabackup 生成的备份建立一个从库时,会发现恢复后的实例执行
\# cat xtrabackup_binlog_info mysql-bin.000003 86412752 55d3d9b9-4d49-11ea-932c-02000aba3fa6:1-595859
2.将该备份恢复至一个新实例并启动该实例,执行
mysql> show master status\G *************************** 1. row *************************** File: mysql-bin.000001 Position: 154 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 55d3d9b9-4d49-11ea-932c-02000aba3fa6:1-326661 1 row in set (0.00 sec)
此时会发现使用备份恢复的实例显示已执行过的 GTID 是 1-326661,而备份文件显示的是 1-595859,这是否表示两者相差的 GTID:326662-595859 代表的事务丢失了?
通过对原实例(进行备份的实例)的 binlog 进行解析,来查询 GTID:326662-595859 这部分事务所生成的数据在新实例(通过备份恢复的实例)上是否存在。可以发现 GTID:326662-595859 这部分事务的数据都存在于新实例上,也就是说数据与 xtrabackup_binlog_info 文件记录的是一致的,只不过与
# # cat xtrabackup_binlog_info binlog.000033 1459 70ec927f-4c6d-11ea-b88c-02000aba3fb1:1-621683
2.查看备份实例相对应的 binlog 解析后的内容:
# mysqlbinlog -vv binlog.000033 | less 定位至 70ec927f-4c6d-11ea-b88c-02000aba3fb1:621683 # at 508 #200213 13:46:47 server id 663728 end_log_pos 583 GTID last_committed=0 sequence_number=2 rbr_only=yes original_committed_timestamp=1581572807720907 immediate_commit_timestamp=15815728 07720907 transaction_length=317 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=1581572807720907 (2020-02-13 13:46:47.720907 CST) # immediate_commit_timestamp=1581572807720907 (2020-02-13 13:46:47.720907 CST) /*!80001 SET @@session.original_commit_timestamp=1581572807720907*//*!*/; /*!80014 SET @@session.original_server_version=80018*//*!*/; /*!80014 SET @@session.immediate_server_version=80018*//*!*/; SET @@SESSION.GTID_NEXT= '70ec927f-4c6d-11ea-b88c-02000aba3fb1:621683'/*!*/; # at 583 #200213 13:46:47 server id 663728 end_log_pos 659 Query thread_id=214 exec_time=0 error_code=0 SET TIMESTAMP=1581572807/*!*/; BEGIN /*!*/; # at 659 #200213 13:46:47 server id 663728 end_log_pos 708 Rows_query # insert into t1 values(null,2) # at 708 #200213 13:46:47 server id 663728 end_log_pos 758 Table_map: `mysqlslap`.`t1` mapped to number 314 # at 758 #200213 13:46:47 server id 663728 end_log_pos 798 Write_rows: table id 314 flags: STMT_END_F BINLOG ' x+JEXh2wIAoAMQAAAMQCAACAAB1pbnNlcnQgaW50byB0MSB2YWx1ZXMobnVsbCwyKQ== x+JEXhOwIAoAMgAAAPYCAAAAADoBAAAAAAEACW15c3Fsc2xhcAACdDEAAgMDAAIBAQA= x+JEXh6wIAoAKAAAAB4DAAAAADoBAAAAAAEAAgAC/wCKAAEAAgAAAA== '/*!*/; ### INSERT INTO `mysqlslap`.`t1` ### SET ### @1=65674 /* INT meta=0 nullable=0 is_null=0 */ ### @2=2 /* INT meta=0 nullable=1 is_null=0 */ # at 798 #200213 13:46:47 server id 663728 end_log_pos 825 Xid = 2436045 COMMIT/*!*/;
可以发现该文件提供的 binlog position 与 GTID 并不对应。而 binlog.000033:1459 对应的 GTID 是 70ec927f-4c6d-11ea-b88c-02000aba3fb1:621685 提交后的下一个位置:
# at 1142 #200213 13:46:47 server id 663728 end_log_pos 1217 GTID last_committed=2 sequence_number=4 rbr_only=yes original_committed_timestamp=1581572807724646 immediate_commit_timestamp=15815728 07724646 transaction_length=317 /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/; # original_commit_timestamp=1581572807724646 (2020-02-13 13:46:47.724646 CST) # immediate_commit_timestamp=1581572807724646 (2020-02-13 13:46:47.724646 CST) /*!80001 SET @@session.original_commit_timestamp=1581572807724646*//*!*/; /*!80014 SET @@session.original_server_version=80018*//*!*/; /*!80014 SET @@session.immediate_server_version=80018*//*!*/; SET @@SESSION.GTID_NEXT= '70ec927f-4c6d-11ea-b88c-02000aba3fb1:621685'/*!*/; # at 1217 #200213 13:46:47 server id 663728 end_log_pos 1293 Query thread_id=215 exec_time=0 error_code=0 SET TIMESTAMP=1581572807/*!*/; BEGIN /*!*/; # at 1293 #200213 13:46:47 server id 663728 end_log_pos 1342 Rows_query # insert into t1 values(null,2) # at 1342 #200213 13:46:47 server id 663728 end_log_pos 1392 Table_map: `mysqlslap`.`t1` mapped to number 314 # at 1392 #200213 13:46:47 server id 663728 end_log_pos 1432 Write_rows: table id 314 flags: STMT_END_F BINLOG ' x+JEXh2wIAoAMQAAAD4FAACAAB1pbnNlcnQgaW50byB0MSB2YWx1ZXMobnVsbCwyKQ== x+JEXhOwIAoAMgAAAHAFAAAAADoBAAAAAAEACW15c3Fsc2xhcAACdDEAAgMDAAIBAQA= x+JEXh6wIAoAKAAAAJgFAAAAADoBAAAAAAEAAgAC/wCMAAEAAgAAAA== '/*!*/; ### INSERT INTO `mysqlslap`.`t1` ### SET ### @1=65676 /* INT meta=0 nullable=0 is_null=0 */ ### @2=2 /* INT meta=0 nullable=1 is_null=0 */ # at 1432 #200213 13:46:47 server id 663728 end_log_pos 1459 Xid = 2436047 COMMIT/*!*/; # at 1459
3.再看将备份恢复到一个新实例并启动后,执行 show master status 显示的信息:
mysql> show master status\G *************************** 1. row *************************** File: binlog.000034 Position: 191 Binlog_Do_DB: Binlog_Ignore_DB: Executed_Gtid_Set: 70ec927f-4c6d-11ea-b88c-02000aba3fb1:1-621685 1 row in set (0.00 sec)
可以发现与 Xtrabackup 2.4 不同的是,该备份的 xtrabackup_binlog_info 文件记录的信息并不准确,而备份恢复后显示的信息却是准确的。
原因
首先我们来看一下 Xtrabackup 8.0 针对 MySQL 8.0 备份的大致过程:
1.start backup
2.copy .ibd file
3.backup non-InnoDB tables and files
4.Executed FLUSH NO_WRITE_TO_BINLOG BINARY LOGS
5.Selecting LSN and binary log position from p_s.log_status
6.copy last binlog file
7.Writing /mysql/backup/backup/binlog.index
8.Writing xtrabackup_binlog_info
9.Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS
10.copy ib_buffer_pool
11.completed OK!
由以上步骤可知,Xtrabackup 8.0 对 MySQL 8.0 的备份与 Xtrabackup 2.4 略有不同,根据 percona 官方文档的信息,当 MySQL 8.0 中仅存在 InnoDB 引擎的表格时,不再执行ftwrl(当存在非 InnoDB 的表格或者使用 --slave-info 选项时会执行),而是根据上述步骤的第 5 步,Xtrabackup 8.0 会通过
SELECT server_uuid, local, replication, storage_engines FROM performance_schema.log_status
来获取 LSN 、binlog position and Gtid。
1.
performance_schema.log_status是 MySQL 8.0 提供给在线备份工具获取复制日志文件信息的表格。查询 log_status 表时,服务器将阻止日志的记录和相关的更改来获取足够的时间以填充该表,然后释放资源。Log_status 表通知在线备份工具应记录主库的 binlog 的哪个位点和 gtid_executed 的值,还有每个复制通道的 relay log。它还为各个存储引擎提供了相关信息,例如 InnoDB 存储引擎使用的最后一个日志序列号(LSN)和最后一个检查点的 LSN。
2.经过测试发现,当无数据写入时,
performance_schema.log_status提供的 binlog position 与 GTID 是一致的,但是当有大量数据持续写入时,该表格提供的 binlog position 与 GTID 信息将不再一致,如下图:

3.既然
performance_schema.log_status提供的信息不一致,那么为什么备份恢复后,GTID 没有缺失?这是因为 Xtrabackup 8.0 在备份过程中多了两步操作,FLUSH NO_WRITE_TO_BINLOG BINARY LOGS 和 copy binlog,Xtrabackup 8.0 在备份完非 InnoDB 表格的文件时会先切换 binlog,然后将切换后的 binlog 也进行备份,这样使用该备份恢复的新实例在启动后不仅会读取 gtid_executed 表,也会读取 binlog 文件来更新 GTID,就可以保持与备份时 xtrabackup_binlog_info 文件记录的 binlog position 保持一致(需要注意的是 MySQL 8.0 的 gtid_executed 表格不再是当 binlog 切换时更新,而是会不断的实时更新,但需要注意在有大量数据写入时也不能做到和全局变量 gtid_exeuted 保持严格一致)。
4.当 MySQL 8.0 中存在非 InnoDB 的表格,比如 MyISAM 表时,Xtrabackup 8.0 会在执行完
FLUSH NO_WRITE_TO_BINLOG BINARY LOGS后执行 ftwrl,此时查询
performance_schema.log_status得到的 binlog position 与 GTID 是一致的,且备份恢复后 show master status 显示的信息也与 xtrabackup_binlog_info 文件记录的信息一致。
总结
1.Xtrabackup 2.4 备份后生成的 xtrabackup_binlog_info 文件记录的 GTID 信息是准确的,但是备份恢复后 show master status 显示的 GTID 是不准确的。
2.Xtrabackup 8.0 在备份只有 InnoDB 表的实例时,xtrabackup_binlog_info 文件记录的 GTID 信息不一定是准确的,但是备份恢复后 show master status 显示的 GTID 是准确的。
3.Xtrabackup 8.0 在备份有非 InnoDB 表格的实例时,xtrabackup_binlog_info 文件记录的 GTID 信息是准确的,备份恢复后 show master status 显示的 GTID 也是准确的。
好了,本文到此结束,带大家了解了《技术分享 | Xtrabackup 备份中 Xtrabackup_binlog_info 文件记录的 GTID 信息是否准确?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!

- 上一篇
- Django media MEDIA_URL MEDIA_ROOT 的配置

- 下一篇
- Linux的crontab定时备份mysql数据库
-
- 害怕的香水
- 这篇技术贴出现的刚刚好,细节满满,赞 ??,收藏了,关注博主了!希望博主能多写数据库相关的文章。
- 2023-03-12 09:06:38
-
- 活泼的帽子
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢老哥分享文章!
- 2023-02-04 18:48:12
-
- 顺利的方盒
- 这篇文章内容真是及时雨啊,太全面了,感谢大佬分享,mark,关注大佬了!希望大佬能多写数据库相关的文章。
- 2023-01-14 20:27:27
-
- 数据库 · MySQL | 3小时前 |
- MySQL添加外键约束详解
- 118浏览 收藏
-
- 数据库 · MySQL | 4小时前 |
- MySQL建库建表步骤全解析
- 267浏览 收藏
-
- 数据库 · MySQL | 6小时前 |
- MySQL中as用法及别名设置详解
- 424浏览 收藏
-
- 数据库 · MySQL | 8小时前 |
- MySQL排序优化与性能提升技巧
- 215浏览 收藏
-
- 数据库 · MySQL | 8小时前 |
- MySQL入门:核心概念与操作详解
- 421浏览 收藏
-
- 数据库 · MySQL | 9小时前 |
- MySQLGROUPBY用法与注意事项详解
- 219浏览 收藏
-
- 数据库 · MySQL | 10小时前 |
- MySQL基础命令速查表大全
- 130浏览 收藏
-
- 数据库 · MySQL | 12小时前 |
- MySQL分区表查询优化技巧
- 419浏览 收藏
-
- 数据库 · MySQL | 22小时前 |
- MySQL数据归档方法与工具详解
- 494浏览 收藏
-
- 数据库 · MySQL | 23小时前 |
- MySQL常用命令20个必备操作指南
- 149浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL数据库详解:核心功能与优势全解析
- 236浏览 收藏
-
- 数据库 · MySQL | 1天前 |
- MySQL基础命令详解,新手必看操作指南
- 436浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 511次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 498次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- 千音漫语
- 千音漫语,北京熠声科技倾力打造的智能声音创作助手,提供AI配音、音视频翻译、语音识别、声音克隆等强大功能,助力有声书制作、视频创作、教育培训等领域,官网:https://qianyin123.com
- 239次使用
-
- MiniWork
- MiniWork是一款智能高效的AI工具平台,专为提升工作与学习效率而设计。整合文本处理、图像生成、营销策划及运营管理等多元AI工具,提供精准智能解决方案,让复杂工作简单高效。
- 232次使用
-
- NoCode
- NoCode (nocode.cn)是领先的无代码开发平台,通过拖放、AI对话等简单操作,助您快速创建各类应用、网站与管理系统。无需编程知识,轻松实现个人生活、商业经营、企业管理多场景需求,大幅降低开发门槛,高效低成本。
- 229次使用
-
- 达医智影
- 达医智影,阿里巴巴达摩院医疗AI创新力作。全球率先利用平扫CT实现“一扫多筛”,仅一次CT扫描即可高效识别多种癌症、急症及慢病,为疾病早期发现提供智能、精准的AI影像早筛解决方案。
- 236次使用
-
- 智慧芽Eureka
- 智慧芽Eureka,专为技术创新打造的AI Agent平台。深度理解专利、研发、生物医药、材料、科创等复杂场景,通过专家级AI Agent精准执行任务,智能化工作流解放70%生产力,让您专注核心创新。
- 258次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览