作者: zhaorenhai
本文计划测试下MariaDB的备份恢复功能在arm64平台上的运行情况,给有兴趣在arm64平台上部署MariaDB的小伙伴提供个参考。
测试平台选择华为云上8C16G的鲲鹏虚拟机,OS为Ubuntu18.04, MariaDB我们计划选择github上的最新版本来进行测试。
首先从https://github.com:/MariaDB/server fork一份最新的代码到自己的仓库。
然后登陆我们的虚拟机,创建一个用户:
adduser mariadb
后续所有的工作都在这个用户下进行。
切换到这个用户,并下载刚刚fork的代码,并进行编译.
1 | su - mariadb |
现在我们有了一个最新版本的数据库程序,下面我们继续创建数据库的配置文件,并将数据库运行起来
创建一个数据库参数文件:vi ~/mariadb.cnf
设置如下参数
1 | [mariadb] |
运行数据库
1 | mkdir -p /home/mariadb/data/dir |
现在一个数据库就运行起来了,我们本文的主要目的是测试备份和恢复功能,在此之前我们还要加载一些数据,我们尽量加载多一点数据。加载数据的工具我们用tpcc-mysql工具,只用他的数据加载功能。
1 | sudo apt install libmariadbclient-dev |
下面开始测试数据库的备份功能。
MariaDB数据库备份分为了逻辑备份和物理备份。
逻辑备份的优点是备份的文件都是sql或者是格式化的文本文件,可以用于其他类型的数据库,也方便导入或者数据迁移,缺点就是备份的时候对数据库性能影响较大,而且恢复的时候比较慢。MariaDB用于逻辑备份的工具就是mysqldump。
物理备份其实就是对于数据库物理文件的备份,因此对数据库影响相对较小,但是备份出的文件不能用于其他类型的数据库。仅能用于备份恢复使用。 MariaDB用于物理备份的工具是mariabackup。
MariaDB的逻辑备份和物理备份都是对于某一个时间点数据库的备份,并不能做到完全的无损恢复,如果要做到无损恢复,还需要用到对于binlog日志的重放功能,MariaDB实现这个的工具主要是mysqlbinlog。
下面我们逐个来测试下这三个工具。
首先测试下逻辑备份。
mysqldump --all-databases --master-data=2 --single-transaction > all_databases.sql
上面命令中的–master-data=2选项的意思是在备份文件中记录备份时的binlog位置,如果后续做无损恢复的话,可以给mysqlbinlog工具提供开始恢复的位置。–single-transaction的意思是备份在一个事务里执行,这样可以不影响其他会话的正常运行,也可以保证备份数据的一致性。
我们的data目录一共8.6G,只花了3分钟就备份完毕,备份文件7.2个G,性能还是可以的。当然这和所用的磁盘也是有关系的。我们这里用的是华为云的SSD,速度会快一点。
逻辑备份的恢复也很简单,直接执行导出的sql文件即可。我们这里只是测试,所以就直接在原库上执行了。
mysql -u root < all_databases.sql
上面7.2G的sql大概执行了21分钟左右,性能也还可以,如果是在一个新的数据库上恢复,估计会更快一点。
我们继续测试下物理备份。
先创建一个备份文件存放的目录:
mkdir -p /home/mariadb/data/backup
然后备份的时候不能有skip-grant-tables选项,我们先将备份文件中的这个配置项删除,重启数据库,然后执行mysql
进入数据库,修改root用户密码:
alter user 'root'@'localhost' identified by 'backuptest';
我们编译出来的mariabackup在编译目录的extra目录下,我们进入到那个目录执行:
1 | cd ~/build-mariadb-server/extra/mariabackup |
整个备份两分钟左右就完成了,速度还是比较快的。
我们继续测试一下恢复:
恢复的时候要停止数据库。
然后我们将原数据目录备份一下,创建一个新目录,因为恢复的时候数据文件目录必须是空的
1 | cd /home/mariadb/data |
然后开始恢复:
1 | cd ~/build-mariadb-server/extra/mariabackup |
恢复只用了一分半钟
下面我继续测试下无损恢复。
假设如下场景:做了数据库备份以后,又新建了一些表,插入了一些数据,但是还没有来得及备份,这个时候数据库数据全被人删除了,但是备份文件和binlog还在。我们试试用备份文件和binlog来将数据库完全恢复出来。
我们先和之前一样,用mariabackup工具先备份一下数据库,然后再执行如下sql先创建一些表,插入一些数据
1 | create database test; |
然后执行如下命令,模拟数据文件全被人清除。我们这里用了mv,主要也是为了保留binlog文件,毕竟我们测试环境,binlog没有做多份复制。
1 | cd /home/mariadb/data |
现在数据文件全被清除了,我们先用mariadbbackup恢复备份时的文件,先把数据库停掉,然后执行如下命令
1 | cd ~/build-mariadb-server/extra/mariabackup |
然后将数据库启动,登陆数据库
用如下sql去查询
1 | select * from test.binlogtest; |
会得到错误提示,表不存在。
下面我们尝试用binlog来恢复
首先查看备份文件的xtrabackup_binlog_info文件,找到开始恢复的pos点
cat xtrabackup_binlog_info
结果如下
mariadb-arm-perf-test-bin.000012 358 0-1-7541
说明开始恢复的pos点应该是358
1 | cd /home/mariadb/data/dirbak2 |
然后再次登陆数据库查询之前的binlogtest表,就会发现数据已经恢复。
至此经过测试,我们可以发现MariaDB的各项备份恢复功能在arm64平台上都能完美运行,而且性能也不错。