通过复制InnoDB表的ibd文件,实现将InnoDB表从源库迁移到目标库,类似Oracle TTS。
传输表空间的限制:
1,mysql 版本 5.6.6 及其以上,源和目标版本建议都是GA版并且大版本一样
2,表引擎为innodb并且开启独立表空间(innodb_file_per_table=1)
3,处于导出状态的表只允许读也就是”read_only“状态
4,DISCARD TABLESPACE不支持分区表[5.6.17才支持] 并且当表上具有外键关系的时候需要将foreign_key_check设置为0
5,源和目标实例的page size必须大小一致
6,ALTER TABLE ... IMPORT TABLESPACE不强制进行外键约束检查,所以需要将主表和子表都导出,然后在目标实例导入
源库
[root@wallet01 ~]# su - mysql
[mysql@wallet01 ~]$ mysqldump -uroot -pabcd.1234 -d soe customer >customer.sql
[mysql@wallet01 ~]$ scp customer.sql 192.168.1.202:/home/mysql
[mysql@wallet01 ~]$ mysql -uroot -pabcd.1234
mysql> use soe
Database changed
mysql> select count(*) from customer;
+----------+
| count(*) |
+----------+
| 1500000 |
+----------+
1 row in set (0.33 sec)
目标库
[root@wallet02 ~]# su - mysql
[mysql@wallet02 ~]$ mysql -uroot -pabcd.1234
mysql> create database soe;
Query OK, 1 row affected (0.05 sec)
mysql> use soe
Database changed
mysql> source customer.sql
Query OK, 0 rows affected (0.01 sec)
mysql> alter table customer discard tablespace;
Query OK, 0 rows affected (0.03 sec)
源库
mysql> flush table customer for export;
Query OK, 0 rows affected (0.00 sec)
[mysql@wallet01 ~]$ cd /usr/local/mysql/data/soe
[mysql@wallet01 soe]$ scp customer.cfg 192.168.1.202:/usr/local/mysql/data/soe
[mysql@wallet01 soe]$ scp customer.ibd 192.168.1.202:/usr/local/mysql/data/soe
mysql> unlock tables;
Query OK, 0 rows affected (0.03 sec)
目标库
mysql> alter table customer import tablespace;
Query OK, 0 rows affected (11.52 sec)
mysql> select count(*) from customer;
+----------+
| count(*) |
+----------+
| 1500000 |
+----------+
1 row in set (0.37 sec)