默认情况下,InnoDB表不能通过直接复制表文件的方式在mysql服务器之间进行移植,即便使用了innodb_file_per_table选项。而使用Xtrabackup工具可以实现此种功能,不过只能"导出"具有.ibd文件的表,也就是说导出表的mysql服务器启用了innodb_file_per_table选项,而且要导出的表还是在启用该选项之后才创建的。
导入表的是,要求导入表的服务器版本是MySQL 5.6+,且启用了innodb_file_per_table选项。
(1). 导出表
导出表是在"准备"的过程中进行的,不是在备份的时候导出。对于一个已经备份好的备份集,使用"--apply-log"和"--export"选项即可导出备份集中的表。
假如以全备份集/bakdir/2017-04-02_17-41-38为例,要导出其中的表。
innobackupex --apply-log --export /bakdir/2017-04-02_17-41-38
在导出过程中,会看到如下信息:
1 2 |
|
它说明了创建了一个.exp文件。
查看备份集目录下的backuptest目录,会发现多出了2个文件:.cfg和.exp,再加上.ibd文件,这3个文件是后续导入表时所需的文件。
-rw-r--r-- 1 root root 349 Apr 2 18:15 num_innodb.cfg
-rw-r----- 1 root root 16K Apr 2 18:15 num_innodb.exp
-rw-r----- 1 root root 8.4K Apr 2 17:41 num_innodb.frm
-rw-r----- 1 root root 31M Apr 2 17:41 num_innodb.ibd
其中.cfg文件是一种特殊的innodb数据字典文件,它和exp文件的作用是差不多的,只不过后者还支持在xtradb中导入,严格地讲,要将导出的表导入到MySQL5.6或者percona server 5.6中,".cfg"文件完全可以不需要,但是如果有该文件的话,会进行架构验证。
(2). 导入表
要在mysql服务器上导入来自于其它服务器的某innodb表,需要先在当前服务器上创建一个跟原表表结构一致的表,而后才能实现将表导入:
mysql> CREATE TABLE tabletest (...) ENGINE=InnoDB;
然后将此表的表空间:
mysql> ALTER TABLE mydatabase.tabletest DISCARD TABLESPACE;
接下来,将来自于"导出"表的的.ibd和.exp文件复制到当前服务器的数据目录,如果导入目标服务器是MySQL 5.6+,也可以复制.cfg文件。然后使用如下命令将其“导入”:
mysql> ALTER TABLE mydatabase.tabletest IMPORT TABLESPACE;
xtrabackup支持部分备份,意味着可以指定备份哪个数据库或者哪个表。
部分备份只有一点需要注意:在恢复的时候不要通过"--copy-back"的方式拷贝回datadir,而是应该使用导入表的方式。尽管使用拷贝的方式有时候是可行的,但是很多情况下会出现数据库不一致的状态。
(1). 备份
创建部分备份有三种方式:
- 通过"--include"选项可以指定正则来匹配要备份的表,这种方式要使用完整对象引用格式,即db_name.tab_name的方式。
- 将要备份的表分行枚举到一个文件中,通过"--tables-file"指定该文件。
- 或者使用"--databases"指定要备份的数据库或表,指定备份的表时要使用完整对象引用格式,多个元素使用空格分开。
使用前两种部分备份方式,只能备份innodb表,不会备份任何myisam,即使指定了也不会备份。而且要备份的表必须有独立的表空间文件,也就是说必须开启了innodb_file_per_table,更精确的说,要备份的表是在开启了innodb_file_per_table选项之后才创建的。第三种备份方式可以备份myisam表。
例如 --include='^back.*[.]num_*' ,将备份back字母开头的数据库中num开头的表,其中"[.]"的中括号不能少,因为正则中"."有特殊意义,所以使用中括号来枚举以实现对象的完整引用。
innobackupex --user=root --password=123456 --include='^back*[.]num_*' /bakdir/
使用"--include"和"--tables-file"备份后,会生成一个时间戳目录,目录中只有和要备份的表有关的文件。
[root@xuexi data]# ls /bakdir/2017-04-02_17-35-46/ backup-my.cnf ibdata1 xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile
如果使用的是--databases选项,则会生成一个时间戳目录,里面有备份的数据库代表的目录,如果只备份了某个表,则该数据库目录中只有该表相关的文件。
innobackupex --user=root --password=123456 --databases='mysql.user backuptest' /bakdir/
上面只备份mysql.user表和backuptest数据库,在生成的时间戳目录中将有两个mysql目录和backuptest目录。
[root@xuexi data]# ls /bakdir/2017-04-02_17-41-38/ backup-my.cnf backuptest ibdata1 mysql xtrabackup_binlog_info xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile[root@xuexi data]# ls /bakdir/2017-04-02_17-41-38/backuptest/ db.opt num_innodb.frm num_innodb.ibd num_isam.frm num_isam.MYD num_isam.MYI[root@xuexi data]# ls /bakdir/2017-04-02_17-41-38/mysql/ user.frm user.MYD user.MYI