SQLServer灾难恢复技术保护数据库.docx
《SQLServer灾难恢复技术保护数据库.docx》由会员分享,可在线阅读,更多相关《SQLServer灾难恢复技术保护数据库.docx(26页珍藏版)》请在冰点文库上搜索。
SQLServer灾难恢复技术保护数据库
使用灾难恢复技术保护数据库
为了防止数据丢失,可以为数据库实施恢复策略。
依据可能发生的错误和数据保护的级别,用户需要很好地规划、实施和测试恢复策略。
在数据仓库中,数据可以从其他系统中恢复,因此不需要备份每一个事务,定期对数据进行完整的备份就足够了。
然而,对于一个存储商店交易信息的数据库来说,我们可能希望备份每一笔交易的信息。
SQLServer提供了非常丰富的备份功能以实现我们需要的备份方式。
在这一章中,我们将讨论在SQLServer中最常用的数据保护策略。
3.1使用完整数据库备份
一种常用的数据库备份策略是依据事先定义好的时间(例如每晚一次)进行整个数据库的备份。
这种备份策略可以将数据库还原到上一次备份发生时的最后状态。
这种备份策略可以通过随后介绍的完整数据库备份来实现。
完整数据库备份的备份内容包括还原数据库时需要的所有数据和数据库的元数据信息,其中包括全文目录。
在还原完整数据库备份时,数据库将恢复所有数据库文件,这些文件包含备份结束时处于一致状态的所有数据。
在执行数据库备份时,数据库即使处于联机状态,用户依然可以像平常一样发起事务,更改数据。
“一致状态”是指在备份执行过程中,所有提交的事务将被接受,所有未完成的事务将被回滚。
在SQLServer执行备份时可能存在事务正在修改数据的情形,而这种情形很可能导致数据不一致。
因此,针对这种情形,SQLServer有一种特殊的处理过程以保证数据的一致性。
这个过程包括向备份设备写数据页和事务日志记录。
提示SQLServer数据库加入了全文目录以实现全文索引功能。
全文索引可以让我们更快、更精确地搜索数据库中的数据。
有关全文索引的更详细信息,请参考SQLServerBooksOnline中的主题“AboutFull-TextIndexes”。
SQLServer进行数据备份的速度取决于输入/输出设备(输入/输出设备用于收集和存储数据)。
为了获得最佳执行性能,SQLServer以顺序方式读取文件。
如果用户的输入/输出设备足以同时处理数据备份和系统一般操作所产生的输入/输出请求,那么创建数据备份对数据库系统造成的影响并不大。
不管怎样,最好在系统使用的非高峰时间进行完整数据库备份。
下一节将讨论实现完整数据库备份策略的系统选项。
3.1.1简单恢复模式
由于SQLServer需要事先知道我们计划对数据库进行哪一种数据备份,因此,我们需要依据备份类型的不同对数据库进行不同的配置。
此配置通过设置恢复模式选项来完成。
数据库所用的默认恢复模式取决于数据库创建时指定的数据库恢复模式。
为了实现只包括完整数据库备份的备份策略,恢复模式应该被设置为“简单模式”。
Ø设置恢复模式为简单模式
1.从”开始”菜单中选择“所有程序”|“MicrosoftSQLServer2005”|“SQLServerManagementStudio”。
2.在“连接到服务器”对话框中单击“连接”按钮。
3.在“标准”工具栏中,单击“新建查询”按钮打开一个“新建查询”窗口。
4.可以用ALTERDATABASE语句来设置恢复模式。
键入以下语句:
USEmaster;
GO
ALTERDATABASEAdventureWorks
SETRECOVERYSIMPLE;
GO
然后单击“执行”按钮。
更多详情本章主要介绍如何使用T-SQL语句进行备份和还原。
在第4章“将数据库迁移到其他系统”将讨论如何使用SQLServerManagementStudio用户界面(而不是T-SQL语句)来执行同样的过程。
Ø检查恢复模式设置
1.可以使用DATABASEPROPERTYEX函数来查看数据库的恢复模式,该函数可以获取当前数据库的选项或特定数据库的属性。
执行以下语句可以获取AdventureWorks数据库的恢复模式:
SELECTDATABASEPROPERTYEX('AdventureWorks','Recovery')
2.检查执行结果,将显示恢复模式为SIMPLE。
3.关闭SQLServerManagementStudio。
3.1.2备份设备
在开始备份之前,需要知道数据备份保存在哪里。
备份的存储位置称为备份设备。
每一个备份设备可以存储许多不同类型的多个备份。
备份设备有两种不同的类型:
●磁带设备可以用于在磁带上备份数据。
磁带设备必须挂接在本机。
备份可以跨越多个磁带,并且SQLServer备份可以与Windows备份混合使用。
●磁盘设备是在本地或远程的磁盘或者磁盘存储媒体上的文件。
它们通过备份存储的文件路径来引用。
远程位置必须通过UNC路径引用。
注意在本书中,我们只讨论备份到磁盘设备的备份过程。
将SQLServer数据库备份到磁带设备上的做法已经不再常见。
SQLServer备份存储在磁带设备上的时候,备份一般通过提供附加功能的第三方产品进行,例如远程磁带存储产品。
对于已经备份到磁盘设备上的数据备份来说,也可以将其再备份到磁带设备上以提高保险系数。
备份设备由设备名标识。
设备名可以是一个逻辑设备名或者一个物理设备名。
一个磁盘设备的物理设备名是备份文件的路径,例如“\\BACKUPSERVER\Backups\adv\AdventureWorks.bak”。
这个路径可以在备份语句中直接使用。
逻辑设备名是存储在SQLServer中指向备份设备物理名的名称。
当一个连接设备名在备份语句中使用的时候,SQLServer将在系统目录中搜寻相应的物理位置并在搜到的位置执行备份。
可以使用系统存储过程sp_addumpdevice在系统目录中加入一个逻辑设备。
以下示例定义了一个名为Adv_FullDb_Dev的逻辑设备:
EXECsp_addumpdevice'disk','Adv_FullDb_Dev',
'T:
\BACKUPS\AdvFullDbDev.bak';
提示务必将上例中的文件路径改为本机器的有效路径。
如果没有映射到T:
\的驱动器,则需要更改上例中的文件路径以和机器上的驱动器映射相匹配。
同样,路径中的文件夹也要在您的机器上。
逻辑设备名和物理设备名可以在备份和还原数据库时交替使用。
当然,一般来说,最好是始终只用这两种命名约定中的一种,这样不会使代码变得复杂。
应该事先想好自己更倾向于哪种命名约定。
数据备份决不能存储到相同的物理存储单元,例如数据库自身的磁盘设备。
即使磁盘通过实施一些级别的RAID功能而具有容错能力,控制器还是可能经常出错并损坏磁盘上的数据。
与此同时,还应考虑将备份文件备份到磁带上并将磁带保存在远程设备上。
提示RAID是“redundantarrayofindependentdisks”(冗余独立磁盘阵列)的缩写。
这些阵列是用于提高可靠性和存储容量的具有多个驱动器的磁盘系统。
3.1.3执行完整数据库备份
将恢复模式设置为SIMPLE并确定使用哪些设备存储备份之后,就可以开始执行备份了。
完整数据库备份是通过BACKUPDATABASE语句来执行的,它非常易于使用。
在这个语句的最简单的形式中,只需告诉系统要备份哪个数据库到哪个设备。
将数据库AdventureWorks备份到先前定义的逻辑设备Adv_FullDb_Dev,可以使用以下语句:
USEmaster;
GO
BACKUPDATABASEAdventureWorks
TOAdv_FullDb_Dev;
如果要执行完整数据库备份到一个物理设备,必须在BACKUPDATABASE语句中指定设备的类型和位置。
可以使用以下语句将数据库备份到位置t:
\adv.bak:
USEmaster;
GO
BACKUPDATABASEAdventureWorks
TODISK='t:
\adv.bak';
如前所述,每一个备份设备都可以存储多个备份。
可以通过BACKUPDATABASE语句的一个参数来指定是否希望SQLServer覆盖或者添加设备上已经存在的备份。
用于覆盖和添加的两个选项分别为INIT和NOINIT。
如果指定INIT,备份设备会在备份前被删除,备份将覆盖原来存在该设备上的任何备份。
如果指定NOINIT,这是默认值,SQLServer将备份添加到备份设备中,保留已有的所有备份。
这些选项由BACKUPDATABASE语句末端的WITH语句块设置。
如果希望执行与前一个例子一样的备份,但要告诉SQLServer首先删除设备,可以使用以下语句:
USEmaster;
GO
BACKUPDATABASEAdventureWorks
TODISK='t:
\adv.bak'
WITHINIT;
可以看出,执行完整数据库备份相当简单。
在下一节中,将提到完整数据库备份是其他所有数据库备份类型都依赖的备份类型。
由于其他数据库备份类型都需要一个重建的数据库才能工作,因此它们都依赖于完整数据库备份。
这些包括差异备份在内的其他类型的数据库备份都通过存储上一次完整数据库发生后所产生的变化来实现备份。
因此,完整数据库备份并不只在执行完整数据库备份的恢复策略中占有重要地位,对后面要讨论的备份策略同样重要。
3.2使用差异备份
完整数据库备份的重要优势在于它重建了这个数据库的所有数据。
但这个优势同时是它的劣势。
设想一个每天晚上都要进行完整备份的数据库。
如果我们希望恢复这个数据库,就只能使用前一天晚上的备份,这会导致一天工作成果的丢失。
减少潜在时间损失的方法是更频繁地执行完整数据库备份,但这本身会成为一个问题。
因为在执行完整数据库备份的时候,所有的数据和部分的事务日志将被写入备份设备,这使得执行一次备份非常耗时。
同时需要许多存储空间保存这些备份,而且由于完整数据库备份会执行大量的I/O操作,因此会降低数据库的执行性能。
如果在晚上执行一次完整数据库备份并且只备份在白天变化的数据是不是会更好?
这种功能由差异备份提供。
差异备份只存储在上一次完整备份之后发生改变的数据。
当一些数据在上一次完整备份后被改变多次的时候,差异备份只存储更改数据的最新版本。
由于差异备份包括自上次完整备份以后的所有变化,因此为了还原差异备份,首先需要还原上一次的完整数据库备份,然后只需应用最后一次差异备份,如图3.1所示。
和完整数据库备份一样,差异备份包括部分的事务日志以恢复一致状态。
图3.1具有差异备份的备份策略
执行差异备份
执行差异备份与执行完整备份非常相似。
惟一的不同是需要在备份的WITH选项中指明要执行差异备份。
为数据库AdventureWorks执行差异备份到一个物理设备并在备份设备上覆盖其他已有的备份,可采用下面的BACKUPDATABASE语句:
USEmaster;
GO
BACKUPDATABASEAdventureWorks
TODISK='t:
\adv_diff.bak'
WITHINIT,DIFFERENTIAL;
如果要用逻辑设备进行差异备份,必须像进行完整数据库备份那样先创建它们:
USEmaster;
GO
EXECsp_addumpdevice'disk','Adv_Diff_Dev',
'T:
\BACKUPS\AdvDiffDev.bak';
GO
BACKUPDATABASEAdventureWorks
TOAdv_Diff_Dev
WITHINIT,DIFFERENTIAL;
重要提示为了还原差异备份,同样需要最新的完整数据库备份。
注意,不要覆盖或者删除完整数据库备份,以便在进行差异备份的时候能用到它。
3.3使用事务日志备份
结合使用完整数据库备份和差异备份,可以为数据创建快照并恢复它们。
但在某些情况下,我们还是希望有数据库中发生的所有事件(例如每一个语句的执行记录)的备份。
有了这种功能,可以将数据库恢复到任何状态。
事务日志备份提供了这种功能。
就像它的名字所示,事务日志备份是事务日志的备份,它包括在数据库中发生的所有事务。
事务日志备份的主要优点如下:
●事务日志备份允许我们将数据库恢复到特定时间点
●由于事务备份日志是日志实体的备份,因此甚至是数据文件已被损坏,也可以执行事务日志备份。
通过这种备份,数据库可以恢复到错误发生前最后那个事务发生后的状态。
因此,在一个错误事件中,不会丢失任何一个提交的事务。
像差异备份一样,需要在备份策略中包括一个完整数据库备份以通过事务日志备份来恢复数据库。
图3.2描绘了使用事务日志备份的备份策略。
完整数据库备份可以在数据库使用的非高峰期间进行,事务日志备份则在预先规定好的白天某一时间进行。
一个事务日志备份包括自从上次事务日志备份后发生的所有事务。
因此,为了使用事务日志备份还原数据库,需要完整数据库备份和完整数据库备份之后所备份的所有事务日志备份。
可以看出,保证所有的备份可用是很重要的。
如果完整数据库备份或者其中任何一个事务日志备份丢失了,将不可能如愿以偿地还原数据库。
图3.2具有事务日志备份的备份策略
在事务日志备份之间可以接受的时间周期取决于:
●在数据库中发生的事务大小。
在这种备份策略下,SQLServer必须存储所有的事务直到事务日志备份把它们存储下来。
因此,事务日志文件必须足够大以存储所有在两次连续事务日志备份时间间隔内发生的所有事务。
如果日志文件的大小增长得太快,可以通过减少两次事务日志备份之间的时间间隔或者增大日志文件的大小来解决。
●对工作丢失的可接受程度。
正如前面所讲的,即使是在数据文件丢失的情况下,也可能将数据库恢复到最后一个事务发生后的状态。
但是,如果事务日志丢失或者损坏了,只能将数据库恢复到最后一次事务日志备份前的状态。
减少在事务日志备份之间的时间间隔将减少发生这种情况时所涉及到的工作量。
结合使用事务日志备份和差异备份
另一种可能的备份策略是结合使用完整数据库备份、差异备份和事务日志备份。
在还原所有事务日志备份会花很多时间的时候可以使用这种策略。
还原事务日志备份意味着将所有事务再次重新运行,因此这种做法会花费相对多的数据恢复时间,尤其是在应用于大型数据库的时候。
由于差异备份只备份变化的数据,因此比重新执行所有事务的方式还原得更快。
如图3.3所示,在使用组合还原策略的时候,为了还原数据库,首先需要还原最后一次备份的完整数据库备份,然后还原最后一次的差异备份,最后还原在差异备份后进行的所有事务日志备份。
3.3.1完整恢复模式
如前所述,用户需要事先告诉SQLServer自己计划实施哪种备份策略。
如果只使用完整数据库备份和差异备份,数据库必须置于简单恢复模式。
如果也想使用事务日志备份,恢复模式必须置于完整恢复模式(FULL)或者大容量日志恢复模式(BULK_LOGGED)。
完整恢复模式会告诉SQLServer您希望执行事务日志备份。
为此,SQLServer将所有事务保存在一个事务日志文件中直到一次事务日志备份发生。
当事务日志备份发生时,SQLServer将在事务日志备份写入备份设备后删除事务日志。
在简单恢复模式中,事务日志会在每一个检查点后被删除,这意味着提交的事务(已经写入数据文件)将在事务日志中被删除。
因此,在简单恢复模式中,不能创建事务日志备份。
重要提示在数据库置于完整恢复模式的时候,执行事务日志备份是非常重要的。
如果没有进行事务日志备份,事务日志文件将不断增加直至其最大大小限制。
事务日志已满且不能再增加的时候,就不能再执行事务了。
执行事务日志备份的代码可以在3.3.2节“执行事务日志备份”找到。
还可以使用ALTERDATABASE将数据库的恢复模式设置为FULL。
以下代码将AdventureWorks数据库的恢复模式设为FULL:
USEmaster;
GO
ALTERDATABASEAdventureWorks
SETRECOVERYFULL;
GO
大容量日志恢复模式
在完整恢复模式下,所有大容量操作(更改大量数据的单一操作)将被完整记录下来以便能还原事务日志备份。
在有些数据库中,由于事务日志大小的限制和完整记录大容量操作时产生的性能问题,数据库不能在所有时间使用完整恢复模式。
这正是大容量日志恢复模式存在的原因。
大容量日志恢复模式可以允许事务日志既捕获日志又捕获大容量操作的结果。
但它也存在缺点。
在大容量日志恢复模式下,将数据库还原到特定的时间点是不可能的。
而且,在数据文件损坏且在最后一次事务日志备份之后发生了大容量操作的情况下,不可能再执行事务日志备份。
这恰好是事务日志备份的重要优点之一。
因此,大容量日志恢复模式必须在执行大容量操作的时候打开,并且要让使用这种模式的时间尽量短。
在其他时间,数据库使用完整备份模式。
如果只需要使用完整日志操作,就不要使用大容量日志恢复模式。
有关大容量日志恢复模式的更多信息,请参阅SQLServerBooksOnline中的相关主题“BackupUndertheBulk-LoggedRecoveryModel”。
3.3.2执行事务日志备份
为了执行事务日志备份,数据库的恢复模式必须设置为完整恢复模式并且我们必须在数据库更改为完整恢复模式后至少执行一次完整数据库备份。
事务日志备份通过BACKUPLOG语句执行。
通常,必须在语句中指出数据库名和备份设备名。
备份设备的类型与使用完整数据库备份和差异数据库备份时的设备类型相同。
执行以下步骤将数据库AdventureWorks的事务日志备份到一个物理设备上。
Ø备份事务日志文件
1.将恢复模式设置为FULL。
2.至少执行一次完整数据库备份。
3.使用以下语句将数据库AdventureWorks的事务日志备份到一个物理设备上:
USEmaster;
GO
BACKUPLOGAdventureWorks
TODISK='t:
\adv_log.bak'
同其他备份语句一样,备份的执行进程在BACKUP语句没有指定任何选项的时候会将备份添加到备份设备上。
如果要覆盖设备,需要使用WITHINIT语句。
USEmaster;
GO
BACKUPLOGAdventureWorks
TODISK='t:
\adv_log.bak'
WITHINIT
3.4恢复数据库
在前一节中,执行了不同类型的数据库备份。
然而对于数据库恢复过程,尚停留在理论阶段。
下面将介绍如何在不同的恢复场景下恢复数据库。
3.4.1获取备份信息
在开始还原数据库之前,自己要清楚要还原哪一个备份。
SQLServer会存储备份历史记录,在数据库中进行的每一次备份都将记录在msdb数据库中。
可以通过查询msdb数据库,找出所有的备份和还原记录。
Ø创建简单备份信息
1.从“开始”菜单中选择“所有程序”|“MicrosoftSQLServer2005”|“SQLServerManagementStudio”。
2.在“连接到服务器”对话框中,单击“连接”按钮。
3.在标准工具条中,单击“新建查询”按钮打开一个“新建查询”窗口。
4.键入并执行以下BACKUP语句对AdventureWorks数据库执行一次完整数据库备份和一次差异备份:
ALTERDATABASEAdventureWorks
SETRECOVERYSIMPLE;
--PerformFullDatabaseBackup
BACKUPDATABASEAdventureWorks
TODISK='T:
\BACKUPS\ADVFULL.BAK'
WITHINIT;
--PerformadifferentialBackup
BACKUPDATABASEAdventureWorks
TODISK='T:
\BACKUPS\ADVDIFF.BAK'
WITHINIT,Differential;
Ø获取简单备份信息
1.要想知道数据库AdventureWorks发生了哪些备份,可以执行以下SELECT语句:
USEmsdb
GO
SELECTbackup_start_date,type,physical_device_name,backup_set_id
FROMbackupsetbsinnerjoinbackupmediafamilybm
ONbs.media_set_id=bm.media_set_id
WHEREdatabase_name='AdventureWorks'
ORDERBYbackup_start_datedesc
下图所示的结果面板指出最近发生的备份的类型为“I”,一个差异备份。
前面曾提到,要还原一个差异备份,必须首先还原一个最近发生的完整数据库备份。
这个备份可以在第二行找到,其类型为“D”,指出这是一个完整数据库备份。
2.每一个备份都有一个惟一标识称为“备份集标头”(backupsetid),可以在结果窗口中看到该标识,如图3.4所示。
可从以上信息中找到备份所涉及的数据和日志文件以及它们所处的原始位置。
以下查询将获得备份集标头为62的备份信息。
在运行这个查询的时候,请确保将备份集标头值“62”改为前一步所找到的完整数据库备份的备份集标头值:
SELECTfilegroup_name,logical_name,physical_name
FROMmsdb..backupfile
WHEREbackup_set_id=62--changetoyourbackup_set_id
图3.4SELECT语句的执行结果
3.在有些情况下,msdb数据库没有我们需要的备份历史信息。
在msdb数据库被破坏或在其他系统上进行备份的时候会发生这种情况。
此时,只能直接通过备份设备来获取备份信息。
可以键入并执行以下语句来获取T:
\BACKUPS\ADVFULL.BAK中存储的备份信息:
RESTOREHEADERONLYFROMDISK='T:
\BACKUPS\ADVFULL.BAK'
4.可以执行RESTOREFILELISTONLY语句来获取受备份设备上所存备份所影响的数据文件和日志文件的有关信息:
RESTOREFILELISTONLYFROMDISK='T:
\BACKUPS\ADVFULL.BAK'
3.4.2使用SQLServerManagementStudio还原数据库
在许多情况下,还原数据库的最简单方式是使用SQLServerManagementStudio。
SQLServerManagementStudio使用msdb数据库中存储的备份历史来展示还原数据库的这种最佳方法。
Ø在SQLServerManagementStudio中执行数据库还原
1.在SQLServerManagementStudio的查询窗口中执行以下语句来模拟一个场景。
在这个场景中,AdventureWorks数据库使用完整数据库备份和差异备份构成的简单恢复策略。
要根据自己的实际情况更改备份设备的路径。
ALTERDATABASEAdventureWorks
SETRECOVERYSIMPLE;
--PerformFullDatabaseBackup
BACKUPDATABASEAdventureWorks
TODISK='T:
\BACKUPS\ADVFULL.BAK'
WITHINIT;
--Simulateatransaction
UPDATEAdventureWorks.Person.