计算机的广泛应用,给人们的生活带来很大方便。但是,也带来了一些负面的影响,比如计算机犯罪和计算机病毒的出现。一个对计算机依赖性很强的公司,可能由于黑客攻击或者计算机病毒等原因,引起计算机的崩溃,造成数据的丢失,使公司陷于瘫痪之中。造成的损失也就是无法弥补的。为了防止灾难性事故和不可避免的损失,数据库的备份工作就是一项非常重要的系统管理工作。
本章主要介绍下列内容:
n 备份的概念
n 何时进行备份
n 备份准备工作
n 如何执行备份
n 备份类型
数据库备份就是制作数据库结构和数据的拷贝,以便在数据库遭到破坏时能够恢复数据库。备份就是一项数据库维护的系统管理工作。在执行备份的时候,用户也可以访问数据库。
在SQL Server 2000中,数据库的备份是动态的。也就是说,在执行数据库备份的时候,用户也可以访问数据库,并对数据库进行操作。在备份数据库的时候,SQL Server执行以下操作:
n 把数据库所有的数据页写到备份介质中。
n 记录最早的事务日志记录的日志序列号。
n 把全部的失误日志记录写到备份介质中。
制作备份数据库需要一定的许可。在SQL Server系统中,应该有专门的管理员负责数据库的备份工作。只有下列角色才能备份数据:
n 固定的服务器角色sysadmin。
n 固定的数据库角色db_owner。
n 固定的数据库角色db_backupoperator。
另外,管理员也可以授权某些角色或用户执行数据库备份。
执行备份后就把需要备份的数据写到了备份介质上。备份介质是备份内容的载体。在SQL Server数据库管理系统中,有以下三种备份介质:
n 硬盘文件
n 磁带
n 命名管道(Named Pipe)
磁盘文件是最普遍的备份介质,既可以是本地文件,也可以是网络文件。使用磁盘作为备份介质时,磁带只能安装在本地SQL Server系统上。命名管道实际上是利用第三方软件包执行数据库备份。
在备份数据库的时候,应该将系统的全部信息都备份下来,以便当系统发生故事时,能够将系统恢复到发生故障之前的状态,一般情况下,需要备份两方面内容:一是备份记录系统信息的系统数据库;二是备份记录用户数据的用户数据库。系统数据库主要包括master、msdb和model数据库,主要记录SQL Server系统和用户数据库信息。用户数据库存储了用户数据。这些数据非常重要,是备份的主要内容。
在什么时候备份数据库,对于系统数据库和用户数据库是不同的,本节主要介绍什么时候备份数据库以及如何进行备份前的准备工作。
master数据库包含了SQL Server系统中有关数据库的全部信息,如果创建了用户自定义对象,master数据库就被修改,此时,就应该备份master数据库。这样,当master数据库遭到破坏时,就可以恢复原来的系统和用户数据库。如果没有mater数据库的备份,可以使用重建系统数据库的命令行程序rebuildm.exe重建全部系统数据库。
另外,在执行某些Transact-SQL或系统存储过程的时候,master数据库也会被修改。因此,在执行了以下操作之后,应该备份数据库:
n 修改事务日志的系统存储过程sp_logdevice。
n 增加或删除服务器的系统存储过程。
n 创建、修改、删除数据库。例如执行CREATE DATABASE、ALTER DATABASE、DROP DATABASE命令等。
msdb存储了有关工作、警报和操作员等SQL Server Agent服务的信息。如果修改了msdb数据库,就应该对该数据库进行备份。如果没有msdb数据库的当前备份,就必须重建所有系统数据库,然后创建每一个工作、警报和操作员。
model数据库存储了用户数据库的默认配置信息。如果修改了model数据库,就应该对该数据库进行备份。
用户数据库的备份工作是数据库管理的一项常规工作,应该有计划地备份用户数据库,此外,在创建数据库和索引之后,也应该执行用户数据库的备份工作,这个不是必须的,但是,在数据库遭受破坏之后,如果已备份了有索引的数据库,在执行恢复数据库操作的时候,就可以大大节省恢复进程的时间。如果在索引创建之后,没有备份数据库,只备份事务日志,在恢复事务日志的时候,SQL Server系统还必须重建索引。创建索引的时间很长,甚至比恢复完全数据库备份所需要的时间更长。
可以使用下面的语句清除事务日志:
BACKUPLOG WITH TRUNCATE_ONLY
清除了事务日志后,事务日志中就不包含数据库活动和操作的记录,从而不能用来恢复数据库,所以,在清除事务日志之后,应该备份数据库。
另外,如果执行了不写入事务日志的操作,也应备份数据库。因为在执行了这种操作之后,事务日志中不再包含数据库活动的记录,不能用来恢复数据库。
不写入事务日志的操作包括下列语句:
n SELECT INTO语句和命令行实用程序。
n BACKUPLOG WITH NO_LOG语句。
n WRITETEXT或者UPDAETEXT语句。
一般情况下,数据库的备份是动态的。但是,如下操作会影数据库的备份:
(1)使用CREATE DATABASE或者ALTER DATABASE语句创建或修改数据库。
(2)创建索引。
(3)加载数据或使用WRITETEXT、SELECTINTO、UPDATETEXT语句。
在执行数据库备份的时候,尽量避免以上操作。
在执行备份之前,应该制定一个完整可行的备份计划,以保证数据库系统的安全。为此,需要考虑以下方面:
n 确定备份的内容。备份的内容包括系统库中的数据和用户数据库中的数据。在执行备份的时候,一定要将备份的内容完整地备份。
n 确定备份的频率。备份频率就是每隔多长时间执行一次备份。可以根据系统恢复的工作量和系统活动的事务来确定备份的频率。
n 确定备份存储的地方。备份应该异地存放。
n 确定备份存储期限。对于一般的数据,可以确定比较短的存储期限,对于重要的数据,则需要确定一个比较长的期限。
n 确定备份的介质。
在备份数据库之前,首先要创建备份文件。在SQL Server 2000中,有多种备份数据库的方法。下面分别介绍。
使用BACKUP DATABASE语句可以创建临时性备份文件。如果所要创建的数据库备份文件不会长久使用,就可以创建临时的备份文件。
创建临时性备份文件有两种方法:
n 使用SQL Server Manager。
n 使用BACKUP DATABASE语句。
在创建临时性文件的时候,必须指定介质类型、路径名称和文件名称。BACKUP DATABASE的语法形式如下:
BACKUP DATABASE{database_name|@database_name_var}
TO<backup_file>[,…n]
其中,backup_file是
{{backup_file_name|@backup_file_name_var}|[DISK|TAPE|PIPE]}
={temp_file_name|temp_file_name_var}
下面这段代码在磁盘上创建了一个临时备份文件,并把master数据库备份到该备份文件中。
USE master
BACKUP DATABASE northwind TO DISK=‘G:\Temp\Temp.bak’
创建永久性备份文件的时候,应该考虑以下因素:
n 应该指定备份文件的逻辑名称和物理名称。
n 在master数据库的表sysdevices中,创建永久性备份文件的逻辑名称和物理名称。
n 一个数据库最多可以创建32个备份文件。
创建永久性备份文件有两种方法:
n 使用SQL Server Manager。
n 使用系统存储过程sp_addumpdevice。
操作如下:
(1)运行SQL Server Manager,打开服务器,选择Backup,单击鼠标右键,弹出一个快捷菜单,如图12-1所示。
图12-1 备份文件菜单
(2)在该快捷菜单中,选择New Backup Device菜单项,弹出如图12-2所示的Backup Device Properties-New Device对话框。
图12-2 New Device对话框
(3)在该对话框中,输入备份文件的逻辑名称和物理名称。
(4)输入完成后,单击“确定”按钮。
系统存储过程sp_addumpdeviec的语法形式如下:
sp_addumpdevice{‘device_type’}
[,‘logical_name’][,‘physical_name’]
[,{{controller_type|‘device_status’}}]
下面的例子创建了一个逻辑名称为logical_name,物理名称为physicak_name的永久性备份文件:
USE master
EXEC sp_adumpdevice‘tape’,‘logical_name’,‘\\physical_name’
在SQL Server 2000中,可以进行并行备份,并行备份允许SQL Server系统同时向多个备份文件进行操作,这些文件存储了一个并行的备份集。
使用多个文件进行备份可以大大节省数据库备份的时间,其语法形式如下:
BACKUP DATABASE{database_name|@database_name_var}
TO<backup_file>[,…n]
[[,][NAME={backup_set_name|@backup_set_name_var}]]
其中,<backup_file>是
{backup_file_name|@backup_file_name_evar}|
{DISK|TAPE|PIPE}={‘temp_file_name’|@temp_file_name_var}
使用多个备份文件进行备份的时候,应该注意以下方面:
n 备份集中可以混合使用永久性文件和临时文件。
n 在同一次备份操作中,所有的备份设备必须是同一种介质。
n 如果格式化备份集中的一个成员,其他成员中的数据会变得无效。
在BACKUP DATABASE语法形式中,NAME选项给出备份集的名称。NAME选项将多个备份文件与一个备份集的成员互相联系起来。如果使用多个备份文件,就应该使用NAME选项。
备份操作有以下三种方法:
n 使用SQL Server Enterprise Manager。
n 使用Transact-SQL语句。
n 使用备份向导。
无论使用哪一种方法创建备份,都涉及到一些常规选项,在使用Transact-SQL语句的时候,涉及到的选项如下:
BACKUP DATABASE{database_name|@database_name_var}
TO<backup_file>[,…n]
[WITH
[[,]FORMAT]
[[,][INIT|NOINIT]
[[,]RESTART]
]
各个选项的含义如下:
(1)INIT和NOINIT选项
如果使用INIT选项,则SQL Server系统将覆盖掉备份设备上除标题之外的任何信息,如果使用NOINIT选项,则SQL Server系统将备份附加在某一个已经存在的备份文件或备份集合上。默认情况下,SQL Server系统备份内容附加在文件上。
(2)FORMAT选项
使用FORMAT选项可以覆盖备份文件的内容,使用FORMAT选项可以执行以下操作:
n 覆盖所有介质和备份文件的内容。
n 在备份操作的所有文件上写入新的标题信息。
@ 使用FORMAT选项要非常谨慎,因为如果不小心格式化备份集中的一个成员,整个备份都会变成不可用。
(3)RESTART选项
如果选择RESTART选项,SQL Server系统将从中断点重新启动备份操作。
使用备份向导进行备份的操作如下:
(1)运行SQL Server Enterprise Manager。
(2)单击Tools菜单,选择Wizards菜单项,弹出如图12-3所示的对话框。
(3)单击Management旁边的“+”,展开Management,双击Backup Wizard,启动备份向导,如图12-4所示。
(4)单击“下一步”按钮,出现如图12-5所示的选择数据库对话框。
(5)在数据库下拉式列表中选择需要备份的数据库。
(6)选择完成后,单击“下一步”按钮,弹出如图12-6所示的键入备份名称和注释对话框。
图12-3 选择向导
图12-4 备份向导欢迎对话框
图12-5 选择数据库对话框
图12-6 键入备份名称和注释
(7)键入备份的名称和注释信息,单击“下一步”按钮,弹出如图12-7所示的选择备份类型对话框。
图12-7 选择备份类型
(8)选择备份类型,然后单击“下一步”按钮。弹出如图12-8所示的选择备份设备并设置属性对话框。
(9)键入备份文件名称并选择备份设备,并选择是添加在原备份文件之后还是覆盖掉以前的数据。
(10)选择完成后,单击“下一步”按钮,弹出如图12-9所示的备份计划安排对话框。
(11)设置完相关的信息后,单击“下一步”按钮,弹出如图12-10所示的对话框。在该对话框中,显示了用户的设备信息。
执行完以上操作后,就成功地创建了备份。
图12-8 选择备份设备并设置属性
图12-9 备份计划安排
图12-10 完成备份对话框
磁带是一种非常方便的存储介质,具有存储量大、价格低廉、易于存放和安全性高的特点。如果使用磁带进行备份,必须将磁带驱动器安装在本地SQL Server服务器上。在进行备份的时候,SQL Server在磁带标签上记录有关备份的信息,包括数据库名称、备份时间、备份日期和备份类型。在使用磁带进行备份的时候,会涉及到这些选项:UNLOAD、NOUNLOAD、BLOCKSIZE、FORMT、SKIP和NOSKIP。
下面分别介绍以上选项。
(1)UNLOAD
默认情况下,UNLOAD选项有效,如果选择该选项,在SQL Server系统完成备份之后,会自动倒带并从磁带驱动器中卸载。
(2)NOUNLOAD
如果选择NOUNLOAD选项,则在完成备份之后,SQL Server系统不会自动倒带和从磁带驱动器中卸载。
(3)BLOCKSIZE
可以使用BLOCKSIZE选项改变以字节表示的物理块尺寸。
(4)FORMAT
如果使用FROMAT选项,SQL Server系统将覆盖备份文件上的全部标题信息和备份。标题信息包括MEDIADESCRIPTION和MEDIANAME选项中的信息。
(5)SKIP
使用SKIP选项,SQL Server系统将忽略掉磁带驱动器上的ANSI磁带标签。默认情况下,该选项有效。
(6)NOSKIP
如果不希望SQL Server系统阅读ANSI磁带标签,选择NOSKIP选项。
在SQL Server 2000中,有以下四种备份类型:
n 完全数据库备份
n 增量数据库备份
n 事务日志备份
n 数据库文件备份
下面分别介绍这四种备份类型。
如果数据库是只读数据库,使用完全数据库备份可以防止数据库损失,在系统失败的时候可以容易地恢复数据库。在执行完全数据库备份的时候,SQL Server系统会备份在备份活动中的任何操作并备份事务日志中没有提交的事物。可以使用SQL Server Enterprise Manager进行完全数据库备份,操作如下:
(1)启动SQL Server Enterprise Manager。
(2)选择Tools菜单,如图12-11所示。
(3)在图12-11所示的菜单中,单击Backup Database,弹出SQL Server Backup对话框,如图12-12所示,默认选项卡为General。
图12-11 Tools菜单
图12-12 SQL Server Backup对话框-General选项卡
(4)在Genral选项卡上,键入数据库的名称、备份名称、备份注释信息、选择备份类型、选择备份目的地、确定备份是初始化还是附加在原有备份内容之后等。
(5)单击Schedule右面的按钮,弹出如图12-13所示的对话框,在该对话框中,键入调度名称并选择调度类型。有以下四种调度可以选择:
n 在SQL Server Agent服务启动时自动执行。
n 在CPU空闲的时候执行。
n 在设定的日期和时间执行一次。
n 指定执行的频率。
图12-13 Edit Schedule对话框
(6)设置完成后,单击OK按钮,返回SQL Server Backup对话框。
(7)选择Options选项卡,如图12-14所示。
图12-14 Optios选项卡
(8)在该选项卡中,选择是否验证备份是否完成、是否检验介质的失效日期和如何初始化介质。
也可以使用Transact-SQL语句创建完全数据库备份。下面的例子创建了一个永久性备份文件,逻辑名称为foreverbackup,执行数据库完全备份。
USE master
EXEC sp_addumpdevice‘disk’,‘foreverbackup’,‘C:\test\forverbackup.bak’
BACKUP DATABASE northwind TO foreverbackup
下面的例子执行完全数据库备份,并覆盖该文件以前的内容。
BACKUP DATABASE northwing TO foreverbackup WITH INIT
下面的例子执行完全数据库备份,并把新的内容附加在原来的内容之后。
BACKUP DATABASE northwind TO forverbackup WITH NOINIT
如果数据库中的数据经常被修改,可以使用增量备份来减少数据库的恢复时间,要执行增量备份,首先需要执行完全数据库备份。增量备份只备份上一次完全数据库备份之后已经改变的数据库内容和在执行增量备份中发生的任何操作以及事务日志中没有提交的事务。
增量备份的语法形式如下:
BACKUP DATABASE{database_name|@database_name_var}
TO<backup-file>[,…n]
[WITH
[[,]DIFFERENTIAL]
]
在执行增量备份的时候,应该考虑以下因素:
n 增量备份包含数据库最近一以更新后的记录。
n 可以为包含增量备份内容的备份文件创建一个命名机制,以区分增量备份文件和包含完整数据库备份的文件。
下面的例子在一个临时备份文件上创建了一个增量备份。
BACKUP DATABASE northwind
TO DISK=‘D:\backupfile.bak’
WITH DIFFERENTIAL
用户可以通过备份事务日志来记录数据库的变化。不过,必须在执行了完全数据库备份之后,才能进行事务日志备份,在进行事务日志备份的时候,SQL Server系统执行以下操作:
n 清除事务日志到事务日志活动部分的开始处。
n 重新整理磁盘空间,并清除事务日志不活动部分中的信息。
n 只有在数据库中存在事务日志的时候,才能进行事务日志备份。
事务日志备份的语法形式如下:
BACKUP DATABASE {database_name|@database_name_var}
TO <backup_file>[,…n]
[WITH
[[,]{INIT|NOINIT}]
[[,][NAME={backup_set_name|@backup_set_name_var}]]
]
当数据库非常庞大的时候,可以执行数据库文件组备份。SQL Server系统在备份文件和文件组的时候,可以只备份在FILE和FILEGROUP选项中指定的数据库文件。在执行数据库文件或者文件组备份的时候,应该考虑以下因素:
n 必须指定文件名和文件组的周期性计划。
n 应该具有一个备份文件的周期性计划。
n 最多可以指定16个文件或者文件组。
数据库文件或者文件组备份的语法形式如下:
BACKUP DATABASE{database_name|@database_name_var}
[<file_or filegroup>[,…n]]TO<backup_file>[,…n]]
其中,<file_or_filegroup>为
[FILE=logcal_file_name|FILEGROUP=logicak_filegroup_name]