前言
目前有这样一个需求,需要备份mysql库中一个库中的默认几张表,因为以前只通过xtrabackup备份过全库或单库,从来没有备份过一个库中的几张表,所以记录一下踩坑经验。
方法
备份方法:
innobackupex有一个--tables-file参数,在备份的时候指定此参数,后面带一个数据库列表文件即可把所有指定表的指定库备份出来,此文件中所有表书写格式为数据库名.表名,多个表名分多行写就行。
考虑到这几个表比较大,所以可以通过--stream参数直接输出为tar包的格式,语句如下:
innobackupex --defaults-file=数据库配置文件 --user=用户名 --password=密码 --tables-file=数据库列表文件 --stream=tar . | xz - > /backup/test.tar.xz #--stream=tar 后面有一个目录,此处为当前目录“.”,此目录为备份文件临时存储目录,- > /backup/test.tar.xz 表示备份文件存储位置和存储名
恢复方法:
因为我要把这份备份文件恢复到其他服务器的数据库,一开始直接通过--apply-log和--copy-back之后发现恢复之后可以看到恢复的库和表,但是对表进行任何操作都会受到如下报错:
mysql错误日志报错如下:
后来查询xtrabackup的man手册和mysql的官方文档发现原因如下:innodb存储引擎的表在恢复到其他数据库的时候它的表空间是存放在.cfg文件中的,但是此时恢复会检测.cfg是否符合mysql的schema,所以就会报错。
解决方法:
在--apply-log的时候添加--export命令,把表空间保存为.exp文件,此时恢复的时候可以单独读取此表空间导出文件,然后就能正常对表进行操作了。
innobackupex --apply-log --export 备份目录
#拷贝已经--apply-log的数据到数据库数据目录,然后修改属组属主,启动数据库即可
注意:
如果没有备份mysql表,恢复的时候首先需要先进行数据库的初始化操作。因为没有mysql表是无法启动mysql服务的。