今天简单的记录下MySQL可传输表空间
复制一张表数据除了使用 mysqldump 命令将数据导出成一组 INSERT 语句和导出 CSV 文件方案外(逻辑拷贝),
在 MySQL 5.6 版本引入了可传输表空间(transportable tablespace) 的方法(物理拷贝),对大表的拷贝能极大减少拷贝时间。
首先安装两台mysql,我在同一台服务器使用docker安装
现目标是迁移源mysql的test库t表数据到目标mysql test库t表中
1,在源mysql中创建数据
mysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t(c1 INT) ENGINE=InnoDB;
mysql> insert into t values(1);
在对应文件夹中可以看到数据文件
*.frm 表定义,是描述表结构的文件。
*.opt 记录数据库的选项,数据库的字符集设置
*.ibd 存储数据信息和索引信息
data
2,在目标mysql中创建数据并discard现有表空间,删除ibd文件
datamysql> CREATE DATABASE test;
mysql> USE test;
mysql> CREATE TABLE t(c1 INT) ENGINE=InnoDB;
mysql>ALTER TABLE t DISCARD TABLESPACE;
3,在源实例上,运行FLUSH TABLES ... FOR EXPORT以使表停顿并创建.cfg元数据文件:
data.pngmysql> FLUSH TABLES t FOR EXPORT;
4,将.ibd文件和.cfg元数据文件从源实例复制到目标实例
datadocker cp e1512368ee74:/var/lib/mysql/test/t.ibd /data
docker cp e1512368ee74:/var/lib/mysql/test/t.cfg /data
docker cp /data/t.cfg 5710663c649b:/var/lib/mysql/test/
docker cp /data/t.ibd 5710663c649b:/var/lib/mysql/test/
5.在源实例上,使用UNLOCK TABLES释放由FLUSH TABLES ... FOR EXPORT获取的锁
mysql> UNLOCK TABLES;
6.在目标实例上,更改权限并导入表空间:
ls
chown mysql:mysql t.cfg t.ibd
mysql> ALTER TABLE t IMPORT TABLESPACE;
7,验证目标实例是否同步数据
select
关于拷贝表的这个流程,有以下几个注意点:
在第 3 步执行完 flsuh table 命令之后,test.t 整个表处于只读状态,直到执行 unlock tables 命令后才释放读锁;
在执行 import tablespace 的时候,为了让文件里的表空间 id 和数据字典中的一致,会修改 t.ibd 的表空间 id。而这个表空间 id 存在于每一个数据页中。
因此,如果是一个很大的文件(比如 TB 级别),每个数据页都需要修改,所以你会看到这个 import 语句的执行是需要一些时间的。当然,如果是相比于逻辑导入的方法,import 语句的耗时是非常短的。
参考:
MySQL实战45讲-41章
https://www.cnblogs.com/abclife/p/11787591.html
网友评论