代码改变世界

MySQL8升级对备份的影响

  abce  阅读(141)  评论(0编辑  收藏  举报

​最近将MySQL5.7.26升级到8.0.27后,备份遇到了一些问题。

升级采用的是使用复制节点的备份,使用percona xtrabackup做的的物理备份。

对于MySQL5.7,用的是PXB2.4做的物理备份。考虑到兼容性的问题,在升级到MySQL8.0后,也将PXB升级到了8.0.27。

在讨论遇到的问题之前,来看看PXB的一些选项:

·slave-info

打印和存储源库的二进制日志的位置

·safe-slave-backup

帮助处理复制节点的临时表,当使用该参数时,会停止sql thread、等待直到没有临时表表了才会开始备份

·lock-ddl

备份时,该选项会阻塞从库上所有的ddl操作,这样就不会有ddl事件损坏备份。dml事件仍然会继续,只会阻塞ddl事件。

回来之前提到的问题,在数据库顺利升级到MySQL8.0.27之后,我们遇到了好几个与备份有关的问题。其中一个主要的问题就是在从库执行备份的时候,从库复制失败了。

 

通过以下两项我们确定了在升级后没有做别的改动:

1.备份命令没有变化

2.所有表都是innodb表,没有发生引擎变化

 

此外,我们发现,一旦pxb开始备份,所在的从库的复制就会停止。进一步检查,我们发现只是sql thread停止了,而io thread是运行的。这就指向一个事实,复制中断是因为pxb在备份的时候开启了--safe-slave-backup选项。在从库执行备份也是推荐开启该参数。

然后,我们注意到在5.7中,备份也是开启了选项--safe-slave-backup,但是备份运行正常且复制也不会受到影响。只不过在升级MySQL的同时,也将pxb从2.4.20升级到了8.0.27。

为了更深入的了解,我做了一个简单的测试。使用PXB 8.0.27和PXB 2.4.26做备份。在测试中,发现PXB8.0,参数的--safe-slave-backup在备份开始后停掉了sql thread(在拷贝innodb文件之前)。在这个测试中,完整的备份需要20秒完成,在整个备份过程中,sql thread都是被停掉的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2022-12-23T10:43:00.668080-00:00 0 [Note] [MYTEST] [Xtrabackup] Using server version 8.0.27
 
**2022-12-23T10:43:00.717674-00:00 0 [Note] [MYTEST] [Xtrabackup] Slave open temp tables: 0
 
2022-12-23T10:43:00.720502-00:00 0 [Note] [MYTEST] [Xtrabackup] Slave is safe to backup.**
 
2022-12-23T10:43:00.720573-00:00 0 [Note] [MYTEST] [Xtrabackup] Executing LOCK INSTANCE FOR BACKUP 
 
...
 
...
 
...
 
2022-12-23T10:43:01.248442-00:00 2 [Note] [MYTEST] [Xtrabackup] Copying ./db/t.ibd to /root/backups/db/t.ibd
 
2022-12-23T10:43:01.980691-00:00 1 [Note] [MYTEST] [Xtrabackup] >> log scanned up to (64948804922)
 
...
 
...
 
**2022-12-23T10:43:19.589799-00:00 0 [Note] [MYTEST] [Xtrabackup] Executing FLUSH TABLES WITH READ LOCK...**
 
**2022-12-23T10:43:19.590675-00:00 0 [Note] [MYTEST] [Xtrabackup] Starting to backup non-InnoDB tables and files**
 
...
 
...
 
2022-12-23T10:43:20.610477-00:00 0 [Note] [MYTEST] [Xtrabackup] Finished backing up non-InnoDB tables and files
 
2022-12-23T10:43:20.676140-00:00 0 [Note] [MYTEST] [Xtrabackup] Stopping log copying thread at LSN 64948804922
 
2022-12-23T10:43:20.728679-00:00 0 [Note] [MYTEST] [Xtrabackup] Executing UNLOCK INSTANCE
 
2022-12-23T10:43:20.729034-00:00 0 [Note] [MYTEST] [Xtrabackup] Executing UNLOCK TABLES
 
2022-12-23T10:43:20.729254-00:00 0 [Note] [MYTEST] [Xtrabackup] All tables unlocked
 
**2022-12-23T10:43:20.729268-00:00 0 [Note] [MYTEST] [Xtrabackup] Starting slave SQL thread**
 
...
 
...
 
2022-12-23T10:43:22.099206-00:00 0 [Note] [MYTEST] [Xtrabackup] completed OK!

但是,在PXB 2.4版本中,sql thread只有在复制非InnoDB文件时才会停止,而在备份InnoDB文件时sql thread不会停止。因此,在整个20秒的备份过程中,sql thread只停止了4秒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Using server version 5.7.26
 
/usr/bin/xtrabackup version 2.4.26 based on MySQL server 5.7.35 Linux (x86_64) (revision id: 19de43b)
 
...
 
...
 
221223 11:20:21 [01] Copying ./db/t.ibd to /root/backups/db/t.ibd
 
221223 11:20:22 >> log scanned up to (3991557882)
 
...
 
221223 11:20:35 >> log scanned up to (3991557882)
 
221223 11:20:35 [01]        ...done
 
...
 
...
 
**221223 11:20:36 Slave open temp tables: 0
 
221223 11:20:36 Slave is safe to backup.**
 
221223 11:20:36 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
 
221223 11:20:36 Executing FLUSH TABLES WITH READ LOCK...
 
**221223 11:20:36 Starting to backup non-InnoDB tables and files**
 
...
 
...
 
221223 11:20:40 Finished backing up non-InnoDB tables and files
 
...
 
...
 
**221223 11:20:40 Executing UNLOCK TABLES
 
221223 11:20:40 All tables unlocked
 
Starting slave SQL thread**
 
...
 
...
 
221223 11:20:40 completed OK!

PXB的safe-slave-backup选项旨在确保数据库副本的一致备份。在8.0.22之前的版本中,该选项将在备份InnoDB表之后和复制非InnoDB数据文件之前停止SQL thread。但是,如果在备份过程中对备份副本执行复制的DDL语句,则可能导致备份损坏。

为了解决这个问题,在8.0.22版本中更改了safe-slave-backup选项的行为。现在,当指定此选项时,将在备份进程开始时发出"STOP SLAVE SQL_THREAD"命令。这可以防止在备份期间执行任何复制的DDL语句,确保备份的一致性和可靠性。

这就是为什么在PXB包升级到8.0后,当备份进程启动时复制被停止,并且它停止了SQL Thread,即使所有的表都是InnoDB。

 

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2022-01-13 Oracle18c主库日志被删除后如何恢复Standby数据库
2022-01-13 Oracle11g主库日志被删除后如何恢复Standby数据库
2022-01-13 Oracle12c主库日志被删除后如何恢复Standby数据库
点击右上角即可分享
微信分享提示