sqlserver2000个人版怎么备份数据库

sqlserver2000个人版怎么备份数据库,第1张

BACKUP

备份整个数据库、事务日志,或者备份一个或多个文件或文件组。有关数据库备份和恢复 *** 作的更多信息,请参见备份和还原数据库。

语法

备份整个数据库:

BACKUP DATABASE { database_name | @database_name_var }

TO <backup_device >[ ,...n ]

[ WITH

[ BLOCKSIZE = { blocksize | @blocksize_variable } ]

[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]

[ [ , ] DIFFERENTIAL ]

[ [ , ] EXPIREDATE = { date | @date_var }

| RETAINDAYS = { days | @days_var } ]

[ [ , ] PASSWORD = { password | @password_variable } ]

[ [ , ] FORMAT | NOFORMAT ]

[ [ , ] { INIT | NOINIT } ]

[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]

[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]

[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]

[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]

[ [ , ] { NOSKIP | SKIP } ]

[ [ , ] { NOREWIND | REWIND } ]

[ [ , ] { NOUNLOAD | UNLOAD } ]

[ [ , ] RESTART ]

[ [ , ] STATS [ = percentage ] ]

]

备份特定的文件或文件组:

BACKUP DATABASE { database_name | @database_name_var }

<file_or_filegroup >[ ,...n ]

TO <backup_device >[ ,...n ]

[ WITH

[ BLOCKSIZE = { blocksize | @blocksize_variable } ]

[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]

[ [ , ] DIFFERENTIAL ]

[ [ , ] EXPIREDATE = { date | @date_var }

| RETAINDAYS = { days | @days_var } ]

[ [ , ] PASSWORD = { password | @password_variable } ]

[ [ , ] FORMAT | NOFORMAT ]

[ [ , ] { INIT | NOINIT } ]

[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]

[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]

[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]

[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]

[ [ , ] { NOSKIP | SKIP } ]

[ [ , ] { NOREWIND | REWIND } ]

[ [ , ] { NOUNLOAD | UNLOAD } ]

[ [ , ] RESTART ]

[ [ , ] STATS [ = percentage ] ]

]

备份一个事务日志:

BACKUP LOG { database_name | @database_name_var }

{

TO <backup_device >[ ,...n ]

[ WITH

[ BLOCKSIZE = { blocksize | @blocksize_variable } ]

[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]

[ [ ,] EXPIREDATE = { date | @date_var }

| RETAINDAYS = { days | @days_var } ]

[ [ , ] PASSWORD = { password | @password_variable } ]

[ [ , ] FORMAT | NOFORMAT ]

[ [ , ] { INIT | NOINIT } ]

[ [ , ] 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 } ]

[ [ , ] { NOREWIND | REWIND } ]

[ [ , ] { NOSKIP | SKIP } ]

[ [ , ] { NOUNLOAD | UNLOAD } ]

[ [ , ] RESTART ]

[ [ , ] STATS [ = percentage ] ]

]

}

<backup_device >::=

{

{ logical_backup_device_name | @logical_backup_device_name_var }

|

{ DISK | TAPE } =

{ 'physical_backup_device_name' | @physical_backup_device_name_var }

}

<file_or_filegroup >::=

{

FILE = { logical_file_name | @logical_file_name_var }

|

FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }

}

截断事务日志:

BACKUP LOG { database_name | @database_name_var }

{

[ WITH

{ NO_LOG | TRUNCATE_ONLY } ]

}

参数

DATABASE

指定一个完整的数据库备份。假如指定了一个文件和文件组的列表,那么仅有这些被指定的文件和文件组被备份。

说明 在进行完整数据库备份或差异数据库备份时,Microsoft® SQL Server™ 备份足够的事务日志,以生成一个将在还原数据库时使用的一致的数据库。在 master 数据库上只能采用完整数据库备份。

{ database_name | @database_name_var }

指定了一个数据库,从该数据库中对事务日志、部分数据库或完整的数据库进行备份。如果作为变量 (@database_name_var) 提供,则可将该名称指定为字符串常量 (@database_name_var = database name) 或字符串数据类型(ntext 或 text 数据类型除外)的变量。

<backup_device >

指定备份 *** 作时要使用的逻辑或物理备份设备。可以是下列一种或多种形式:

{ logical_backup_device_name } | { @logical_backup_device_name_var }

是由 sp_addumpdevice 创建的备份设备的逻辑名称,数据库将备份到该设备中,其名称必须遵守标识符规则。如果将其作为变量 (@logical_backup_device_name_var) 提供,则可将该备份设备名称指定为字符串常量 (@logical_backup_device_name_var = logical backup device name) 或字符串数据类型(ntext 或 text 数据类型除外)的变量。

{ DISK | TAPE } =

