注册 登录
  • 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

MySQL表空间传输

MySQL FAQ 彭东稳 5436次浏览 已收录 0个评论

在MySQL中如果要迁移一个表导另外一个服务器/环境中,常规的做法就是使用备份工具备份,比如mysqldump/mysqlpump/mydumper,然后拷贝备份到目标服务器或者环境导入。如果某一个表数据量很大,导出dump文件很大的情况下,使用导出导入工具其实会花费不少的时间。

怎么样提高效率呢,可以有一种想法就是直接拷贝数据文件到目标环境,当然在早期版本中这么做是不可取的,因为会有很多关联数据在ibdata中,InnoDB的数据存在对应的数据字典信息,是存放在共享表空间中,无法直接剥离出来,而在5.6/5.7中,就推出了一个很不错的特性,就是迁移表空间,可以把这个配置信息剥离出来,简单来说就是把数据文件直接拷贝到目标环境,在目标端挂载即可。

这样一个操作的一个基本前提是使用了独立表空间,开启innodb_file_per_table参数(MySQL 5.6已结默认开启)。

示例:将InnoDB表复制到另一个实例

此过程演示如何将正常InnoDB表从正在运行的MySQL服务器实例复制到另一个正在运行的实例,可以使用与较小调整相同的步骤在同一实例上执行完整表恢复。

1. 在源实例上,创建一个表,如果不存在

2. 在目标实例上,如果不存在,则创建一个表

3. 在源实例上,运行FLUSH TABLES … FOR EXPORT停止表并创建.cfg元数据文件:

metadata(.cfg)在InnoDB数据目录中创建 。

该FLUSH TABLES … FOR EXPORT语句确保对命名表的更改已刷新到磁盘,以便在实例运行时可以进行二进制表副本。当FLUSH TABLES … FOR EXPORT运行时, InnoDB会产生一个.cfg在同一个数据库的目录表文件。该.cfg文件包含导入表空间文件时用于模式验证的元数据。

这个命令值得一提的是,保持当前的窗口,不要关闭,如果关闭,cfg文件就会自动删除,可以看到命令运行后生成了cfg文件。

在FLUSH TABLE之后,这个表就被锁定了,DML操作是阻塞的,也就意味着迁移的过程中,是无法直接写入数据的。

4. 在目标实例上,丢弃现有的表空间(在导入表空间之前,InnoDB必须丢弃附加到接收表的表空间)

Discard的意思就是从数据库detached,会删除ibd文件,保留frm文件。也就意味着,你可以对frm文件操作,比如:rename table,drop table,但是不能对ibd文件操作,比如:dml。

5. 将.ibd文件和 .cfg元数据文件从源实例复制到目标实例

6. 在源实例上,UNLOCK TABLES用来释放所获得的锁FLUSH TABLES … FOR EXPORT

7. 在目标实例上,导入表空间

这个时候尤其需要注意文件的权限,拷贝完成,我们就可以通过import tablespace来进行数据文件挂载。

该ALTER TABLE … IMPORT TABLESPACE功能不会对导入的数据执行外键约束。如果表之间存在外键约束,则所有表应在相同(逻辑)时间点导出。在这种情况下,您将停止更新表,提交所有事务,获取表上的共享锁,然后执行导出操作。

我们检查一下表的情况。

如果没有.cfg文件,还能够import成功吗?可以,但是这样就没办法认证schema了。导入的时候会报一个warning。

 

Level Code Message
Warning 1810 InnoDB: IO Read error: (2, No such file or directory) Error opening ‘./test/t.cfg’, will attempt to import without schema verification

最好能使用.cfg来帮助认证schema,否则很可能会导致MySQL查询此表时卡死,只能通过kill查询解决。

另外,我们刚开始就创建了两个相同的表结构,其实也就说是表空间传输时两边的表结构必须一样才行。不然会报错。也就是说如果你有ibd文件,还不一定能够恢复,你必须还要知道该表的表结构才行。

同样,分区表也支持表空间传输,具体看官网。

<参考>

从Xtrabackup完整备份中恢复单个表

https://dev.mysql.com/doc/refman/8.0/en/innodb-transportable-tablespace-examples.html


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (3)or分享 (0)
关于作者:

您必须 登录 才能发表评论!