前端开发入门到精通的在线学习网站

网站首页 > 资源文章 正文

innobackup专题3-备份恢复指定表

qiguaw 2024-11-19 09:08:27 资源文章 13 ℃ 0 评论

场景:当我们想要备份恢复表的时候,一般使用导出为sql的方式,当时如果遇到数据量大的表,导出sql时很慢,导入的时候就更慢了;这里使用innobackup工具进行演示导出导入,速度快,基本相当于cp复制的速度,上限取决于磁盘的读写速度了就;

一、单个表的备份恢复

本操作示例模拟从A数据库备份code.user表,导入到B数据库;

1、备份指定表

——备份code库中的user表

在A数据库进行表备份

innobackupex --defaults-file=/etc/my.cnf --databases="code.user" --user=root --password=123456 ./code_user_back

--databases=""内参数可以以空格为单位分开,从而备份多个;

2、恢复操作

——回滚事务

对备份生产的文件夹进行事务的回滚,防止未提交事务导致数据缺失;

innobackupex --apply-log --export code_user_back/

此时查看文件夹内,user表有 .cfg、.exp、.frm、.ibd

[root@node2 mysql]# ls code_user_back/code/
user.cfg  user.exp  user.frm  user.ibd

备份的每个表都会有这四个文件;

——创建对应的库和表

(在B数据库中创建对应的库和表)

示例:

mysql> create database code;		#创建code库;
mysql> user code;
mysql> CREATE TABLE `user` (
    ->   `id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `username` varchar(50) NOT NULL,
    ->   `password` varchar(50) NOT NULL,
    ->   `name` varchar(20) NOT NULL,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8;

创建的表一定要和原库中的表一致;可以在原库mysql命令行中查看创建表时的命令;

use code;

show create code.user;

——清空表空间

由于使用的是单独表空间储存,所以清空单个表空间不会影响整个mysql库的数据

mysql> use code;
mysql> alter table user discard tablespace;			#清空user表空间

清空表空间后,在数据库物理目录下,code的user表就没有了user.ibd和user.cfg两个文件;

——复制表数据

将回滚事务后,code内表的 .frm、.ibd 两个文件复制到B数据库物理目录对应库下;

[root@node2 mysql]# cp code_user_back/code/user.ibd /usr/loca/mysql/data/code/
[root@node2 mysql]# cp code_user_back/code/user.cfg /usr/loca/mysql/data/code/

chown -R mysql:mysql /usr/local/mysql/data/

——导入表空间

mysql> use code;
mysql> alter table user import tablespace;

相当于user表重新读取了 user.ibd和user.cfg;

此时完成恢复;

3、说明

备份、恢复单独的表无需重启或初始化mysql。

如果这对的表比较多,需要频繁的清空每个表的表空间——复制表文件——导入表空间;

二、批量表的备份和恢复

上面介绍了单个表的备份恢复,那如果想备份多个表,且表也分散mysql实例的其他库中,该如何备份呢;有两种方式指定过个表;

1、通过命令行指定过个表

按照【四】中的 --databases 来指定多个表,以空格隔开,示例:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --databases="newcode.user newcode.mnoinfo" /data/dbBack/new_innobackup_datas/xpt_test --no-timestamp

在 --databases 参数中,newcode 是库名称,后面的user是表名称,多个以空格隔开;

执行后进行备份;

2、通过指定文件

如果备份很过个表,命令行会很长,不便于编辑。

可以读取指定文件,文件内填写要备份的表,即可一次性备份很多个表:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123456 --tables-file=/data/dbBack/new_innobackup_datas/tables.txt /data/dbBack/new_innobackup_datas/back_tables --no-timestamp

参数说明:

--tables-file:指定一个文件,文件内包含要备份的表;

文件格式为 database.table ,每行一个表,示例:

[root@localhost new_innobackup_datas]# cat tables.txt 
newcode.user
newcode.mnoinfo
newcode.project
hpdb.testedinfonew_roche
hpdb.sys_menu

我们先写好要备份的 库.表 名称,每行一个,不要有空格;

然后在执行时指定该txt文件,就会按照txt文件中的库表名来备份了;

3、批量表的恢复

在单表备份恢复中,已经讲述了备份恢复的原理。

如果恢复单表,手动恢复还是没有多少工作量的,但是设计了批量表的恢复,手动执行显然也是不行的,但是innobackup工具也没有给出批量表恢复的工具。

于是,针对批量表恢复的场景,我编写了python脚本工具,可以应对批量表的恢复场景。

关注我,下期发送批量表恢复的教程和工具,感谢大家支持!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表