数据库恢复模式
SQL Server有三种可用的恢复模式。有两种是常用的,简单和完整恢复模式,第三种是大容量日志恢复模式,是完整回复模式的附加模式。恢复模式会改变事务日志的行为、可执行的备份以及数据的恢复方式。
完整恢复模式:在完整恢复模式中,所有的影响数据库的活动都已某种方式记录在事务日志中,完全记录的好处在于一旦出现故障,每一个事务都可以恢复;缺点是事务日志会很快被填满。当把数据库设置为使用完整恢复模式时,则必须开发并实现一个定期备份事务日志的有效计划。备份事务日志将清空所有旧的事务,为新的事务腾出空间。在完整恢复模式中,事务日志包含自最近一次BACKUP LOG事件之后对数据库作出的所有修改的记录,因而可以用来恢复那些事务
大容量日志恢复模式:大容量日志恢复模式是完整恢复模式的附加模式。它将数据库配置为按最小方式记录大容量操作,在大容量日志恢复模式中,列出的操作都记录为已发生的,但受影响的单独行不会记录下来。除了操作记录被记录下来之外,由操作分配或受操作影响的无力去的记录也都被记录在事务日志中。在下一个BACKU LOG事件中,受影响的无力去被复制到日志备份中。大容量日志回复模式通过按最小方式记录数据密集型笑傲做,使得日志比较小,但日志备份实际上比较大。因为日志备份依赖于日志备份时未改动的物理数据,所以如果磁盘损坏或不可用,日志备份就会失败。唉大容量日志恢复模式中,事务日志记录所有对数据库作出的完全记录的修改,以及自最近一次BACKUP LOG事件以来按最小方式记录的操作修改的去。和完整恢复模式中的事务日志一样,在数据库出现故障时,大容量日志恢复模式中的事务日志可用于还原事务。
简单恢复模式:在简单恢复模式下,日志的不活动部分会在每次SQL Server发出一个检查点时被截断,这使得恢复一个数据库所需要的时间降低到最少。基本上,日志的不活动部分就是从最早打开的日无开始到日志末尾的部分。简单恢复模式的好处是降低了事务日志管理的管理开,因为日志的不活动部分基本上在每个检查点后都会被清除,所以团扇规划的日志将永远不会增长,也不需要加以管理。不过,这种事务日志不能备份并用于数据恢复,因为它没有完整记录所有修改数据库的事务。
SQL Server 2008数据库备份
不管执行何种类型的备份,SQL Server都会执行如下操作:在事务日志中记录BACKUP语句。发出一个检查点,把所有未完成的脏缓冲页写入磁盘;把FULL,DIFFERENTIAL,FILE或FILEGROUP备份选项指定的所有数据页写入备份媒体;把记录在事务日志中的、备份过程中发生的所有数据修改写入备份媒体;在事务日志中记录备份的完成。备份语句大致如下:
--Full database backup of the master database
BACKUP DATABASE master
TO DISK='D:\SQLBackups\FullMaster.BAK'
WITH DESCRIPTION='MASTER DB FULL Backups'
SQL Server 2008备份类型
完整备份:完整备份会备份数据库中的所有数据,并记录所有数据库文件的位置,完整备份可用于任何恢复模式中
--Full database backup of Smallworks
BACKUP DATABASE SmallWorks TO DISK='D:\SQLBackups\SmallWorksFull.BAK' WITH DESCRIPTION='SmallWorks FULL Backup'
差异备份:差异备份仅备份一次完整备份之后更改的数据,不管数据库恢复模式是什么,差异备份都可用,但是它要求有一个基准的完整数据库备份
--Differential database backup of SmallWorks
BACKUP DATABASE SmallWorks TO DISK='D:\SQLBackups\SmallWorksDiff.BAK' WITH DIFFERENTIAL,DESCRIPTION='SmallWorks Differential Backup'
文件/文件组备份:当一个数据库分成多个文件和文件组时,可以单独备份这些文件和文件组,这种备份对超大型数据库特别有用:
--Backup of the "SWUserData1" User-Defined Filegroup
BACKUP DATABASE SmalWorks FILEGROUP='SWUserData1' TO DISK='D:\SQLBackups\SmallWorksUserData1FG.BAK' WITH DESCRIPTION='SmalWorks SWUserData1 Filegroup Backup'
--Backup of the SmallWorks data file "SmallWorksData1"
--The logical name of the file **NOT the physical file name**
BACKUP DATABASE SmallWorks FILE='SmallWorksData1' TO DISK='D:\SQLBackups\SmallWorksData1File.BAK' WITH DESCRIPTION='SmallWorks UserData1 File Backup'
差异文件/文件组备份:同一般的差异备份相似,仅备份自最后一次文件或文件组完整备份以来对文件或文件组作出的更改,以及备份时对文件作出的更改
--Differential Filegroup Backup of the "SWUserData1" User-Defined Filegroup
BACKUP DATABASE SmallWorks FILEGROUP='SWUserData1' TO DISK='D:\SQLBackups\SmallWorksUserData1FGDIFF.BAK' WITH DIFFERENTIAL, DESCRIPTION='SmallWOrks Filegroup Differential Backup'
文件和文件组备份只有在数据库处于完整或大容量日志回复模式下才可用,但有一个例外。如果文件组被标记为制度,而数据库被配置为简单恢复模式,那么可以备份该文件组。
事务日志备份:在完整或大容量日志恢复模式中,必须定期执行驶入日志备份,使得事务日志的大小保持在合理的范围内,并使得数据恢复时的数据损失最小。事务日志备份有3种形式:纯日志备份,大容量日志备份和尾日志备份。纯日志备份值包含事务,并在数据库处于完整恢复模式或大容量日志回复模式,但没有执行大容量操作时执行。
--Pure or Bulk Log Backup of SmallWorks
BACKUP LOG SmallWorks TO DISK='D:\SQLBackups\SmallWorksLog.TRN' WITH DESCRIPTION='SmallWorks Log Backup'
大容量日志备份包含当数据库处于大容量日志回复模式中时被大容量操作修改的事务数据和所有物理区;当数据库处于完整或大容量日志恢复模式中时,会在数据库还原前执行尾日志备份来捕获所有还没有备份的事务日志记录。
--Tail Log Backup of SmallWorks
BACKUP LOG SmallWorks TO DISK='D:\SQLBackups\SmallWorksTailLog.TRN' WITH NO_TRUNCATE, DESCRIPTION='SmallWorks Tail Log Backup'
部分备份:部分备份指的是,主要文件组和usoyou易被修改的文件组可以备份在一起,将不改变和不经常改变的文件组单独备份,这样既节省了时间,又节省了备份媒体的空间
BACKUP DATABASE SmallWorks READ_WRITE_FILEGROUPS TO DISK='D:\SQLBackups\SmallWorksPartial.BAK' WITH DESCRIPTION='Partial Backup of all Read/Write filegroups'
仅复制备份:仅复制备份可以在数据库文件和事务日志上执行,创建一个备份而不影响还原数据库所需的备份链。他们是不记录的备份,可以在维护环境之外使用。
BACKUP DATABASE SmallWOrks TO DISK='D:\SQLData\SmallWorksCopyOnly.BAK' WITH COPY_ONLY, DESCRIPTION='Copy only backup'
备份选项
备份条带:由于同时写入多个物理设备,跨多个设备条条带化一个备份可以节省备份时间。要创建备份条带,只需要把多个目标添加到BACKUP命令中即可:
BACKUP DATABASE SmallWorks TO DISK='D:\StripedBackupsA\SmallWorksStripe1.bak',DISK='D:\StripedBackupsB\SmallWorksStripe2.bak',DISK='D:\StripedBackupsC\SmallWorksStripe3.bak' WITH DESCRIPTION='Stripped Backup'
镜像备份:下面的代码演示了如何把一个数据库备份至一个目标,同时又可把整个备份镜像到另一个目标
BACKUP DATABASE SmallWorks TO DISK='D:\MirroredBackupsA\SmallWorksMirror1.bak' MIRROR TO DISK='D:\MirroredBackupsB\SmallWorksMirror2.bak' WITH FORMAT, DESCRIPTION='Mirrored Backup'
压缩备份
BACKUP DATABASE SmallWorks TO DISK='D:\SQLBackups\SmallWOrksCompressed.bck' WITH COMPRESSION, DESCRIPTION='Compressed Backup'
WITH选项,略
备份策略
仅完整备份:这一策略可能会使数据库丢失一定时期内的数据修改。例如,如果数据库在每天凌晨1点备份,而1点之前任何时间都可能发生数据库失败,但是最忌你的还原将是前一天凌晨1点
完整备份+差异备份:同完整备份策略一样,不提供任何对事务日志的管理。
完整备份+事务日志备份:通过在完整备份之间执行定期事务入职备份可以把该数据库还原到失败点。日志备份的数目和备份周期缺角与数据库的忙碌程度。因为事务日志备份通常较小也较快,可以根据需要安排他们京城执行。对于一个改动很频繁的数据库,事务日志备份被安排为每10分钟执行一次。
完整备份+差异备份+事务日志备份:如果日志备份过多,那么还原的时候可能会麻烦,加入差异备份可以现将数据库还原至最近的差异备份,再用日志备份进行还原
文件/文件组备份:对于大型数据库而言,有时候分成几部分来备份数据库更有效率。这种备份计划更加灵活,但也使得备份相应的变得复杂起来
文件组备份+差异备份:因为简单的文件/文件组备份都会增加复杂度,而添加差异备份会使事情变得更加复杂,因此该策略需要大量的计划和维护
部分备份:略
还原数据库
还原过程:还原过程由三个阶段构成:数据复制阶段,在这一阶段中将数据页从备份媒体复制到数据文件中;重做阶段,在这一阶段将从日志备份或数据库备份的日志部分还原已提交的事务记录;撤销阶段,在这一阶段中将从日志或数据库备份的日志部分回滚没有提交的事务
延迟恢复:当还原一个备份序列(例如一个完整备份和一系列事务日志备份)时,撤销阶段和数据库恢复将要延迟,以使每一个附加的备份都能够还原。
数据库还原准备
将数据库至于SINGLE_USER模式,隔离该数据库;如果处于完整或大容量日志回复模式,那么备份事务日志的结尾。这可以捕捉到所有最近的活动;搜集将数据库还原至最近的一致状态所需的所有备份信息。
还原用户数据库
完整还原:
RESTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksWed2002.BAK' WITH RECOVERY
完整还原+差异还原:
RESTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksFullMon2002.BAK' WITH NORECOVERY
RESTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksDiffWed2002.BAK' WITH RECOVERY
完整还原+事务日志还原:
BACKUP LOG SmallWorks TO DISK='E:\SQLBackups\SmallWorksTailLogMon1510.BAK' WITH NO_TRUNCATE
RESOTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksFullMon0002.BAK' WITH NORECOVERY
RESOTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksLogMon0900.BAK' WITH NORECOVERY
RESOTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksLogMon1202.BAK' WITH NORECOVERY
RESOTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksLogMon15010.BAK' WITH RECOVERY
完整还原+差异还原+事务日志还原
BACKUP LOG SmallWorks TO DISK='E:\SQLBackups\SmallWorksTailLogMon1810.BAK' WITH NO_TRUNCATE
RESOTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksFullMon0002.BAK' WITH NORECOVERY
RESOTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksDiffMon1202.BAK' WITH NORECOVERY
RESOTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksLogMon1500.BAK' WITH NORECOVERY
RESOTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksLogMon1810.BAK' WITH RECOVERY
文件和文件组还原:
第一个例子显示的是当SmallWorks数据库被配置为完整恢复模式时,还原其中单个损坏文件的过程
--Capture the tail of the transaction log
BACKUP LOG SmallWorks TO DISK='E:\SQLBackups\SmallWorksTailLog.BAK' WITH INIT,NO_TRUNCATE,NORECOVERY
--Restore the damaged or corrupted file
RESTORE DATABASE SmallWorks FILE='SmallWorksData1' FROM DISK='E:\SQLBackups\SmallWorksFull.BAK'
--Restore the tail of the log to bring the SmallWorksData1 file online
RESTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksTailLog.BAK' WITH RECOVERY
第二个例子显示了还原一个处于制度文件组的中的被损坏数据文件的过程
--Restore the damaged or corrupted file
RESTORE DATABASE SmallWorks FILE='SmallWorksData2' FROM DISK='E:\SQLBackups\SmallWOrksFull.BAK'
第三个例子显示了如何使用部分备份来备份SmallWorks数据库,然后在SWUserData1 READWRITE文件组和主文件组失败之后进行还原以使数据库再次在线
BACKUP DATABASE SmallWorks READ_WRITE_FILEGROUPS TO DISK='E:\SQLBackups\SmallWorksFull.BAK' WITH INIT
--when the red_write file group went wrong
BACKUP LOG SmallWorks TO DISK='E:\SQLBackups\SmallWorksTailLog.BAK' WITH INIT, NORECOVERY, NO_TRUNCATE
RESTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksFull.BAK' WITH PARTIAL, NORECOVERY
RESTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksTailLog.BAK' WITH RECOVERY
--还原用户定义的文件组
RESTORE DATABASE SmallWorks FILEGROUP='SWUserData1' WITH RECOVERY
RESTORE DATABASE SmallWorks FILEGROUP='SQUserData2' WITH RECOVERY
下面的例子中,只有SWUserdata1这个READ_WRITE文件组被损坏,所以没有必要还原主文件组
BACKUP DATABASE SmallWorks READ_WRITE_FILEGROUPS TO DISK='E:\SQLBackups\SmallWorksFull.BAK' WITH INIT
--when the red_write file group went wrong
BACKUP LOG SmallWorks TO DISK='E:\SQLBackups\SmallWorksTailLog.BAK' WITH INIT, NORECOVERY, NO_TRUNCATE
RESTORE DATABASE SmallWorks FILEGROUP='SWUserData1' FROM DISK='E:\SQLBackups\SmallWorksFull.BAK' WITH NORECOVERY
RESTORE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksTailLog.BAK' WITH RECOVERY
时间点还原
RESTORE DATABASE SmallWorks FROM DISK='E:\SQLBackups\SmallWorksFull1600.BAK' WITH STOPAT='12/05/200/ 14:59:00', NORECOVERY
RESOTRE LOG SmallWorks FROM DISK='E:\SQLBackups\SmallWorksLog1700.BAK' WITH STOPAT='12/05/2008 14:59:00' RECOVERY
恢复系统数据库
如果可以连接SQL Server,服务器实例就必须以丹利用户模式启动,以便还原和恢复master数据库,要以但用户模式启动SQL Server的一个实例,需要在命令提示窗口中输入以下命令:sqlservr.exe -m,如果服务器支持SQL Server的多个实例,需要启动正确的实例,一旦以单用户模式启动了服务器,就可以还原master数据库了。要完成这一操作,需要启动另一个命令提示窗口,使用SQLCMD登录SQL Server实例,C:\>SQLCMD -S AughtEight -E;成功登录之后,可以使用普通的RESTORE语法完成master数据库的还原。
如果SQL Server实例由于master数据库或整体服务器出现故障而不能访问,那么就需要重建master数据库,必须重新安装SQL Server,重新安装之后就可以使用master数据库的最新备份来还原服务器,过程和前面一样。
在还原或附加master数据库和所有其他数据库之后,有必要检查用户数据库中是否有鼓励的用于。如果一个SQL Server登录名被天极到master数据库并授予访问数据库的去啊你西安,但是master数据库的备份在该登录名创建之间就已经执行,那么这时候就会出现孤立的用户,当附加或还原用户数据库时,用户数据库包含该数据库的用户,但是master数据库中的登录名并不存在,可用如下方法进行修复;
USE SmallWorks
GO
ALTER USER FredF WITH LOGIN=FredF
数据库快照
数据库快照是数据库在某个时间点的静态只读视图,快照的创建可以瞬时完成,因为这个过程并没有真正复制作为快照源的数据库。相反,创建的数据文件只包含原数据库中自快照创建之后改变过的数据页。此项功能叫做Copy On Write。当最初创建数据库快照时,会创建几乎同样的数据文件来存放快照内容。这些数据文件的区别在于,他们有余元数据库独立的物理位置,而且在一开始值消耗很少的磁盘空间。SQL Server保留了与数据库现在正在使用的同样数量的磁盘空间,但只分配足够存储数据库结构的元数据的空间。
CREATE DATABASE SmallWorksSnapShot ON (NAME='SmallWOrksPrimary',FILENAME='D:\SQLSnapShotData\SmallWorksPrimary.mdf'),
(NAME='SmallWOrksdata1',FILENAME='D:\SQLSnapShotData\SmallWorksdata1.ndf'),
(NAME='SmallWOrksdata2',FILENAME='D:\SQLSnapShotData\SmallWorksdata2.ndf'),
创建快照数据库之后,编写一个查询分别对源数据库和快照数据库进行执行,返回相同的结果,当对源数据库中的数据进行更新过后,再次执行,会发现源数据库中的数据有更新,而快照数据库依然是原来的结果,但是快照数据库却因为存储了被更改的数据页而导致体积增大了。
数据库快照有一些限制,而快照的源数据也有一些限制:数据库快照不能备份;数据库快照不能修改;有快照存在是,不能删除源数据库;有快照存在是,不能将源数据库还原到快照创建之间的时间点
灾难恢复和数据库快照
快照可以用来撤销对源数据库的更新,因为他们有修改之前的数据的原副本。
撤销更新
USE SmallWorks
GO
UPDATE dbo.Person
SET LastName=S.LastName FROM dbo.Person P JOIN SmallWOrksSnapShot.dbo.Person S ON S.PersonID=P.PersonID
撤销删除
DELETE dbo.Person WHERE PersonID<51
USE SmallWorks
GO
INSERT dbo.Person (PersonID,FirstName,LastName,EmailAddress) SELECT PersonID,FirstName,LastName,EmailAddress FROM SmallWOrksSnapShot.dbo.Person WHERE PersonID<51
撤销删除
--Inadvertant deletion of the Person table
USE SmallWorks
GO
DROP TABLE dbo.Person
--Recreate the Person Table
USE SmallWorks
GO
CREATE TABLE dbo.Person(
PersonID int NOT NULL,
FirstName varchar(50) NOT NULL,
MiddleName varchar(50) NULL,
LastName varchar(50) NOT NULL,
EmailAddress nvarchar(50) NULL
) ON SWUserData1
--Repopulate the table
INSERT dbo.Person (PersonID, FirstName, LastName, EmailAddress) SELECT PersonID, FirstName, LastName, EmailAddress FROM SmallWorkSnapShot.dbo.Person
从快照还原
USE MASTER
GO
RESTORE DATABASE SmallWorks FROM DATABASE_SNAPSHOT='SmallWorksSnapShot'