【问题标题】:Recover Updated Data - SQL Server 2005 [closed]恢复更新的数据 - SQL Server 2005 [关闭]
【发布时间】:2012-02-21 15:40:13
【问题描述】:

我有一个问题,在使用 sql server 2005 时,我执行了没有 where 子句的更新查询(错误地)并且列的所有原始值都丢失了。

如何获取旧值?

欢迎任何建议/提示/解决方案,我们将不胜感激。

【问题讨论】:

  • 从备份中恢复。你有备份,不是吗?
  • 能力越大,责任越大。数据库完全按照您的要求进行。让这成为一个教训:不要在生产环境中执行任何 SQL,除非它首先是 peer reviewed
  • 我不是故意的。它是错误的。我忘记放置 where 子句。相反,我被建议更新我的简历,而不是给出一个解决方案。我认为这是一个很好的社区,但我错了。我相信世界上的每个人都不会完美地工作,他们会犯这种错误。他们在那种情况下做什么???这就是我在这个社区的原因,否则我知道我需要更新我的简历。我有数据库的备份,但它超过一周,并且在这段时间内完成了十几个修改。
  • user1059637 的回答非常好,它允许恢复更新的信息没有问题,我们不要判断是否有问题,尽量不要用没有帮助的 cmets 做最坏的事情。

标签: sql sql-server sql-server-2005 sql-update


【解决方案1】:
  1. 恢复更新前的备份
  2. 将事务日志恢复到更新前的某个时间点
  3. 恢复您在更新前创建的表的副本
  4. 回滚包含更新的事务

在不知道您采取了哪些预防措施的情况下很难提供具体的解决方案。这些可能无法解决您的问题,但可能会阻止这种情况在未来发生。

在您回答这个问题之前,不要乱用会改变生产数据的 SQL。

【讨论】:

    【解决方案2】:

    嗨,AngelIII, SQL Server 会为每次事务保留日志。因此您也可以从日志中恢复修改后的数据而无需备份。

    Select [PAGE ID],[Slot ID],[AllocUnitId],[Transaction ID] ,[RowLog Contents 0]
    , [RowLog Contents 1],[RowLog Contents 3],[RowLog Contents 4] ,[Log Record]
    FROM    sys.fn_dblog(NULL, NULL)   
    WHERE AllocUnitId IN 
    (Select [Allocation_unit_id] from sys.allocation_units allocunits 
    INNER JOIN sys.partitions partitions ON (allocunits.type IN (1, 3)   
    AND partitions.hobt_id = allocunits.container_id) 
    OR (allocunits.type = 2 AND partitions.partition_id = allocunits.container_id)   
    Where object_id=object_ID('' + 'dbo.student' + '')) 
    AND Operation in ('LOP_MODIFY_ROW','LOP_MODIFY_COLUMNS')  
    And [Context] IN   ('LCX_HEAP','LCX_CLUSTERED') 
    

    这里是文章,一步一步地解释了如何去做。 http://raresql.com/2012/02/01/how-to-recover-modified-records-from-sql-server-part-1/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 2013-01-25
      相关资源
      最近更新 更多