千家信息网

mysql备份恢复实例丢失事务分析

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,看到了一篇server id导致mysql备份恢复的时候丢失事务的文章,特此重现一下。主备开启了GTID,实验过程如下:1.主库执行:create database test1;create data
千家信息网最后更新 2025年01月20日mysql备份恢复实例丢失事务分析

看到了一篇server id导致mysql备份恢复的时候丢失事务的文章,特此重现一下。

主备开启了GTID,实验过程如下:

1.主库执行:create database test1;create database test2;2.主从没有延迟后备份,利用从库备份,物理或者逻辑都可以:mysqldump -uroot -poracle --single-transaction --master-data=2 --all-databases > dump.sql3.主库执行:create database test3;4.将主库干掉5.从库提升为主库,并且:create database test4;6.利用从库的备份恢复老的主库,并指向新主这个时候会发现,恢复出来的从库丢失了一个事务test3:mysql> show databases;+--------------------+| Database           |+--------------------+| information_schema || ming               || mysql              || performance_schema || sakila             || sys                || test1              || test2              || test4              || tt                 || world              |+--------------------+11 rows in set (0.00 sec)

文章说是因为server_id的缘故。

server id一个很大的作用是避免数据回环。所以事务中记录的sever id会是持久不变的,就像我们的身份证一样,

走到哪儿都不变。

老主库因为是利用从库的备份集还原出来的,执行过的事务是 6f5b02b9-1f08-11ea-9853-000c2970dcdf:1-4,

那么就要去向新主请求6f5b02b9-1f08-11ea-9853-000c2970dcdf:5事务。

新主的master-bin log文件中该事务如下:server id是1573854809 。而该server id正好是老主的server id,

此时该条记录就会被过滤掉。就不会传递到老主那边去。

# at 836#200328 11:23:25 server id 1573854809  end_log_pos 901 CRC32 0x23ffdc70         GTID    last_committed=4        sequence_number=5     rbr_only=noSET @@SESSION.GTID_NEXT= '6f5b02b9-1f08-11ea-9853-000c2970dcdf:5'/*!*/;# at 901#200328 11:23:25 server id 1573854809  end_log_pos 998 CRC32 0x2f611a1d         Query   thread_id=2     exec_time=4290974348    error_code=0SET TIMESTAMP=1585365805/*!*/;create database test3/*!*/;

那么为什么test4会被传递到老主被应用呢?因为该事务在新主master-bin log中如下,server id 1051295是新主的,

就不会被IO thread过滤.

# at 998#200211  6:19:19 server id 1051295  end_log_pos 1063 CRC32 0xec9c6a1e   GTID    last_committed=5        sequence_number=6       rbr_only=noSET @@SESSION.GTID_NEXT= '4c312339-ab38-11e9-86a8-000c29050245:1'/*!*/;# at 1063#200211  6:19:19 server id 1051295  end_log_pos 1160 CRC32 0xaccb28ab   Query   thread_id=2     exec_time=0     error_code=0SET TIMESTAMP=1581373159/*!*/;SET @@session.sql_mode=1151336480/*!*/;create database test4/*!*/;

那么为什么两条记录不一致呢?这是因为test3事务是老主传递过来的,那么在relay log中,master-bin log中,

以及向后传递到其它从库中的时候,server id是会一直被带下去的。test4事务是新主自己的事务,

那么从他自己的master-bin log,以及向后传递的从库的relay log和应用后生成的master-bin log中都会是新主的server id。

所以test3会被过滤,test4会被应用。

老的主库此时:

mysql> show master status\G*************************** 1. row ***************************             File: mysql-bin.000002         Position: 1443     Binlog_Do_DB:  Binlog_Ignore_DB: Executed_Gtid_Set: 1508afe9-70a7-11ea-8d70-000c2970dcdf:1-3,    --自己库里执行的事务4c312339-ab38-11e9-86a8-000c29050245:1,--主从传递下来的事务6f5b02b9-1f08-11ea-9853-000c2970dcdf:1-4--自己作为主的时候执行的事务1 row in set (0.00 sec)

新的主库:

mysql> show master status\G*************************** 1. row ***************************             File: mysql-bin.000002         Position: 1322     Binlog_Do_DB:  Binlog_Ignore_DB: Executed_Gtid_Set: 4c312339-ab38-11e9-86a8-000c29050245:1-2,6f5b02b9-1f08-11ea-9853-000c2970dcdf:1-51 row in set (0.00 sec)
事务 备份 时候 应用 主从 文章 很大 一致 作用 去向 后生 回环 指向 数据 文件 物理 缘故 被带 说是 身份 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 青年人应该怎么防范网络安全 数据管理节点服务器硬件选择 客户管理软件开发技术 服务器计算机管理 街机三国哪个服务器人最多 免费大数据库软件 计算机网络安全法包括 网络安全隐患相关图片 高校网络安全 暴恐音视频 关于计算机网络技术的体会 滨海新区媒体网络技术不二之选 云趣网络技术有限公司怎么样 无法验身份服务器出错 松江区创新软件开发服务收费 区委网信办网络安全微视频 木链科技互联网 如何优化亿级数据库技术 上海榕基软件开发分公司 域管理员无法远程连接服务器 市政府网络安全科 数据库可以修改视图吗 高博领域互联网科技有限公司 学生假期网络安全 计算机软件开发技术和应用 注意系统网络安全 生信 不同数据库下载的数据 数据库连接断开请检查网络 如何调用m文件中的数据库 深圳网辰互联网科技有限公司 济南博赛网络技术公司培训基地
0