有没有办法在MySQL表的每一行的每一列中保留每次更改的带时间戳的记录?这样我就不会丢失任何数据并保留过渡的历史记录。行删除可能只是将“已删除”列设置为true,但可以恢复。
我正在查看HyperTable,这是Google BigTable的一个开源实现,这个功能真的让我大吃一惊。如果可以在MySQL中使用它会很棒,因为我的应用程序无法处理大量数据,这些数据证明部署HyperTable是合理的。有关其工作原理的更多详细信息,请参见here。
是否有任何配置,插件,分支或任何可以将这一功能添加到MySQL的内容?
答案 0 :(得分:3)
我过去在一个类似于混沌描述的php模型中实现了这个。
如果你正在使用mysql 5,你也可以使用一个存储过程来实现这一点,该存储过程可以挂钩到表的更新和删除事件。
答案 1 :(得分:2)
我在自定义框架中执行此操作。每个表定义还生成与主表多对一关联的Log表,当框架对主表中的行进行任何更新时,它会将行的当前状态插入到Log表中。所以我对表的状态有一个完整的审计跟踪。 (我有时间记录,因为我的所有表都有LoggedAt列。)
没有插件,我担心,更多的做事方法需要融入整个数据库交互方法。
答案 2 :(得分: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)
现在创建一个执行此操作的sproc ......
INSERT Data (MyID, Name)
VALUES(@MyID,@Name)
UPDATE MyData SET DataID = @@IDENTITY
WHERE ID = @MyID
通常,MyData表只是一个关键表。然后,将其指向Data表中最新的记录。无论何时需要更改数据,只需调用将新数据插入数据表的sproc,然后更新MyData以指向最新记录。全部,如果系统中的其他表将自己从MyData.ID键入以用于外键目的。
这种安排避免了对第二个日志表的需求(并且在架构更改时保持它们同步),但是在创建新记录时需要额外的连接和一些开销。
答案 3 :(得分:0)
您是否需要它以保持可查询性,或者这只是为了从错误的编辑中恢复?如果是后者,您可以设置一个cron作业来备份MySQL存储数据的实际文件并将其发送到版本控制服务器。