zoukankan      html  css  js  c++  java
  • sql server 备份与恢复系列三 简单恢复模式下的备份与还原

    一.概述

      前面讲了备份的一些理论知识,这篇开始讲在简单恢复模式下的备份与还原。在简单模式下是不能做日志备份的,发生灾难后,数据库最后一次备份之后做的数据修改将是全部丢失的,所以在生产环境下,数据又很重要,一般不建议使用这种模式。 例如对一个数据库有5次完整数据备份,时间是t5,  之后发生灾难,就会部丢失。

      当数据库越来越大,完整备份时间会越来越长,为了减少丢失风险,引入差异备份。例如下图演示:在第一次建立数据库完整备份后,建立了三次差异备份,之后再建立完整备份,从而建立新的差异基准。不管是完整备份还是差异备份,一般只能在晚间进行。如果数据比较庞大又不允许长时间数据丢失,那简单恢复模式是不能满足的。

    二.备份演示

      在简单恢复模式下主要的备份是完整备份和差异备份。我这里有TestLog库,库里有二个表。假设周日做一次完整备份,周一到周六晚上每天做一次差异备份,到第二周的周日时开始新的基准线。如下所示

    use test
    exec sp_addumpdevice 'disk', 'BackupTestDevice','F:SqlServiceackupBackupTestBackup.bak'

      

    --设置恢复模式为简单恢复
     ALTER DATABASE TestLog SET RECOVERY simple
    go
    -- 做一次完整备份到备份设备中(备份基准) 假设在周日晚上 backup database TestLog to BackupTestDevice go

    go
    --差异备份 周一晚
    backup database TestLog to BackupTestDevice with differential 
    go
    --差异备份 周二晚
    backup database TestLog to BackupTestDevice with differential 
    go
    --差异备份 周三晚
    backup database TestLog to BackupTestDevice with differential 
    go
    --差异备份 周四晚
    backup database TestLog to BackupTestDevice with differential 
    go
    --差异备份 周五晚
    backup database TestLog to BackupTestDevice with differential 
    go
    --差异备份 周六晚
    backup database TestLog to BackupTestDevice with differential 
    go
    --完整备份 周日晚(新基准)
    backup database TestLog to BackupTestDevice 
    --差异备份 周一晚
    backup database TestLog to BackupTestDevice with differential 

     在备份设备中查看备份集
      

    -- 通过脚本查看

    select distinct s.first_lsn,s.last_lsn,s.database_backup_lsn,s.position,
    s.backup_finish_date,s.type,y.physical_device_name,s.backup_size
    from msdb..backupset as s inner join
    msdb..backupfile as f on f.backup_set_id=s.backup_set_id inner join
    msdb..backupmediaset as m on s.media_set_id=m.media_set_id inner join
    msdb..backupmediafamily as y on m.media_set_id=y.media_set_id
    where s.database_name='TestLog'
    order by s.position asc

    三. 还原演示

       将一个数据库还原,需要构造一个正确的还原顺序。在还原过程中,备份文件结尾使用norecovery事务不恢复(正在还原。。)不可读写,在最后一个备份文件结尾使用recovery事务恢复。数据库恢复正常。

    -- 切换到master库
    use master
    --设置单用户模式(否则执行下面报错:“因为数据库正在使用,所以无法获得对数据库的独占访问权”)
    ALTER DATABASE TestLog SET OFFLINE WITH ROLLBACK IMMEDIATE
    -- 从备份恢复一个全备份 ,norecovery(正在还原...)不可读写. file指备份集位置号
    restore database TestLog from BackupTestDevice with file=1, norecovery 

      

    -- 恢复到差异备份文件3,跳过差异备份2 ,看是否备份成功
    restore database TestLog from BackupTestDevice  with file=3, recovery

      

    -- 备份结束之后,结束单用户模式
    ALTER  database  TestLog  set   online  

     下面在来演示还原差异文件,使用旧基准。还原看会怎么样

    -- 从旧基准中恢复一个全备份 ,norecovery(正在还原...)不可读写. file是1
    restore database TestLog from BackupTestDevice with file=1, norecovery 
    
    --新基准file是8, 恢复到差异备份文件9 
    restore database TestLog from BackupTestDevice  with file=9, recovery

     总结:对于简单恢复模式,没有日志备份,恢复只需要一个完整数据库备份,以及最后一个差异备份。 对于多个差异备份文件,在还原时不需要LSN的连续性(在同一个基准内)。

  • 相关阅读:
    MVC之Ajax异步操作
    MVCHtmlHelper使用
    Xamarin.Forms初始
    .NET CORE2.0后台管理系统(一)配置API
    DDD领域驱动之干货(四)补充篇!
    基于官方驱动封装mongodb
    webApi签名验证
    在.Net下使用redis基于StackExchange.Redis
    DDD领域驱动之干货(三)完结篇!
    DDD领域驱动之干货(二)
  • 原文地址:https://www.cnblogs.com/MrHSR/p/9433729.html
Copyright © 2011-2022 走看看