zoukankan      html  css  js  c++  java
  • Database differential backup差异备份和还原

    完整备份: 备份全部选中的文件和文件夹,并不依赖文件的存档属性来确定备份哪些文件。(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份,换言之,清除存档属性),完全备份也叫完整备份。 

    差异备份: 差异备份是针对完整备份:备份上一次完整备份后发生变化的所有文件。(差异备份过程中,只备份有标记的那些选中的文件和文件夹。它不清除标记,即:备份后不标记为已备份文件,换言之,不清除存档属性,直到下一次完整备份为止)。 

    完整+差异备份的优缺点比较:  

    优点: 

    1. 占用的空间较小,在一个周期内,只需要保存一份完整备份,其它都是差异备份; 

    2. 在恢复数据时,只需要恢复一份完整备份 + 最新一次的差异备份;

     3. 虽然备份数据需要较多的时间,但还原数据使用较少的时间。

     缺点: 

    1. 若完整备份的资料丢了,则所有的备份就全完蛋了!所以要特别注意对完整备份文件的保存;

    本文中环境为SQL2012.

    例子

    1.  备份

    1.1 创建数据库TestBackup

    1.2 创建表TestTable

    CREATE TABLE [dbo].[TestTable](
    
             [id] [int] NULL,
    
             [name] [nvarchar](10) NULL
    
    ) ON [PRIMARY]
    

      

    1.3 插入数据

    insert into [TestTable] values (1,'full').

    我们把此时的点叫做 时间点1

    1.4 备份数据库,选择全备份

    BACKUP DATABASE [TestBackup] TO  DISK = N'D:database backupTestBackupDB-full.bak' WITH NOFORMAT, NOINIT, 
    
    NAME = N'TestBackup-Full Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    
    GO
    

      

    或者如下图

     

    1.5 插入数据

    insert into [TestTable] values (2,'diff1')
    

      

    我们把此时的点叫做 时间点2

    1.6 做第一个差异备份

    BACKUP DATABASE [TestBackup] TO  DISK = N'D:database backupTestBackupDB-diff1.bak' WITH  DIFFERENTIAL ,
    
    NOFORMAT, NOINIT,  NAME = N'TestBackup-Differential Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    
    GO
    

      

    或者如下图

     

    1.7 插入数据

    insert into [TestTable] values (3,'diff2')

    我们把此时的点叫做 时间点3

    1.8 做第二个差异备份

    BACKUP DATABASE [TestBackup] TO  DISK = N'D:database backupTestBackupDB-diff2.bak' WITH  DIFFERENTIAL ,
    
    NOFORMAT, NOINIT,  NAME = N'TestBackup-Differential Database Backup', SKIP, NOREWIND, NOUNLOAD,  STATS = 10
    
    GO
    

      

    2      还原(没有分区)

    2.1 还原到时间点1

    就是将全备份直接还原,这里不多叙述.

    2.2 还原到时间点2

    2.2.1做全备份的还原

    RESTORE DATABASE [TestBackup-Re] FROM  DISK = N'D:database backupTestBackupDB-full.bak' WITH  FILE = 1,  MOVE N'TestBackup'

    TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re.mdf',

     MOVE N'TestBackup_log' TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re_log.ldf',  NORECOVERY,  NOUNLOAD,  STATS = 5

    注意,必须加选项NORECOVERY.

    或如下图

     

    在这里,我们把数据还原成了另外一个数据库,名字叫TestBackup-Re.加了NORECOVERY的数据库还原后是不能直接使用的.如下图(显示正在还原)

     

    2.2.2差异还原

    选择TestBackupDB-diff1.bak文件,还原到TestBackup-Re,

    RESTORE DATABASE [TestBackup-Re] FROM  DISK = N'D:database backupTestBackupDB-diff1.bak' WITH  FILE = 1,  MOVE N'TestBackup'
    
    TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re.mdf',
    
     MOVE N'TestBackup_log' TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re_log.ldf',  RECOVERY,  NOUNLOAD,  STATS = 5
    

      

    注意mdf和log文件的命名需要手动更改和TestBackup-Re一致.

     

    还原后,查看[TestTable]表,表中数据为时间点2的数据.

     

    2.3 还原到时间点3

    2.3.1做全备份的还原(同2.2.1)

    把数据库名字改为TestBackup-Re2

    RESTORE DATABASE [TestBackup-Re2] FROM  DISK = N'D:database backupTestBackupDB-full.bak' WITH  FILE = 1,  MOVE N'TestBackup'
    
    TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re2.mdf',
    
     MOVE N'TestBackup_log' TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re2_log.ldf',  NORECOVERY,  NOUNLOAD,  STATS = 5
    

      

    下图

     

    2.3.2差异还原

    选择TestBackupDB-diff2.bak文件,还原到TestBackup-Re2,注意mdf和log文件的命名需要手动更改和TestBackup-Re2一致.

    RESTORE DATABASE [TestBackup-Re2] FROM  DISK = N'D:database backupTestBackupDB-diff2.bak' WITH  FILE = 1,  MOVE N'TestBackup'
    
    TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re2.mdf',
    
     MOVE N'TestBackup_log' TO N'C:Program FilesMicrosoft SQL ServerMSSQL11.SQL2012MSSQLDATATestBackup-Re2_log.ldf',  RECOVERY,  NOUNLOAD,  STATS = 5
    

      

    还原后,查看[TestTable]表,表中数据为时间点3的数据.

     

    3      还原(有分区)

    来,在实践中,有一个数据有分区,按照2中所属分步操作失败了.

    ITMP2每天都备份,每天删除一个老的分区,每天创建一个新的分区.按照上面的步骤,先做全备份的还原,在做差异备份的还原.报错如下:

    Unable to create restore plan due to break in the LSN chain.--(版本为sql2012)

    后来试了几次,通过如下方法解决:

    在选择Source中Device的时候,选择多个文件:选择全备份和最近一个差异备份,如下图

     

    选项Options选择默认的restore with recovery.

    备份成功后,和最后一个差异备份的分区文件和数据完全相同(即删除的分区文件新建的分区文件相同,其他数据也相同)

    4      测试完毕并测试成功

  • 相关阅读:
    微信支付-我遇到的那些问题
    [工作笔记]JDK版本不同导致的SSL异常
    mysql与oracle在groupby语句上的细节差异
    微信js-sdk调用
    循序渐进看Java web日志跟踪(3)-Log4J的使用和配置
    循序渐进看Java web日志跟踪(2)-Java日志API认识
    循序渐进看Java web日志跟踪(1)-Tomcat 日志追踪与配置
    手机号码正则表达式(含虚拟运营商)
    网站URL重写(Java UrlRewrite 的使用)
    TCP/IP提供网络传输速率
  • 原文地址:https://www.cnblogs.com/birds-zhu/p/7910065.html
Copyright © 2011-2022 走看看