MySQL重大隐患!mysqlpump的--set-gtid-purged参数在5.7和8.0的雷区

    MySQLPump是MySQL官方提供的一个用于备份和恢复MySQL数据库的工具。它于MySQL 5.7.8版本中首次引入,旨在提供一种快速、可靠且高效的备份和恢复解决方案。MySQL Pump首次支持了并行导出、压缩导出,可以利用多核CPU来提高备份能力,在效率上要比mysqldump要高很多。mysqlpump同mysqldump一样导出的文件以SQL语句的形式。这篇文章主要分享一下在使用mysqlpump导出时加上--set-gtid-purged参数遇到的bug。

    各位大佬都知道在开启gtid全局事务标识符的MySQL主从环境中,如果导入的数据是通过mysqldump或者mysqlpump在其他开启gtid的实例上导出的,那么就必须设置--set-gtid-purged参数,如果不设置--set-gtid-purged参数,那么默认通过mysqldump或者mysqlpump导出的数据进行导入时,从库是没有数据的,因为导出的SQL文件中会默认加上@@SESSION.SQL_LOG_BIN= 0,这就非常鸡肋。。。。那先来聊聊SQL_LOG_BIN参数的作用,以及在使用mysqldump或者mysqlpump导出时不加--set-gtid-purged参数,导出的SQL文件是怎么体现SQL_LOG_BIN参数的。

SQL_LOG_BIN参数介绍:

生效范围

Session(注:只支持会话级别)

默认值

ON

可以设置的值

OFF | ON

作用

对当前的会话是否记录到二进制日志中,默认值为ON,也就是当前会话的所有的操作都会记录到二进制日志,记录二进制日志是必须的,因为恢复、主从复制等场景都需要记录到二进制日志中。如果关闭,也就是设置为OFF,那么在这个会话的操作都不记录到二进制日志中。

在开启gtid的实例上使用mysqldump导出数据,查看SQL文件中对SQL_LOG_BIN参数的定义:

[root@ha1 backup]# mysqldump -uroot -p123456 --single-transaction --master-data=2 --flush-logs --flush-privileges --routines --events --all-databases --log-error=mysqldump_liudbwycs_3306_err.log  --skip-add-locks --socket=/liu_data/mysql5.7/data/3306/liu.sock  > mysqldump_liudbwycs_3306.sql

可以看到使用mysqldump不管在5.7还是8.0中都会设置SQL_LOG_BIN= 0,也就是说导入的数据都不会写入到二进制日志中

图片

图片

   

在开启gtid的实例上使用mysqlpump导出数据,查看SQL文件中对SQL_LOG_BIN参数的定义:

[root@ha1 backup]# mysqlpump -uroot -p123456 --single-transaction --users --default-parallelism=2 --all-databases --exclude-databases=mysql --log-error-file=mysqlpump_liudbwycs_3306_err.log --extended-insert=10000 --socket=/liu_data/mysql5.7/data/3306/liu.sock  > mysqlpump_liudbwycs_3306.sql

同样的使用mysqlpump不管在5.7还是8.0中都会设置SQL_LOG_BIN= 0,也就是说导入的数据都不会写入到二进制日志中

图片

图片

    通过上面的截图,已经非常清楚了,使用mysqldump或者mysqlpump导出的数据进行导入的话都不会写到二进制日志,这个在单机的MySQL实例上导入没有问题,但在是主从复制或者MGR等依赖主从复制环境的架构中是个非常坑的问题 ,因为从库就是读取主库的二进制,现在导入的数据都不写二进制日志了,那么从库还复制啥子数据,当然MySQL也提供了解决办法,就是在使用mysqldump或者mysqlpump导出时加上--set-gtid-purged=OFF参数(两个导出工具都支持--set-gtid-purged参数,并且功能都是一样的),关于这个参数的介绍如下:

mysqldump中--set-gtid-purged参数:

默认值

AUTO

可以设置的值

OFF
ON
AUTO

作用

    用于使用基于 GTID 的复制的实例(gtid_mode=ON)。它控制是否在导出文件中包含 SET @@GLOBAL.gtid_purged 语句,该语句更新在重新加载导出文件的目标服务器上 gtid_purged 的值, 将源服务器的 gtid_executed 系统变量中的 GTID 集合添加到目标服务器中。gtid_purged 保存了服务器上所有已执行事务的 GTID,但这些事务不再存在于任何二进制日志文件中。因此,mysqldump 会将源服务器上已执行事务的 GTID 添加到导出文件中,以便目标服务器记录这些事务为已应用,尽管它们不在目标服务器的二进制日志中。--set-gtid-purged 还控制是否在导出文件中包含 SET @@SESSION.sql_log_bin=0 语句,该语句在重新加载导出文件时禁用二进制日志记录。此语句会防止在执行导出文件中的事务时生成和分配新的 GTID,从而确保事务使用原始的 GTID。

