写在前面:
笔者在实际工作中发现,对于数据恢复来说,更多情况下面临的问题是:单个数据库中的某个或者某几个表出现了问题,很少对整个库的数据进行恢复,除非硬盘损坏或者手抖执行了DROP,笔者就单库备份,单表恢复的场景进行记录(需要全库备份、全库恢复需求的同行,自行百度),如有不当之处,望请留言指正,不胜感激!
环境准备:
1)Xtrabackup版本的选择
不同版本的MySQL需要使用不同版本的 Percona XtraBackup。
笔者的MySQL版本是5.6的,需要下载2.2版本的Percona XtraBackup,另外MySQL5.1对应XtraBackup2.1,MySQL5.7对应XtraBackup2.4(笔者,没有验证,仅供参考)
[root@backup ~]# xtrabackup --version
xtrabackup version 2.2.13 based on MySQL server 5.6.24 Linux (x86_64) (revision id: 70f4be3)
2)创建一个最小化备份权限用户
mysql> grant reload,process,lock tables,replication client on *.* to xtrauser@'localhost' identified by 'xtrauser@123';
mysql> flush privileges;
3)这里利用的是表空间传输特性进行的数据恢复,所以你得是InnoDB表,而且开启了innodb_file_per_table参数
单库备份:
[root@backup
~]# innobackupex --databases='bailidb'
--defaults-file=/home/data/mysql3306/my.cnf --user='xtrauser'
--password='xtrauser@123' --socket='/tmp/mysql.sock' /home/dbback/
数据变更:
UPDATE `bailidb`.`bl_country` SET `keywords` = '取经' WHERE `id` = '8';
INSERT INTO `bailidb`.`bl_auth_assignment` (`item_name`, `user_id`, `created_at`) VALUES ('lzb', '2', '3');
增量备份:
[root@backup
~]# innobackupex --defaults-file=/home/data/mysql3306/my.cnf
--user='xtrauser' --password='xtrauser@123' --socket='/tmp/mysql.sock'
--incremental /home/increment
--incremental-basedir=/home/dbback/2019-04-04_16-20-28/
预备完整备份:
[root@backup home]# innobackupex --apply-log --redo-only /home/dbback/2019-04-04_16-20-28/
为什么预备完整备份?
因为在Xtrabackup备份过程中,可能会有新的事务生成,直接进行数据恢复的话,会造成数据的不一致,所以,在数据恢复之前,需要将Xtrabackup备份过程尚未提交的事务回滚,已经提交但未同步的事务进行同步,这个过程就叫预备完整备份
合并增量备份:
[root@backup
home]# innobackupex --apply-log --redo-only
/home/dbback/2019-04-04_16-20-28/
--incremental-dir=/home/increment/2019-04-04_16-23-45/
为什么要合并?
简单来说,就是将新增数据和原来的数据合并到一起,使其达到数据一致性
数据恢复:
1)将bailidb库的bl_auth_assignment表在test库创建(当然了,可以直接在原来的数据表基础上进行数据恢复,前提是你做了数据备份)
2)丢弃原来的ibd文件表空间
mysql>ALTER TABLE `bl_auth_assignment` DISCARD TABLESPACE
3)复制bl_auth_assignment表的ibd文件,到test库下
[root@backup home]# cp /home/dbback/2019-04-04_16-20-28/bailidb/bl_auth_assignment.ibd /home/data/mysql3306/test/
[root@backup home]# cd /home/data/mysql3306/test/
4)更改ibd文件权限
[root@backup test]# chown mysql.mysql bl_auth_assignment.ibd
5)导入表空间文件
ALTER TABLE `bl_auth_assignment` IMPORT TABLESPACE
6)最后将其复制到原来的数据库下(bailidb)