镜像备份媒体-->通过提供冗余来提高备份的可靠性 包含两个到四个镜像,每个镜像包含每个媒体簇的所有卷。每个镜像要求每个媒体簇都有单独的备份设备 通过将数据同步写入设备来保证镜像媒体具有相同的内容-->见下图:
如何使用镜像备份媒体集呢?
1.全选创建备份设备语句--按执行之后就创建一个叫做NwBackupDevice的备份设备了 2.全选修改数据库中的数据的语句--按执行之后就把Employees表里面的内容修改了 3.接下来就执行一个完全的数据库备份了 全选执行完整数据库备份的语句--按执行 注意: NW这个数据库其实就是NorthWind这个数据库 我把它从SQL Server 2000中拿出来,然后添加到SQL Server 2005里面
展开服务器对象--备份设备--可以看到已经创建了一个叫做NwBackupDevice的备份设备了 对着NwBackupDevice这个备份设备右键--选择属性--按媒体内容--可以看到有一个完整的数据库备份 1.全选使用COPY ONLY数据库仅复制数据库备份的语句--按执行 2.全选使用READ_URITE_FILEGROUPS选项进行部分备份的语句--按执行之后就只备份主文件组和读写的文件组 那么对于其它的只读文件组是不做备份的 展开数据库--对着NW这个数据库右键--选择属性--按文件组之后可以看到一共有4个文件组 其中有一个是主文件组
USE master -->全选这条语句--按执行之后就得到9个介质了 其实是三个媒体集 在C盘DBBackup这个文件夹里面可以看到9个备份介质
Go
BACKUP DATABASE Northwind
To DISK = 'C:\DBBackup\A-1.BAK',DISK = 'C:\DBBackup\A-2.BAK',DISK = 'C:\DBBackup\A-3.BAK'
MIRROR TO DISK = 'C:\DBBackup\B-1.BAK',DISK = 'C:\DBBackup\B-2.BAK',DISK = 'C:\DBBackup\B-3.BAK'
MIRROR TO DISK = 'C:\DBBackup\C-1.BAK',DISK = 'C:\DBBackup\C-2.BAK',DISK = 'C:\DBBackup\C-3.BAK'
WITH FORMAT,MEDIANAME = 'AdventureWorksSet1'
Go
如果三个镜像媒体集中目前只有A-1、B-2、C-3这三个媒体集可用的话 此时怎么办呢? 我们可以使用来自不同镜像集中媒体来还原数据库
USE master -->全选这条语句--按执行之后来自不同媒体集的文件就成功进行还原了
Go
RESTORE DATABASE Northwind
FROM DISK = 'C:\DBBackup\C-3.BAK', DISK = 'C:\DBBackup\B-2.BAK', DISK = 'C:\DBBackup\A-1.BAK'
WITH FILE = 1, REPLACE
Go
从备份中还原数据库: 数据库还原过程原理-->数据库还原阶段的过程: 数据库复制阶段-->从数据库的备份媒体将所有数据、日志和索引页复制到数据库文件中 重做阶段(Redo)/前滚(Roll Forward)-->将记录的事务应用到从备份复制的数据,以将这些数据前滚到恢复点 撤销阶段(Undo)/回滚(Roll Back)-->回滚所有未提交的事务并使用户可以使用此数据库,回滚阶段后将无法还原后续的备份
数据库还原选项-->RECOVERY选项: 完成重做和撤消两个阶段 数据库处于一致状态,完成后数据库在线
NORECOVERY选项: 不执行撤消阶段以保留未提交的事务 允许还原其他备份以将数据库进一步前滚
即时点还原-->支持数据库备份的即时点还原: 在SQL Server 2005之前的版本中只支持事务日志的及时点还原 使用STOPAT选项指明时间点
[RESTORE DATABASE AdventureWorks FROM AWBackup WITH RECOVERY ,STOPAT='Mar 1,2006 2:00 PM' 执行段落还原-->通过段落还原分阶段逐步恢复由多个文件组组成的数据库: 未恢复文件组被标记为离线,其中的数据不可访问 还原步骤: 还原主文件组和需要立即使用的辅助文件组 在以后通过逐步还原其它辅助文件组
[RESTORE DATABASE AWTemp FILE='AdventureWorks_data_1' FROM AWBackup
WITH PARTIAL,MOVE'AdventureWorks_data_1'TO'AWTemp_data_1.mdf']
执行页面还原-->通过执行页面还原对数据库中损坏的页进行修复 获取页面损坏信息: SQL Server错误日志 msdb.dbo.suspect_pages表中
[RESTORE DATABASE AdventureWorks
PAGE='AdventureWorks_data_1:832'
FROM AWBackup]
数据库的在线还原-->数据库在进行部分还原时仍处于在线可用状态 限制条件:只有SQL Server 2005企业版本支持 只能应用在完整或者大容量日志恢复模型 正在还原的部分不可用 默认情况下对文件和页的还原自动以在线还原形式执行
如何从数据库备份中还原数据呢?
1.全选将数据库还原到即时点的语句--按执行之后这个数据就被成功还原而且向它形成了一个指定的时间点 展开数据库--按F5键来刷新一下可以看到NW这个数据库的显示状态是正在还原 2.全选完成数据库恢复过程的语句--按执行之后--然后展开数据库--按F5键来刷新一下就可以看到NW这个数据库在线了 可以使用NW这个数据库了
USE master -->全选这条语句--按执行之后就生成了一个叫做NwTmp的数据库了 这个数据库包含了主文件组和ReadWriteFG文件组
Go
RESTORE DATABASE NwTmp FILEGROUP='ReadWriteFG'
FROM NwBackupDevice
WITH FILE =3,
MOVE N'Northwind'To N'C:\tmp\NW.mdf',
MOVE N'ReadWriteFile' TO N'C:\tmp\ReadWriteFile.ndf',
MOVE N'Northwind_log' TO N'C:\tmp\NW.ldf',
NOUNLOAD, STATS = 10,REPLACE
Go
2.全选查询Customers表的语句--按执行之后就可以看到表的内容了
3.全选查询Employees表的语句--按执行之后就看到错误了 为什么错误呢? 因为我们只是分段地还原了ReadWriteFG这样一个文件组 而Employees表是在另一个文件组 所以数据是不在线的
从数据库快照中恢复数据: 什么是数据库快照? 在一个时间点数据库一致状态的只读副本-->和源数据库必须同在一个服务器实例 为同一个数据库可以创建多个数据库快照 对于数据库的测试,报表创建和开发非常有用 是对数据库备份和还原的一种补充-->见下图:
能从数据库快照中还原的数据(1)-->恢复被更新的数据
[UPDATE HumanResources Department
SET Name=
(
SELECT Name
FROM AdventureWorks_dbsnapshot_1800 HumanResource Department
WHERE DepartmentID=1
)
WHERE DepartmentID=1]
能从数据库快照中还原的数据(2)-->恢复被删除的行
[ALTER TABLE Production WorkOrderRouting
NOCHECK CONSTRAINT CK_WorkOrderRouting_ActualEndDate
INSERT INTO Production WorkOrderRouting
SELECT * FROM AdventureWorks_dbsnapshot_1800 Production WorkOrderRouting
ALTER TABLE Production WorkOrderRouting
CHECK CONSTRAINT CK_WorkOrderRouting_ActualEndDate
能从数据库快照中还原的数据(3)-->恢复被删除的对象: 由快照数据库中对象生成脚本 在当前数据库中运行脚本恢复删除的对象
能从数据库快照中还原的数据(4)-->将数据库恢复到快照时的状态
[RESTORE DATABASE AdventureWorks
FROM DATABASE_SNAPSHOT='AdventureWorks_dbsnapshot_1800'
如何使用数据库快照备份和还原数据呢?
USE Adventureworks -->全选这条语句--按执行之后--打开C盘里面的SnapshotData这个文件夹之后就可以看到已经成功创建了一个叫做AdventureWorks_Data.mdf的快照了
GO
CREATE DATABASE AdventureWorks_dbsnapshot_1800
ON (NAME = AdventureWorks_Data, FILENAME = 'C:\SnapshotData\AdventureWorks_Data.mdf')
AS SNAPSHOT OF AdventureWorks
Go
1.全选查询快照数据库的语句--按执行之后就可以看到数据里面的内容了 其实跟AdventureWorks这个数据库里面的内容是完全一样的
2.全选在快照数据库中尝试更新的语句--按执行之后就会发现失败 为什么呢? 因为数据库快照里面的数据是只读的
3.全选检测数据库快照文件占用空间的大小,修改源数据中的数据的语句--按执行之后 然后打开C盘里面的SnapshotData这个文件夹--对着AdventureWorks_Data.mdf这个快照右键--选择属性--可以看到占用空间的大小比以前大了 这就说明了我们刚才对源数据库做修改的时候原来的数据就会被复制到快照数据库里面相应的数据文件中
5.全选验证修改,对比源数据库和快照数据库中的数据变化语句--按执行之后就可以看到源数据库表和快照数据库表的内容了
1.全选删除源数据库表Production.WorkOrderRouting中的行的语句--按执行之后就删除源数据库表Production.WorkOrderRouting中的行了
2.USE AdventureWorks -->全选恢复删除的数据行这条语句--按执行之后就把刚才误删除的那些数据还原回去
Go
ALTER TABLE Production.WorkOrderRouting
NOCHECK CONSTRAINT CK_WorkOrderRouting_ActualEndDate
Go
INSERT INTO Production.WorkOrderRouting
SELECT * FROM AdventureWorks_dbsnapshot_1800.Production.WorkOrderRouting
ALTER TABLE Production.WorksOrderRouting
CHECK CONSTRAINT CK_WorkOrderRouting_ActualEndDate
全选将源数据库恢复到快照时的状态的语句--按执行之后这个数据库就会被恢复到快照生成的时候的状态了
本文转自 叶俊生 51CTO博客,原文链接:http://blog.51cto.com/yejunsheng/160958