Xtrabackup(innobackupex) 的一次还原数据库实战....

善良单纯的小阿板
创建时间: 2018年11月5日 庆丰六年
最后编辑: 2018年11月5日 5 年前
显然,这肯定不是一次我想要的实战。

背景

众所周知,mysqlworkbench 导出导入,每个表是一个整句的 insert,所以导致众所周知的,如果你用老版本的数据覆盖新的,新的数据是会被清掉的,binlog 当中,只能看到一打打打句的 insert,很难从 binlog 中恢复。

没错,我就做了这件事情。导入数据的时候选错了选选项卡....丢掉了一部分线上数据

do

首先,看人都推荐 binlog2sql,我就上车了。但是由于服务器羸弱的硬盘性能和菊大的 binlog,还有大 python 八核围观的特性,跑不出来。

8watch1

此时,能采取的最小损失的方法就是每天早上五点钟的增量备份。终于(??)能吃到了 Rex 当年种下的 Xtrabackup 树的果子啦~~开心。

bak

每周一次的全量,每天一次的增量。道理我们都懂。但是...问了 Rex 之后发现,我们两个都没用这玩意还原过(难道用过这玩意的都被打死了?我们这是幸存者偏差?)。于是,简单的 lolo 文档和别人的博客,我们就上路啦。

首先呢,第0步,先停掉 mariadb,systemctl stop mysql,用 mysqldump 导出一次完整数据,以防万一。

mysqldump -u<user> -p<passw0rd> --all-databases > /tmp/2018.11.4.sql

最好异地存一下这个大 sql。

第一步,不要 像一些文章说的,直接删除数据库(你们就这么教人 rm -rf /data/mysql 的么?),先把原来的 mysql 数据文件夹改名(此时开始,推荐 sudo su 切换到 root 用户)

move /data/mysql /data/mysql.bak

然后新建一个同名文件

mkdir /data/mysql

/data/mysql 是数据库的数据目录,可以在 /etc/my.cnf 中找到

[mysqld]
datadir = /data/mysql

第二步,到备份的地方看看(一单小可爱们跑了怎么办呢,对吧

bakdir

因为全量和差量 开始时间不一样,我们的最近一次的全量备份是 2018-10-29_05-00-01

就决定从这个文件开始了

第三步,开始整合增量备份到全量备份。

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log --redo-only /backup/mysql/2018-10-29_05-00-01 

参数 --defaults-file,mysql 的配置文件,一定要是第一个参数,userpassword 不必多说,用 root 就可以,无 root 权限要足够高。

--use-memory 尽量给的大一点,内存拉满,肯定更快

--apply-log --redo-only 指的是基于 /backup/mysql/2018-10-29_05-00-01 准备还原数据

然后 等他结束...

第四步,依次增加增量备份

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log --redo-only /backup/mysql/2018-10-29_05-00-01 --incremental-dir=/backup/mysql/2018-10-29_05-30-01/

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log --redo-only /backup/mysql/2018-10-29_05-00-01 --incremental-dir=/backup/mysql/2018-10-30_05-30-01/

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log --redo-only /backup/mysql/2018-10-29_05-00-01 --incremental-dir=/backup/mysql/2018-10-31_05-30-02/

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log --redo-only /backup/mysql/2018-10-29_05-00-01 --incremental-dir=/backup/mysql/2018-11-01_05-30-01/

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log --redo-only /backup/mysql/2018-10-29_05-00-01 --incremental-dir=/backup/mysql/2018-11-02_05-30-01/

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log --redo-only /backup/mysql/2018-10-29_05-00-01 --incremental-dir=/backup/mysql/2018-11-03_05-30-01/

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log  /backup/mysql/2018-10-29_05-00-01 --incremental-dir=/backup/mysql/2018-11-04_05-30-01/

一定要注意 ,最后一个增量数据 去掉 --redo-only

增量全部搞完之后

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G --apply-log   /backup/mysql/2018-10-29_05-00-01

再戳一下全量

第五步,登登,还原全量包

innobackupex --defaults-file=/etc/my.cnf  --user=<user> --password=<passw0rld> --use-memory=8G  --copy-back /backup/mysql/2018-10-29_05-00-01

又一定要注意 如果你全是innodb,或者说即使不是,也不要使用 --rsync 选项。在 Btrfs 上,可能会导致 inode 无法动态分配导致的报磁盘不足错误。

导入完成之后,systemctl start mysql 就ok啦~~

ending

大家就当无事发生过~

其他

对于 brtfsdumpe2fs /dev/sda 会得到

dumpe2fs: Bad magic number in super-block while trying to open /dev/sda3
Couldn't find valid filesystem superblock.

emmmmm,讲道理,这就是 brtfs 先进的地方了吧。

在稳健的 centos7 当中,df -i 对于 brtfs,会显示 inode 为 0