在使用数据库的过程中,及时的进行数据库的备份工作是很有必要的。
笔者在维护数据库的过程中, 遇到几次意外的数据库丢失, 幸好有及时的备份, 才使用的applicatio没有受到较大的影响。
针对 MSSQL 2000, 我们有log explorer之类的工具,可以帮助备份与恢复数据库, 但是这个比较的耗资源。
本身SQLSERVER 还提供了一组命令BACKUP来进行同行的工作, 本文来描述一下这个命令的使用的语法。 更多的信息,请参考MSDN
一、 备份
对整个数据库进行备份 :
BACKUP DATABASE { database_name | @database_name_var }
TO <backup_device> [ ,...n ]
[ <MIRROR TO clause> ] [ next-mirror-to ]
[ WITH { DIFFERENTIAL | <general_WITH_options> [ ,...n ] } ]
[;]
对特定的文件或者是文件组进行备份
BACKUP DATABASE { database_name | @database_name_var }
<file_or_filegroup> [ ,...n ]
TO <backup_device> [ ,...n ]
[ <MIRROR TO clause> ] [ next-mirror-to ]
[ WITH { DIFFERENTIAL | <general_WITH_options> [ ,...n ] } ]
[;]
对事务日志进行备份
BACKUP LOG { database_name | @database_name_var }
TO <backup_device> [ ,...n ]
[ <MIRROR TO clause> ] [ next-mirror-to ]
[ WITH { <general_WITH_options> | <log-specific_optionspec> } [ ,...n ] ]
[;]
下面就来对上面的具体的参数进行描述:
首先是备份的地方:backup_device, 可以是逻辑磁盘也可以是物理磁盘。
逻辑磁盘主要是针对做SAN或者是磁盘阵列的,可以映射到某个具体的物理磁盘,或者 直接就是物理磁盘。
<backup_device>::=
{
{ logical_device_name | @logical_device_name_var }
| { DISK | TAPE } =
{ 'physical_device_name' | @physical_device_name_var }
}
其次,当备份特定的文件或者是文件组的时候, 文件或者文件组就是当前数据库使用的文件或者文件组,
<file_or_filegroup>::=
{
FILE = { logical_file_name | @logical_file_name_var }
| FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }
}

还有就是 WITH 选项
1) 通用的with选项
<general_WITH_options> [ ,...n ]::=--Backup Set Options
COPY_ONLY
| { COMPRESSION | NO_COMPRESSION }
| DESCRIPTION = { 'text' | @text_variable }
| NAME = { backup_set_name | @backup_set_name_var }
| PASSWORD = { password | @password_variable }
| { EXPIREDATE = { 'date' | @date_var }
| RETAINDAYS = { days | @days_var } }
COPY_ONLY: 指定备份为“仅复制备份”,该备份不影响正常的备份顺序. 用于执行特殊目的的备份,例如在进行联机文件还原前备份日志
{ COMPRESSION | NO_COMPRESSION }: 指定些备份是否压缩, 2008才有备份压缩。
NAME: 指定备份集的名称
{ EXPIREDATE = 'date'| RETAINDAYS = days }:指定允许覆盖该备份的备份集的日期。如果同时使用这两个选项,RETAINDAYS 的优先级别将高于 EXPIREDATE。
2) 介质选项
{ NOINIT | INIT }控制备份操作是追加到还是覆盖备份介质中的现有备份集。默认为追加到介质中最新的备份集
NOINIT:表示备份集将追加到指定的介质集上,以保留现有的备份集,此选项是默认的
INIT:
指定应覆盖所有备份集,但是保留介质标头。如果指定了 INIT,将覆盖该设备上所有现有的备份集(如果条件允许)。默认情况下,BACKUP 将检查下列条件,如果其中的任一条件存在,都不会覆盖备份介质:
-
所有备份集都未过期。
-
如果 BACKUP 语句给出了备份集名,则该备份集名与备份介质上的名称不匹配
笔者使用的是每周一完整备份, 其余每天差异备份。
完整备份
差异备份:
对master, msdb 和model DB,要进行每天的备份
二、还原
还原使用 BACKUP 命令所做的备份。
基于完整数据库备份还原整个数据库(完整还原)。
还原数据库的一部分(部分还原)。
将特定文件或文件组还原到数据库(文件还原)。
将特定页面还原到数据库(页面还原)。
将事务日志还原到数据库(事务日志还原)。
将数据库恢复到数据库快照捕获的时间点。
1) 完整还原
RESTORE DATABASE { database_name | @database_name_var } [ FROM <backup_device> [ ,...n ] ] [ WITH { [ RECOVERY | NORECOVERY | STANDBY = {standby_file_name | @standby_file_name_var } ] | , <general_WITH_options> [ ,...n ] | , <replication_WITH_option> | , <change_data_capture_WITH_option> | , <service_broker_WITH options> | , <point_in_time_WITH_options—RESTORE_DATABASE> } [ ,...n ] ] [;]
2) 还原特定的页面
RESTORE DATABASE { database_name | @database_name_var } <file_or_filegroup> [ ,...n ] [ FROM <backup_device> [ ,...n ] ] WITH { [ RECOVERY | NORECOVERY ] [ , <general_WITH_options> [ ,...n ] ] } [ ,...n ] [;]
3)从snapshot还原
RESTORE DATABASE { database_name | @database_name_var } FROM DATABASE_SNAPSHOT = database_snapshot_name