• 分析VLF以及利用日志备份还原数据库到指定时间


    本文原整理于2012-09

    一备份链

    USEMASTER;

    GO

    CREATEDATABASElogtest

    运行如下语句

    USElogtest

    go

    DBCCloginfo

    1-1

    运行如下语句可以看到产生很多VTL

    USElogtest

    go

    SELECTTOP 10000 *INTOt1

    FROMAdventureWorks.Sales.SalesOrderHeader

    DBCCloginfo

     

    1-2

    运行如下语句可以看到日志被截断,标记为可重用状态(status=0)

    USElogtest

    BACKUPDATABASElogtestTODISK='c:logtest_full.bak'

    DBCCloginfo

     

    1-3

    重新插入一个新表,可以看到VTL又将处于活动状态

    --at 21:59

    SELECTTOP 10000 *INTOt2

    FROMAdventureWorks.Sales.SalesOrderHeader

    DBCCloginfo

     

    1-4

    --at 22:03

    BACKUPDATABASElogtestTODISK='c:logtest_diff.bak'WITHdifferential

    DBCCloginfo

     

    1-5

    --at 22:04

    SELECTTOP 10000 *INTOt3

    FROMAdventureWorks.Sales.SalesOrderHeader

    DBCCloginfo

     

    1-6

    --at 22:10

    BACKUPLOGlogtestTODISK='c:logtest_log201209192210'--注意不要加bak后缀

    DBCCloginfo--可以看到VTL被标记为可复用状态(satus=0)

     

    1-7

    --at 22:15 误删t3的数据表

    DELETEFROMt3

    DBCCloginfo

     

    1-8

    二利用备份链还原数据库

    --需将数据库恢复到22:15之前数据被删除的状态

    --1 首先备份尾部日志

    --at 22:22

    BACKUPLOGlogtestTODISK='c:logtest_log_tail'

    DBCCloginfo --

    VTL将变为可复用

     

    2-1

    --2.还原数据库到指定时间(被删前的时间 22:15以前)

    --at 22:31

    USEmaster

    restore DATABASE logtest FROM DISK='c:logtest_full.bak'WITH REPLACE,norecovery

    restore DATABASE logtest FROM DISK='c:logtest_diff.bak'WITH REPLACE,norecovery--该步也可忽略,前提是日志备份链完整

    RESTORE LOG logtest FROM DISK='c:logtest_log201209192210'WITH REPLACE,norecovery

    RESTORE LOG logtest FROM DISK='c:logtest_log_tail'WITH REPLACE,RECOVERY,STOPAT='2012-09-19 22:15:00'

    USElogtest

    SELECT*FROMt3

    可以看到数据库恢复到指定时间成功如下图

     

    2-2

    3.还原到指定的日志备份集

    USEmaster

    restore DATABASE logtest FROM DISK='c:logtest_full.bak'WITH REPLACE,norecovery

    restore DATABASE logtest FROM DISK='c:logtest_diff.bak'WITH REPLACE,NORECOVERY--该步也可忽略,前提是日志备份链完整

    RESTORE LOG logtest FROM DISK='c:logtest_log201209192210'WITH REPLACE,RECOVERY

    USElogtest

    SELECT*FROMt3

    2-3

    三利用备份链复制出一个新数据库,并且将数据回退到22:15前的状态

    RESTOREDATABASE[logtest_bk]FROMDISK=N'c:logtest_full.bak'WITHFILE= 1,

    MOVEN'logtest'TON'D:$SQLDatabase$logtest_bk.mdf',

    MOVEN'logtest_log'TON'D:$SQLDatabase$logtest_bk.LDF',NORECOVERY,NOUNLOAD,STATS= 10

    GO

    RESTOREDATABASE[logtest_bk]FROMDISK=N'c:logtest_diff.bak'WITHFILE= 1,

    MOVEN'logtest'TON'D:$SQLDatabase$logtest_bk.mdf',

    MOVEN'logtest_log'TON'D:$SQLDatabase$logtest_bk.LDF',NORECOVERY,NOUNLOAD,STATS= 10

    GO

    RESTORELOG[logtest_bk]FROMDISK=N'c:logtest_log201209192210'WITHFILE= 1,NORECOVERY,NOUNLOAD,STATS= 10

    GO

    RESTORELOG[logtest_bk]FROMDISK=N'c:logtest_log_tail'WITHFILE= 1,NOUNLOAD,STATS= 10,STOPAT='2012-09-19 22:15:00'

    GO

    USElogtest_bk

    SELECT*FROMt3

     

    3-1

    四注意事项

    1还原数据库前必须先备份日志尾巴

    2.利用日志或者差异备份还原之前,必须在还原链上先还原全备。

    否则会报"无法还原日志备份或差异备份,因为没有文件可用于前滚。"

  • 相关阅读:
    PMO的重要性
    idea CPU过高问题
    近期面试心得
    Spring-Eureka
    BIO/NIO
    redis redlock
    nmon 安装及使用 【linux环境】
    一致性hash 算法
    gossip协议了解
    00008
  • 原文地址:https://www.cnblogs.com/dotagg/p/6369552.html
Copyright © 2020-2023  润新知