代码之家  ›  专栏  ›  技术社区  ›  Andrew G. Johnson

SQL Server有什么神奇的撤消功能吗?

  •  13
  • Andrew G. Johnson  · 技术社区  · 15 年前

    长话短说,我试图使用management studio快速更新sql server中的一行,然后键入 UPDATE table SET column='value' 忘记了 WHERE other_column='other_value' 部分。去吃午饭,回来,有15封未读邮件等着我。发生在一个小时前,等待数据库人员回来查看上次备份的时间。虽然没有魔法撤销功能,是吗?

    5 回复  |  直到 15 年前
        1
  •  19
  •   Scott Ivey    15 年前

    是的,有-这是事务日志。要从这种情况中恢复,只要您的数据库处于完全恢复模式,您只需执行另一个事务日志备份,然后在设置了stop at选项的情况下执行还原,以告知还原在开始事务之前的某个时间点停止还原。这将使数据库恢复到错误的位置。

    有关使用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
    
        2
  •  4
  •   gbn    15 年前

    How to: Restore to a Point in Time (Transact-SQL)

    “时间点”是指 ohnosecond “在你胡说八道之前…

        3
  •  2
  •   Joel Coehoorn    15 年前

    它被称为事务日志。你可以把它放回去。你已经开始了 整体 重新登录到特定的时间点,而不仅仅是一个坏事务。

        4
  •  1
  •   SQLMenace    15 年前

    如果您进行数据库备份和事务日志备份,那么您可以将时间点还原到执行update语句之前的某一时刻,否则就不会

        5
  •  0
  •   Raja    15 年前

    恐怕没有。这就是为什么我总是编写select来查看结果,然后将其转换为update。同时也学到了教训,你当然可以从事务日志中恢复。