还原方案

数据库级(数据库完整还原)

还原和恢复整个数据库。数据库在还原和恢复操作期间会处于离线状态。SQL SERVER不允许用户备份或还原单个表。还原方案是指从一个或多个备份中还原数据、继而恢复数据库的过程。

不同恢复模式所支持的各种还原方案

简单恢复模式下

这是基本的还原策略,数据库完整还原可能涉及完整数据库备份的简单还原和恢复。另外,完整的数据库还原还可能涉及还原完整数据库备份,以及还原和恢复差异备份

完整/大容量日志恢复模式下

这是基本的还原策略,数据库完整还原涉及还原完整数据库备份或差异备份,以及所有后续日志备份(按顺序)。通过恢复并还原上一次日志备份,完成数据库完整还原。

在恢复数据库前,SQL Server 数据库引擎都会保证整个数据库在逻辑上的一致性。例如,还原一个文件以后,必须恢复完整的一套日志文件备份,以便将该文件里的事务前滚足够长度,与数据库保持一致,才能恢复该文件并使其在线。

数据库完整还原

在简单情况下,还原操作只需要一个完整数据库备份,一个差异数据库备份和后续日志备份。

数据库还原到故障点操作步骤

  1. 首先备份活动事务日志(日志的”尾部“)
  2. 按备份的创建顺序还原最新的完整数据库备份,最新的差异备份(如果有)及所有后续日志备份

若源数据库是简单模式,则没有相应的日志备份。恢复工作仅限于还原一个完整数据库备份,以及最后的一个差异备份。

数据库发生灾难后,如何将之恢复到一个特定的恢复点

  • 场景

一个关键数据表被人在中午 12 点 01 份误删,如何将其恢复到 12 点的那个状态呢?

  • 解决方案

    通过恢复日志文件到指定恢复点的方式来实现。有以下几个先决要求,而且是要在灾难发生之前,数据库就必须满足以下所有条件:
  1. 数据库的恢复模式必须是完整恢复模式
  2. 灾难发生前,数据库曾做过一个完整数据库备份
  3. 在上次完整数据库备份后,若做过任何日志备份,这些日志备份现在每个都能找到。

符合以上三个要求的数据库就可以使用备份恢复方法将数据库恢复到完整备份后的任意一个时间点。

将数据库恢复到故障点的基本步骤如下:

  1. 备份活动事务日志(也称为日志尾部)。此操作将创建尾日志备份。如果活动事务日志在灾难发生后变得不可用,则该日志部分的所有事务都将丢失。
  2. 还原最新完整数据库备份,而且不做事务恢复
  3. 如果存在差异备份,则还原最新的差异备份,而不做事务恢复
  4. 从还原备份后创建的第一个事务日志备份开始,使用 NORECOVER 依次还原日志
  5. 恢复数据库到某个时间点(RESTORE DATABASE database_name with stopat='???', RECOVERY)
完整数据库备份+差异备份+事务日志备份 示例

示例前准备

清空表 msdb..backupset 上 2018/09/28 之前的记录,注意时间

USE msdb;
GO
EXEC sp_delete_backuphistory @oldest_date = '09/28/2018';

AdventureWorksDW2018 库的恢复模式修改为完整恢复模式,否则会报 4208 错误

USE master ;
ALTER DATABASE AdventureWorksDW2018 SET RECOVERY FULL ;
-- 显示 AdventureWorksDW2018 这个数据库历史上曾经的备份信息。
use msdb;
select distinct s.first_lsn, s.last_lsn,
s.database_backup_lsn, s.backup_start_date, s.backup_finish_date,
s.type, y.physical_device_name
from msdb..backupset s inner join
msdb..backupfile f on f.backup_set_id = s.backup_set_id inner join
msdb..backupmediaset m on s.media_set_id = m.media_set_id inner join
msdb..backupmediafamily y on m.media_set_id = y.media_set_id
where (s.database_name = 'AdventureWorksDW2018')
order by s.backup_finish_date desc;

示例操作内容

将创建 AdventureWorksDW2018 数据库的尾日志备份,将还原较早的完整数据库备份和日志备份,最后还原尾日志备份。事务恢复动作将在最后的尾日志恢复步骤中完成,在此之前数据库不能被访问。

  1. 对数据库做一个全备份
    BACKUP DATABASE [AdventureWorksDW2018] TO DISK='F:\backup\AdvFull1.bak'
  2. 对数据库做一个操作,然后做一个日志备份
      --drop table t2;
    use AdventureWorksDW2018;
    create table t2(number int, name nvarchar(50));
    insert into t2 values(1, 'a');
    go
    BACKUP LOG [AdventureWorksDW2018] TO DISK='F:\backup\AdvLog2.bak'
  3. 对数据库做一个操作
      use AdventureWorksDW2018;
    insert into t2 values(2, 'b');
    go
  4. 此时灾难发生,试图创建一个尾日志备份
    use master
    backup log [AdventureWorksDW2018] to disk = 'F:\backup\AdvLogTail.bak' with norecovery;
    go
  5. 删除 AdventureWorksDW2018 数据库
    drop database [AdventureWorksDW2018];
  6. 从备份恢复一个全备份
    restore database [AdventureWorksDW2018] from disk = 'F:\backup\AdvFull1.bak' with norecovery;
  7. 从备份中恢复一个正常的日志备份
    restore log [AdventureWorksDW2018] from DISK='F:\backup\AdvLog2.bak' with norecovery;
  8. 用 STOPAT 恢复尾日志文件
    restore log [AdventureWorksDW2018] from DISK='F:\backup\AdvLogTail.bak' with stopat = '2018-09-27 16:23:00.000', recovery;
    go
  9. 验证数据完整性
    use AdventureWorksDW2018
    select * from t2;

方案缺点

