提问人:Andrew G. Johnson 提问时间:3/13/2010 更新时间:3/13/2010 访问量:381
SQL Server 是否有任何神奇的撤消功能?
Does SQL Server have any kind of magic undo feature?
问:
长话短说,我尝试使用 Management Studio 快速更新 SQL Server 中的单行,但只是键入并忘记了该部分。去吃午饭,回来后,有 15 封未读电子邮件等着我。发生在大约一个小时前,等待数据库人员回来查看上次备份是什么时候。虽然没有神奇的 UNDO 功能,是吗?UPDATE table SET column='value'
WHERE other_column='other_value'
答:
2赞
Joel Coehoorn
3/13/2010
#1
它称为事务日志。您可以回滚它。您已将整个日志回滚到特定时间点,而不仅仅是您的一个错误事务。
19赞
Scott Ivey
3/13/2010
#2
是的,有 - 这是事务日志。若要从此类情况中恢复,只要数据库处于“完整”恢复模式,只需执行另一个事务日志备份,然后使用设置的 STOPAT 选项执行还原,以告知还原在开始事务之前的某个时间点停止还原。这会将数据库恢复到您出错的点。
有关使用 STOPAT 选项 - http://msdn.microsoft.com/en-us/library/ms186858(SQL.90).aspx 的更多信息,请参见此处。
你的脚本看起来像这样......
-- backup the existing log
BACKUP LOG [MyDatabase]
TO DISK = N'\\MyServer\Share\MyDatabase.trn'
-- options left out for brevity
GO
-- restore the database first
RESTORE DATABASE [MyDatabase]
FROM DISK = N'\\MyServer\Share\MyDatabase.bak'
WITH FILE = 1,
NORECOVERY,
NOUNLOAD,
STATS = 10
GO
/* Previous transaction logs in the chain go here... */
/* restore your log that you backed up after the mistake
took place, stopping at your point where the problem happened */
RESTORE LOG [MyDatabase]
FROM DISK = N'\\MyServer\Share\MyDatabase.trn'
WITH FILE = 1,
NORECOVERY,
NOUNLOAD,
STATS = 10,
STOPAT = '2010-03-12 13:00'
GO
评论
1赞
dverespey
3/13/2010
事务日志是你的朋友,我们中有多少人在想,“我讨厌我这样做......”
0赞
Scott Ivey
3/13/2010
我们都做过——但只让它发生一次。像这样的错误是要从:)中吸取教训的
0赞
Andrew G. Johnson
3/13/2010
很棒的帖子,我稍后会尝试一下
1赞
SQLMenace
3/13/2010
#3
如果进行数据库备份和事务日志备份,则可以将时间点还原到执行 UPDATE 语句之前的那一刻,否则不可以,不是真的
0赞
Raja
3/13/2010
#4
恐怕没有。这就是为什么我总是写选择,看到结果,然后将其转换为更新。也以艰难的方式吸取了教训,哈哈。当然,您可以从事务日志中恢复。
评论
0赞
SQLMenace
3/13/2010
你是什么意思?事务日志和备份的存在是有原因的
0赞
Raja
3/13/2010
我补充说,先生......我的意思是,如果不从备份中恢复,就没有神奇的方法可以撤消此操作。(他说他正在等DB的人回来。
4赞
gbn
3/13/2010
#5
“时间点”是你把事情搞砸之前的“ohnosecond”......
评论