SQL Server 是否有任何神奇的撤消功能?

Does SQL Server have any kind of magic undo feature?

提问人:Andrew G. Johnson 提问时间:3/13/2010 更新时间:3/13/2010 访问量:381

问:

长话短说,我尝试使用 Management Studio 快速更新 SQL Server 中的单行,但只是键入并忘记了该部分。去吃午饭,回来后,有 15 封未读电子邮件等着我。发生在大约一个小时前,等待数据库人员回来查看上次备份是什么时候。虽然没有神奇的 UNDO 功能,是吗?UPDATE table SET column='value'WHERE other_column='other_value'

sql-服务器

评论

0赞 Kristopher Johnson 3/13/2010
相关问题:stackoverflow.com/questions/168486/...

答:

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

如何还原到某个时间点 (Transact-SQL)

“时间点”是你把事情搞砸之前的“ohnosecond”......