InnoDB存储引擎--透明表空间传输


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支持分区表的更细粒度。

你可能感兴趣的:(InnoDB存储引擎--透明表空间传输)