zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

MYSQL 备份到底怎么办,XTRABACKUP 还是 mysql enterprise backup (1)

2023-02-18 16:23:52 时间

众所周知,MYSQL的版本更新的越来越快,明年或许就看到 MYSQL 9 的身影,大部分人都想试试,但先得泼一盆冷水,备份的事情你想好了吗?

基于MYSQL 不断的更新REDO LOG 的功能,同时对于并行方式在DDL 方也有所更新,导致XTRABACKUP 的备份软件,一直无法对其新版本的MYSQL。从下文看到,XTRABACKUP 经历了

1 MYSQL 8.020 后一段时间的 XTRABACKUP 无法对8.020 及以后的版本进行备份的问题

2 截止目前XTRBACKUP 只能对8.029 的数据库进行备份,更高版本的无法进行备份-- 目前还是不可以

在开始说备份的问题之前我们先看看8.020 对REDO 都做了什么

1 8.020 UNDO 表空间ID值的变化增加了数据字节的存储扩展,导致REDO LOG 记录的大小变化,引起IO 操作性能下降,所以需要修改日志的格式,为UNDO LOG 变化时,减少REDO LOG 所使用的日志大小而修改了REDO LOG 的格式。

这就是导致备份软件出现问题,无法继续对新版本MYSQL 进行备份的。

2 8.029 的问题在于之前DDL添加的列只能在表的列中的最后,而8.029后的版本则可以在列中任意的位置添加字段,这样的操作后,会导致在使用立即添加或删除会创建一个新的行版本最多允许64个行版本。

所以导致XTRABACKUP 在每次的一些数据库核心内部结构变化后,都不能进行数据的备份。

下面我们看看最新版本的XTRABACKUP 到底是不是能对目前的8.030 进行备份。

首先对于文件权限方面,xtrabackup 必须具有对MYSQL 的访问权限,也就是必须有读写用户的权利,同时基于读取大量的数据,使用posix_fadvise() 函数避免读取的数据进入到缓存中。

从文件中读取数据后,xtrabackup每次在1MB的缓冲区中迭代一个页面,并使用InnoDB的buf_page_is_corrupt()函数检查每个页面的页面损坏情况。如果页面损坏,它将为每个页面重新读取和重试最多10次。

我们下面就在MYSQL 8.030 上,尝试通过 8.029 XTRBACKUP 进行备份会产生什么问题。

在备份的数据库中,设置xtrabackup 需要最小的权限

mysql> create user 'backup'@'%' identified by '1234.Com';

Query OK, 0 rows affected (0.01 sec)

mysql> grant backup_admin,process,reload,lock tables,replication client on *.* to 'backup'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> grant select on performance_schema.log_status to 'backup'@'%';

Query OK, 0 rows affected (0.00 sec)

mysql> grant select on performance_schema.keyring_component_status to 'backup'@'%';

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec)

在备份的中,可以看下面的截图,的确因为MYSQL 8.029 更改了DDL 在表中的策略,导致目前备份软件只能支持到8.028的MSYQL 数据库。

我们在尝试一下8.027 MYSQL 匹配 8.029 xtrbackup, 同样的配置和命令的基础上,在MYSQL 8.027 是可以进行数据的备份操作的。

那么摆在现在的问题就是 8.029 和8.030 版本的数据库如果存在如何进行备份的问题。

下面我就试试ORACLE 提供的 mysql enterprise bakcup 工具软件对8.030是否能进行备份。

1 我们先建立相关的用户并针对MYSQLBAKCUP软件需要的权限进行赋予

mysql> create user 'mysqlbackup'@'%' identified by '1234.Com';

Query OK, 0 rows affected (0.01 sec)

mysql> grant select,backup_admin,reload,process,super,replication client on *.* to 'mysqlbackup'@'%';

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> grant create,insert,drop,update on mysql.backup_process to 'mysqlbackup'@'%';

Query OK, 0 rows affected (0.01 sec)

mysql> grant create,insert,drop,update,select,alter on mysql.backup_history to 'mysqlbackup'@'%';

Query OK, 0 rows affected (0.01 sec)

mysqlbackup --user=mysqlbackup --password=1234.Com --socket=/data/mysql.sock --backup-dir=/backup backup

通过上面的方法我们将MYSQL8.031 进行了简单的备份,由于只能通过试用的方式获得mysqlbackup 软件,并且只能选择 8.031版本,所以数据库也必须是 8.031 可以是社区版本,但需要注意的是,备份软件的版本和数据库软件本身的版本,不一致时将会报数据库版本和MEB 的版本不同,而拒绝备份的问题。

后续将针对两款备份软件,做相关的比较和功能的分析。