mysql 表空间传输

1.使用场景

有一种场景,表数据量大,又要以最小的时间迁移到另外的服务器上,那怎么办呢?一般都是特理备份恢复。用物理备份恢复,恢复单个表数据,就用到了表空间传输的特性。用逻辑备份恢复,数据量大的话,恢复太慢。

2.测试使用表空间

2.1在源数据库上导出需要迁移的表
mysql [localhost:5727] {root} (sbtest) > use sbtest
Database changed
mysql [localhost:5727] {root} (sbtest) > FLUSH TABLES sbtest1 FOR EXPORT;
Query OK, 0 rows affected (0.00 sec)
当执行export时,会产生一个sbtest1.cfg文件,以cfg为后缀命名的

2.2在目标端数据库创建相同表名与表结构

node1 [localhost:21227] {root} ((none)) > use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
node1 [localhost:21227] {root} (test) > CREATE TABLE sbtest1 (
-> id int(11) NOT NULL AUTO_INCREMENT,
-> k int(11) NOT NULL DEFAULT ‘0’,
-> c char(120) NOT NULL DEFAULT ‘’,
-> pad char(60) NOT NULL DEFAULT ‘’,
-> PRIMARY KEY (id),
-> KEY k_1 (k)
-> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.01 sec)
2.3 在目标端数据库 discard表空间

node1 [localhost:21227] {root} (test) > ALTER TABLE sbtest1 DISCARD TABLESPACE;
Query OK, 0 rows affected (0.00 sec)

2.4把源端数据文件和cfg文件copy到目标端数据库(由于我的环境是同一台服务器,不同服务器用scp)
cp -r /root/sandboxes/msb_5_7_26/data/sbtest/sbtest1.{cfg,ibd} /root/sandboxes/all_masters_msb_5_7_26/node1/data/test/

2.5在源端数据库解锁
mysql [localhost:5727] {root} (sbtest) > use sbtest
Database changed
mysql [localhost:5727] {root} (sbtest) > unlock tables;
Query OK, 0 rows affected (0.00 sec)

2.6在目标端数据库导入表
node1 [localhost:21227] {root} ((none)) > USE test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
node1 [localhost:21227] {root} (test) > ALTER TABLE sbtest1 IMPORT TABLESPACE;
Query OK, 0 rows affected (0.04 sec)

2.7在目标端验证数据。
node1 [localhost:21227] {root} (test) > select count(1) from sbtest1;
±---------+
| count(1) |
±---------+
| 50000 |
±---------+
1 row in set (0.01 sec)

查看源端数据库数据

mysql [localhost:5727] {root} (sbtest) > select count(1) from sbtest1;
±---------+
| count(1) |
±---------+
| 50000 |
±---------+
1 row in set (0.00 sec)

目标端和源端数据一样,说明数据迁移成功。

3.表空间迁移前决条件与限制

1.变量innodb_file_per_table 必须打开。
2.表空间的页面大小必须与目标MySQL服务器实例的页面大小匹配。InnoDB页面大小由innodb_page_size变量定义,innodb_page_size变量在初始化MySQL服务器实例时配置。
3.如果表有外键关系,那么在执行DISCARD TABLESPACE之前必须禁用foreign_key_checks。此外,在相同的逻辑时间点导出所有与外键相关的表,如ALTER TABLE…IMPORT TABLESPACE不会对导入的数据强制外键约束。
4.当从另一个MySQL服务器实例导入表时,两个MySQL服务器实例必须是相同的版本
5.如果表创建是以外部目录创建,比如create table … data directory 子句。迁移到目标端的表必须要有相同的data directory 子句
6.如果在表定义中没有显式定义ROW_FORMAT选项,或者使用了ROW_FORMAT=DEFAULT,源实例和目标实例的innodb_default_row_format设置必须相同。
7.可传输表空间特性仅支持位于每个表对应的文件表空间中的表。不支持系统表空间或一般表空间中,共享表空间的表也不支持
8.由于.cfg元数据文件的限制,在导入分区表时,不会报告分区类型或分区定义差异的架构不匹配。列的差异会报出


免责声明:

1、本站资源由自动抓取工具收集整理于网络。

2、本站不承担由于内容的合法性及真实性所引起的一切争议和法律责任。

3、电子书、小说等仅供网友预览使用,书籍版权归作者或出版社所有。

4、如作者、出版社认为资源涉及侵权,请联系本站,本站将在收到通知书后尽快删除您认为侵权的作品。

5、如果您喜欢本资源,请您支持作者,购买正版内容。

6、资源失效,请下方留言,欢迎分享资源链接

文章评论

0条评论