AUTO(默认值):SET @@GLOBAL.gtid_purged、 SET @@SESSION.sql_log_bin=0语句会添加到输出中

OFF:SET @@GLOBAL.gtid_purged、SET @@SESSION.sql_log_bin=0不会被添加到输出中

ON:SET @@GLOBAL.gtid_purged、 SET @@SESSION.sql_log_bin=0语句会添加到输出中。如果在没有启用 GTID 的服务器上设置了此选项,则会发生错误。对于启用了 GTID 的服务器,可以使用此选项或 AUTO,除非你确定 gtid_executed 中的 GTID 在目标服务器上不需要。

mysqlpump中--set-gtid-purged参数:

默认值

AUTO

可以设置的值

OFF
ON
AUTO

作用

    此选项通过指示是否将 SET @@GLOBAL.gtid_purged 语句添加到输出中,从而控制写入转储文件的全局事务ID(GTID)信息。此选项还会再SQL文件中写入一条禁用二进制日志的SET @@SESSION.sql_log_bin=0 语句。

AUTO(默认值):SET @@GLOBAL.gtid_purged、 SET @@SESSION.sql_log_bin=0语句会添加到输出中

OFF:SET @@GLOBAL.gtid_purged、SET @@SESSION.sql_log_bin=0不会被添加到输出中

ON:SET @@GLOBAL.gtid_purged、 SET @@SESSION.sql_log_bin=0语句会添加到输出中。如果在没有启用 GTID 的服务器上设置了此选项,则会发生错误。对于启用了 GTID 的服务器,可以使用此选项或 AUTO,除非你确定 gtid_executed 中的 GTID 在目标服务器上不需要。

    从参数介绍可以看出,不管是mysqldump还是mysqlpump在使用--set-gtid-purged=OFF参数时都会将设置gtid的语句SET @@GLOBAL.GTID_PURGED和SET @@SESSION.SQL_LOG_BIN取消掉,所以加上--set-gtid-purged=OFF参数可以解决两个问题:

解决的问题一:如果导入的主库实例已经存在了gtid全局事务标识符,那么导出开启gtid的实例时就必须加上--set-gtid-purged=OFF,因为不加的话直接导出的SQL文件中会有设置SET @@GLOBAL.GTID_PURGED这行,就会导致报错:GTID_PURGED can only be set when GTID_EXECUTED is empty。

解决的问题二:导入的主库实例下面还挂有从库,那么导出开启gtid的实例时就必须加上--set-gtid-purged=OFF,因为不加的话直接导出的SQL文件中会有设置SET @@SESSION.SQL_LOG_BIN=0这行,就会导致导入的数据不写二进制日志,没有二进制日志从库也就没有数据了

    那么继续演示下,在开启gtid的实例上通过mysqldump或者mysqlpump导出时加上--set-gtid-purged=OFF参数,演示如下:

在开启gtid的实例上使用mysqldump导出数据加上--set-gtid-purged=OFF,查看SQL文件:

[root@ha1 backup]# mysqldump -uroot -p123456 --set-gtid-purged=OFF --single-transaction --master-data=2 --flush-logs --flush-privileges --routines --events --all-databases --log-error=mysqldump_liudbwycs_3306_err.log  --skip-add-locks --socket=/liu_data/mysql5.7/data/3306/liu.sock  > mysqldump_liudbwycs_3306.sql

可以看到使用mysqldump不管在5.7还是8.0中加上--set-gtid-purged=OFF参数,不仅会去掉SET @@GLOBAL.GTID_PURGED、SET @@MYSQLDUMP_TEMP_LOG_BIN,还会去掉SET @@SESSION.SQL_LOG_BIN

图片

图片

在开启gtid的实例上使用mysqlpump导出数据加上--set-gtid-purged=OFF,查看SQL文件:

[root@ha1 backup]# mysqlpump -uroot -p123456 --set-gtid-purged=OFF --single-transaction --users --default-parallelism=2 --all-databases --exclude-databases=mysql --log-error-file=mysqlpump_liudbwycs_3306_err.log --extended-insert=10000 --socket=/liu_data/mysql5.7/data/3306/liu.sock  > mysqlpump_liudbwycs_3306.sql

