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的连续性(在同一个基准内)。

  • 相关阅读:
    Dot Net WinForm 控件开发 (七) 为属性提下拉式属性编辑器
    WinForm 程序的界面多语言切换
    c#遍历HashTable
    Dot Net WinForm 控件开发 (三) 自定义类型的属性需要自定义类型转换器
    Dot Net WinForm 控件开发 (六) 为属性提供弹出式编辑对话框
    Dot Net WinForm 控件开发 (一) 写一个最简单的控件
    Dot Net WinForm 控件开发 (四) 设置属性的默认值
    Dot Net WinForm 控件开发 (二) 给控件来点描述信息
    Dot Net WinForm 控件开发 (八) 调试控件的设计时行为
    Dot Net WinForm 控件开发 (五) 复杂属性的子属性
  • 原文地址:https://www.cnblogs.com/MrHSR/p/9433729.html
Copyright © 2011-2022 走看看