MSSQL-最佳实践-数据库恢复模式与备份的关系

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
日志服务 SLS,月写入数据量 50GB 1个月
简介: --- title: MSSQL-最佳实践-数据库恢复模式与备份的关系 author: 风移 --- # 摘要 在SQL Server备份专题分享中,前三期我们分享了三种常见的数据库备份、备份策略的制定以及如何查找备份链。本期我们将分享数据库的三种恢复模式与备份之间的关系,SQL Server的三种数据库恢复模式包括: 简单恢复模式(Simple) 完全恢复模式(Full)

title: MSSQL-最佳实践-数据库恢复模式与备份的关系

author: 风移

摘要

在SQL Server备份专题分享中,前三期我们分享了三种常见的数据库备份、备份策略的制定以及如何查找备份链。本期我们将分享数据库的三种恢复模式与备份之间的关系,SQL Server的三种数据库恢复模式包括:
简单恢复模式(Simple)
完全恢复模式(Full)
大容量日志恢复模式(Bulk-logged)

SQL Server三种恢复模式

简单恢复模式(Simple)

简单恢复模式下的数据库事务日志会伴随着Checkpoint或者Backup操作而被清理,最大限度的保证事务日志最小化。

工作原理

按照我个人的理解,简单恢复模式(Simple)这个名字不足以很好的描述数据库的工作原理,准确的说法应该是”Checkpoint with truncate log”。详细的解释就是:所有已经提交的事务,会伴随着数据库的Checkpoint或者Backup操作的完成而被清理掉,仅保留少许用于实例重启时Recovery所需必要少量日志。这样做的好处是,数据库的事务日志非常的少,空间占用小,节约存储开销,不需要专职的DBA去维护和备份数据库日志。但是坏处也是显而易见的,比如:
无法实现数据库的日志备份
基于简单恢复模式的数据库无法实现任意时间点恢复(point-in-time recovery)
数据最多能够恢复到上一次的备份文件(可以是完全或者差异备份),无法恢复到最近可用状态

适用场景

基于以上数据库简单恢复模式的工作原理和缺点,因此简单恢复模式的适用场景就非常清楚了,包括:
数据库存储的是非关键数据(比如:日志信息等)
数据库在任何时间,任何场景下都没有任意时间点恢复的需求
在数据库灾难发生时,可以接受部分数据库丢失
数据库中数据变化频率非常低
数据库在可以预见的时间内没有高可用(HA)需求(比如:Database Mirroring, AlwaysOn, Log Shipping等)

设置简单恢复模式

在介绍完简单恢复模式使用场景之后,让我们来看看如何将数据库修改为简单恢复模式,以下两种方法任选其一即可。
方法一,使用SSMS IDE界面操作
右键点击需要修改恢复模式的数据库名 -> Properties -> Options -> 在右侧Recovery model中选择Simple -> OK
01.png

方法二,使用语句修改
如果你觉得使用SSMS IDE修改操作繁琐,你也可以使用ALTER DATABASE语句来修改数据库的恢复模式为Simple,以下语句是将AdventureWorks2008R2数据修改为简单恢复模式。

USE [master]
GO
ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY SIMPLE WITH NO_WAIT
GO

应用举例

数据库为简单恢复模式的应用举例如下图所示:
02.png

注:以上图片来自于网络:https://sqlbak.com/academy/simple-recovery-model/

10:00和22:00数据库进行了完全备份(Full Backup)
16:00数据库完成了差异备份(Differential Backup)
19:00一些重要的数据库被误删除
在这种情况之下,我们最多能够找回到16:00这个差异备份文件中的数据,而16:00 - 22:00之间的数据将会丢失而无法找回。即我们最多能够找回异常发生时间点的前一个备份文件中的数据,找回方法是,先还原10:00这个Full Backup,然后还原16:00这个Differential Backup。还原数据库的方法类似于如下语句:

USE [master]
GO

