代码改变世界

MySQL8升级对备份的影响

2023-01-13 08:59  abce  阅读(137)  评论(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都是被停掉的。

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秒。

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。