【发布时间】:2010-09-15 07:04:03
【问题描述】:
这与What’s your #1 way to be careful with a live database 的接受答案有关?
假设您为备份目的创建了一个临时表并在原始表中进行了更改。这些更改破坏了系统,您想要恢复备份。与此同时,原始表中的一些其他记录也发生了变化(它是一个实时数据库)。现在如果您恢复备份,系统将处于不一致的状态。
解决这个问题的最佳方法是什么
【问题讨论】:
标签: database
这与What’s your #1 way to be careful with a live database 的接受答案有关?
假设您为备份目的创建了一个临时表并在原始表中进行了更改。这些更改破坏了系统,您想要恢复备份。与此同时,原始表中的一些其他记录也发生了变化(它是一个实时数据库)。现在如果您恢复备份,系统将处于不一致的状态。
解决这个问题的最佳方法是什么
【问题讨论】:
标签: database
我不认为这是可取的,在将表投入生产之前我会更加努力地测试,但假设它无论如何都会发生,你有两个选择:
1.- 创建一个 ON INSERT 触发器,用插入到新表中的行更新临时备份表,按摩数据以适应旧表
或
2.- 像这样找出数据的差异
SELECT * FROM faultyTable
EXCEPT
SELECT * FROM backupTable
当然,您必须将要选择的列调整为公共子集。 EXCEPT 有时也称为 MINUS。
之后,您可以将差异插入备份表并恢复组合。表的关系越多,这就越难……根据用于恢复表的方式,您可能会删除相关数据,因此您也必须选择它。
【讨论】:
我经常这样做
BEGIN TRANSACTION
-- SQL CODE
最后,如果一切正常,请执行我的 SELECT 之类的操作
COMMIT
否则
ROLLBACK
【讨论】:
您的数据库可能会提供此功能。例如在 Oracle 中:
Export (Your options) consistent = y
当然,在生产在线环境中进行一致的备份会对系统造成性能损失。
【讨论】: