Contents

在5.6之前的服务版本,在不同的MySQL服务中通过复制表的文件来拷贝表是不可能的,即使启用了innodb_file_per_table。然而,通过Percona XtraBackup,可以从任意的InnoDB数据库中导出指定的表,并将它们导入到使用XtraDB的Percona服务中或MySQL 5.6。这只对.ibd文件有效。

创建测试表

CREATE TABLE `export_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `a` varchar(60) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3   ROW_FORMAT=DYNAMIC  DEFAULT CHARSET=utf8

insert into `test`.`export_test` ( `a`) values ( 'aaa');
insert into `test`.`export_test` ( `a`) values ( 'ddd');
insert into `test`.`export_test` ( `a`) values ( 'ccc');
insert into `test`.`export_test` ( `a`) values ( 'dddccc');

确认innodb_file_per_table是否开启

mysql> show variables like 'innodb_file_per_table'; 
+-----------------------+-------+ 
| Variable_name         | Value | 
+-----------------------+-------+ 
| innodb_file_per_table | ON    | 
+-----------------------+-------+ 
1 row in set (0.00 sec) 

确认行格式

show variables like '%format%';
+---------------------------+-------------------+
| Variable_name             | Value             |
+---------------------------+-------------------+
| binlog_format             | ROW               |
| date_format               | %Y-%m-%d          |
| datetime_format           | %Y-%m-%d %H:%i:%s |
| default_week_format       | 0                 |
| innodb_default_row_format | dynamic           |
| innodb_file_format        | Barracuda         |
| innodb_file_format_check  | ON                |
| innodb_file_format_max    | Barracuda         |
| time_format               | %H:%i:%s          |
+---------------------------+-------------------+
9 rows in set (0.00 sec)

执行备份

innobackupex --defaults-file=/etc/my.cnf --user=bkuser --password=xxxx  --socket=/tmp/mysql.sock ~/backup/fullbackup/

导出的表必须是以 innodb_file_per_table 格式创建,在备份目录中以.bd文件格式存在。

find . -name export_test.*
./guo_test/export_test.ibd
./guo_test/export_test.frm

当准备备份的时候,增加xtrabackup –export参数到命令中。

innobackupex --user=root --password=root --no-timestamp --apply-log --export ./

在目标目录下,可以看到.exp文件

find . -name export_test.*
./guo_test/export_test.ibd
./guo_test/export_test.exp
./guo_test/export_test.cfg
./guo_test/export_test.frm

.exp、.ibd、.cfg这三个文件用于数据库导入中
Percona官方对这三个文件的描述
After this, copy mytable.ibd and mytable.exp ( or mytable.cfg if importing to MySQL 5.6) files to database’s home, and import its tablespace:

删除表 (如果表结构一致可以不用删除)

drop table export_test; 
Query OK, 0 rows affected (1.45 sec) 

在目标MySQL服务器上,创建一张具有相同结构的空表。

CREATE TABLE `export_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `a` varchar(60) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3   ROW_FORMAT=DYNAMIC  DEFAULT CHARSET=utf8

清除表空间

ALTER TABLE export_test DISCARD  TABLESPACE;

拷贝导出文件到数据目录中

cp -f  ~/export_test.* ./

更改文件权限为mysql

chown -R mysql:mysql .  

导入表空间

ALTER TABLE export_test IMPORT TABLESPACE;

验证表中的数据

mysql> select * from `test`.`export_test`;
+----+--------+
| id | a      |
+----+--------+
| 1  | aaa    |
| 2  | ddd    |
| 3  | ccc    |
| 4  | dddccc |
+----+--------+
4 rows in set (0.02 sec)

mysql> 

常见错误

ERROR 1815 (HY000): Internal error: Cannot reset LSNs in table '"test"."export_test"' : Tablespace not found 

查看export文件权限、export文件是否都已经导入到数据库目录

ERROR 1030 (HY000): Got error -1 from storage engine

检查innodb_file_per_table是否开启

Error : Schema mismatch (Table flags don't match, server table has 0x0 and the meta-data file has 0x1)

检查表ROW_FORMAT、innodb_file_format
以前支持COMPACT、REDUNDANT的innodb_file_format文件格式为Antelope,新的文件格式为Barracuda,新增格式Compressed、dynamic
innodb_file_format
Default Value (>= 5.7.7) Barracuda
Default Value (<= 5.7.6) Antelope

Contents