kunpengcompute / kunpengcompute.github.io

Kunpeng Tech Blog: https://kunpengcompute.github.io/
Apache License 2.0
17 stars 5 forks source link

在arm64平台上对MariaDB进行备份恢复测试 #52

Open zhaorenhai opened 4 years ago

zhaorenhai commented 4 years ago

作者: zhaorenhai

本文计划测试下MariaDB的备份恢复功能在arm64平台上的运行情况,给有兴趣在arm64平台上部署MariaDB的小伙伴提供个参考。

测试平台选择华为云上8C16G的鲲鹏虚拟机,OS为Ubuntu18.04, MariaDB我们计划选择github上的最新版本来进行测试。

首先从https://github.com:/MariaDB/server fork一份最新的代码到自己的仓库。

然后登陆我们的虚拟机,创建一个用户:

adduser mariadb 后续所有的工作都在这个用户下进行。

切换到这个用户,并下载刚刚fork的代码,并进行编译.

su - mariadb
git clone https://github.com/zhaorenhai/server
sudo apt-get install build-essential libncurses5-dev gnutls-dev bison zlib1g-dev ccache libnuma-dev libxml2-dev cmake
mkdir build-mariadb-server
cd build-mariadb-server
#加入RelWithDebInfo选项,是为了后续如果需要进行对性能分析的话,可以用perf工具看到代码
cmake ../server -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build .

现在我们有了一个最新版本的数据库程序,下面我们继续创建数据库的配置文件,并将数据库运行起来

创建一个数据库参数文件: vi ~/mariadb.cnf

设置如下参数

[mariadb]
#数据文件目录
datadir = /home/mariadb/data/dir
#path to source dir + sql/share
lc_messages_dir = /home/mariadb/server/sql/share
#buffer pool,配置成8G,我们预留一部分内存给OS和其他工具
innodb_buffer_pool_size = 8G
#redo log 配置成1G
innodb_log_file_size = 1G
#flush_method配置成o_direct,可以减少文件系统的cache占用内存
innodb_flush_method = O_DIRECT
#跳过root用户登陆权限验证
skip-grant-tables
#开启binlog
log-bin

运行数据库

mkdir -p /home/mariadb/data/dir
./scripts/mysql_install_db --srcdir=../server --defaults-file=~/mariadb.cnf
sql/mysqld --defaults-file=~/mariadb.cnf

现在一个数据库就运行起来了,我们本文的主要目的是测试备份和恢复功能,在此之前我们还要加载一些数据,我们尽量加载多一点数据。加载数据的工具我们用tpcc-mysql工具,只用他的数据加载功能。

sudo apt install libmariadbclient-dev
git clone https://github.com/Percona-Lab/tpcc-mysql
cd tpcc-mysql/src
make
cd ..
export PATH=~/build-mariadb-server/client:$PATH  
mysqladmin create tpcc100
mysql tpcc100 < create_table.sql
./tpcc_load -h127.0.0.1 -d tpcc100  -u root -p "" -w 100
mysql tpcc100 < add_fkey_idx.sql

下面开始测试数据库的备份功能。

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目录下,我们进入到那个目录执行:

cd ~/build-mariadb-server/extra/mariabackup
./mariabackup --backup --target-dir=/home/mariadb/data/backup -uroot -pbackuptest 
./mariabackup --prepare --target-dir=/home/mariadb/data/backup

整个备份两分钟左右就完成了,速度还是比较快的。

我们继续测试一下恢复:

恢复的时候要停止数据库。

然后我们将原数据目录备份一下,创建一个新目录,因为恢复的时候数据文件目录必须是空的

cd /home/mariadb/data
mv dir dirbak
mkdir dir

然后开始恢复:

cd ~/build-mariadb-server/extra/mariabackup
./mariabackup --copy-back --target-dir=/home/mariadb/data/backup --datadir=/home/mariadb/data/dir/

恢复只用了一分半钟

下面我继续测试下无损恢复。

假设如下场景:做了数据库备份以后,又新建了一些表,插入了一些数据,但是还没有来得及备份,这个时候数据库数据全被人删除了,但是备份文件和binlog还在。我们试试用备份文件和binlog来将数据库完全恢复出来。

我们先和之前一样,用mariabackup工具先备份一下数据库,然后再执行如下sql先创建一些表,插入一些数据

create database test;
use test;
create table binlogtest(id int, descs varchar(10));
insert into binlogtest values(1, 'test1');
insert into binlogtest values(2, 'test2');
commit;

然后执行如下命令,模拟数据文件全被人清除。我们这里用了mv,主要也是为了保留binlog文件,毕竟我们测试环境,binlog没有做多份复制。

cd /home/mariadb/data
mv dir dirbak2
mkdir dir

现在数据文件全被清除了,我们先用mariadbbackup恢复备份时的文件,先把数据库停掉,然后执行如下命令

cd ~/build-mariadb-server/extra/mariabackup
./mariabackup --copy-back --target-dir=/home/mariadb/data/backup --datadir=/home/mariadb/data/dir/

然后将数据库启动,登陆数据库

用如下sql去查询

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

cd /home/mariadb/data/dirbak2
mysqlbinlog mariadb-arm-perf-test-bin.000001 --start-position=344| mysql -uroot -pbackuptest

然后再次登陆数据库查询之前的binlogtest表,就会发现数据已经恢复。

至此经过测试,我们可以发现MariaDB的各项备份恢复功能在arm64平台上都能完美运行,而且性能也不错。