问题:如何快速迁移InnoDB大表?mysqldump和复制ibd恢复速度对比。
实验环境:
名称 | 值 |
---|---|
源数据库 | vm-1(192.168.223.100) |
目标数据库 | vm-2(192.168.223.101) |
mysql版本 | 5.6.50-log(最低要求版本没验证) |
待迁移表 | test.history |
表行数量 | 1182759 |
文件大小 | 124M |
- 源数据库vm-1导出表结构并刷新表
vm-1 mysql> use test; vm-1 mysql> show create table history\G vm-1 mysql> flush table history for export;
- 拷贝history的.ibd和.cfg文件到目标数据库vm-2
[root@vm-1 ~]# scp history.ibd history.cfg root@192.168.223.101:/root/
- vm-1解锁
vm-1 mysql> unlock tables;
- 目标库vm-2初始化表
vm-2 mysql> create table history(...)engine=innodb;
- 分离初始化的表空间
vm-2 mysql> alter table history discard tablespace;
- 移动新表空间到vm-2的数据库目录下
[root@vm-2 ~]# mv /root/history.* /var/lib/mysql/test/
- 修改文件所有者(不然导入不了)
[root@vm-2 ~]# chown mysql:mysql /var/lib/mysql/test/history.*
- 导入表空间
vm-2 mysql> alter table history import tablespace;
- 验证源、目标数据库表行数是否一致
整个过程3s
左右;而通过mysqldump,再source的方式,则需要20s
左右。
注意:
- 需要执行flush table xxx for export并拷贝.cfg文件,有的教程直接拷贝.ibd没执行flush,导入的时候会出现下面问题
InnoDB: IO Read error: (2, No such file or directory) Error opening './test_innodb/history.cfg', will attempt to import without schema verification
- 源数据库要开启innodb_file_per_table
否则执行flush table xxx for export会提示InnoDB: Table '"test"."t_test"' in system tablespace
,该表使用的是系统表空间system tablespace - 有时加入cfg文件,还会报
ERROR 2013 (HY000): Lost connection to MySQL server during query
,那就把.cfg文件删掉,直接执行import tablespace
Comments