2

有没有办法保留对 MySQL 表中每一行的每一列的每次更改的时间戳记录?这样我就永远不会丢失任何数据并保留转换的历史记录。行删除可能只是将“已删除”列设置为 true,但可以恢复。

我在看HyperTable ,一个 Google 的BigTable的开源实现,这个功能真的让我大吃一惊。如果可以在 MySQL 中使用它会很棒,因为我的应用程序无法处理大量数据,而这些数据足以证明部署 HyperTable 是合理的。可以在此处查看有关其工作原理的更多详细信息。

是否有任何配置、插件、fork 或任何可以将这一功能添加到 MySQL 的东西?

4

4 回答 4

3

我过去在类似于混乱描述的 php 模型中实现了这一点。

如果您使用的是 mysql 5,您还可以使用一个存储过程来完成此操作,该过程连接到表的 on update 和 on delete 事件。

http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html

于 2009-08-10T01:43:00.470 回答
2

我在自定义框架中执行此操作。每个表定义还生成一个与主表多对一相关的 Log 表,当框架对主表中的行进行任何更新时,会将行的当前状态插入到 Log 表中。所以我对表的状态有一个完整的审计跟踪。(我有时间记录,因为我所有的表都有 LoggedAt 列。)

恐怕没有插件,更多的是一种需要融入整个数据库交互方法的做事方法。

于 2009-08-10T01:35:55.923 回答
2

创建一个存储以下信息的表...

CREATE TABLE MyData (
    ID INT IDENTITY,
    DataID INT )

CREATE TABLE Data (
    ID INT IDENTITY,
    MyID INT,
    Name VARCHAR(50),
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)

现在创建一个执行此操作的存储过程...

INSERT Data (MyID, Name)
VALUES(@MyID,@Name)

UPDATE MyData SET DataID = @@IDENTITY
WHERE ID = @MyID

一般来说,MyData 表只是一个键表。然后将其指向数据表中最新的记录。每当您需要更改数据时,您只需调用将新数据插入数据表的存储过程,然后更新 MyData 以指向最新记录。如果系统中的其他表出于外键目的将自己关闭 MyData.ID。

这种安排回避了对第二个日志表的需求(并在模式更改时使它们保持同步),但代价是额外的连接和创建新记录时的一些开销。

于 2009-08-10T01:40:03.953 回答
0

您是否需要它保持可查询状态,或者这只是为了从错误的编辑中恢复?如果是后者,您可以设置一个 cron 作业来备份 MySQL 存储数据的实际文件并将其发送到版本控制服务器。

于 2009-08-10T01:50:02.753 回答