'physical_backup_device_name' | @physical_backup_device_name_var

允许在指定的磁盘或磁带设备上创建备份。在执行 BACKUP 语句之前不必存在指定的物理设备。如果存在物理设备且 BACKUP 语句中没有指定 INIT 选项,则备份将追加到该设备。

当指定 TO DISK 或 TO TAPE 时,请输入完整路径和文件名。例如,DISK = 'C:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\Mybackup.dat' 或 TAPE = '\\.\TAPE0'。

说明 对于备份到磁盘的情况,如果输入一个相对路径名,备份文件将存储到默认的备份目录中。该目录在安装时被设置并且存储在 KEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer\MSSQLServer 目录下的 BackupDirectory 注册表键值中。

如果使用的是具有统一命名规则 (UNC) 名称的网络服务器或已重新定向的驱动器号,则请指定磁盘的设备类型。

当指定多个文件时,可以混合逻辑文件名(或变量)和物理文件名(或变量)。但是,所有的设备都必须为同一类型(磁盘、磁带或管道)。

Windows 98 不支持备份到磁盘。

n

是表示可以指定多个备份设备的占位符。备份设备数目的上限为 64。

BLOCKSIZE = { blocksize | @blocksize_variable }

用字节数来指定物理块的大小。在 Windows NT 系统上,默认设置是设备的默认块大小。一般情况下,当 SQL Server 选择适合于设备的块大小时不需要此参数。在基于 Windows 2000 的计算机上,默认设置是 65,536(64 KB,是 SQL Server 支持的最大大小)。

对于磁盘,BACKUP 自动决定磁盘设备合适的块大小。

说明 如果要将结果备份集存储到 CD-ROM 中然后从 CD-ROM 中恢复,请将 BLOCKSIZE 设为 2048。

磁带的默认 BLOCKSIZE 为 65,536 (64 KB)。显式声明块大小将替代 SQL Server 选择的块大小。

DESCRIPTION = { 'text' | @text_variable }

指定描述备份集的自由格式文本。该字符串最长可以有 255 个字符。

DIFFERENTIAL

指定数据库备份或文件备份应该与上一次完整备份后改变的数据库或文件部分保持一致。差异备份一般会比完整备份占用更少的空间。对于上一次完整备份时备份的全部单个日志,使用该选项可以不必再进行备份。有关更多信息,请参见差异数据库备份和文件差异备份。

说明 在进行完整数据库备份或差异备份时,SQL Server 备份足够的事务日志,从而在恢复数据库时生成一个一致的数据库。

EXPIREDATE = { date | @date_var }

指定备份集到期和允许被重写的日期。如果将该日期作为变量 (@date_var) 提供,则可以将该日期指定为字符串常量 (@date_var = date)、字符串数据类型变量(ntext 或 text 数据类型除外)、smalldatetime 或者 datetime 变量,并且该日期必须符合已配置的系统 datetime 格式。

RETAINDAYS = { days | @days_var }

指定必须经过多少天才可以重写该备份媒体集。假如用变量 (@days_var) 指定,该变量必须为整型。

重要 假如 EXPIREDATE 或 RETAINDAYS 没有指定,有效期将取决于 sp_configure 的 media retention 配置设置。这些选项仅仅阻止 SQL Server 重写文件。用其它方法可擦除磁带,而通过 *** 作系统可以删除磁盘文件。有关过期验证的更多信息,请参见本主题的 SKIP 和 FORMAT。

PASSWORD = { password | @password_variable }

为备份集设置密码。 PASSWORD 是一个字符串。如果为备份集定义了密码,必须提供这个密码才能对该备份集执行任何还原 *** 作。

重要 备份集密码防止未经授权即通过 SQL Server 2000 工具访问备份集的内容,但是不能防止重写备份集。

有关使用密码的更多信息,请参见"权限"部分。

FORMAT

指定应将媒体头写入用于此备份 *** 作的所有卷。任何现有的媒体头都被重写。FORMAT 选项使整个媒体内容无效,并且忽略任何现有的内容。

重要 使用 FORMAT 要谨慎。格式化一个备份设备或媒体将使整个媒体集不可用。例如,如果初始化现有条带备份集中的单个磁带,则整个备份集都将变得不可用。

通过指定 FORMAT,备份 *** 作也就暗示了 SKIP 和 INIT;这些都不必显式说明。

NOFORMAT

指定媒体头不应写入所有用于该备份 *** 作的卷中,并且不要重写该备份设备除非指定了 INIT。

INIT

指定应重写所有备份集,但是保留媒体头。如果指定了 INIT,将重写那个设备上的所有现有的备份集数据。

当遇到以下几种情况之一时不重写备份媒体:

