MySQL:创建一致的审计表转储

时间:2013-10-29 11:03:21

标签: mysql mysqldump

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

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

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

  1. LOCK TABLES table WRITE
  2. SELECT * FROM table
  3. DELETE FROM table
  4. UNLOCK TABLES
  5. 然后我将输出传递给其他一些脚本以供进一步处理。

    现在这完全正常,然而它会产生一个问题,即每个表的状态都是一致的,整个表集都不会。例如,如果我有一个clicks表和一个impressions表,并且在转储前者和后者之间有1分钟的延迟,那么显然整个转储将处于不一致的状态。

    现在我的问题是:我如何做到以下几点:

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

      有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

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

由于在不释放锁的情况下无法执行步骤3和4,至少使用mysqldump实用程序,为什么不将所有表复制到另一个数据库(备份数据库),然后从中导出转储文件?< / p>

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;

从提示1:

中删除原始数据库
USE backupdb;
DROP DATABASE originaldb;

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

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

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