要做一次数据库的完整备份恢复,这在时间上和空间上都是代价高昂的

  • 时间上

    SQL Server 需要很长的时间来重建整个数据库。在此过程中,数据库是不能访问的。重建时间的长短基本由硬盘的速度决定。一个上TB的数据库做一个完整恢复可能需要近一天的时间,这个等待时间很多系统不能接受。

  • 空间上

    一个完整备份的大小和数据库已使用空间大小基本一致。若备份要放在硬盘上,需要硬盘能提供2倍的存储空间,一份放数据库,一份放备份。

参考资料

<<SQL Server 2012 实施与管理实战指南>>

SQL Server 2008/2012 完整数据库备份+差异备份+事务日志备份 数据库完整还原(一)的更多相关文章

  1. SQL Server 2008 维护计划实现数据库备份

    SQL Server 2008 维护计划实现数据库备份(最佳实践) 2013-08-29 09:08 by 听风吹雨, 173 阅读, 2 评论, 收藏, 编辑 一.背景 之前写过一篇关于备份的文章: ...

  2. SQL Server 2008 R2 清空数据库中ldf日志文件

    /************************************************************ * Sql Server 2008 R2 清空数据库中ldf日志文件 * 将 ...

  3. SQL Server 2008 R2 主从数据库同步

    一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2    DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...

  4. SQL SERVER 2008/2012/2012R2/2014 设置开启远程连接(sa配置)

    本文方案适用于Microsoft Sql Server 2008/2012/2012 r2/2014版本,以下简称MSSQLSERVER. MSSQL默认是不允许远程连接,并且禁用sa账户的.如果想要 ...

  5. SQL Server 2008 R2 主从数据库同步设置

    一.准备工作: 主数据库服务器: OS:Windows Server 2008 R2    DB: SQL Server 2008 R2 Hostname : CXMasterDB IP: 192.1 ...

  6. 基于Sql Server 2008的分布式数据库的实践(五)

    原文 基于Sql Server 2008的分布式数据库的实践(五) 程序设计 ------------------------------------------------------------- ...

  7. 基于Sql Server 2008的分布式数据库的实践(四)

    原文 基于Sql Server 2008的分布式数据库的实践(四) 数据库设计 1.E-R图 2.数据库创建 Win 7 1 create database V3 Win 2003 1 create  ...

  8. 基于Sql Server 2008的分布式数据库的实践(三)

    原文 基于Sql Server 2008的分布式数据库的实践(三) 配置PHP 1.打开PHP配置文件,找到extension=php_mssql.dll,将前面的注释符号去掉 2.找到mssql.s ...

  9. 基于Sql Server 2008的分布式数据库的实践(二)

    原文 基于Sql Server 2008的分布式数据库的实践(二) 从Win7连接Win2003的Sql Server 2008 1.新建链接服务器链接到Win2003的Sql Server 2008 ...

  10. 基于Sql Server 2008的分布式数据库的实践(一)

    原文 基于Sql Server 2008的分布式数据库的实践(一) 配置Sql Server 2008(Win7) 1.打开SQL server2012,使用windows身份登录 2.登录后,右键选 ...

随机推荐

  1. java多线程基础小白指南--关键字识别(start,run,sleep,wait,join,yield)

    在学习java多线程基础上,会遇到几个关键字,理解并识别它们是掌握多线程的必备知识,下面,我将通过源码或者程序演示给出我对这几个关键字的理解,如果有不同意见,欢迎在评论区或者发私信与我探讨. 一.st ...

  2. Spring(Bean详解)

    GoF之工厂模式 GoF是指二十三种设计模式 GoF23种设计模式可分为三大类: 创建型(5个):解决对象创建问题. 单例模式 工厂方法模式 抽象工厂模式 建造者模式 原型模式 结构型(7个):一些类 ...

  3. JavaScript中计时器requestAnimationFrame、setTimeout、setInterval、setImmediate的使用和区别

    在JavaScript中,我们经常使用requestAnimationFrame.setTimeout.setInterval和setImmediate来控制代码的执行时机.它们各有特点和适用场景: ...

  4. Django之admin后台管理

    目录 创建超级用户 向页面中添加表 admin管理页面表名中文显示 创建超级用户 python manage.py createsuperuser 向页面中添加表 登录后,页面中是什么都没有的,还需要 ...

  5. 扯下@EventListener这个注解的神秘面纱。

    你好呀,我是歪歪. 前段时间看到同事在项目里面使用了一个叫做 @EventListener 的注解. 在这之前,我知道这个注解的用法和想要达到的目的,但是也仅限于此,其内部工作原理对我来说是一个黑盒, ...

  6. Java设计模式 —— 组合模式

    11 组合模式 11.1 组合模式概述 Composite Pattern: 组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式使得客户端可以统一处理单个对象和组合对象. 组合模式关 ...

  7. day107:MoFang:Python操作MongoDB数据库:PyMongo

    目录 PyMongo 1.PyMongo安装 2.数据库连接 3.数据库管理 4.集合管理 5.文档管理 PyMongo 1.PyMongo安装 pip install pymongo 2.数据库连接 ...

  8. MySQL(四)用户与权限管理

    用户与权限管理 用户管理 MySQL用户分为普通用户和root用户,提供了许多语句来管理包括登录.退出MySQL服务器.创建用户.删除用户.密码管理和权限管理等内容. 登录MySQL服务器 mysql ...

  9. 【Ubuntu】 Perf工具的使用

    一.perf工具的安装 sudo apt-get install linux-tools-common sudo apt-get install linux-tools-"$(uname - ...

  10. java生成机器码

    java根据系统参数生成每个计算机的唯一标识. 1. 获取CPU序列号 /** * 获取CPU序列号 * @return * @throws IOException */ public static ...