使用日志文件还原数据库插入?

时间:2012-10-22 23:06:36

标签: sql database logging transactions

我正在开发一个程序,它应该在每次运行时向数据库插入数百行。

问题是,一旦插入的数据错误,我们如何从该运行中恢复?目前我只有一个日志文件(我创建了格式),它记录了插入的原始数据(没有元数据也没有主键)。有没有办法可以创建数据库可以理解的日志,一旦我们想要撤消插入,我们就会用该日志文件为数据库提供数据。

或者,如果有其他机制从程序中撤消操作,请告诉我,谢谢。

2 个答案:

答案 0 :(得分:1)

事实上,这只有几百行,这使得所有撤销机制的曾祖母都能成功:

  • 有一个表importruns,每次运行都有一行。我假设它有一个整数自动增量PK
  • 在数据表中添加一个字段,该字段带有导入运行的PK
  • 仅限插入式运行,您只需要DELETE FROM sometable WHERE importid=$whatever

如果您还有替换/更新导入,请更进一步

    每个数据表的
  • 都有一个对应的表,其中包含一个字段:superseededby
  • 对于您更新/替换的每一行
  • ,请在此表格中添加该行的原始副本以及superseededby
  • 中的导入ID
  • 要还原,您现在必须添加INSERT INTO originaltable SELECT * FROM superseededtable WHERE superseededby=$whatever

您可以清除superseededtable已知良好的导入,以确保存储不会无限增长。

答案 1 :(得分:0)

您有几种选择。取决于您何时发现错误。 如果您知道数据存在错误,则可以使用事务API回滚到当前事务的更改。

如果您知道以后只有错误,那么您可以创建自己的日志。创建标识事务的索引,并将字段添加到将插入该id的相关表中。这将允许您准确识别它来自哪个交易。您还可以创建一个存储过程,根据给定的事务ID删除行。