媒体上的备份设置没有全部过期。有关更多信息,请参见 EXPIREDATE 和 RETAINDAYS 选项。

如果 BACKUP 语句给出了备份集名,该备份集名与备份媒体上的名称不匹配。有关更多信息,请参见 NAME 子句。

使用 SKIP 选项替代这些检查。有关使用 SKIP、NOSKIP、INIT 和 NOINIT 时的相互作用关系的更多信息,请参见注释部分。

说明 如果备份媒体有密码保护,SQL Server 将不写入媒体,除非提供媒体密码。SKIP 选项不替代此检查。只有通过格式化才能重写受密码保护的媒体。有关更多信息,请参见 FORMAT 选项。

NOINIT

表示备份集将追加到指定的磁盘或磁带设备上,以保留现有的备份集。NOINIT 是默认设置。

RESTORE 命令的 FILE 选项用于在还原时选择适当的备份集。有关更多信息,请参见 RESTORE。

如果为媒体集定义了媒体密码,则必须提供密码。

MEDIADESCRIPTION = { text | @text_variable }

指明媒体集的自由格式文本描述,最多为 255 个字符。

MEDIADESCRIPTION = { text | @text_variable }

为整个备份媒体集指明媒体名,最多为 128 个字符。假如指定了 MEDIANAME,则它必须与以前指定的媒体名相匹配,该媒体名已存在于备份卷中。假如没有指定 MEDIANAME,或指定了 SKIP 选项,将不会对媒体名进行验证检查。

MEDIAPASSWORD = { mediapassword | @mediapassword_variable }

为媒体集设置密码。MEDIAPASSWORD 是一个字符串。

如果为媒体集定义了密码,则在该媒体集上创建备份集时必须提供此密码。另外,从该媒体集执行任何还原 *** 作时也必须提供媒体密码。只有通过格式化才能重写受密码保护的媒体。有关更多信息,请参见 FORMAT 选项。

有关使用密码的更多信息,请参见"权限"部分。

NAME = { backup_set_name | @backup_set_var }

指定备份集的名称。名称最长可达 128 个字符。假如没有指定 NAME,它将为空。

NORECOVERY

只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于正在还原的状态。当将故障转移到辅助数据库或在 RESTORE *** 作前保存日志尾部时,NORECOVERY 很有用。

STANDBY = undo_file_name

只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于只读或备用模式。撤消文件名指定了容纳回滚更改的存储,如果随后应用 RESTORE LOG *** 作,则必须撤消这些回滚更改。

如果指定的撤消文件名不存在,SQL Server 将创建该文件。如果该文件已存在,则 SQL Server 将重写它。有关更多信息,请参见使用备用服务器。

NOREWIND

指定 SQL Server 在备份 *** 作完成后使磁带保持打开。NOREWIND 意即 NOUNLOAD。SQL Server 将保留磁带驱动器的所有权,直到 BACKUP或 RESTORE 命令使用 REWIND 为止。

如果无意中使磁带处于打开状态,则释放磁带的最快方法是使用下面的 RESTORE 命令:

RESTORE LABELONLY FROM TAPE = <name>WITH REWIND

通过查询 master 数据库中的 sysopentapes 表可以查找正在打开的磁带列表。

REWIND

指定 SQL Server 将释放磁带和倒带。如果 NOREWIND 和 REWIND 均未指定,则默认设置为 REWIND。

NOSKIP

指示 BACKUP 语句在可以重写媒体上的所有备份集之前先检查它们的过期日期。

SKIP

禁用备份集过期和名称检查,这些检查一般由 BACKUP 语句执行以防重写备份集。有关更多信息,请参见注释部分。

NOUNLOAD

指定不在备份后从磁带驱动器中自动卸载磁带。设置始终为 NOUNLOAD,直到指定 UNLOAD 为止。该选项只用于磁带设备。

UNLOAD

指定在备份完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。该设置一直保持到用户指定了 NOUNLOAD 时为止。该选项只用于磁带设备。

RESTART

指定 SQL Server 重新启动一个被中断的备份 *** 作。因为 RESTART 选项在备份 *** 作被中断处重新启动该 *** 作,所以它节省了时间。若要重新启动一个特定的备份 *** 作,请重复整个 BACKUP 语句并且加入 RESTART 选项。不一定非要使用 RESTART 选项,但是它可以节省时间。

重要 该选项只用于导向磁带媒体的备份和跨越了多个磁带卷的备份。在备份的第一卷上永远不会有重新启动 *** 作。

STATS [= percentage]

每当另一个 percentage 结束时显示一条消息,它被用于测量进度。如果省略 percentage,SQL Server 将每完成 10 个百分点显示一条消息。

<file_or_filegroup>

指定包含在数据库备份中的文件或文件组的逻辑名。可以指定多个文件或文件组。