RESTORE DATABASE [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\10:00_Full.bak' WITH NORECOVERY, REPLACE

RESTORE DATABASE [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\16:00_Diff.bak' WITH RECOVERY

通过以上方法,在简单恢复模式下的数据库,无法找回数据删除时间点靠前的所有数据,最多能够找回前一个有效备份的数据。

完全恢复模式(Full)

与SQL Server数据库简单恢复模式相反的一种模式叫着:完全恢复模式(Full),以下会对数据库完全恢复的工作原理、使用场景、设置以及应用举例四个方面来了解。

工作原理

相对于简单恢复模式而言,完全恢复模式我们可以叫着“Checkpoint without truncate log”,换句话说,SQL Server数据库引擎本身不会自己主动截断事务日志,也因此,完全恢复模式下的数据库相对于简单恢复模式的数据库,事务日志文件涨的更快,大得更多。这些数据库日志文件中包含了近期所有已经提交的事务,直到事务日志备份发生且成功结束。所以,完全恢复模式下的数据库:
允许数据库日志备份
可以实现任意时间点的恢复(point-in-time recovery)
可以恢复到灾难发生时间点非常近的数据,最大限度保证数据不丢失

适用场景

基于以上对完全恢复模式的介绍,让我们来看看完全恢复模式的适用场景,包括:
数据库中存储的是非常关键的业务数据(比如:订单信息、支付信息等)
对数据安全有着非常强烈的需求,需要在任何时间,任何情况下找回最多的数据
在灾难发生时,仅能接受极少数据的丢失
对数据库的高可用(HA)要求极高(比如:Database Mirroring、Alwayson等有强需求)
对数据库有任意时间点恢复(point-in-time recovery)的能力要求
需要数据库能够实现页级别的还原能力
当然,完全恢复模式下的数据库事务日志文件增长速度和涨幅相对简单模式更大,所以,也需要DBA对数据库事务日志做定期维护,监控和备份管理。

设置完全恢复模式

将数据库设置为完全恢复模式,同样也有两种方法。
方法一、使用SSMS IDE修改数据库为完全恢复模式,同“设置简单恢复模式”中方法一。
方法二、使用ALTER DATABASE语句将数据库设置为完全恢复模式,如下语句。

USE [master]
GO
ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY FULL WITH NO_WAIT
GO

应用举例

对于完全恢复模式应用举例,如下图所示:
03.png

注:以上图片来自网络 https://sqlbak.com/academy/full-recovery-model/
对于该图的场景做如下解释:
10:00和22:00:对数据库做了完全备份
16:00:对数据库做了差异备份
12:00、14:00、18:00和20:00对数据库做了事务日志备份
19:00灾难发生,数据库中一些关键数据被误删除
那么,接下来的问题就是,我们如何利用数据库的备份信息,将19:00误删除的数据找回?也就是将数据库还原到18:59:59这个时间点的状态。根据数据库的所有备份信息,我们可以按照如下思路找回被误删除的数据。
首先,我们需要还原10:00的完全备份文件,并且状态为norecovery;
其次,我们还原16:00的差异备份文件,状态也为norecovery;
然后,还原18:00的事务日志备份文件,状态依然为norecovery;
最后,还原20:00的事务日志备份文件,需要特别注意的是这里需要指定还原到的时间点(使用STOPAT关键字)为18:59:59,并且将状态设为recovery带上线。
将以上的文字描述找回数据的步骤,以代码的形式表达出来如下:

USE [master]
GO
RESTORE DATABASE [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\10:00_Full.bak.bak' WITH NORECOVERY, REPLACE

RESTORE DATABASE [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\16:00_Diff.bak' WITH NORECOVERY

RESTORE LOG [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\18:00_Log.trn' WITH NORECOVERY

RESTORE LOG [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\20:00_Log.trn' WITH STOPAT = '2018-02-20 18:59:59', RECOVERY

通过以上步骤,在数据库完全恢复模式下,借助于备份信息,我们可以成功找回被误删除的数据,而假如数据库是工作在简单模式下,则不能达到此效果。

大容量日志恢复模式(Bulk-logged)

大容量日志恢复模式是简单恢复模式和完全恢复模式的结合体,是工作在完全恢复模式下对Bulk Imports操作的改良和适应。

工作原理

在SQL Server数据库系统中,有一种快速导入数据的方法叫Bulk Imports,比如:BCP、Bulk INSERT或者INSERT INTO ...SELECT。如果这些Bulk操作发生在完全恢复模式下的数据库,将会产生大量的日志信息,对SQL Server性能影响较大。大容量日志恢复模式的存在就是为了解决这个问题的,工作在Bulk-logged模式下的数据库在Bulk Imports的时候,会记录少量日志,防止事务日志的暴涨,以保证SQL Server性能的稳定和高效。可以简单的将Bulk-logged模式理解为:在没有Bulk Imports操作的时候,它与完全恢复模式等价,而当存在Bulk Imports操作的时候,它与简单恢复模式等价。所以,处于Bulk-logged模式下的数据库无法实现任意时间点恢复(point-in-time recovery),这个缺点与Simple模式类似。

适用场景

基于大容量日志模式的原理解释,它的适用场景包括:
Bulk Imports操作,比如:BCP、Bulk INSERT和INSERT INTO...SELECT
SELECT INTO操作
关于索引的一些操作:CREATE/DROP INDEX、ALTER INDEX REBUILD或者DBCC DBREINDEX
Bulk-logged模式最常用的使用场景是在做Bulk操作之前切换到Bulk-logged,在Bulk操作结束之后切换回Full模式

设置大容量日志恢复模式

将数据库设置为大容量日志模式,还是有两种方法。
方法一、使用SSMS IDE修改数据库为大容量日志恢复模式,同“设置简单恢复模式”中方法一。
方法二、使用ALTER DATABASE语句将数据库设置为大容量日志恢复模式,如下语句。

USE [master]
GO
ALTER DATABASE [AdventureWorks2008R2] SET RECOVERY Bulk_LOGGED WITH NO_WAIT
GO

应用举例

对于大容量日志恢复模式应用例子,参见如下图所示:
04.png
注:以上图片来自网络 https://sqlbak.com/academy/Bulk-logged-recovery-model/
对于该图的场景做如下解释:
10:00:对数据库做了完全备份
12:00、14:00、16:00和18:00:对数据库做了事务日志备份,其中16:00的日志备份(黄颜色标示)是在修改为Bulk-logged的模式后进行的
20:00:对数据库做了差异备份
14:30:将数据库修改为Bulk-logged模式
15:00:灾难发生,重要的数据被误删除
那么,接下来的问题就是,我们如何利用这些备份文件,尽可能的找回更多的数据,使丢失的数据最少。在原理部分,我们已经知道了,处于Bulk-logged模式下的数据库,无法实现任意时间点的恢复,因此16:00这个事务日志备份文件就无法使用,即使尝试使用也会报告如下错误:

This log backup contains Bulk-logged changes. It cannot be used to stop at an arbitrary point in time.

The STOPAT clause specifies a point too early to allow this backup set to be restored. Choose a different stop point or use RESTORE DATABASE WITH RECOVERY to recover at the current point.

RESTORE LOG is terminating abnormally

最终,我们能够找回的数据最多能够使用到14:00这个事务日志备份。找回的步骤如下:
首先:我们需要还原10:00的完全备份文件,并且状态为norecovery;
其次:我们还原12:00的事务日志备份文件,状态也为norecovery;
最后:还原14:00的视图日志备份,并且将状态设为recovery带上线。
将以上的文字描述步骤用代码来表达,如下:

USE [master]
GO
RESTORE DATABASE [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\10:00_Full.bak.bak' WITH NORECOVERY, REPLACE

RESTORE LOG [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\12:00_Log.trn' WITH NORECOVERY

RESTORE LOG [AdventureWorks2008R2] 
FROM DISK = 'D:\Backup\14:00_Log.trn' WITH RECOVERY

通过以上步骤,工作在Bulk-logged模式下的数据库,无法实现任意时间恢复;因此一般该模式是使用在Bulk操作的过程中。

最后总结

本期分享了SQL Server三种恢复模式的工作原理、适用场景以及典型应用举例,以此来探讨数据库恢复模式与备份之间的关系,从中我们很清楚的理解了数据库恢复模式与备份的协同工作,来保证我们数据的安全性,以及在灾难发生的时候,可以最大限度减少数据损失。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
2月前
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
77 4
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:详细步骤与最佳实践指南ali01n.xinmi1009fan.com
随着Web开发技术的不断进步,ASP.NET已成为一种非常流行的Web应用程序开发框架。在ASP.NET项目中,我们经常需要与数据库进行交互,特别是SQL数据库。本文将详细介绍如何在ASP.NET项目中连接SQL数据库,并提供最佳实践指南以确保开发过程的稳定性和效率。一、准备工作在开始之前,请确保您
171 3
|
2月前
|
消息中间件 缓存 监控
优化微服务架构中的数据库访问:策略与最佳实践
在微服务架构中,数据库访问的效率直接影响到系统的性能和可扩展性。本文探讨了优化微服务架构中数据库访问的策略与最佳实践,包括数据分片、缓存策略、异步处理和服务间通信优化。通过具体的技术方案和实例分析,提供了一系列实用的建议,以帮助开发团队提升微服务系统的响应速度和稳定性。
|
12天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
30 3
|
12天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
26 3
|
20天前
|
存储 Java 关系型数据库
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践
在Java开发中,数据库连接是应用与数据交互的关键环节。本文通过案例分析,深入探讨Java连接池的原理与最佳实践,包括连接创建、分配、复用和释放等操作,并通过电商应用实例展示了如何选择合适的连接池库(如HikariCP)和配置参数,实现高效、稳定的数据库连接管理。
39 2
|
26天前
|
存储 定位技术 数据库
介绍一下数据库的备份和恢复策略
【10月更文挑战第21】介绍一下数据库的备份和恢复策略
|
11天前
|
数据库
【赵渝强老师】数据库的备份方式
备份数据库是指将数据库中的数据及相关信息保存起来,以便在系统故障时恢复。备份对象不仅限于数据本身,还包括数据库对象、用户权限等。根据备份策略、类型和模式的不同,可分为整体/部分备份、完全/增量备份、一致/非一致备份。文中还附有相关视频讲解。
|
1月前
|
关系型数据库 MySQL 数据库
MySQL数据库:基础概念、应用与最佳实践
一、引言随着互联网技术的快速发展,数据库管理系统在现代信息系统中扮演着核心角色。在众多数据库管理系统中,MySQL以其开源、稳定、可靠以及跨平台的特性受到了广泛的关注和应用。本文将详细介绍MySQL数据库的基本概念、特性、应用领域以及最佳实践,帮助读者更好地理解和应用MySQL数据库。二、MySQL
116 5
|
1月前
|
SQL 数据管理 数据库
文章初学者指南:SQL新建数据库详细步骤与最佳实践
引言:在当今数字化的世界,数据库管理已经成为信息技术领域中不可或缺的一部分。作为广泛使用的数据库管理系统,SQL已经成为数据管理和信息检索的标准语言。本文将详细介绍如何使用SQL新建数据库,包括准备工作、具体步骤和最佳实践,帮助初学者快速上手。一、准备工作在开始新建数据库之前,你需要做好以下准备工作
121 3
下一篇
无影云桌面