zoukankan      html  css  js  c++  java
  • 【SQL Server备份恢复】提高恢复速度:通过数据库完整备份,来恢复损坏的某个文件

    如果数据库比较大,而只是某个文件损坏了,那么并不需要恢复整个数据库,而只需要通过完整备份,来修复损坏的文件就可以了,另外,应用后续的日志就可以完全恢复这个文件的数据。


    1、创建一个包含主文件组、读写文件组的测试数据库

    CREATE DATABASE db_test
    ON
    (
    	NAME = db_test_DATA,
    	FILENAME = 'c:db_test.mdf'
    ),
    
    FILEGROUP FG_READ_WRITE
    (
    	NAME = db_test_RW,
    	FILENAME = 'c:db_test_RW.ndf'
    )
    
    LOG ON
    (
    	NAME = db_test_LOG,
    	FILENAME = 'c:db_test.ldf'
    )
    GO


    2、创建表,插入数据

    use db_test
    go
    
    create table xxx(v int) on FG_READ_WRITE
    
    insert into xxx
    select OBJECT_ID
    from sys.objects

    3、完整备份

    backup database db_test
    to disk  ='c:db_test.bak'
    with format


    4、再次插入数据

    insert into xxx
    select 0
    
    --返回55条数据
    select *
    from xxx


    5、日志备份

    backup log db_test
    to disk = 'c:db_test.trn'


    6、关闭服务,删除文件 c:db_test_RW.ndf,重启服务后,发现数据库不能打开.



    7、尝试恢复数据库,但会报错,提示需要先备份尾日志:

    use master
    go
    
    
    RESTORE DATABASE db_test
    		FILE = N'db_test_RW'
    FROM DISK = 'c:db_test.bak'
    with norecovery
    /*
    消息 3159,级别 16,状态 1,第 1 行
    尚未备份数据库 "db_test" 的日志尾部。如果该日志包含您不希望丢失的工作,
    请使用 BACKUP LOG WITH NORECOVERY 备份该日志。
    请使用 RESTORE 语句的 WITH REPLACE 或 WITH STOPAT 子句来只覆盖该日志的内容。
    消息 3013,级别 16,状态 1,第 1 行
    RESTORE DATABASE 正在异常终止。
    */


    8、通过no_truncate选项来备份尾日志:

    backup log db_test
    to disk = 'c:db_test_trail.trn'
    with no_truncate
    /*
    已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 2 页。
    BACKUP LOG 成功处理了 2 页,花费 0.112 秒(0.074 MB/秒)。
    */
    


    9、通过完整备份,还原损坏的文件db_test_RW,从返回的信息来看,确实只是从恢复了指定的文件,而不是整个数据库:

    RESTORE DATABASE db_test
    		FILE = N'db_test_RW'
    FROM DISK = 'c:db_test.bak'
    with norecovery
    /*
    已为数据库 'db_test',文件 'db_test_RW' (位于文件 1 上)处理了 16 页。
    已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 6 页。
    RESTORE DATABASE ... FILE=<name> 成功处理了 22 页,花费 0.168 秒(1.014 MB/秒)。
    */


    10、还原日志:

    restore log db_test
    from disk = 'c:db_test.trn'
    with norecovery
    /*
    已为数据库 'db_test',文件 'db_test_RW' (位于文件 1 上)处理了 0 页。
    已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 7 页。
    RESTORE LOG 成功处理了 7 页,花费 0.092 秒(0.567 MB/秒)。
    */


    11、还原尾日志:

    restore log db_test
    from disk = 'c:db_test_trail.trn'
    with recovery
    /*
    已为数据库 'db_test',文件 'db_test_DATA' (位于文件 1 上)处理了 0 页。
    已为数据库 'db_test',文件 'db_test_RW' (位于文件 1 上)处理了 0 页。
    已为数据库 'db_test',文件 'db_test_LOG' (位于文件 1 上)处理了 2 页。
    RESTORE LOG 成功处理了 2 页,花费 0.092 秒(0.090 MB/秒)。
    */ 


    12、验证是否恢复:

    --返回55条数据,数据全部恢复
    select *
    from xxx
  • 相关阅读:
    centos安装配置jdk
    java封装数据类型——Byte
    centos7安装mysql8
    centos安装redis
    centos源码安装nginx
    Linux查看系统及版本信息
    sqlyog无操作一段时间后重新操作会卡死问题
    mysql8中查询语句表别名不能使用 “of”
    一次腾讯云centos服务器被入侵的处理
    java封装数据类型——Long
  • 原文地址:https://www.cnblogs.com/momogua/p/8304516.html
Copyright © 2011-2022 走看看