FILE = { logical_file_name | @logical_file_name_var }

给一个或多个包含在数据库备份中的文件命名。

FILEGROUP = { logical_filegroup_name | @logical_filegroup_name_var }

给一个或多个包含在数据库备份中的文件组命名。

说明 当数据库的大小和性能要求使得进行完整数据库备份不切实际时,备份一个文件。若要单独备份事务日志,请使用 BACKUP LOG。

重要 必须通过使用 BACKUP LOG 提供事务日志的单独备份,才能使用文件和文件组备份来恢复数据库。有关文件备份的更多信息,请参见备份使用文件备份。

如果恢复模型为 SIMPLE,则不允许文件和文件组备份。

n

是一个占位符,表示可以指定多个文件和文件组。对文件或文件组的最大个数没有限制。

LOG

指定只备份事务日志。该日志是从上一次成功执行了的 LOG 备份到当前日志的末尾。一旦备份日志,可能会截断复制或活动事务不再需要的空间。

说明 假如备份日志看来并没有截断大部分的日志,则有可能在日志中存在一个旧的开放事务。可以使用 DBCC SQLPERF (LOGSPACE) 观察日志空间。有关更多信息,请参见事务日志备份。

NO_LOG | TRUNCATE_ONLY

无须备份复制日志即删除不活动的日志部分,并且截断日志。该选项会释放空间。因为并不保存日志备份,所以没有必要指定备份设备。NO_LOG 和 TRUNCATE_ONLY 是同义的。

使用 NO_LOG 或 TRUNCATE_ONLY 备份日志后,记录在日志中的更改不可恢复。为了恢复,请立即执行 BACKUP DATABASE。

NO_TRUNCATE

允许在数据库损坏时备份日志。

注释

可以将数据库或日志备份追加到任何磁盘或磁带设备上,从而使得数据库和它的事务日志能存储在一个物理位置中。

当数据库正在使用时,SQL Server 使用一个联机备份过程来对数据库进行备份。下面的列表包括在数据库或事务日志备份时无法进行的 *** 作:

在备份 *** 作时允许进行文件管理 *** 作,如带有 ADD FILE 或 REMOVE FILE 选项的 ALTER DATABASE 语句,以及 INSERT、UPDATE 或 DELETE 语句。

收缩数据库或文件。这包括自动收缩 *** 作。

假如在这些 *** 作正在进行时启动备份,备份将终止。假如正在进行备份时,试图进行这些 *** 作,则 *** 作会失败。

只要 *** 作系统支持数据库的排序规则,就可以在不同的平台之间执行备份 *** 作,即使这些平台使用不同的处理器类型。有关更多信息,请参见 SQL Server 排序规则基础知识。

备份文件格式

因为 SQL Server 2000 的备份格式遵从 Microsoft 磁带格式 (MTF),该格式与 Windows NT 磁带备份所使用的格式相同,所以 SQL Server 备份可与 Windows NT 备份共存于磁带媒体上。若要确保相互 *** 作性,磁带应由 NTBackup 格式化。

备份类型

SQL Server 支持的备份类型包括:

完整数据库备份,它备份包括事务日志的整个数据库。

在完整数据库备份之间执行差异数据库备份。

事务日志备份。

日志备份序列提供了连续的事务信息链,可支持从数据库、差异或文件备份中快速恢复。

文件和文件组备份。

当时间限制使得完整数据库备份不切实际时,请使用 BACKUP 备份数据库文件和文件组,而不是备份完整数据库。若要备份一个文件而不是整个数据库时,请合理安排步骤以确保数据库中所有的文件按规则备份。同时必须进行单独的事务日志备份。在恢复一个文件备份后,使用事务日志将文件内容前滚,使其与数据库其余部分一致。

在条带集中使用的备份设备必须一直在条带集中使用(除非在某处用 FORMAT 重新初始化),而且设备数目不变。在备份设备已定义为条带集的组成部分后,就不能用于单个设备备份,除非指定了 FORMAT。同样,一个含有非条带集备份的备份设备不能用于条带集,除非指定了 FORMAT。使用 FORMAT 来分开条带备份集。

如果写入媒体头时未指定 MEDIANAME 或 MEDIADESCRIPTION,则与空项对应的媒体头字段将为空。

如果恢复模型为 SIMPLE,则无法使用 BACKUP LOG。应该使用 BACKUP DATABASE 来替代。

SKIP、NOSKIP、INIT 和 NOINIT 间的相互作用

下表说明 { INIT | NOINIT }和{ NOSKIP | SKIP } 子句间是如何相互作用的。

