0. Summary
1. 目的服务器创建一张表,表结构和源服务器结构一样
2. 目的服务器discard tablespace
3. 源服务器锁表
4. 拷贝ibd和cfg文件到目的服务器
5. 目的服务器导入表空间文件
6. 其他
1. 目的服务器创建一张表,表结构和源服务器结构一样
#### 源 ####
(root@localhost) [dbt3]> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 150000 |
+----------+
1 row in set (0.02 sec)
(root@localhost) [dbt3]> show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c_custkey` int(11) NOT NULL,
`c_name` varchar(25) DEFAULT NULL,
`c_address` varchar(40) DEFAULT NULL,
`c_nationkey` int(11) DEFAULT NULL,
`c_phone` char(15) DEFAULT NULL,
`c_acctbal` double DEFAULT NULL,
`c_mktsegment` char(10) DEFAULT NULL,
`c_comment` varchar(117) DEFAULT NULL,
PRIMARY KEY (`c_custkey`),
KEY `i_c_nationkey` (`c_nationkey`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
#### 目 ####
(root@localhost) [mytest]> create database dbt3;
Query OK, 1 row affected (0.01 sec)
(root@localhost) [mytest]> use dbt3;
Database changed
(root@localhost) [dbt3]> CREATE TABLE `t1` (
-> `c_custkey` int(11) NOT NULL,
-> `c_name` varchar(25) DEFAULT NULL,
-> `c_address` varchar(40) DEFAULT NULL,
-> `c_nationkey` int(11) DEFAULT NULL,
-> `c_phone` char(15) DEFAULT NULL,
-> `c_acctbal` double DEFAULT NULL,
-> `c_mktsegment` char(10) DEFAULT NULL,
-> `c_comment` varchar(117) DEFAULT NULL,
-> PRIMARY KEY (`c_custkey`),
-> KEY `i_c_nationkey` (`c_nationkey`)
-> ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.02 sec)
2. 目的服务器discard tablespace
[root@test-2 dbt3]# ls
db.opt t1.frm t1.ibd
(root@localhost) [dbt3]> alter table t1 discard tablespace;
Query OK, 0 rows affected (0.03 sec)
[root@test-2 dbt3]# ls
db.opt t1.frm
执行discared tablespace的作用是删除了ibd文件,只保留了表结构定义文件。
3. 源服务器锁表
(root@localhost) [dbt3]> flush tables t1 for export;
Query OK, 0 rows affected (0.01 sec)
另一个session执行:
(root@localhost) [dbt3]> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 150000 |
+----------+
1 row in set (0.03 sec)
锁住的意思是加共享的锁。
(root@localhost) [dbt3]> delete from t1 limit 1;
...hang...
4. 拷贝ibd和cfg文件到目的服务器
拷贝文件先到别的地方,尽快的释放读锁
[root@test-1 dbt3]# cp t1.cfg t1.ibd /mdata/
(root@localhost) [dbt3]> unlock tables;
Query OK, 0 rows affected (0.00 sec)
释放掉之后delete返回结果
(root@localhost) [dbt3]> delete from t1 limit 1;
Query OK, 1 row affected (2 min 43.80 sec)
接下来拷贝cfg和ibd到目的服务器的数据目录下。
[root@test-2 dbt3]# ls -ltr
total 40980
-rw-r-----. 1 mysql mysql 67 Feb 7 09:42 db.opt
-rw-r-----. 1 mysql mysql 8850 Feb 7 09:44 t1.frm
-rw-r--r--. 1 root root 41943040 Feb 7 10:47 t1.ibd
-rw-r--r--. 1 root root 893 Feb 7 10:47 t1.cfg
[root@test-2 dbt3]# chown -R mysql:mysql t1.ibd t1.cfg
cfg是校验文件,其实没有也是可以的,不对元数据进行校验。如果frm和ibd不一致的话,运行的时候就会crash.
5. 目的服务器导入表空间文件
(root@localhost) [dbt3]> alter table t1 import tablespace;
Query OK, 0 rows affected (0.18 sec)
(root@localhost) [dbt3]> select count(*) from t1;
+----------+
| count(*) |
+----------+
| 150000 |
+----------+
1 row in set (0.59 sec)
6. 其他
该特性在5.6引入,5.7支持分区表的更细粒度。