SQLServer数据库作为我们经常用到的产品, 在平时大家用到SQLServer的时候很多,也经常会对其进行各种操作,如果不小心把一些比较重要的数据删除了,那不用紧张,SQLServer提供了几个很方便大家恢复的模式,SQLServer简单的数据查询或添加还没什么问题,顶多就是添加错误直接删除就可以了,但如果你操作的是重要的数据库,而且库中有着重要的数据,更甚至你还进行了update、delete操作,那该怎么办呢?
解决方案:
SQLServer中误删除数据的恢复本来不是件难事,从事务日志恢复即可。但是,这个恢复需要有两个前提条件:
1.至少有一个误删除之前的数据库完全备份。
2.数据库的恢复模式(Recoverymode)是“完整(Full)”。
那么问题来了,如何查看数据库的恢复模式呢?
查看或更改数据库恢复模式
1.连接到相应的SQLServer数据库引擎实例之后,展开“数据库”;
2.右键单击所要进行操作的数据库,再选择“属性”,打开“数据库属性”对话框;
3.在“选择页”窗格中,单击“选项”;
4.当前恢复模式显示在“恢复模式”列表框中;
5.在列表中就可以选择不同的模式来更改恢复模式啦~~~
1、Simple 简单恢复模式,
Simple模式的旧称叫”Checkpoint with truncate log“,其实这个名字更形象,在Simple模式下,SQL Server会在每次checkpoint或backup之后自动截断log,也就是丢弃所有的inactive log records,仅保留用于实例启动时自动发生的instance recovery所需的少量log,这样做的好处是log文件非常小,不需要DBA去维护、备份log,但坏处也是显而易见的,就是一旦数据库出现异常,需要恢复时,最多只能恢复到上一次的备份,无法恢复到最近可用状态,因为log丢失了。 Simple模式主要用于非critical的业务,比如开发库和测试库,但是道富这边的SQL Server(即使是生产库)大都采用Simple模式,是因为这边的SQL Server大都用于非critical的业务(critical的数据库大都采用Oracle和DB2),可以忍受少于1天的数据丢失(我们的job每天都会定时备份全库)。
如果需要压缩数据库日志(Shrink语句),将数据库模式切换到简单恢复模式后压缩率才是最高的,如果你的数据库在完整恢复模式或大容量日志回复模式下采用日志压缩,压缩后的日志大小并不会很理想。
2.Full 完整恢复模式,
和Simple模式相反,Full模式的旧称叫”Checkpoint without truncate log“,也就是SQL Server不主动截断log,只有备份log之后,才可以截断log,否则log文件会一直增大,直到撑爆硬盘,因此需要部署一个job定时备份log。Full的好处是可以做point-in-time恢复,最大限度的保证数据不丢失,一般用于critical的业务环境里。缺点就是DBA需要维护log,增加人员成本(其实也就是多了定时备份log这项工作而已)。
3.Bulk-logged 大容量日志恢复
Bulk-logged模式和full模式类似,唯一的不同是针对以下Bulk操作,会产生尽量少的log: 1) Bulk load operations (bcp and BULK INSERT). 2) SELECT INTO. 3) Create/drop/rebuild index 众所周知,通常bulk操作会产生大量的log,对SQL Server的性能有较大影响,bulk-logged模式的作用就在于降低这种性能影响,并防止log文件过分增长,但是它的问题是无法point-in-time恢复到包含bulk-logged record的这段时间。 Bulk-logged模式的最佳实践方案是在做bulk操作之前切换到bulk-logged,在bulk操作结束之后马上切换回full模式。
SQLServer中误删除数据的恢复大容量日志恢复模式(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]GOALTERDATABASE[AdventureWorks2008R2]SETRECOVERYBulk_LOGGEDWITHNO_WAITGO
下面的一段话源自其他帖子:
1、这是一般大型网站数据安全的一个办法,因为数据库比较大(可能有几百G)数据,做一次完整备份时间很长,而且影响数据库服务器的性能, 为保证数据安全,大多采用完整备份+事务日志备份来保证数据安全。例如:一天做一次或者2天做一次完整备份,几个小时内做一次日志备份。(当然可以用写一 个job来实现)
2、如SQL server 2005里的镜像就是采用的这种事务日志同步的方法保证数据的同步。
3、如果恢复的日志数据出现”LSN“太早和太晚说明了事务日志间的不连续。这时要注意备份 的时间和顺序。