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;
2. dest_db,将刚创建好的表空间丢弃,注意discard tablespace不支持分区表,因此无法导入分区表。
use dest_db;
alter table transportable_tbs discard tablespace;
3. src_db,在源实例执行flush tables ... for export准备导出表空间,此操作会锁住表(共享锁)。
use src_db;
flush tables transportable_tbs for export;
执行完成后在表空间所在文件夹下会多出,一个cfg后缀的文件(表的元数据),将.ibd(数据文件)和.cfg(元数据文件)文件拷贝到目标实例表空间的文件夹下
4. src_db, 拷贝完成后,源表因flush tables ... for export获得的锁就可以释放了,同时此命令也会删除刚才产生的.cfg文件。
use src_db;
unlock tables;
5.dest_db,执行alter table ... import tablespace将刚才拷贝的表空间文件导入,并随便执行一个查询验证数据已经导入。
alter table transportable_tbs import tablespace;
select * from transportable_tbs;
以上即是表空间导入方式迁移表的步骤,flush tables生成的.cfg文件的作用的校验元数据,导入时没有这个文件也可以成功,只是会有一个警告(无验证导入):
Warning 1810 Error opening './dest_db/transportable_tbs.cfg', will attempt to import without schema verification
标签:dest,tbs,db,导入,tablespace,空间,InnoDB,transportable 来源: https://blog.csdn.net/frostlulu/article/details/122574152