T-SQL语言里提供了BACKUP DATABASE语句来备份数据库,用该语句可以完成完整、差异、文件和文件组备份。如果要备份事务日志则要用BACKUP LOG语句。虽然BACKUP DATABASE语句可以进行完整、差异、文件和文件组备份,但是在完整备份、差异备份与文件和文件组备份的语法上有一点点出入,下面分别介绍几种类型的 备份方法。
18.3.1 完整备份与差异备份
完整备份与差异备份的语法代码如下:
BACKUP DATABASE { database_name | @database_name_var } TO < backup_device > [ ,...n ] [ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...next-mirror ] ] [ WITH [ BLOCKSIZE = { blocksize | @blocksize_variable } ] [ [ , ] BUFFERCOUNT = { buffercount | @buffercount_variable } ] [ [ , ] { CHECKSUM | NO_CHECKSUM } ] [ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ] [ [ , ] DESCRIPTION = { 'text' | @text_variable } ] [ [ , ] DIFFERENTIAL ] [ [ , ] EXPIREDATE = { date | @date_var } | RETAINDAYS = { days | @days_var } ] [ [ , ] PASSWORD = { password | @password_variable } ] [ [ , ] { FORMAT | NOFORMAT } ] [ [ , ] { INIT | NOINIT } ] [ [ , ] { NOSKIP | SKIP } ] [ [ , ] MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable } ] [ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ] [ [ , ] MEDIANAME = { media_name | @media_name_variable } ] [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ] [ [ , ] NAME = { backup_set_name | @backup_set_name_var } ] [ [ , ] { REWIND | NOREWIND } ] [ [ , ] { UNLOAD | NOUNLOAD } ] [ [ , ] RESTART ] [ [ , ] STATS [ = percentage ] ] [ [ , ] COPY_ONLY ] ] <backup_device> ::= { { logical_backup_device_name | @logical_backup_device_name_var } | { DISK | TAPE } = { 'physical_backup_device_name' | @physical_backup_device_name_var } }
其主要参数有:
l database_name:数据库名。
l @database_name_var:数据库名称变量。
l < backup_device >:备份设备名称。
l MIRROR TO:表示备份设备组是包含二至四个镜像服务器的镜像媒体集中的一个镜像。若要指定镜像媒体集,则针对第一个镜像服务器设备使用TO子句,后跟最多三个MIRROR TO子句。
l BLOCKSIZE:用字节数来指定物理块的大小,支持的大小为512、1024、2048、4096、8192、16384、32768和65536 (64 KB) 字节。
l BUFFERCOUNT:指定用于备份或还原操作的I/O缓冲区总数。可以指定任何正整数。
l CHECKSUM | NO_CHECKSUM:是否启用校检和。
l STOP_ON_ERROR | CONTINUE_AFTER_ERROR:校检和失败时是否还继续备份操作。
l DESCRIPTION:此次备份数据的说明文字内容。
l DIFFERENTIAL:只做差异备份,如果没有该参数,则做完整备份。
l EXPIREDATE:指定备份集到期和允许被覆盖的日期。
l RETAINDAYS:指定必须经过多少天才可以覆盖该备份媒体集。
l PASSWORD:为备份集设置密码,如果为备份集定义了密码,则必须提供此密码才能对该备份集执行还原操作。
l FORMAT | NOFORMAT:指定创建或不创建新的媒体集。
l INIT:指定覆盖所有备份集,但是保留媒体标头。如果指定了 INIT,将覆盖该设备上所有现有的备份集。
l NOINIT:表示备份集将追加到指定的媒体集上,以保留现有的备份集。
l NOSKIP | SKIP:指定是否在覆盖媒体上的所有备份集之前先检查它们的过期日期。
l MAXTRANSFERSIZE:指定要在SQL Server和备份媒体之间使用的最大传输单元(字节)。可能的值是65536字节(64 KB) 的倍数,最多可到4194304字节 (4 MB)。
l MEDIADESCRIPTION:指定媒体集的自由格式文本说明,最多为255个字符。
l MEDIANAME:指定整个备份媒体集的媒体名称。
l MEDIAPASSWORD:为媒体集设置密码。MEDIAPASSWORD 是一个字符串。如果为媒体集定义了密码,则在该媒体集上创建备份集之前必须提供此密码。另外,从该媒体集执行任何还原操作时也必须提供媒体密码。
l NAME:指定备份集的名称。名称最长可达128个字符。
l REWIND:指定SQL Server将释放和重绕磁带。
l NOREWIND:指定在备份操作之后SQL Server让磁带一直处于打开状态。
l UNLOAD:指定在备份完成后自动重绕并卸载磁带。
l NOUNLOAD:指定在备份操作之后磁带将继续加载在磁带机中。
l RESTART:在SQL Server 2005该参数已经失效,在以前版本中,表示现在要做的备份是要继续前次被中断的备份作业。
l STATS:该参数可以让SQL Server每备份好百分之多少时的数据就显示备份进度信息。
l COPY_ONLY:指定此备份不影响正常的备份序列。仅复制不会影响数据库的全部备份和还原过程。
例二、将Northwind数据库完整备份到名为“新备份设备”的备份设备上,其代码为:
BACKUP DATABASE Northwind
TO 新备份设备
运行结果如图18.7所示:
图18.7 例二的运行结果
例三、将Northwind数据库完整备份到磁盘文件中,其代码为:
BACKUP DATABASE Northwind
TO DISK = 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\backup.BAK'
例四、将Northwind数据库差异备份到名为“新备份设备”的备份设备上,其代码为:
BACKUP DATABASE Northwind
TO 新备份设备
WITH DIFFERENTIAL
18.3.2 备份文件和文件组
备份文件和文件组的语法代码如下:
BACKUP DATABASE { database_name | @database_name_var }
<file_or_filegroup> [ ,...f ]
TO < backup_device > [ ,...n ]
[ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...next-mirror ] ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] BUFFERCOUNT = { buffercount | @buffercount_variable } ]
[ [ , ] { CHECKSUM | NO_CHECKSUM } ]
[ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] DIFFERENTIAL ]
[ [ , ] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] { FORMAT | NOFORMAT } ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] { REWIND | NOREWIND } ]
[ [ , ] { UNLOAD | NOUNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
[ [ , ] COPY_ONLY ]
]
<file_or_filegroup> :: =
{
FILE = { logical_file_name | @logical_file_name_var }
|
FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }
| READ_WRITE_FILEGROUPS
}
从以上代码可以看出,文件和文件组的备份与完整备份、差异备份的代码大同小异,不同的是在“TO < backup_device >”之前多了一句“<file_or_filegroup>”。该语法块里的参数有:
l FILE:给一个或多个包含在数据库备份中的文件命名。
l FILEGROUP:给一个或多个包含在数据库备份中的文件组命名。
l READ_WRITE_FILEGROUPS:指定部分备份,包括主文件组和所有具有读写权限的辅助文件组。创建部分备份时需要此关键字。
例五、将Northwind数据库中的“Northwind_Data”文件备份到名为“新备份设备”的备份设备上,其代码为:
BACKUP DATABASE Northwind
FILE = 'Northwind_Data'
TO 新备份设备
例六、将Northwind数据库中的名为“自定义文件组”的文件组备份到名为“新备份设备”的备份设备上,其代码为:
BACKUP DATABASE Northwind
FILEGROUP = ' Northwind文件组'
TO 新备份设备
18.3.3 事务日志备份
事务日志备份的语法代码如下所示:
BACKUP LOG { database_name | @database_name_var }
{
TO <backup_device> [ ,...n ]
[ [ MIRROR TO <backup_device> [ ,...n ] ] [ ...next-mirror ] ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] BUFFERCOUNT = { buffercount | @buffercount_variable } ]
[ [ , ] { CHECKSUM | NO_CHECKSUM } ]
[ [ , ] { STOP_ON_ERROR | CONTINUE_AFTER_ERROR } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] { FORMAT | NOFORMAT } ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] NO_TRUNCATE ]
[ [ , ] { NORECOVERY | STANDBY = undo_file_name } ]
[ [ , ] { REWIND | NOREWIND } ]
[ [ , ] { UNLOAD | NOUNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
[ [ , ] COPY_ONLY ]
]
}
从以上代码可以看出,文件和文件组的备份与完整备份、差异备份的代码大同小异,只是将BACKUP BATABASE改为了 BACKUP LOG。
例七、将Northwind数据库的事务日志备份到名为“新备份设备”的备份设备上,其代码为:
BACKUP LOG Northwind
TO 新备份设备
18.4 备份设备管理
在前面章节里介绍过怎么样去创建备份设备。当将数据库备份到备份设备之后,要妥善管理好备份设备。备份设备尽量不要与数据库系统放在同一台服务器上,以免硬件发生故障时备份数据也保不住。如果可能的话,可以将备份设备刻录到光盘上。
18.4.1 查看备份设备的内容
由于一个备份设备可以存储多个数据库的备份数据,也可以存储同一个数据库的多次备份的数据,因此,在某些时候(如还原数据库前)会需要查看一下备份设备里的包含有哪些内容。在SQL Server Management Studio查看备份设备里的内容的方法如下:
(1)启动【SQL Server Management Studio】,在【对象资源管理器】窗口里展开树型目录,【数据库实例】à【服务器对象】à【备份设备】。
(2)右击要查看内容的备份设备名,在弹出的快捷菜单里选择【属性】选项,也可以双击要查看内容的备份设备名。
(3)弹出【备份设备—设备名称】的对话框,在该对话框里选择【媒体内容】选项项,弹出如图18.8所示对话框,在该对话框里可以该备份设备里包含的数据库备份数据。如备份时的备份名称、备份类型、备份的数据库、备份时间、过期时间等等。
(4)查看完毕后,单击【确定】退出该对话框。
图18.8 查看备份设备内容
在T-SQL语言里提供了RESTORE HEADERONLY来查看备份设备上所有备份集的所有备份标头信息的结果集,其语法代码为:
RESTORE HEADERONLY
FROM <backup_device>
[ WITH
[ { CHECKSUM | NO_CHECKSUM } ]
[ [ , ] { CONTINUE_AFTER_ERROR | STOP_ON_ERROR } ]
[ [ , ] FILE = backup_set_file_number ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ] --媒体文件名
[ [ , ] MEDIAPASSWORD = { mediapassword | --媒体密码
@mediapassword_variable } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] REWIND ]
[ [ , ] { UNLOAD | NOUNLOAD } ]
]
[;]
<backup_device> ::=
{
{ logical_backup_device_name |
@logical_backup_device_name_var }
| { DISK | TAPE } = { 'physical_backup_device_name' |
@physical_backup_device_name_var }
}
以上参数都比较简单,大多在前面已经介绍过了,在此就不再一一介绍。
例八、查看名为“新备份设备”的备份设备里的内容,其代码如下:
RESTORE HEADERONLY
FROM 新备份设备
运行结果如图18.9所示:
图18.9 例八的运行结果
18.4.2 通过备份设备来备份数据库
在上面的章节里介绍了备份数据库的一种方法,该方法是右击数据库名,在弹出的快捷菜单里选择【任务】à【备份】选项,然后完成备份数据库的操作。在SQL Server 2005里,还可以直接在备份设备上备份数据库,其方法如下:
(1)启动【SQL Server Management Studio】,在【对象资源管理器】窗口里展开树型目录,【数据库实例】à【服务器对象】à【备份设备】。
(2)右击要创建数据库备份的备份设备,在弹出的快菜单里选择【备份数据库】。
(3)弹出如图18.3所示对话框,在该对话框的【目标】区域里已经自动添加了备份设备,这个备份设备就是第(2)步中右击备份设备。
(4)按照第18.2章节中的操作完成剩下的备份操作。
18.4.3 验证备份的内容
在图18.6所示的备份数据库的【选项】对话框里,可以选择【可靠性】区域中的【完成后验证备份】和【写入媒体前检查校验和】两个选项来检查备份后的数据是否有误,避免在恢复数据库时才发现备份的文件有误或无法读取,引起不必要的损失。
然而通过BACKUP语句来备份的数据库时,并没有验证备份文件的 功能,如果要验证备份文件是否有误,只能用RESTORE VERIFYONLY语句来验证。在SQL Server 2005中的RESTORE VERIFYONLY语句功能已经得到了增强,不但可以验证备份集是否完整、整个备份是否可读,还可以对数据执行额外的检查,从而提高发现错误的概率。其 目标是尽可能接近实际的还原操作。RESTORE VERIFYONLY语句的语法代码如下:
RESTORE VERIFYONLY
FROM <backup_device> [ ,...n ]
[ WITH
[ { CHECKSUM | NO_CHECKSUM } ]
[ [ , ] { CONTINUE_AFTER_ERROR | STOP_ON_ERROR } ]
[ [ , ] FILE =backup_set_file_number ]
[ [ , ] LOADHISTORY ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword |
@mediapassword_variable } ]
[ [ , ] MOVE 'logical_file_name' TO 'operating_system_file_name' ] [ ,...n ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] { REWIND | NOREWIND } ]
[ [ , ] STATS [ = percentage ] ]
[ [ , ] { UNLOAD | NOUNLOAD } ]
]
[;]
<backup_device> ::=
{
{ logical_backup_device_name |
@logical_backup_device_name_var }
| { DISK | TAPE } = { 'physical_backup_device_name' |
@physical_backup_device_name_var }
}
其中参数大多前面章节里已经介绍过了,这里介绍几个没有介绍过的参数:
l CONTINUE_AFTER_ERROR:指定遇到错误后继续执行还原操作。
l STOP_ON_ERROR:指定还原操作在遇到第一个错误时停止。
l FILE:要还原的备份集。
l LOADHISTORY:指示还原操作将信息加载到msdb历史记录表中。
l MOVE:将逻辑名指定的数据文件或日志文件还原到所指定的位置。
例九、校验名为“新备份设备”的备份设备是否有误,其代码如下:
RESTORE VERIFYONLY
FROM 新备份设备
运行结果如图18.10所示,如果校验备份设备不通过,则有可能出现如图18.11所示的出错信息。
图18.10 校验备份设备通过
图18.11 校验备份设备不通过
例十、由于一个备份设备里可以包含多个备份集,如果要校验名为“新备份设备”的备份设备里第二个备份集是否正确,可以使用以下代码:
RESTORE VERIFYONLY
FROM 新备份设备
WITH FILE = 2
注意:如果未指定file,默认只校验第一个备份集是否正确。
使用RESTORE VERIFYONLY语句也可以校验备份文件里的备份集是否正确。
例十一、校验backup.bak文件里的备份集是否正确,其代码如下:
RESTORE VERIFYONLY
FROM DISK='D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Backup\backup.bak'
18.4.4 删除备份设备
当备份设备不要需要使用时,可以将其删除,在SQL Server Management Studio里删除备份设备的方法如下:
(1)启动【SQL Server Management Studio】,在【对象资源管理器】窗口里展开树型目录,【数据库实例】à【服务器对象】à【备份设备】。
(2)右击要删除的备份设备名,在弹出的快捷菜单里选择【删除】选项。
(3)弹出【删除对象】对框话,在该对话框里单击【确定】按钮完成操作。
18.5 在SQL Server Management Studio中还原数据库
不管愿不愿意,一个数据库管理员或多或少都会遇到要还原数据库的操作。有时是因为数据库的软硬件出了故障,有时是因为做了大量的误操作,需要将数据库还原到误操作之前的状态。不过不管是因为什么原因,在还原数据库时都必需要了解还原的方式和一些注意事项。
18.5.1 还原数据库的方式
有几种数据库备份的方式就将会有几种还原数据库的方式:
l 完整备份的还原:无论是完整备份、差异备份还是事务日志备份的还原,在第一步都要先做完整备份的还原。完整备份的还原只需要还原完整备份文件即可。
l 差异备份的还原:差异备份的还原一共需要两个步骤,第一个步骤先还原完整备份,第二步还原最后一个差异备份。例如在每个周日做一次完整备份,周一到周六每 天下班前做一次差异备份,如果在某个周四发生了数据库故障,那么做差异备份的还原就应该先还原最近一个周日做的完整备份,然后还原周三做的差异备份。如果 在差异备份之后还有事务日志备份,那么还应该还原事务日志备份。
l 事务日志备份的还原:还原事务日志备份的步骤比较多一些,因为事务日志备份相对而言会做得比较频繁一些。例如某个数据库在每个周日做完整备份,每天的下午 18点做差异备份,在白天里每隔三个小时做一次事务日志备份。假设在周三早上8点上班时数据库发生故障,那么还原数据库的步骤应该是:先恢复周日做的完整 备份,然后恢复周二下午做的差异备份,最后依次恢复差异备份到损坏为止的每一个事务日志备份,即周二晚上21点、周二晚上24点、周三早上3点、周三早上 6点所做的事务日志备份。
l 文件和文件组备份的还原:通常只有数据库中某个文件或文件组损坏了才会使用这种还原模式。
18.5.2 还原数据库前要注意的事项
在还原数据库之前,要注意以下两点:
l 检查备份设备或文件:在还原数据库之前,首先要找到要还原的备份文件或备份设备,并检查备份文件或备份设备里的备份集是否正确无误,例如使用前面介绍的“RESTORE VERIFYONLY”语句。
l 查看数据库的使用状态:在还原数据库之前,要先查看数据库是否还有其他人在使用,如果还有其他人正在使用,将无法还原数据库。
18.5.3 还原数据库备份
在SQL Server Management Studio里还原数据的方法如下:
(1)启动【SQL Server Management Studio】,右击要还原的数据库,在弹出的快捷菜单里选择【任务】à【还原】à【数据库】,弹出如图8-12所示【还原数据库】对话框
图8-12 【还原数据库】对话框
(2)在图8-12所示对话框里有很多选择项,不同的还原情况选择不同的选择项:
l 【目标数据库】:在该下拉列表框里可以选择要还原的数据库。
l 【目标时间点】:如果备份文件或备份设备里的备份集很多的话,还可以选择【目标时间点】,只要有事务日志备份支持,可以还原到某个时间的数据库状态。在默认情况下该项为“最近状态”。
l 【还原的源】:在该区域里可以指定用于还原的备份集的源和位置。
如果选择【目标数据库】单选框,则从msdb数据库里的备份历史记录里查得可用的备份,并显示在【选择用于还原的备份集】区域里。此时不需要指定备份文件的位置或指定备份设备,SQL Server会自动根据备份记录来找到这些文件。
如果选择【源设备】单选框,则要指定还原的备份文件或备份设备。点击【…】按钮,弹出如图18.13所示【指定备份】对话框。在【备份媒体】下拉列表框里 可以选择是备份文件还是备份设备,选择完毕后单击【添加】按钮,将备份文件或备份设备添加进来。选择备份文件或备份设备后,返回到18-12所示对话框。
图18.13 【指定备份】对话框
l 【选择用于还原的备份集】区域:在该区域里列出了所有可用的备份集。
如果【目标时间点】为“最近状态”,【还原的源】为“源数据库”,该区域显示的是最后一次完整备份到现在的所有可用备份集。
如果【目标时间点】为“最近状态”,【还原的源】为“源设备”,该区域显示的是备份文件或备份设备里的所有可用备份集。
如果【目标时间点】指定的时间,【还原的源】为“源数据库”,该区域里显示的是从该时间前一个完整备份到目前为止的所有非完整备份。例如一个数据库在 2006年9月18日、19日、20日三天的做过备份,其中每天的0点是完整备份,12点是差异备份,21点是日志备份。如果在【目标时间点】里的时间点 为2006年9月19日14点,那么在【选择用于还原的备份集】区域里显示的将是从2006年9月19日的所有备份集与20日的所有差异备份集和事务日志 备份集。
如果【目标时间点】指定的时间,【还原的源】为“源设备”,该区域显示的是备份文件或备份设备里的第一个到该时间之后第一个完整备份以来的所有备份。例如 一个备份文件里包含了2006年9月18日、19日、20日三天的备份数据,其中每天的0点是完整备份,12点是差异备份,21点是日志备份。如果在【目 标时间点】里的时间点为2006年9月19日14点,那么在【选择用于还原的备份集】区域里显示的将是从2006年9月18日与19日两天的所有备份集。
在【选择用于还原的备份集】里可以选择完整备份、差异备份或事务日志备份,SQL Server 2005十分智能,如果选择差异备份,系统会自动将上一个完整备份选择上;如果选择日志备份,系统也会自动将上一个完整备份以及所需要的差异备份和日志备 份都选择上。换句话说,只要选择想恢复到的那个备份集即可,系统会自动选上要恢复到这个备份集的所有其他备份集。
说明:SQL Server 2005在【选择用于还原的备份集】区域里进行了完善工作,可以一次性选择多个备份集来还原数据库,如图18.12所示,选择完整备份和日志备份两个备份集,SQL Server 2005会自动按次序还原这些备份。
(3)如果没有其他的需要,设置完第二步后可以单击【确定】按钮进行还原操作,也可以在图18.12所示对话框里选择【选项】标签,进入如图18.14所示对话框。
图18.14 【选项】选项卡
(4)在如图18.14所示对话框里,可以设置以下选项:
l 【覆盖现有数据库】:选中该复选框则会覆盖所有现有数据库以及相关文件,包括已存在的同名的其他数据库或文件。
l 【保留复制设置】:选中该复选框则会将已发布的数据库还原到创建该数据库的服务器之外的服务器时,保留复制设置。不过该项只有在选择了【回滚未提交的事务,使数据库处于可以使用状态】选项才可以使用。
l 【还原每个备份之前进行提示】:选中该复选框则在还原每个备份设备前都会要求确认一次。
l 【限制访问还原的数据库】:选中该复选框则使还原的数据库仅供db_owner、dbcreator或sysadmin的成员使用。
l 【将数据库文件还原为】:在该区域里可以更改要还原到的任意目的文件的路径和名称。例如在备份完数据库之后,数据库文件移动过位置,如果此时用移动过位置之前的数据库备份来还原数据库,则会把数据库文件还原到原来的位置。使用该项可以将数据库文件还原到新的位置。
l 【恢复状态】:在该区域里有三个选择项:
如果选择了【回滚未提交的事务,使数据库处于可以使用状态。无法还原其他事务日志】单选框,则让数据库在还原后进入可正常使用的状态,并自动恢复尚未完成的事务,如果本次还原是还原的最后一次操作,可以选择该项。
如果选择了【不对数据库执行任何操作,不回滚未提交的事务。可以还原其他事务日志】单选框,则在还原后数据库仍然无法正常使用,也不恢复未完成的事务操作,但可再继续还原事务日志备份或差异备份,让数据库能恢复到最接近目前的状态。
如果选择了【使数据库处于只读模式。撤消未提交的事务,但将撤消操作保存在备用文件中,以便可以恢复效果逆转】单选框,则在还原后做恢复未完成事务的操 作,并使数据库处于只读状态,为了可再继续还原后的事务日志备份,还必须指定一个还原文件来存放被恢复的事务内容。
(5)设置完毕后,单击【确定】按钮完成还原操作。
18.5.4 还原文件和文件组备份
还原文件和文件组备份与还原完整备份、差异备份和事务日志备份有点区别:
(1)启动【SQL Server Management Studio】,右击要还原的数据库,在弹出的快捷菜单里选择【任务】à【还原】à【文件和文件组】,弹出如图8-15所示【还原文件和文件组】对话框。
图18.15 【还原文件和文件组】对话框
(2)如图18.15所示的【还原文件和文件组】对话框里,可以设置以下选项:
l 【目标数据库】:在该下拉列表框里可以选择要还原的数据库。
l 【还原的源】:在该区域里可以选择要用来还原的备份文件或备份设备,用法与还原数据库完整备份中的一样,在此就不赘述了。
l 【选择用于还原的备份集】:在该区域里可以选择要还原的备份集,从图18.15中可以看出,在该区域里所列出备份集不仅仅包含文件和文件组的备份,还包括 完整备份、差异备份和事务备份,无论选择哪种备份,都是允许的。换句话说,在此不仅仅可以恢复文件和文件组备份,也可以恢复完整备份、差异备份和事务备 份。
(3)选择完毕后可以单击【确定】按钮完成还原操作,也可以选择【选项】选项项进行进一步设置,其设置与上面介绍的相同。
注意:在进行完文件和文件组备份之后,还必须进行一次事务日志备份,否则无法还原文件和文件组备份。
18.5.5 从现有的备份创建新的数据库
通常数据库设计员都会在本地计算机上设计并调试数据库,在数据库初 始化完毕之后再上传到服务器上。在前面曾经提到用可以先将数据库文件分离,然后将其传到服务器上再附加。使用这种方法附加的数据库不能改名。在SQL Server 2005中还可以先将本地计算机上的数据库备份,再通过备份文件在服务器上创建一个新的数据库,此时新数据库的数据文件和数据库名都可以和原来的不一样。 其方法为:
(1)启动【SQL Server Management Studio】,在【对象资源管理器里】选项【数据库实例名】à【数据库】。
(2)右击数据库,在弹出的快捷菜单里选择【还原数据库】选项,弹出如图18.12所示【还原数据库】对话框,不过该对话框里【目标数据库】下拉列表框和【源数据库】列表框里都是空白的。
(3)在【目标数据库】下拉列表框处输入新的数据库名。
(4)选择【源设备】单选框,并选择备份文件,然后在【选择用于还原的备份集】区域里选择用于还原的备份集。
(5)单击【选项】标签,进入如图18.14所示对话框,修改该对话框的【将数据库文件还原为】区域里的文件【还原为】的位置。
(6)完成后单击【确定】按钮完成新建数据库的操作。
完成后的新数据库拥有新的数据库名、新的数据库文件以及数据库文件存储的新位置。
18.6 用T-SQL语言还原数据库
T-SQL语言里提供了RESTORE DATABASE语句来恢复数据库备份,用该语句可以恢复完整备份、差异备份、文件和文件组备份。如果要还原事务日志备份则还可以用RESTORE LOG语句。虽然RESTORE DATABASE语句可以恢复完整备份、差异备份、文件和文件组备份,但是在恢复完整备份、差异备份与文件和文件组备份的语法上有一点点出入,下面分别介 绍几种类型备份的还原方法。
18.6.1 还原完整备份
还原完整备份的语法如下:
RESTORE DATABASE { database_name | @database_name_var } --数据库名
[ FROM <backup_device> [ ,...n ] ] --备份设备
[ WITH
[ { CHECKSUM | NO_CHECKSUM } ] --是否校检和
[ [ , ] { CONTINUE_AFTER_ERROR | STOP_ON_ERROR } ] --还原失败是否继续
[ [ , ] ENABLE_BROKER ] --启动Service Broker
[ [ , ] ERROR_BROKER_CONVERSATIONS ] --对束所有会话
[ [ , ] FILE = { backup_set_file_number | @backup_set_file_number } ] --用于还原的文件
[ [ , ] KEEP_REPLICATION ] --将复制设置为与日志传送一同使用
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ] --媒体名
[ [ , ] MEDIAPASSWORD = { mediapassword | --媒体密码
@mediapassword_variable } ]
[ [ , ] MOVE 'logical_file_name_in_backup' TO 'operating_system_file_name' ] --数据还原为
[ ,...n ]
[ [ , ] NEW_BROKER ] --创建新的service_broker_guid值
[ [ , ] PASSWORD = { password | @password_variable } ] --备份集的密码
[ [ , ] { RECOVERY | NORECOVERY | STANDBY = --恢复模式
{standby_file_name | @standby_file_name_var }
} ]
[ [ , ] REPLACE ] --覆盖现有数据库
[ [ , ] RESTART ] --重新启动被中断的还原操作
[ [ , ] RESTRICTED_USER ] --限制访问还原的数据库
[ [ , ] { REWIND | NOREWIND } ] --是否释放和重绕磁带
[ [ , ] { UNLOAD | NOUNLOAD } ] --是否重绕并卸载磁带
[ [ , ] STATS [ = percentage ] ] --还原到其在指定的日期和时间时的状态
[ [ , ] { STOPAT = { date_time | @date_time_var } --还原到指定的日期和时间
| STOPATMARK = { 'mark_name' | 'lsn:lsn_number' } --恢复为已标记的事务或日志序列号
[ AFTER datetime ]
| STOPBEFOREMARK = { 'mark_name' | 'lsn:lsn_number' }
[ AFTER datetime ]
} ]
]
[;]
<backup_device> ::=
{
{ logical_backup_device_name |
@logical_backup_device_name_var }
| { DISK | TAPE } = { 'physical_backup_device_name' |
@physical_backup_device_name_var }
}
其中大多参数在备份数据时已经介绍过了,下面介绍一些没有介绍过的参数:
l ENABLE_BROKER:启动Service Broker以便消息可以立即发送。
l ERROR_BROKER_CONVERSATIONS:发生错误时结束所有会话,并产生一个错误指出数据库已附加或还原。此时Service Broke将一直处于禁用状态直到此操作完成,然后再将其启用。
l KEEP_REPLICATION:将复制设置为与日志传送一同使用。设置该参数后,在备用服务器上还原数据库时,可防止删除复制设置。该参数不能与NORECOVERY参数同时使用。
l MOVE:将逻辑名指定的数据文件或日志文件还原到所指定的位置,相当于图18.14中所示的【将数据库文件还原为】功能。
l NEW_BROKER:使用该参数在会在databases数据库和还原数据库中都创建一个新的service_broker_guid值,并通过清除结束所有会话端点。Service Broker已启用,但未向远程会话端点发送消息。
l RECOVERY:回滚未提交的事务,使数据库处于可以使用状态。无法还原其他事务日志
l NORECOVERY:不对数据库执行任何操作,不回滚未提交的事务。可以还原其他事务日志。
l STANDBY:使数据库处于只读模式。撤消未提交的事务,但将撤消操作保存在备用文件中,以便可以恢复效果逆转。
l standby_file_name | @standby_file_name_var:指定一个允许撤消恢复效果的备用文件或变量。
l REPLACE:会覆盖所有现有数据库以及相关文件,包括已存在的同名的其他数据库或文件。
l RESTART:指定SQL Serve 应重新启动被中断的还原操作。RESTAR从中断点重新启动还原操作。
l RESTRICTED_USER:还原后的数据库仅供db_owner、dbcreator或sysadmin的成员才能使用。
l STOPAT:将数据库还原到其在指定的日期和时间时的状态。
l STOPATMARK:恢复为已标记的事务或日志序列号。恢复中包括带有已命名标记或 LSN 的事务,仅当该事务最初于实际生成事务时已获得提交,才可进行本次提交。
l TOPBEFOREMARK:恢复为已标记的事务或日志序列号。恢复中不包括带有已命名标记或LSN的事务,在使用WITH RECOVERY时,事务将回滚。
例十二、用名为“Northwind备份”的备份设备来还原Northwind数据库,其代码如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind备份
在本例中,没有使用指定备份设备里的哪一个备份集来还原数据库备份,那么默认使用备份设备里的第一个备份集还原数据库。如果要指定用哪个备份集来还原数据库,则要使用file参数指定。
例十三、用名为“Northwind备份”的备份设备的第六个备份集来还原Northwind数据库,其代码如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind备份
WITH FILE = 6
例十四、用名为“backup.bak”的备份文件来还原Northwind数据库,其代码如下:
USE master
RESTORE DATABASE Northwind
FROM DISK='D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\
Backup\backup.bak'
18.6.2 还原差异备份
还原差异备份的语法与还原完整备份的语法是一样的,只是在还原差异 备份时,必须要先还原完整备份再还原差异备份,因此还原差异备份必须要分为两步完成。完整备份与差异备份数据在同一个备份文件或备份设备中,也有可能是在 不同的备份文件或备份设备中。如果在同一个备份文件或备份设备中,则必须要用file参数来指定备份集。无论是备份集是不是在同一个备份文件(备份设备) 中,除了最后一个还原操作,其他所有还原操作都必须要加上NORECOVERY或STANDBY参数。
例十五、用名为“Northwind备份”的备份设备的第一个备份集来还原Northwind数据库的完整备份,再用第三个备份集来还原差异备份,其代码如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind备份
WITH FILE = 1,NORECOVERY
GO
RESTORE DATABASE Northwind
FROM Northwind备份
WITH FILE = 3
GO
如果单独还原差异备份或在本例中完整备份代码里没有加上NORECOVERY参数,都会出现如图18.16所示的无法还原差异备份信息。
图18.16 无法还原差异备份
18.6.3 还原事务日志备份
SQL Server 2005中已经将事务日志备份看成和完整备份、差异备份一样的备份集,因此,还原事务日志备份也可以和还原差异备份一样,只要知道它在备份文件或备份设备里是第几个文件集即可。
与还原差异备份相同,还原事务日志备份必须要先还原在其之前的完整备份,除了最后一个还原操作,其他所有还原操作都必须要加上NORECOVERY或STANDBY参数。
例十六、用名为“Northwind备份”的备份设备的第一个备份集来还原Northwind数据库的完整备份,再用第二个备份集来还原事务日志备份,其代码如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind备份
WITH FILE = 1,NORECOVERY
GO
RESTORE DATABASE Northwind
FROM Northwind备份
WITH FILE = 2
GO
使用RESTORE LOG语句也可以用来还原事务日志备份,例十六的代码也可以改为以下代码:
USE master
RESTORE DATABASE Northwind
FROM Northwind备份
WITH FILE = 1,NORECOVERY
GO
RESTORE LOG Northwind
FROM Northwind备份
WITH FILE = 2
GO
18.6.4 还原文件和文件组备份
还原文件和文件组备份也可以使用RESTORE DATABASE语句,但是必须要在数据库名与FROM之间加上“FILE”或“FILEGROUP”参数来指定要还原的文件或文件组。通常来说,在还原文件和文件组备份之后,还要再还原其他备份来获得最近的数据库状态。
例十七、用名为“Northwind备份”的备份设备的还原文件和文件组,再用第十五个备份集来还原事务日志备份,其代码如下:
USE master
RESTORE DATABASE Northwind
FILEGROUP = 'PRIMARY'
FROM Northwind备份
GO
RESTORE LOG Northwind
FROM Northwind备份
WITH FILE = 15
GO
18.6.5 将数据库还原到某个时间点
有关“时间点”在上面章节里提到过一点点,下面举例详细地介绍怎么将数据库还原到某个时间点。
假设一个数据库,在上午8点做过一次完整备份、10点做过一次事务日志备份,现在发现在9点15分时的一次数据更新是错误的,那么能不能将数据恢复到9点14分时的数据库状态,还是只能恢复到10点所做的事务日志备份时的状态呢?
事务日志的作用就是记录每一次数据的修改记录,所以从理论上来说,是可以恢复到任何一次操作之前的状态。9点15分时的数据是错误的,那就将其恢复到9点14分的数据吧。
例十八、用名为“Northwind备份”的备份设备的第17个备份集来还原Northwind数据库的完整备份,再用第18个事务日志备份集来将数据库还原到9点14分,其代码如下:
USE master
RESTORE DATABASE Northwind
FROM Northwind备份
WITH FILE = 17,NORECOVERY
GO
RESTORE LOG Northwind
FROM Northwind备份
WITH FILE = 18,STOPAT = '2006-9-21 9:14:00'
GO
技巧:在SQL Server Management Studio里也可以完成同样的操作,只要将图18.12所示对话框里设置好【目标时间点】即可。
18.6.6 将文件还原到新位置上
使用RESTORE DATABASE语句也可以利用备份文件创建一个新的数据库。
例十九、用名为“Northwind备份”的备份设备的第17个备份集来创建一个名为“Northwind_test”的新数据库,其代码如下:
USE master
RESTORE DATABASE Northwind_test
FROM Northwind备份
WITH FILE = 17,
MOVE 'Northwind_Data' TO 'D:\Northwind_Data.MDF',
MOVE 'Northwind_Log' TO 'D:\Northwind_Log.LDF',
MOVE 'Northwind自定义数据文件' TO 'D:\Northwind自定义数据文件.NDF',
MOVE 'Northwind自定义日志文件' TO 'D:\Northwind自定义日志文件.LDF'
GO