首页 > 编程知识 正文

自然人系统数据库还原失败,备份出错是怎么回事

时间:2023-05-04 08:18:20 阅读:148108 作者:4173

如果实例存在,则可以根据实例的状态查询ALL_GTID。

如果实例崩溃,则无法在实例状态下查询ALL_GTID。 可以通过查询BINLOG的Previous-GTIDs计算来获取ALL_GTID。

以下列举了与ALL_GTID相关的变量。

与ALL_GTID相关的变量

Previous-GTIDs

Previous-GTIDs的格式如下。 环境为MySQL5.7,日志手动在flush binary logs中获取。

浏览新轮转的BINLOG :

mysql-bin.00001中包含的GTID如下所示。

请点击输入图像的说明

然后再次使用flush binary logs:

请点击输入图像的说明

mysql-bin.00002中没有GTID。

请点击输入图像的说明

因此,Previous-GTIDs是自身这个BINLOG文件之前的所有BINLOG的集合。

请点击输入图像的说明

全局变量中与GTID相关的变量

请点击输入图像的说明

变量解释:

GTID_executed表示执行服务器上的所有事务所生成的GTID。 这包括已经purge的BINLOG的GTID或手动设置GTID _ purged的gtid。

GTID_purged表示已经purge的gtid。 gtid_purged是gtid_executed的子集。

GTID_retrieved是桌面上relay_log的gtid。

ALL_GTID计算

了解GTID相关变量后,可以获得获取实例的All_GTID集合的方法。

对象

方法

存活的主实例gtid_executed

生存的Slave实例gtid_executed和gtid_retrieved的并集

非存活主实例的最后一个BINLOG文件的Previous-GTIDs最后一个BINLOG文件中的所有GTID

未存活的Slave实例的最后一个BINLOG文件的Previous-GTIDs最后一个BINLOG文件中的所有GTID

如果获取非存活实例的ALL_GTID,则必须扫描最后一个BINLOG文件,因为最后一个BINLOG文件的GTID可能不是连续的。 例如,事务既来自此实例的客户端,也来自复制播放。

在生产环境中,我们使用Xtrabackup通过实例创建了流程。

进行备份和恢复

变更主目标

set @@global.gtid_purged='xxx ';

set @@global.gtid_purged='xxx '; 的影响:

如果手动将实例的ALL_GTID设置为xxx,则使用GTID方法创建复制时不会发生错误。

Binlog中记录的Previous-GTIDs被更新(因为Binlog不能变更,所以生成新的Binlog,新的Previous-GTIDs被记录)。

MySQL 5.7中set gtid_purged的行为更改

问题的说明

请检查备份恢复过程:

进行备份和恢复

变更主目标

set @@global.gtid_purged='xxx ';

症状:MySQL5.7的Slave服务器恢复后,发现未生成正确的预配ids。

分析

分析整个过程,解决问题要分阶段进行手动模拟来发现问题。 详细步骤如下所示。

手动恢复备份

环境

BINLOG数,Previous-GTIDs状态

Xtrabackup 2.4.2 MySQL 5.6 1,空

Xtrabackup 2.4.2 MySQL 5.7 1,空

Xtrabackup 2.2.9 MySQL 5.6 1,空

Xtrabackup 2.2.9 MySQL 5.7 1,空

可以看到:恢复过程不会轮换BINLOG。

检查在不同版本的MySQL上执行change master和set gtid_purged的差异

环境

BINLOG数,Previous-GTIDs状态

更改主文件MySQL 5.6 1,为空

更改主文件MySQL 5.7 1,为空

set gtid_purged MySQL 5.6 2,正常

set gtid_purged MySQL 5.7 1,为空

在:上运行set gtid_purged时,可以看到MySQL版本之间存在差异

验证

针对不同版本的MySQL分别设置set @@global.gtid_purged=' '; 语句。 检查结果

环境

的操作

BINLOG数,Previous-GTIDs状态

MySQL 5.7重置主程序; set @@global.gtid_purged="; 1、天空

MySQL 5.6重置主程序; set @@global.gtid_purged="; 2、正常

结论

请参阅:3358 bugs.MySQL.com/bug.PHP? id=75767

在公式解释: 5.7版中,执行SET GTID_PURGED语句后,binlog_simple_gtid_recovery会为GTID_PURGED计算错误的值。

存储GTID的表已添加到5.7中。 所以在5.7版中set @@global.gtid_purged=' '; 语句已更改为仅修改存储GTID的表。

5.6版将向BINLOG轮转和Previous_GTIDs_log_event添加gtid。 如果需要在5.7中生成与5.6相同的结果,则可以在SET GTID_PURGED语句之后手动执行flush binary logs语句。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。