还原方案

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

还原和恢复整个数据库。数据库在还原和恢复操作期间会处于离线状态。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. XAML 设计器已意外退出。(退出代码: e0434352)

    一.前言 开门见山,这个问题我遇到过两次,第一次因为项目刚开始不长时间,我查了很长时间都没解决,然后就直接重写了,几乎一样的写法,但问题没复现了,但程序员思维告诉我,一定还是有比较关键的地方出现了问题 ...

  2. Windows7蓝牙音响连接成功,但是无法播放音乐,没有声音

    本人使用的蓝牙是博通94360CD的无线网卡集成的,在Windows7系统,成功安装蓝牙驱动,但是无论连接什么蓝牙音响设备,都可以连接成功,但是在音频管理却没有蓝牙音响的设备,自然就没有声音.后来找到 ...

  3. 抽象同步队列AQS原理和实践

    AQS简述 AQS是一个FIFO的双向队列,队列元素类型为Node(也就是Thread).AQS有一个state属性,ReentrantLock可以用来便是当前线程获取锁的可重入次数:对于samaph ...

  4. 一个斜杠引发的CDN资源回源请求量飙升

    背景 一个安静的晚上,突然接到小伙伴电话线上CDN回源异常,具体表现为请求量飙升,且伴有少量请求404,其中回源请求量飙升已经持续两天但一直未被发现,直到最近404请求触发了告警后分析log才同时发现 ...

  5. 迁移学习(NRC)《Exploiting the Intrinsic Neighborhood Structure for Source-free Domain Adaptation》

    论文信息 论文标题:Exploiting the Intrinsic Neighborhood Structure for Source-free Domain Adaptation论文作者:Shiq ...

  6. ACM-NEFUOJ-汉诺塔问题

    P200汉诺塔 #include<bits/stdc++.h> using namespace std; int main() { int n,i; long long s[40]; s[ ...

  7. 提交docker镜像

    docker commit -m="提交的描述信息" -a="作者" 容器id 目标镜像名:[TAG]

  8. 淘宝/天猫获得淘宝商品评论 API 返回值说明

    item_review-获得淘宝商品评论 taobao.item_review 公共参数 API测试工具 名称 类型 必须 描述 key String 是 调用key(必须以GET方式拼接在URL中) ...

  9. CommunityToolkit.Mvvm8.1 viewmodel使用-旧式写法(2)

    本系列文章导航 https://www.cnblogs.com/aierong/category/2297596.html 0.说明 CommunityToolkit.Mvvm8.1有一个重大更新的功 ...

  10. 5.根据uid获取用户所有收货地址信息和设置默认地址

    1.总结:昨天主要是实现了根据uid获取该用户的所有收货地址以及设置默认地址:再对默认地址的实现里面让我认识到它的具体操作,首先我们根据aid查询收货地址 再根据收货地址查询到地址归属人的信息,判断u ...