可以看到使用mysqldump不管在5.7还是8.0中加上--set-gtid-purged=OFF参数,只会去掉SET @@GLOBAL.GTID_PURGED,不会去掉SET @@SESSION.SQL_LOG_BIN,但官方文章中明确标注mysqldump加上--set-gtid-purged=OFF参数是会去掉SET @@SESSION.SQL_LOG_BIN的,但实际并没有去掉,所以这是这个工具的一个bug。

图片

图片

    这也就是为啥使用mysqlpump导出开启gtid实例的数据,并且我也已经加上--set-gtid-purged=OFF参数了,但导入主库后,从库还没有数据的原因。


    mysqlpump这个bug虽然很小,但对于在开启gtid全局事务标识符的主从环境中使用mysqlpump导出的数据进行导入来说是非常严重的,导致了主从数据不一致。目前这个bug至少在5.7和8.0版本都存在,使用这两个版本的小伙伴们可以避坑一下,也希望MySQL在之后的大版本中进行优化😳

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/94289.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/94289.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

低质量视频变高清AI:告别模糊,重现清晰画质

在数字时代,视频内容的创作和消费日益普及,然而,许多早期拍摄或存储的视频,由于技术限制或压缩等原因,往往存在画质不佳的问题,如模糊、噪点多、分辨率低等。这不仅影响观看体验,也限制了这些珍…

Linux入门教程 第十二章 防火墙

文章目录前言一、 iptables 概述Netfilter二、iptables 的表、链结构2.1 ptables的四表五链结构介绍2.1.1 四表五链2.1.2 四表2.1.3 **五链**2.2 数据包过滤的匹配流程(数据包到防火墙)2.2.1 规则链之间的匹配顺序:主机型防火墙:2.2.2 规则链内的匹配顺序…

单词搜索+回溯法

题目&#xff1a;思考&#xff1a; 1.经典回溯 实现&#xff1a; class Solution { public:bool find_word(vector<vector<char>>&board,string word,int pos,int i,int j){bool retfalse;if (posword.size()-1) return board[i][j]word[pos];if (board[i][j…

【嵌入式开发 Linux 常用命令系列 8 -- git checkout 解冲突详细介绍】

文章目录1. Git 冲突产生的场景2. 冲突标记符号解释3. git checkout --ours 和 git checkout --theirs语法含义使用场景4. 操作完成后的流程5. 举例演示1. Git 冲突产生的场景 当你在 git merge、git rebase、git cherry-pick 等操作时&#xff0c;如果 同一个文件的同一部分在…

16-day13强化学习和训练大模型

强化学习 强化学习和监督学习是机器学习中的两种不同的学习范式 强化学习&#xff1a;目标是让智能体通过与环境的交互&#xff0c;学习到一个最优策略&#xff0c;以最大化长期累积奖励。 例如&#xff0c;在机器人导航任务中&#xff0c;智能体需要学习如何在复杂环境中移动&…

OpenAI o1:OpenAI最新推出的AI大语言模型,更擅长推理也更贵

本文转载自&#xff1a;OpenAI o1&#xff1a;OpenAI最新推出的AI大语言模型&#xff0c;更擅长推理也更贵 - Hello123工具导航 ** 一、&#x1f916; OpenAI o1 是什么&#xff1f; OpenAI o1 是 2024 年推出的推理特化型 AI 模型&#xff0c;主打 “慢思考、深分析”&#…

自然语言处理——03 RNN及其变体

1 认识RNN 1.1 概念循环神经网络 RNN &#xff08;Recurrent Neural Network&#xff0c;简称RNN&#xff09;——处理序列数据的神经网络&#xff1b;一般以序列数据作为输入&#xff0c;通过网络内部的结构设计有效捕捉序列之间的关系特征&#xff0c;一般也是以序列形式进行…

量子计算基础

量子计算 量子计算一般由三个基本步骤组成&#xff1a;制备输入量子态、对于量子态执行幺正变换以及测量输出态&#xff0c;这里将介绍这三个基本要素。 1 量子态 与经典计算中比特(bit)的概念相对应&#xff0c;量子计算中最小信息载体和处理单位是量子比特(quantum bit, or t…

Apache Maven 3.1.1 (eclipse luna)

Apache Maven 3.1.1 &#xff08;eclipse luna&#xff09;D:\apache-maven-3.1.1\binMAVEN_HOME:D:\apache-maven-3.1.1PATH:D:\apache-maven-3.1.1\binmvn -vMaven Integration for Eclipse(Luna)