说明 在所有这些交互 *** 作中,如果磁带媒体为空或磁带备份文件不存在,则写入媒体头并继续。如果媒体头不为空或不含有效的媒体头,则指出这是无效的 MTF 媒体并取消备份。

INIT NOINIT

SKIP 如果卷中包含有效的1 媒体头,则验证媒体密码并重写媒体上的全部备份集,仅保留媒体头。

如果卷不含有效的媒体头,则使用给定的 MEDIANAME、MEDIAPASSWORD 和 MEDIADESCRIPTION(若有)生成媒体头。

如果卷中包含有效的媒体头,则验证媒体密码并添加备份集,并保留所有现有备份集。

如果卷不含有效的媒体头,则会出错。

NOSKIP 如果该卷包含一个有效的媒体头,将执行以下检查:

验证媒体密码。2

如果指定了 MEDIANAME,将验证所给的媒体名是否匹配媒体头的媒体名。

验证媒体上没有未过期的备份集。

如果有,将终止备份。

如果这些检查都通过了,将重写该媒体上一切备份集,只保留媒体头。

如果卷不含有效的媒体头,则使用给定的 MEDIANAME、MEDIAPASSWORD 和 MEDIADESCRIPTION(若有)生成媒体头。

如果该卷包含一个有效的媒体头,将验证媒体密码*并且验证媒体是否名匹配所给的 MEDIANAME(假如有的话)。如果匹配,追加备份集,同时保留所有现有的备份集。

如果卷不含有效的媒体头,则会出错。

1. 有效性包括 MTF 版本号和其它标题信息。如果不支持指定的版本或指定的版本不是期望值,将会发生错误。

2. 用户必须属于适当的固定数据库或服务器角色,并提供执行备份 *** 作所需的正确媒体密码。

说明 为保持向后兼容性,在 BACKUP 语句的语法中可使用 DUMP 关键字替代 BACKUP 关键字。另外,可使用 TRANSACTION 关键字替代 LOG 关键字。

备份历史表

SQL Server 使用以下的备份历史表来跟踪备份活动:

backupfile

backupmediafamily

backupmediaset

backupset

执行 RESTORE 时,将修改备份历史记录表。

兼容性注意事项

注意 无法在早期 SQL Server 版本中还原使用 Microsoft® SQL Server™ 2000 创建的备份。

权限

BACKUP DATABASE 和 BACKUP LOG 权限默认情况下授予 sysadmin 固定服务器角色和 db_owner 及 db_backupoperator 固定数据库角色的成员。

此外,用户可以为媒体集、备份集或两者指定密码。如果为媒体集指定了密码,则用户若只是适当的固定服务器和数据库角色成员还不足以执行备份。用户还必须提供媒体密码才能执行这些 *** 作。同样,除非在还原命令中指定正确的媒体集密码和备份集密码,否则不能执行还原 *** 作。

在 BACKUP 语句中,定义备份集密码和媒体集密码为可选功能。使用密码可防止利用 SQL Server 2000 工具未经授权地执行还原 *** 作和在媒体中添加备份集,但是,密码不能防止通过 FORMAT 选项重写媒体。

因此,尽管使用密码对防止利用 SQL Server 工具未经授权地访问媒体内容有帮助,但密码不能防止媒体内容被破坏。密码不能完全防止未经授权地访问媒体内容,原因在于备份集中的数据没有加密,理论上可以被专为此目的创建的程序所检查。对于安全性至关重要的场合,防止未经授权的个人访问媒体非常重要。

为不是用相关密码创建的对象指定密码是错误的做法。

BACKUP 使用由 PASSWORD 选项提供的备份集密码创建备份集。另外,BACKUP 正常情况下在写入媒体之前验证由 MEDIAPASSWORD 选项提供的媒体密码。BACKUP 不验证媒体密码的唯一情况是当格式化媒体时,这将重写媒体头。BACKUP 只在下列情况下格式化媒体:

如果指定了 FORMAT 选项。

如果媒体头无效且指定了 INIT。

如果正在写入延续卷。

如果 BACKUP 写入媒体头,BACKUP 将给 MEDIAPASSWORD 选项中指定的值指派媒体集密码。

有关密码对 SKIP、NOSKIP、INIT 和 NOINIT 选项的影响的更多信息,请参见注释部分。

备份设备物理文件的所有权和权限问题可能会妨碍备份 *** 作。SQL Server 必须能够读取并写入设备;运行 SQL Server 服务的帐户必须有写入权限。但是,为设备在系统表中添加项目的 sp_addumpdevice 不检查文件访问权。备份设备物理文件的这些问题可能直到为备份或还原而访问物理资源时才会出现。

示例

A. 备份整个 MyNwind 数据库

说明 MyNwind 数据库仅用于演示。

下例创建用于存放 MyNwind 数据库完整备份的逻辑备份设备。

