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