InnoDB可传输表空间(transportable tablespace)

生产环境中,经常会遇到需要迁移表的情况,正常情况下都会使用mysqldump工具。但是mysqldump属于逻辑导入,需要通过SQL对数据进行导入,然后还要进行索引重建,当表的数据量非常大的时候,mysqldump的效率会非常低,耗时会很长。

此场景可以利用lnnodb的可传输表空间的特性,直接通过操作系统的复制命令拷贝表空间文件,可以快速迁移数据,提升效率。

前提条件

可传输表空间并不是总是可用,如果要利用这一特性,必须要满足以下条件:

  • 表的存储必须是独立表空间(innodb_file_per_table=on)
  • 源实例和目标实例的页大小必须相同(innodb_page_size参数相同)
  • 如果有外键约束,必须要先禁用约束,而且外键相关的表必须一起迁移,并且逻辑上要保持一致(通过加锁或暂停业务更新)。
  • 如果建表时采用data directory子句将表建立在指定路径,则迁移的目标实例必须也要保持路径一致。
  • 分区表导入不支持。
  • 如果有全文索引则需要先删除,导入后再重建。

迁移步骤

表空间导入是利用操作系统层面复制的原理,因此在目标实例不会自动创建表,所以我们要现在目标实例创建好表,然后丢弃原始表空间。再导入源实例的表空间,由此达到数据迁移的目的。

现在需要将表transportable_tbs,从数据库src_db迁移至数据库dest_db:

1. 首先在dest_db创建表,表的定义可以通过在src_db执行show create table获取

use dest_db;
CREATE TABLE `transportable_tbs` (
  `id` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

InnoDB可传输表空间(transportable tablespace)

 

2. dest_db,将刚创建好的表空间丢弃,注意discard tablespace不支持分区表,因此无法导入分区表。

use dest_db;
alter table transportable_tbs discard tablespace;

InnoDB可传输表空间(transportable tablespace)

3. src_db,在源实例执行flush tables ... for export准备导出表空间,此操作会锁住表(共享锁)。

use src_db;
flush tables transportable_tbs for export;

InnoDB可传输表空间(transportable tablespace)

执行完成后在表空间所在文件夹下会多出,一个cfg后缀的文件(表的元数据),将.ibd(数据文件)和.cfg(元数据文件)文件拷贝到目标实例表空间的文件夹下

InnoDB可传输表空间(transportable tablespace)

 4. src_db, 拷贝完成后,源表因flush tables ... for export获得的锁就可以释放了,同时此命令也会删除刚才产生的.cfg文件。

use src_db;
unlock tables;

InnoDB可传输表空间(transportable tablespace)

 5.dest_db,执行alter table ... import tablespace将刚才拷贝的表空间文件导入,并随便执行一个查询验证数据已经导入。

alter table transportable_tbs import tablespace;
select * from transportable_tbs;

InnoDB可传输表空间(transportable tablespace)

以上即是表空间导入方式迁移表的步骤,flush tables生成的.cfg文件的作用的校验元数据,导入时没有这个文件也可以成功,只是会有一个警告(无验证导入):

Warning 1810 Error opening './dest_db/transportable_tbs.cfg', will attempt to import without schema verification

InnoDB可传输表空间(transportable tablespace)

 

上一篇:深度


下一篇:linux C Mysql数据库增删改查(CURD)操作