我有几个需要“收听”的mysql数据库和表。我需要知道哪些数据发生了变化,并将更改发送到具有数据库本地镜像的远程服务器。
如何镜像mysql数据库中的更改?我正在考虑设置mysql触发器,将所有更改写入另一个表。此表具有数据库名称,表名称和所有列。然后我编写自定义代码来传输更改并定期在远程镜像上安装它们。这会满足我的需求吗?
答案 0 :(得分:1)
您的计划是100%正确的。
这个额外的表被称为“审计”或“历史”表(有一些细微的区别,但你不应该太在意 - 但你现在有了“官方”术语,你可以用来做进一步的研究)。
如果主表有列A,B,C,那么审计还有3个:A,B,C,Operation,Changed_By,Change_DateTime(名称取决于您的口味和编码标准)。
“操作”列存储更改是插入,删除,更新的旧值还是更新的新值(通常它是3个字符宽,操作为“INS”/“DEL”/“U_D”和“U_I” “,但还有其他方法)。
审计表中的数据通过主表上的触发器填充。
然后确保Change_DateTime列上有索引。
要查找更改列表,您可以跟踪上次轮询的时间,然后只需执行
SELECT * FROM Table_Audit WHERE Change_DateTime > 'LAST_POLL_TIME'
答案 1 :(得分:1)
您可以告诉MySQL从特定时间点创建增量备份。数据仅包含自那时以来对数据库的更改。
您必须启用二进制日志记录,然后您可以使用mysqlbinlog
命令导出自给定时间戳以来的更改。请参阅手册的Point-in-Time (Incremental) Recovery部分以及documentation for mysqlbinlog。具体来说,您需要--start-datetime参数。
以文本格式导出日志后,可以在其他数据库实例上执行。
答案 2 :(得分:0)
一旦你走出DBMS的机制来完成一个固有的面向数据库的任务,比如镜像,你就违反了DB的大部分属性,将它与普通文件区分开来。
特别是,您提出的机制违反了构建MySQL以确保的atomicity, consistency, isolation, and durability。例如,镜像上日志的不完整回放将使镜像处于与父DB不一致的状态。您建议的只能近似镜像,因此您应该更喜欢DBMS内在机制,除非您不关心镜像是否准确反映了父级的状态。