我已经建立了一个系统,其目的是将我们的生产数据增量转储到我们的数据仓库。从这个意义上说,“增量”意味着我们可以每分钟左右将生产数据库与我们的数据仓库“同步”,而无需生成完整的转储。相反,我们只是转储和插入新的/更改的数据。
在我们的复制保存中,我建立了一个系统,我们生产数据库的每个相关表都有一个 insertTRIGGER
和一个 update TRIGGER
。这些将插入或更新的每一行复制到不同模式中的“审计表”中。此审计模式包含与生产表具有相同结构的表,但没有索引,并且通过使用这些TRIGGER
表,审计表将仅包含自上次导出以来的新行或更新行。
目前,我正在使用mysql
命令行客户端对每个审计表执行以下操作:
LOCK TABLES table WRITE
SELECT * FROM table
DELETE FROM table
UNLOCK TABLES
然后,我将输出通过管道传输到其他一些脚本以进行进一步处理。
现在这工作得非常好,但是它产生了一个问题,即虽然每个单独的表的状态都是一致的,但整个表集不会是一致的。例如,如果我有一张clicks
桌子和一张impressions
桌子,并且在转储前者和后者之间有 1 分钟的延迟,那么整个转储显然会处于不一致的状态。
现在我的问题是:我该如何执行以下操作:
- 锁定所有表
- 为所有表生成转储
- 从所有表中删除所有数据
- 解锁表
我无法使用mysql
命令行客户端,因为我无法在不同的会话中保持锁定,并且每个表都需要一个新命令。另外,我检查了mysqldump
哪个允许一次转储多个表,但我没有找到在释放锁之前从表中删除所有数据的方法。
有任何想法吗?