2

我已经建立了一个系统,其目的是将我们的生产数据增量转储到我们的数据仓库。从这个意义上说,“增量”意味着我们可以每分钟左右将生产数据库与我们的数据仓库“同步”,而无需生成完整的转储。相反,我们只是转储和插入新的/更改的数据。

在我们的复制保存中,我建立了一个系统,我们生产数据库的每个相关表都有一个 insertTRIGGER和一个 update TRIGGER。这些将插入或更新的每一行复制到不同模式中的“审计表”中。此审计模式包含与生产表具有相同结构的表,但没有索引,并且通过使用这些TRIGGER表,审计表将仅包含自上次导出以来的新行或更新行。

目前,我正在使用mysql命令行客户端对每个审计表执行以下操作:

  1. LOCK TABLES table WRITE
  2. SELECT * FROM table
  3. DELETE FROM table
  4. UNLOCK TABLES

然后,我将输出通过管道传输到其他一些脚本以进行进一步处理。

现在这工作得非常好,但是它产生了一个问题,即虽然每个单独的表的状态都是一致的,但整个表集不会是一致的。例如,如果我有一张clicks桌子和一张impressions桌子,并且在转储前者和后者之间有 1 分钟的延迟,那么整个转储显然会处于不一致的状态。

现在我的问题是:我该如何执行以下操作:

  1. 锁定所有表
  2. 为所有表生成转储
  3. 从所有表中删除所有数据
  4. 解锁表

我无法使用mysql命令行客户端,因为我无法在不同的会话中保持锁定,并且每个表都需要一个新命令。另外,我检查了mysqldump哪个允许一次转储多个表,但我没有找到在释放锁之前从表中删除所有数据的方法。

有任何想法吗?

4

1 回答 1

0

要执行前两点,命令可能是这个:

mysqldump --lock-all-tables -u root -p DATABASENAME > nameofdumpfile.sql

既然不释放锁就不可能执行第 3 步和第 4 步,至少使用 mysqldump 实用程序,为什么不将所有表复制到另一个数据库(备份数据库)然后从中导出转储文件?

CREATE DATABASE backupdb;
USE originaldb;
FLUSH TABLES WITH READ LOCK;

保持此提示(提示 1)打开,然后从另一个命令提示(提示 2)克隆数据库:

   mysqldump --lock-all-tables -u root -p originaldb | mysql -u backup -p password backupdb;

从 Prompt 1 中删除原始数据库:

USE backupdb;
DROP DATABASE originaldb;

然后使用原始名称恢复空数据库(注意 -d 标志):

mysqldump --lock-all-tables -u root -p backupdb | mysql -u backup -p password originaldb;

这可能是您可以应用以实现所需的解决方法的示例。

于 2013-10-29T11:35:16.840 回答