zoukankan      html  css  js  c++  java
  • 分析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.利用日志或者差异备份还原之前,必须在还原链上先还原全备。

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

  • 相关阅读:
    Java 基础(接口的应用:代理模式 Proxy)
    Appium 环境配置
    破解CCleaner
    数据驱动
    (C语言内存二十)C语言内存泄露(内存丢失)
    (C语言内存十九)C语言野指针以及非法内存操作
    (C语言内存十八)malloc函数背后的实现原理——内存池
    (C语言内存十七)栈溢出攻击的原理是什么?
    (C语言内存十六)C语言动态内存分配
    (C语言内存十五)用一个实例来深入剖析函数进栈出栈的过程
  • 原文地址:https://www.cnblogs.com/dotagg/p/6369552.html
Copyright © 2011-2022 走看看