zoukankan      html  css  js  c++  java
  • SQLSERVER 备份还原1

    SQLSERVER 备份还原

      参考文献:

    --概念讲解:http://www.jb51.net/article/31038.htm
    --事务日志概念:http://www.cnblogs.com/CareySon/archive/2012/02/13/2349751.html(非常详细)

    上面这些文章已经将得很详细了,小弟只是做一些总结和具体的实例演示;你可以先看看大神的,再看看小弟的,都会有收货

    sqlserver 的备份可以很简单,也可以很难,就看你对他理解多少了!

    A.恢复模式

                  1.简单恢复模式(将不产生事务日志,无法进行事务日志备份,在简单恢复模式下,日志仅仅是为了保证SQL Server事务的ACID。并没有恢复数据的功能)

                  2.完整恢复模式(完整备份并不像其名字“完整”那样备份所有部分,而是仅备份数据库本身,而不备份日志(虽然仅仅备份少量日志用于同步))

                  3.大容量日志恢复模式 

    SQL语句切换模式:

       
       ALTER DATABASE NAME SET RECOVERY SIMPLE        --简单模式
    
       ALTER DATABASE NAME SET RECOVERY FULL          --完整模式
       
       ALTER DATABASE NAME SET RECOVERY BULK_LOGGED   --容量模式

    B.各种备份  

                  1.完整备份 (创建完一个新数据库之后,强烈建议甚至强制做一次完整备份)

                  2.差异备份

                  3.事务日志备份

                  4.文件和文件组备份

    使用下面的语句可以看出,那些数据库做过备份

      SELECT * FROM MSDB.dbo.BACKUPSET

     C.参数讲解

                  先讲解一些基本的语法和参数使用(主要是with 后面的参数)

                   { NOINIT | INIT }

                    控制备份操作是追加到还是覆盖备份介质中的现有备份集。 默认为追加到介质中最新的备份集 (NOINIT)。

      D.具体实例

     1.完整模式下使用事务日志备份和还原

    CREATE DATABASE MC
      GO
      USE MC
      GO
     
      ALTER DATABASE MC SET RECOVERY FULL
      
      BACKUP DATABASE MC
      TO DISK='F:TESTMC.BAK'
     
      
       CREATE TABLE STU(
       ID INT IDENTITY(1,1),
       NAME VARCHAR(100)
       )
       GO
      
       INSERT INTO STU VALUES('LIUQI1')
       INSERT INTO STU VALUES('LIUQI2')
       INSERT INTO STU VALUES('LIUQI3')
       
       --执行一次事务日志备份
       BACKUP LOG MC
       TO DISK='F:TESTLOGMC.TRN'
       
       --然后我们再插入第二数据
        INSERT INTO STU  VALUES('SECONDE')
        INSERT INTO STU  VALUES('SECONDE')
        INSERT INTO STU  VALUES('SECONDE')
        GO
        
        --进行第二次事务日志备份;
        BACKUP LOG MC
        TO DISK='F:TESTLOGMC1.TRN'
        
        --
        SELECT * FROM STU
        TRUNCATE TABLE STU
        SELECT * FROM STU
        --突然间,数据被全部删除了,幸好老子又备份;
        
        
        --先分离数据库mc 如果觉得无用,可以直接删除
        --先恢复完整备份的数据库;
        --USE master 
        --GO
        --DROP DATABASE MC
        
        RESTORE DATABASE NEW_MC1
        FROM DISK='F:TESTMC.BAK'
        WITH REPLACE,NORECOVERY
        
        RESTORE LOG NEW_MC1
        FROM DISK='F:TESTLOGMC.TRN'
        WITH NORECOVERY
    
        
        RESTORE LOG NEW_MC1
        FROM DISK='F:TESTLOGMC1.TRN'
        WITH RECOVERY
        
        USE NEW_MC1 
        GO
        SELECT * FROM STU
    View Code

     2.完整模式下使用事务日志备份和还原(将数据库恢复到指定的时间点

    --1.首先创建一个数据库
    CREATE DATABASE MC67
    GO
    
    --2.设置数据库的恢复模式为:完整。
    ALTER DATABASE MC67 SET RECOVERY FULL
    
    --3.进行一次完整备份(这个是必须的)
    BACKUP DATABASE MC67
    TO DISK='F:TESTMC67.BAK'
    WITH INIT
    GO
    
    USE MC67
    GO
    --4.创建表,并插入测试数据;
    CREATE TABLE STU(
     ID INT ,
     NAME VARCHAR(50)
    )
    GO
    
    INSERT INTO STU VALUES(1,'刘奇1')
    INSERT INTO STU VALUES(2,'刘奇2')
    INSERT INTO STU VALUES(3,'刘奇3')
    INSERT INTO STU VALUES(4,'刘奇4')
    GO
    
    --5.现在延迟五秒种
    WAITFOR DELAY '00:00:05'
    
    SELECT * FROM STU
    
    --6.现在某个时间不小小心误删了数据
    TRUNCATE TABLE STU
    GO
    SELECT GETDATE() --2015-10-06 15:05:17.380
    
    --7.备份事务日志
    BACKUP LOG MC67
    TO DISK='F:TESTMC67_LOG.TRN'
    WITH FORMAT
    
    --8.先恢复原先的数据库;(也就是备份的)
    USE master
    GO
    SP_DETACH_DB MC67,TRUE  ----分离数据库
    GO
    
    RESTORE DATABASE NEWMC67
    FROM DISK='F:TESTMC67.BAK'
    WITH REPLACE, NORECOVERY  --这里要使用NORECOVERY
    
    --9.现在来恢复事务日志;
    RESTORE LOG NEWMC67
    FROM DISK='F:TESTMC67_LOG.TRN'
    WITH STOPAT='2015-10-06 15:04'
    --10测试
    USE NEWMC67
    GO
    select * FROM STU
    View Code

     3.简单模式下的差异备份和还原 (有缺陷)

       这种方式是有缺陷的,如:我们在每周一0点做一次完整备份,在周三0点和周五0点分别做差异备份。在简单恢复模式下,如果周六数据库崩溃。我们的恢复计划只有根据周一0点的做的完整备份恢复后,再利用周五0点的差异备份进行恢复.而周五0点之后到服务器崩溃期间所有的数据将会丢失。

       

     4.完整模式下的差异备份和还原

      这里值的注意是:如果进行了两次全备份,mc67_full1.bak 接着又进行一次全备份 mc67_full2.bak,而你的差异备份是在mc67_full2.bak之后额的,那么在进行还原的时候,只能使用mc67_full2.bak进行差异还原。,总之,差异备份是基于前一次的全备份而进行的差异备份

    USE MASTER
    GO
    
    CREATE DATABASE MC67
    GO
    
    --USE MC67
    --GO
    
    CREATE TABLE SHOW
    (
      ID INT IDENTITY(1,1),
      INFO VARCHAR(100)
    )
    
    --进行一次完整备份
    BACKUP DATABASE MC67 TO DISK='F:TESTMC67_FULL.BAK'
    
    --第一次添加数据
          INSERT INTO SHOW VALUES('第一次添加数据')
          INSERT INTO SHOW VALUES('第一次添加数据')
          INSERT INTO SHOW VALUES('第一次添加数据')
    --第一次差异备份
         BACKUP DATABASE MC67 TO DISK='F:TESTMC67_DIFF1.BAK'
         WITH DIFFERENTIAL
    --第二次添加数据
          INSERT INTO SHOW VALUES('第二次次添加数据')
          INSERT INTO SHOW VALUES('第二次次添加数据')
          INSERT INTO SHOW VALUES('第二次次添加数据')
    --第二次差异备份
           BACKUP DATABASE MC67 TO DISK='F:TESTMC67_DIFF2.BAK'
           WITH DIFFERENTIAL
           
     --还原;第一差异备份的
       USE master
       GO
       RESTORE DATABASE MC67_1 FROM DISK='F:TESTMC67_FULL.BAK' 
       WITH NORECOVERY,
       MOVE 'MC67' TO 'F:TESTONEMC67.MDF',
       MOVE 'MC67_LOG' TO 'F:TESTONEMC67_LOG.LDF'
       
       
       RESTORE DATABASE MC67_1 FROM DISK='F:TESTMC67_DIFF1.BAK'
       WITH RECOVERY 
      
       USE MC67_1 
       GO
       SELECT * FROM SHOW
       --结果:
       /* 
         1    第一次添加数据
         2    第一次添加数据
         3    第一次添加数据
       
       */
    
       --还原第二次差异备份的数据
       USE master
       GO
       RESTORE DATABASE MC67_2 FROM DISK='F:TESTMC67_FULL.BAK' 
       WITH NORECOVERY,
       MOVE 'MC67' TO 'F:TESTTWOMC67.MDF',
       MOVE 'MC67_LOG' TO 'F:TESTTWOMC67_LOG.LDF'
       
       
       RESTORE DATABASE MC67_2 FROM DISK='F:TESTMC67_DIFF2.BAK'
       WITH RECOVERY 
       
       USE MC67_2
       GO
       SELECT * FROM SHOW
       --结果:
       /*
        1    第一次添加数据
        2    第一次添加数据
        3    第一次添加数据
        4    第二次次添加数据
        5    第二次次添加数据
        6    第二次次添加数据
       
       */
    View Code
  • 相关阅读:
    MySQL索引长度限制问题
    Mysql查询缓存碎片、缓存命中率及Nagios监控
    PHP多台服务器跨域SESSION共享
    php会话全揭秘
    深入PHP中慎用双等于(==)的详解
    php二进制安全的含义
    分表,分库算法
    php学习网站推荐
    在linux平台下,设置core dump文件属性(位置,大小,文件名等)
    常用Linux shell命令汇总
  • 原文地址:https://www.cnblogs.com/mc67/p/4832413.html
Copyright © 2011-2022 走看看