-- Create a logical backup device for the full MyNwind backup.

USE master

EXEC sp_addumpdevice 'disk', 'MyNwind_1',

DISK ='c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_1.dat'

-- Back up the full MyNwind database.

BACKUP DATABASE MyNwind TO MyNwind_1

B. 备份数据库和日志

本例创建了一个数据库和日志的完整备份。将数据库备份到称为 MyNwind_2 的逻辑备份设备上,然后将日志备份到称为 MyNwindLog1 的逻辑备份设备上。

说明 创建逻辑备份设备需要一次完成。

-- Create the backup device for the full MyNwind backup.

USE master

EXEC sp_addumpdevice 'disk', 'MyNwind_2',

'c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwind_2.dat'

--Create the log backup device.

USE master

EXEC sp_addumpdevice 'disk', 'MyNwindLog1',

'c:\Program Files\Microsoft SQL Server\MSSQL\BACKUP\MyNwindLog1.dat'

-- Back up the full MyNwind database.

BACKUP DATABASE MyNwind TO MyNwind_2

-- Update activity has occurred since the full database backup.

-- Back up the log of the MyNwind database.

BACKUP LOG MyNwind

TO MyNwindLog1

利用T-SQL语句,实现数据库的备份和还原的功能

体现了SQL Server中的四个知识点:

1. 获取SQL Server服务器上的默认目录

2. 备份SQL语句的使用

3. 恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理

4. 作业创建SQL语句的使用

/*1.--得到数据库的文件目录

@dbname 指定要取得目录的数据库名

如果指定的数据不存在,返回安装SQL时设置的默认数据目录

如果指定NULL,则返回默认的SQL备份目录名

*/

/*--调用示例

select 数据库文件目录=dbo.f_getdbpath(’tempdb’)

,[默认SQL SERVER数据目录]=dbo.f_getdbpath(’’)

,[默认SQL SERVER备份目录]=dbo.f_getdbpath(null)

--*/

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[f_getdbpath]’) and xtype in (N’FN’, N’IF’, N’TF’))

drop function [dbo].[f_getdbpath]

GO

create function f_getdbpath(@dbname sysname)

returns nvarchar(260)

as

begin

declare @re nvarchar(260)

if @dbname is null or db_id(@dbname) is null

select @re=rtrim(reverse(filename)) from master..sysdatabases where name=’master’

else

select @re=rtrim(reverse(filename)) from master..sysdatabases where name=@dbname

if @dbname is null

set @re=reverse(substring(@re,charindex(’\’,@re)+5,260))+’BACKUP’

else

set @re=reverse(substring(@re,charindex(’\’,@re),260))

return(@re)

end

go

/*2.--备份数据库

*/

/*--调用示例

--备份当前数据库

exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_db.bak’

--差异备份当前数据库

exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_df.bak’,@bktype=’DF’

--备份当前数据库日志

exec p_backupdb @bkpath=’c:\’,@bkfname=’db_\DATE\_log.bak’,@bktype=’LOG’

--*/

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_backupdb]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)

drop procedure [dbo].[p_backupdb]

GO

create proc p_backupdb

@dbname sysname=’’, --要备份的数据库名称,不指定则备份当前数据库

@bkpath nvarchar(260)=’’, --备份文件的存放目录,不指定则使用SQL默认的备份目录

@bkfname nvarchar(260)=’’, --备份文件名,文件名中能用\DBNAME\代表数据库名,\DATE\代表日期,\TIME\代表时间

@bktype nvarchar(10)=’DB’, --备份类型:’DB’备份数据库,’DF’ 差异备份,’LOG’ 日志备份

@appendfile bit=1 --追加/覆盖备份文件

as

declare @sql varchar(8000)

if isnull(@dbname,’’)=’’ set @dbname=db_name()

if isnull(@bkpath,’’)=’’ set @bkpath=dbo.f_getdbpath(null)

if isnull(@bkfname,’’)=’’ set @bkfname=’\DBNAME\_\DATE\_\TIME\.BAK’

set @bkfname=replace(replace(replace(@bkfname,’\DBNAME\’,@dbname)

,’\DATE\’,convert(varchar,getdate(),112))

,’\TIME\’,replace(convert(varchar,getdate(),108),’:’,’’))

set @sql=’backup ’+case @bktype when ’LOG’ then ’log ’ else ’database ’ end +@dbname

+’ to disk=’’’+@bkpath+@bkfname

+’’’ with ’+case @bktype when ’DF’ then ’DIFFERENTIAL,’ else ’’ end

+case @appendfile when 1 then ’NOINIT’ else ’INIT’ end

print @sql

exec(@sql)

go

/*3.--恢复数据库

*/

