首页 > 解决方案 > 从数据库中复制一些数据并保持参照完整性

问题描述

要求是将一些数据从活动数据库(目前 159 个表)中提取到另一个数据库中,以便复制的数据具有完全的引用完整性,而数据是不断变化的(它是一个实时数据库)。这不是转储整个数据库(接近 50GB),只是将我们从整个数据库中识别出的一些行提取到一个单独的数据库中。

我们目前基于我们的初始模式和后续 DDL 迁移和可重复数据(视图、存储过程等)创建一个新数据库,然后复制适当的行。这通常需要超过 10 分钟,但不到 1 小时,具体取决于要提取的集合的大小。

有没有办法告诉 mysql 在我开始运行提取后我想忽略任何提交的事务,无论是添加的新行、删除的行还是更新的行,但是到数据库的任何其他连接都照常工作,就好像我没有提出任何要求。

我不希望发生的是我从表 1 复制数据,当我到达表 159 时,表 1 已更改,表 159 中的一行引用表 1 中的新行。

标签: mysqltransactions

解决方案


使用mysqldump --single-transaction. 这会在开始转储数据之前启动可重复读取事务,因此在转储数据时发生的任何并发事务都不会影响事务转储的数据。


重新更新您的问题:

您可以在事务中执行自己的自定义查询。

在开始运行提取查询之前,以可重复读取模式启动事务。您可以针对许多表运行许多查询,并且您提取的所有数据都将与您启动该事务时当前提交的数据完全相同。

您可能想阅读https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html


推荐阅读