应用篇#1:YOLOv8模型在Windows电脑摄像头上的部署

一、前言如何部署YOLOv8模型在摄像头上是完成模型应用必须解决的问题&#xff0c;通过使用“cv2”这个库&#xff0c;可以完成对电脑摄像头的调用&#xff08;本人Windows联想&#xff09;&#xff0c;实时检测并输出图像。二、代码实现与解读import warnings import cv2 from …

关于内存泄漏的一场讨论

下面是以前&#xff08;大概2003、2004年吧&#xff09;在某BBS上的一场关于内存泄漏的讨论。我先原样贴出当时存档的&#xff0c;如果C友友兴趣&#xff0c;我再整理成文章。发信人: tianshangfei(天上飞的猪), 信区: C 标 题: 什么叫做内存泄漏&#xff0c;谁能定义一下呢 :…

Java全栈开发实战:从基础到微服务的深度解析

Java全栈开发实战&#xff1a;从基础到微服务的深度解析 一、面试官开场介绍 面试官&#xff08;微笑&#xff09;&#xff1a;你好&#xff0c;我是今天的面试官&#xff0c;我们公司是互联网大厂&#xff0c;负责前端和后端的全栈开发。今天主要想了解你在技术方面的掌握情况…

深度学习--PyTorch代码框架

一代码import torch print(torch.__version__) # 验证安装的开发环境是否正确 MNIST 包含 70,000 张手写数字图像&#xff1b;60,000 张用于训练&#xff0c;10,000 张用于测试。 图像是灰度的&#xff0c;28x28 像素的&#xff0c;并且居中的&#xff0c;以减少预处理和加快运…

LinkedIn 自动消息发送工具

LinkedIn 自动消息发送工具说明文档 一、项目概述 本项目是一个基于 Python 的自动化工具&#xff0c;用于批量向指定 LinkedIn 用户发送消息。 核心功能包括&#xff1a; 读取消息模板和 URL 列表&#xff1b;使用浏览器模拟操作&#xff0c;自动发送 LinkedIn 消息&#xff1…

新的 macOS 安装程序声称能够快速窃取数据,并在暗网上销售

一种新型 macOS 信息窃取恶意软件&#xff0c;被命名为 Mac.c&#xff0c;已成为地下恶意软件即服务 (MaaS) 生态系统中强大的竞争者。 Mac.c 由使用化名“mentalpositive”的威胁行为者公开开发&#xff0c;是臭名昭著的 Atomic MacOS Stealer (AMOS) 的简化衍生品&#xff0…

我的小灶坑

最近在写项目 有时候希望有个人能跟我一起来写 这样子交流中也能有很多新的想法 但也并不是都是优点 因为我现在不是处于对这个项目的每个步骤都很熟悉的阶段。 我觉得一个人从零到一确实能捋顺不少 但是我在做项目的时候发现自己经常容易被细节的部分牵制 比如说一个按钮的样式…

6.4 Element UI 中的 <el-table> 表格组件

一、 核心组成与基本结构Element UI 的表格主要由以下几个核心部分构成&#xff1a;<el-table>: 表格的根容器&#xff0c;负责管理数据、选择、排序、分页集成等全局状态。<el-table-column>: 定义表格的一列。表格的列结构由一个或多个 <el-table-column> …

Linux 软件编程(十一)网络编程:TCP 机制与 HTTP 协议

五、TCP 进阶机制&#xff08;一&#xff09;TCP 头部标志位TCP 头部的标志位是控制通信行为的 “开关”&#xff0c;常用标志位功能&#xff1a;标志位含义典型场景SYN请求建立连接三次握手第一步&#xff0c;发起连接请求ACK响应报文确认回复对方&#xff0c;确认已收到数据P…

[element-plus] el-table在行单击时获取行的index

el-table中添加 row-class-name&#xff0c;绑定row-click事件 <el-table:data"list":row-class-name"tableRowClassName"row-click"handleRowClick" > </el-table>给el-table中的每个row对象里添加index属性 tableRowClassName({…

真实应急响应案例记录

成功溯源的应急背景事件背景&#xff1a;服务器被植入博彩黑链入侵排查查看日志&#xff1a;发现Struts2漏洞利用痕迹通过process monitor工具监控Web进程(java.exe),发现执行了以下命令:攻击入侵者服务器查看Web日志,可发现攻击者的的Ip地址61.139.77.xx (四川省成都市 61.139…