/*--调用示例

--完整恢复数据库

exec p_RestoreDb @bkfile=’c:\db_20031015_db.bak’,@dbname=’db’

--差异备份恢复

exec p_RestoreDb @bkfile=’c:\db_20031015_db.bak’,@dbname=’db’,@retype=’DBNOR’

exec p_backupdb @bkfile=’c:\db_20031015_df.bak’,@dbname=’db’,@retype=’DF’

--日志备份恢复

exec p_RestoreDb @bkfile=’c:\db_20031015_db.bak’,@dbname=’db’,@retype=’DBNOR’

exec p_backupdb @bkfile=’c:\db_20031015_log.bak’,@dbname=’db’,@retype=’LOG’

--*/

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_RestoreDb]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)

drop procedure [dbo].[p_RestoreDb]

GO

create proc p_RestoreDb

@bkfile nvarchar(1000), --定义要恢复的备份文件名

@dbname sysname=’’, --定义恢复后的数据库名,默认为备份的文件名

@dbpath nvarchar(260)=’’, --恢复后的数据库存放目录,不指定则为SQL的默认数据目录

@retype nvarchar(10)=’DB’, --恢复类型:’DB’完事恢复数据库,’DBNOR’ 为差异恢复,日志恢复进行完整恢复,’DF’ 差异备份的恢复,’LOG’ 日志恢复

@filenumber int=1, --恢复的文件号

@overexist bit=1, --是否覆盖已存在的数据库,仅@retype为

@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效

as

declare @sql varchar(8000)

--得到恢复后的数据库名

if isnull(@dbname,’’)=’’

select @sql=reverse(@bkfile)

,@sql=case when charindex(’.’,@sql)=0 then @sql

else substring(@sql,charindex(’.’,@sql)+1,1000) end

,@sql=case when charindex(’\’,@sql)=0 then @sql

else left(@sql,charindex(’\’,@sql)-1) end

,@dbname=reverse(@sql)

--得到恢复后的数据库存放目录

if isnull(@dbpath,’’)=’’ set @dbpath=dbo.f_getdbpath(’’)

--生成数据库恢复语句

set @sql=’restore ’+case @retype when ’LOG’ then ’log ’ else ’database ’ end+@dbname

+’ from disk=’’’+@bkfile+’’’’

+’ with file=’+cast(@filenumber as varchar)

+case when @overexist=1 and @retype in(’DB’,’DBNOR’) then ’,replace’ else ’’ end

+case @retype when ’DBNOR’ then ’,NORECOVERY’ else ’,RECOVERY’ end

print @sql

--添加移动逻辑文件的处理

if @retype=’DB’ or @retype=’DBNOR’

begin

--从备份文件中获取逻辑文件名

declare @lfn nvarchar(128),@tp char(1),@i int

--创建临时表,保存获取的信息

create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))

--从备份文件中获取信息

insert into #tb exec(’restore filelistonly from disk=’’’+@bkfile+’’’’)

declare #f cursor for select ln,tp from #tb

open #f

fetch next from #f into @lfn,@tp

set @i=0

while @@fetch_status=0

begin

select @sql=@sql+’,move ’’’+@lfn+’’’ to ’’’+@dbpath+@dbname+cast(@i as varchar)

+case @tp when ’D’ then ’.mdf’’’ else ’.ldf’’’ end

,@i=@i+1

fetch next from #f into @lfn,@tp

end

close #f

deallocate #f

end

--关闭用户进程处理

if @overexist=1 and @killuser=1

begin

declare @spid varchar(20)

declare #spid cursor for

select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)

open #spid

fetch next from #spid into @spid

while @@fetch_status=0

begin

exec(’kill ’+@spid)

fetch next from #spid into @spid

end

close #spid

deallocate #spid

end

--恢复数据库

exec(@sql)

go

/*4.--创建作业

*/

/*--调用示例

--每月执行的作业

exec p_createjob @jobname=’mm’,@sql=’select * from syscolumns’,@freqtype=’month’

--每周执行的作业

exec p_createjob @jobname=’ww’,@sql=’select * from syscolumns’,@freqtype=’week’

--每日执行的作业

exec p_createjob @jobname=’a’,@sql=’select * from syscolumns’

--每日执行的作业,每天隔4小时重复的作业

exec p_createjob @jobname=’b’,@sql=’select * from syscolumns’,@fsinterval=4

--*/

if exists (select * from dbo.sysobjects where id = object_id(N’[dbo].[p_createjob]’) and OBJECTPROPERTY(id, N’IsProcedure’) = 1)

drop procedure [dbo].[p_createjob]

GO

create proc p_createjob

@jobname varchar(100), --作业名称

@sql varchar(8000), --要执行的命令

@dbname sysname=’’, --默认为当前的数据库名

