none
SQL 2005数据恢复 RRS feed

  • 问题

  • 由于备份时少备份一个表,导致生产环境数据错误,现在怎么能通过LDF文件恢复,怎样将数据库内容恢复到一个时间点上.
    2009年11月6日 9:30

答案

  • 先看一个示例:

    --数据还原到指定时间点的处理示例
    --创建测试数据库
    CREATE DATABASE Db
    GO

    --对数据库进行备份
    BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT
    GO

    --创建测试表
    CREATE TABLE Db.dbo.TB_test(ID int)

    --延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
    WAITFOR DELAY '00:00:01'
    GO

    --假设我们现在误操作删除了 Db.dbo.TB_test 这个表
    DROP TABLE Db.dbo.TB_test

    --保存删除表的时间
    SELECT dt=GETDATE() INTO #
    GO

    --在删除操作后,发现不应该删除表 Db.dbo.TB_test

    --下面演示了如何恢复这个误删除的表 Db.dbo.TB_test

    --首先,备份事务日志(使用事务日志才能还原到指定的时间点)
    BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT
    GO

    --接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行)
    RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE,NORECOVERY
    GO

    --将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
    DECLARE @dt datetime
    SELECT @dt=DATEADD(ms,-20,dt) FROM #  --获取比表被删除的时间略早的时间
    RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY,STOPAT=@dt
    GO

    --查询一下,看表是否恢复
    SELECT * FROM Db.dbo.TB_test

    /*--结果:
    ID         
    -----------

    (所影响的行数为 0 行)
    --*/

    --测试成功
    GO

    --最后删除我们做的测试环境
    DROP DATABASE Db
    DROP TABLE #

     


    More: blog.csdn.net/happyflystone
    • 已标记为答案 moto-v8 2009年11月6日 15:09
    2009年11月6日 9:37

全部回复

  • 先看一个示例:

    --数据还原到指定时间点的处理示例
    --创建测试数据库
    CREATE DATABASE Db
    GO

    --对数据库进行备份
    BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT
    GO

    --创建测试表
    CREATE TABLE Db.dbo.TB_test(ID int)

    --延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
    WAITFOR DELAY '00:00:01'
    GO

    --假设我们现在误操作删除了 Db.dbo.TB_test 这个表
    DROP TABLE Db.dbo.TB_test

    --保存删除表的时间
    SELECT dt=GETDATE() INTO #
    GO

    --在删除操作后,发现不应该删除表 Db.dbo.TB_test

    --下面演示了如何恢复这个误删除的表 Db.dbo.TB_test

    --首先,备份事务日志(使用事务日志才能还原到指定的时间点)
    BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT
    GO

    --接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行)
    RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE,NORECOVERY
    GO

    --将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
    DECLARE @dt datetime
    SELECT @dt=DATEADD(ms,-20,dt) FROM #  --获取比表被删除的时间略早的时间
    RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY,STOPAT=@dt
    GO

    --查询一下,看表是否恢复
    SELECT * FROM Db.dbo.TB_test

    /*--结果:
    ID         
    -----------

    (所影响的行数为 0 行)
    --*/

    --测试成功
    GO

    --最后删除我们做的测试环境
    DROP DATABASE Db
    DROP TABLE #

     


    More: blog.csdn.net/happyflystone
    • 已标记为答案 moto-v8 2009年11月6日 15:09
    2009年11月6日 9:37
  • 另外可以log explorer 看看
    More: blog.csdn.net/happyflystone
    2009年11月6日 9:38
  • Don't think log knows you didn't backup certain table, it's different from dropping table.
    2009年11月6日 14:17
  • 先看一个示例:

    --数据还原到指定时间点的处理示例
    --创建测试数据库
    CREATE DATABASE Db
    GO

    --对数据库进行备份
    BACKUP DATABASE Db TO DISK='c:\db.bak' WITH FORMAT
    GO

    --创建测试表
    CREATE TABLE Db.dbo.TB_test(ID int)

    --延时1秒钟,再进行后面的操作(这是由于SQL Server的时间精度最大为百分之三秒,不延时的话,可能会导致还原到时间点的操作失败)
    WAITFOR DELAY '00:00:01'
    GO

    --假设我们现在误操作删除了 Db.dbo.TB_test 这个表
    DROP TABLE Db.dbo.TB_test

    --保存删除表的时间
    SELECT dt=GETDATE() INTO #
    GO

    --在删除操作后,发现不应该删除表 Db.dbo.TB_test

    --下面演示了如何恢复这个误删除的表 Db.dbo.TB_test

    --首先,备份事务日志(使用事务日志才能还原到指定的时间点)
    BACKUP LOG Db TO DISK='c:\db_log.bak' WITH FORMAT
    GO

    --接下来,我们要先还原完全备份(还原日志必须在还原完全备份的基础上进行)
    RESTORE DATABASE Db FROM DISK='c:\db.bak' WITH REPLACE,NORECOVERY
    GO

    --将事务日志还原到删除操作前(这里的时间对应上面的删除时间,并比删除时间略早
    DECLARE @dt datetime
    SELECT @dt=DATEADD(ms,-20,dt) FROM #  --获取比表被删除的时间略早的时间
    RESTORE LOG Db FROM DISK='c:\db_log.bak' WITH RECOVERY,STOPAT=@dt
    GO

    --查询一下,看表是否恢复
    SELECT * FROM Db.dbo.TB_test

    /*--结果:
    ID         
    -----------

    (所影响的行数为 0 行)
    --*/

    --测试成功
    GO

    --最后删除我们做的测试环境
    DROP DATABASE Db
    DROP TABLE #

     


    More: blog.csdn.net/happyflystone

    感谢您的答复,想再请教您一下,按照您的步骤上去恢复,结果发现数据库agent服务出错没有启动,造成一部分日志丢失了。然后又重新启动了agent服务,在这种情况下如何最佳恢复?还有比如我做了完整备份是中午12点,结果12点到3点之间的数据丢失了,如何恢复这一时间断的数据。
    2009年11月6日 15:11
  • Why sql agent stop causes database log lose? Not related at all. For second issue, backup log first. Then restore 12pm's full backup with norecovery option and restore log to specific time you like with stopat option.
    2009年11月6日 20:21