MySQL5.6版本以后引入的表空间传输,可以把一张表从一个数据库移到另一个库或另一个机器上。
要想使用表空间传输的几个限制条件:
1.必须是5.6以上的版本
2.使用独立表空间方式,把innodb_file_per_table参数开启
3.源库和目录库的page size必须一致。innodb_page_size
4.源库和目录库的表结构必须一致
5.当表做导出操作时,该表只能进行只读操作
步骤描述:
1.目标库:创建和源库相同表结构的表
2.目标库执行alter table tb_name discard tablespace ; 这个命令会删除ibd文件
3.源库:flush table tb_name for export ;此时这个表只能读不能写
数据目录下会生成一个tb_name.cfg的文件
4.cp tb_name.ibd、 tb_name.cfg文件到目标库的数据目录下
5.源库:unlock tables ; 释放表锁
6.目标库数据目录授权:chown -R mysql:mysql *
7.目标库导入表空间:alter table tb_name import tablespace;
主库执行恢复的时候,从库会报错找不到原来的表空间,造成复制中断
实验过程:
描述:把dhr库下的t1表的数据传输到tdhr库下的t1表中,dhr库下的t1表中的数据如下:
mysql> select * from t1;
+----+----+----+----+
| c1 | c2 | c3 | c4 |
+----+----+----+----+
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 |
| 3 | 3 | 3 | 0 |
| 4 | 2 | 2 | 0 |
| 6 | 2 | 5 | 0 |
| 8 | 6 | 6 | 0 |
| 10 | 4 | 4 | 0 |
+----+----+----+----+
7 rows in set (0.03 sec)
先在tdhr库下创建一个和dhr库下t1表结构相同的表t1
mysql> use tdhr;
Database changed
mysql> CREATE TABLE `t1` (
-> `c1` int(10) unsigned NOT NULL DEFAULT '0',
-> `c2` int(10) unsigned NOT NULL DEFAULT '0',
-> `c3` int(10) unsigned NOT NULL DEFAULT '0',
-> `c4` int(10) unsigned NOT NULL DEFAULT '0',
-> PRIMARY KEY (`c1`),
-> UNIQUE KEY `index_c3` (`c3`),
-> KEY `c2` (`c2`)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.15 sec)
查看数据目录下形成了t1表的数据信息
[root@dhr data]# cd tdhr
[root@dhr tdhr]# ls -l
total 144
-rw-r----- 1 mysql mysql 61 Aug 24 14:32 db.opt
-rw-r----- 1 mysql mysql 8634 Aug 24 14:35 t1.frm
-rw-r----- 1 mysql mysql 131072 Aug 24 14:35 t1.ibd
目标库:卸载tdhr库下t1表的表空间
mysql> alter table t1 discard tablespace;
Query OK, 0 rows affected (0.10 sec)
发现tdhr数据目录下,t1.ibd文件被删除了
[root@dhr tdhr]# ls -l
total 16
-rw-r----- 1 mysql mysql 61 Aug 24 14:32 db.opt
-rw-r----- 1 mysql mysql 8634 Aug 24 14:35 t1.frm
源库:然后在dhr库下执行表空间导出操作
mysql> use dhr;
Database changed
mysql> flush table t1 for export;
Query OK, 0 rows affected (0.00 sec)
会发现dhr的数据目录下,多了一个t1.cfg的文件
[root@dhr tdhr]# cd ../dhr
[root@dhr dhr]# ls
db.opt t1.cfg t1.frm t1.ibd t2.frm t2.ibd t3.frm t3.ibd
然后dhr数据目录下的t1.cfg和t1.ibd文件拷贝到tdhr数据目录下
[root@dhr dhr]# cp t1.cfg ../tdhr/
[root@dhr dhr]# cp t1.ibd ../tdhr/
[root@dhr dhr]# cd ../tdhr/
[root@dhr tdhr]# ls -la
total 156
drwxr-x--- 2 mysql mysql 4096 Aug 24 14:38 .
drwxr-xr-x 7 mysql mysql 4096 Aug 24 14:32 ..
-rw-r----- 1 mysql mysql 61 Aug 24 14:32 db.opt
-rw-r----- 1 root root 633 Aug 24 14:38 t1.cfg
-rw-r----- 1 mysql mysql 8634 Aug 24 14:35 t1.frm
-rw-r----- 1 root root 131072 Aug 24 14:38 t1.ibd
更改文件 权限
[root@dhr tdhr]# chown mysql:mysql *
[root@dhr tdhr]# ls -la
total 156
drwxr-x--- 2 mysql mysql 4096 Aug 24 14:38 .
drwxr-xr-x 7 mysql mysql 4096 Aug 24 14:32 ..
-rw-r----- 1 mysql mysql 61 Aug 24 14:32 db.opt
-rw-r----- 1 mysql mysql 633 Aug 24 14:38 t1.cfg
-rw-r----- 1 mysql mysql 8634 Aug 24 14:35 t1.frm
-rw-r----- 1 mysql mysql 131072 Aug 24 14:38 t1.ibd
源库:授权完后,因为目前dhr库下的t1表处于只读操作,所以需要执行解锁操作
mysql> unlock tables;
Query OK, 0 rows affected (0.01 sec)
目标库:然后在 tdhr库上执行表空间导入命令
mysql> alter table t1 import tablespace;
Query OK, 0 rows affected (0.03 sec)
确认tdhr库下的t1表中是否有数据了
mysql> select * from t1;
+----+----+----+----+
| c1 | c2 | c3 | c4 |
+----+----+----+----+
| 0 | 0 | 0 | 0 |
| 1 | 1 | 1 | 0 |
| 3 | 3 | 3 | 0 |
| 4 | 2 | 2 | 0 |
| 6 | 2 | 5 | 0 |
| 8 | 6 | 6 | 0 |
| 10 | 4 | 4 | 0 |
+----+----+----+----+
7 rows in set (0.00 sec)