@freqtype varchar(6)=’day’, --时间周期,month 月,week 周,day 日

@fsinterval int=1, --相对于每日的重复次数

@time int=170000 --开始执行时间,对于重复执行的作业,将从0点到23:59分

as

if isnull(@dbname,’’)=’’ set @dbname=db_name()

--创建作业

exec msdb..sp_add_job @job_name=@jobname

--创建作业步骤

exec msdb..sp_add_jobstep @job_name=@jobname,

@step_name = ’数据处理’,

@subsystem = ’TSQL’,

@database_name=@dbname,

@command = @sql,

@retry_attempts = 5, --重试次数

@retry_interval = 5 --重试间隔

--创建调度

declare @ftype int,@fstype int,@ffactor int

select @ftype=case @freqtype when ’day’ then 4

when ’week’ then 8

when ’month’ then 16 end

,@fstype=case @fsinterval when 1 then 0 else 8 end

if @fsinterval<>1 set @time=0

set @ffactor=case @freqtype when ’day’ then 0 else 1 end

EXEC msdb..sp_add_jobschedule @job_name=@jobname,

@name = ’时间安排’,

@freq_type=@ftype , --每天,8 每周,16 每月

@freq_interval=1, --重复执行次数

@freq_subday_type=@fstype, --是否重复执行

@freq_subday_interval=@fsinterval, --重复周期

@freq_recurrence_factor=@ffactor,

@active_start_time=@time --下午17:00:00分执行

go

/*--应用案例--备份方案:

完整备份(每个星期天一次)+差异备份(每天备份一次)+日志备份(每2小时备份一次)

调用上面的存储过程来实现

--*/

declare @sql varchar(8000)

--完整备份(每个星期天一次)

set @sql=’exec p_backupdb @dbname=’’要备份的数据库名’’’

exec p_createjob @jobname=’每周备份’,@sql,@freqtype=’week’

--差异备份(每天备份一次)

set @sql=’exec p_backupdb @dbname=’’要备份的数据库名’’,@bktype=’DF’’

exec p_createjob @jobname=’每天差异备份’,@sql,@freqtype=’day’

--日志备份(每2小时备份一次)

set @sql=’exec p_backupdb @dbname=’’要备份的数据库名’’,@bktype=’LOG’’

exec p_createjob @jobname=’每2小时日志备份’,@sql,@freqtype=’day’,@fsinterval=2

/*--应用案例2

生产数据核心库:PRODUCE

备份方案如下:

1.设置三个作业,分别对PRODUCE库进行每日备份,每周备份,每月备份

2.新建三个新库,分别命名为:每日备份,每周备份,每月备份

3.建立三个作业,分别把三个备份库还原到以上的三个新库。

目的:当用户在produce库中有所有的数据丢失时,均能从上面的三个备份库中导入相应的TABLE数据。

--*/

declare @sql varchar(8000)

--1.建立每月备份和生成月备份数据库的作业,每月每1天下午16:40分进行:

set @sql=’

declare @path nvarchar(260),@fname nvarchar(100)

set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_m.bak’’

set @path=dbo.f_getdbpath(null)+@fname

--备份

exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname

--根据备份生成每月新库

exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_月’’

--为周数据库恢复准备基础数据库

exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DBNOR’’

--为日数据库恢复准备基础数据库

exec p_RestoreDb @bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’DBNOR’’

exec p_createjob @jobname=’每月备份’,@sql,@freqtype=’month’,@time=164000

--2.建立每周差异备份和生成周备份数据库的作业,每周日下午17:00分进行:

set @sql=’

declare @path nvarchar(260),@fname nvarchar(100)

set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_w.bak’’

set @path=dbo.f_getdbpath(null)+@fname

--差异备份

exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’DF’’

--差异恢复周数据库

exec p_backupdb @bkfile=@path,@dbname=’’PRODUCE_周’’,@retype=’’DF’’

exec p_createjob @jobname=’每周差异备份’,@sql,@freqtype=’week’,@time=170000

--3.建立每日日志备份和生成日备份数据库的作业,每周日下午17:15分进行:

set @sql=’

declare @path nvarchar(260),@fname nvarchar(100)

set @fname=’’PRODUCE_’’+convert(varchar(10),getdate(),112)+’’_l.bak’’

set @path=dbo.f_getdbpath(null)+@fname

--日志备份

exec p_backupdb @dbname=’’PRODUCE’’,@bkfname=@fname,@bktype=’’LOG’’

--日志恢复日数据库

exec p_backupdb @bkfile=@path,@dbname=’’PRODUCE_日’’,@retype=’’LOG’’

exec p_createjob @jobname=’每周差异备份’,@sql,@freqtype=’day’,@time=171500


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10719416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存