本章包括:
备份与恢复的介绍
备份的类型
恢复的模式
如何备份数据库
如何还原数据库
备份设备的管理
自动备份
一个数据库管理员,为了保证数据库里的数据万无一失,必须要定期对数据库进行备份,一旦数据库出现了问题,可以从备份的文件里最大程度地还原数据。
18.1 备份与恢复简介
相信大多数人都会同意数据库里的数据要比数据库本身要重要得多,但是因为种种原因,如磁盘故障、计算机硬件故障、用户操作失误等,都有可能会损坏数据。为了保证在发生这些意外的时候可以最大限度地挽救数据,数据库管理员必须要经常备份数据库里的数据。SQL Server 2005提供了强大的备份和还原的功能。
18.1.1 备份类型
SQL Server 2005提供了四种备份数据库的方式:
l 完整备份:备份整个数据库的所有内容,包括事务日志。该备份类型需要比较大的存储空间来存储备份文件,备份时间也比较长,在还原数据时,也只要还原一个备份文件。
l 差异备份:是完整备份的补充,差异备份只备份上次完整备份后更改的数据。相对完整备份来说,差异备份的数据量比完整数据备份小,备份的速度也比完整备份要快。因此,差异备份通常作为经常用到的备份。在还原数据时,要先还原前一次做的完整备份后再还原最后一次所做的差异备份,这样才能让数据库里的数据恢复到与最后一次差异备份时的相同内容。
l 事务日志备份:事务日志备份只备份事务日志里的内容。事务日志记录了上一次完整备份或事务日志备份后数据库的所有变动过程。事务日志记录的是某一段时间内的数据库变动情况,因此在做事务日志备份之前,也必须要做完整备份。与差异备份类似,事务日志备份的备份文件和时间都会比较小,但是在还原数据时,除了先要还原完整备份之外,还要依次还原每个事务日志备份,而不是只还原最近一个事务日志备份。
l 文件和文件组备份:如果在创建数据库时,为数据库创建了多个数据库文件或文件组,可以使用该备份方式。使用文件和文件组备份方式可以只备份数据库中的某些文件,该备份方式在数据库文件非常庞大的时候十分有效,由于每次只备份一个或几个文件或文件组,可以分多次来备份数据库,避免大型数据库备份的时间过长。另外,由于文件和文件组备份只备份其中一个或多个数据文件,那么当数据库里的某个或某些文件损坏时,可以只还原损坏的文件或文件组备份即可。
完整备份可能比较好理解,例如说,在2006年1月1日早上8点进行了完整备份,那么将来在还原时,就可以恢复到2006年1月1日早上8点时的数据库状态。
差异备份是备份完整备份后的数据变动情况。例如在2006年1月1日早上8点进行了完整备份后,在1月2日和1月3日又进行差异备份,那么在1月2日的差异备份里记录的是从1月1日到1月2日这一段时间里的数据变动情况;而在1月3日的差异备份里记录的是从1月1日到1月3日之一段时间里的数据变动情况。因此,如果要还原到1月3日的数据,只要先还原1月1日做的完整备份,再还原1月3日做的差异备份就可以了。
事务日志备份是以事务日志文件作为备份对象,相当于将数据库里的每一个操作都记录下来了。假设在2006年1月1日早上8点进行了完整备份后,到1月2日早上8点为止,数据库里的数据变动了一百次,如果此时做了差异备份,那么差异备份记录的是第一百次数据变动后的数据库状态,而如果此时做了事务日志备份,备份的将是这一百次的数据变动情况。
再举一个例子,例如在2006年1月1日早上8点进行了完整备份后,在1月2日和1月3日又进行事务日志备份,那么在1月2日的事务日志备份里记录的是从1月1日到1月2日这一段时间里的数据变动情况;而在1月3日的事务日志备份里记录的是从1月2日到1月3日之一段时间里的数据变动情况。因此,如果要还原到1月3日的数据,只要先还原1月1日做的完整备份,再还原1月2日做的事务日志备份,最后还要还原1月3日所做的事务日志备份。
18.1.2 恢复模式
前面章节里多次提到过事务日志,每次提到事务日志时,都会说事务日志会记录数据库中每一次的数据变动。事实上并不是所有数据库都需要记录每一次的数据操作。如果每个操作都要记录的话,数据库不但要写数据文件,而且还要写日志文件,在操作大量数据时(如导入数据),会降低数据库的性能。在SQL Server 2005可以使用“恢复模式”来设置事务日志的操作方法。SQL Server 2005中的恢复模式分为以下三种:
l 完整恢复模式:在该恢复模式下,SQL Server 2005会完整记录下操作数据库的每一个步骤。通常来说,对数据可靠性要求比较的数据库需要使用该恢复模式,如银行、邮电等部门的数据库系统,任何事务日志都是必不可少的。该恢复模式也是SQL Server 2005默认的恢复模式。使用完整恢复模式可以将整个数据库恢复到一个特定的时间点。是这个时间点可以是最近一次可用的备份、一个特定的日期和时间或标记的事务。在该模式下应该定期做事务日志备份,否则日志文件将会变得很大。
l 大容量日志恢复模式:是对完整恢复模式的补充。在该恢复模式下,只对大容量操作(如导入数据、select into等操作)进行最小记录,在保护大容量操作不受媒体故障的危害下,提供最佳性能并占用最小日志空间。例如一次在数据库中插入数十万条记录时,在完整恢复模式下每一个插入记录的动作都会记录在日志中,那么数十万条记录将会使日志文件变得非常大。在大容量日志恢复模式下,只记录必要的操作,不记录所有日志,这么一来,可以大大提高数据的性能,但是由于日志不完整,一旦出现问题,数据将有可能无法恢复。因此,一般只有在需要进行大量数据操作时才将恢复模式改为大容量日志恢复模式,将数据处理完毕之后,马上恢复到完整恢复模式。
l 简单恢复模式:在该模式下,数据库会自动把不活动的日志删除。因此简化了备份的还原,但是因为没有事务日志备份,所以不能恢复到失败的时间点。通常只有在对数据库数据安全要求不太高的数据库中使用。在该模式下数据库只能做完整备份和差异备份。
在SQL Server Management Studio里设置恢复模式的方法如下:
(1)启动【SQL Server Management Studio】,在【对象资源管理器】窗口里展开树型目录,定位到要设置恢复模式的数据库上。
(2)右击数据库名,在弹出的快捷菜单里选择【属性】选项,在弹出的【数据库属性】对话框里选择【选项】标签。
(3)在如图18.1所示对话框中的【恢复模式】下拉列表框里可以选择恢复模式。
(4)选择完毕后,单击【确定】按钮完成操作。
图18.1 设置数据库的恢复模式
18.1.3 如何备份数据库
在了解了什么是数据库备份和恢复之后,并不是可以马上动手备份或恢复数据库,在备份或恢复数据库时,要先考虑几个问题:
(1)什么时候备份数据库?备份数据库会占用系统资源,很显然,在很多人都在使用数据库时备份数据不是一个明智的选择。
(2)隔多久备份一次数据库?每天数据库里改变的数据有多少?如果一天只有数十条数据改变,却天天备份数据库,这也不是一个明智的选择。
(3)用什么方式备份数据库?每次备份数据库都用完整模式,还是先用一次完整模式后再用几次差异备份模式?
(4)将数据库备份到哪里?是磁盘中,还是磁带中?
(5)一旦数据发生问题,恢复数据要花多少时间?数据能恢复到哪个时间状态?
如何备份数据库,主要是看数据库里每天变动的数据量以及恢复数据时可以允许多大范围内的误差而决定的。
如果数据库里每天变动的数据量很小的话,可以每周做一次完整备份,如周日做一次完整备份,以后的每天,如周一到周六每天下班前做一次事务日志备份,那么一旦数据库发生问题,也可以将数据恢复到前一天下班时的状态。
当然也可以在周日时做一次完整备份,周一到周六每天下班前做一次差异备份,这样一旦数据库发生问题,同样也可以将数据恢复到前一天下班时的状态。只是一周的后几天里做差异备份时,备份的时间和备份的文件都会跟着增加。但这也有一个好处,在数据损坏时,只要恢复完整备份的数据和前一天差异备份的数据即可,不需要去恢复每一天的事务日志备份,恢复的时间会比较短。
如果数据库里的数据变动得比较频繁,只要损失一个小时的数据都是十分大的损失的时候,用上面的办法备份数据就不可行了,此时可以使用三种备份方式交替使用的方法来备份数据库。
例如每天下班时做一次完整备份,在两次完整备份之间每隔八个小时做一次差异备份,在两次差异备份之间每隔一个小时做一次事务日志备份。如此一来,一旦数据损坏可以将数据恢复到最近一个小时以内的状态,同时又能减少数据库备份数据的时间和减少备份数据文件的大小。
在前面还提到过当数据库文件过大不易备份时,可以分别备份数据库文件或文件组,将一个数据库分多次备份。在现实操作中,还有一种情况可以使用到数据库文件的备份。例如一个数据库中,某些表里的数据变动得很少,而某些表里的数据却又经常改变,那么可以考虑将这些数据表分别存储在不同的文件或文件组里,然后通过不同的备份频率来备份这些文件和文件组。但使用文件和文件组来进行备份,还原数据时也要分多次才能将整个数据库还原完毕,所以除非数据库文件大到备份困难时,不要使用该备份方式。
注意:除了要备份用户自己创建的数据库之外,系统数据库中的master数据库和msdb数据库也应该备份。
18.1.4 数据库备份到哪里
在SQL Server 2005中,可以将数据库备份到磁盘中或磁带中。如果是备份到磁盘中,可以有两种形式:一种是文件的形式,一种是备份设备的形式。无论是哪种形式,在磁盘中的体现都是文件的形式。下面介绍如何在数据库中创建备份设备:
(1)启动【SQL Server Management Studio】,在【对象资源管理器】窗口里展开树型目录,【数据库实例】à【服务器对象】à【备份设备】。
(2)右击【备份设备】,在弹出的快捷菜单里选择【新建备份设备】选项,弹出如图18.2所示【新建备份设备】对话框。
图18.2 【新建备份设备】对话框
(3)如图18.2所示,在【设备名称】文本框里可以输入备份设备的名称,在本例中输入“我的备份设备”;在【文件】文本框里可以输入备份设备的路径和文件名。由此可见,SQL Server 2005中的备份设备事实上也只是一个文件而已。
(4)设置完毕后,单击【确定】按钮完成创建备份设备操作。
无论是将数据库备份到文件还是备份到备份设备,在同一个设备中都可以存放多个数据库的备份数据,或者是一个数据库的多个备份数据。SQL Server 2005还提供了一个名为“sp_addumpdevice”的存储过程可以创建数据库备份设备,其语法代码如下:
sp_addumpdevice [ @devtype = ] 'device_type'
, [ @logicalname = ] 'logical_name'
, [ @physicalname = ] 'physical_name'
]
其中参数有:
@devtype:设备类型,可以支持的值为disk和tape,其中disk为磁盘文件;tape为windows支持的任何磁带设备。
@logicalname:备份设备的逻辑名称,相当于图18.2中的【设备名称】。
@physicalname:备份设备的物理名称,相当于图18.3中的【文件】。
例一、创建一个名为“新备份”的备份设备,其代码如下:
exec sp_addumpdevice 'disk','新备份设备',
'E:\book\SQL Server 2005大全\数据库\第十八章\运行后数据库\新备份设备.bak'