VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > sql数据库 >
  • sql语句大全之企业信息平台的备份与恢复

企业信息平台的备份与恢复

备份与恢复对于企业数据库管理是非常重要的一个方面,本节主要讨论如何执行备份与恢复。主要内容包括:
l   企业信息平台的数据库备份
l   企业信息平台的数据库恢复

4.1  企业信息平台的数据库备份

今天,计算机软件、硬件系统的可靠性都有很大改善,而且还可以采用磁盘阵列等设备来提高系统的容错能力,这些技术提高了系统的可靠性。然而这些措施不可能是完美的,也无法保证系统安全做到万无一失,它们只是在一定程度上减少了由于介质故障带来的损失。然而,对于操作人员的意外操作或蓄意的破坏性操作、破坏性病毒的攻击、自然灾害带来的原因所引起的系统故障,以上措施还是存在不足。定期进行数据库备份是保证系统安全的一项重要措施。在意外情况发生时,可以依靠备份数据来恢复数据库。
任何一个数据库管理员应该认识到数据库中数据的重要性和备份它们的重要性。有了备份可以在服务器崩溃之后迅速有效地恢复数据库的备份产品。除了灾难恢复之外,下述原因是数据备份的理由:
l  偶然地或恶意地修改或者删除数据。
l  一些自然灾难,像火灾、水灾或者风暴。
l  设备被盗或遭到破坏。
l  从一台机器到另一台机器所进行的数据传输。
l  永久的数据档案。
总之,对于SQL Server的管理者来说,有许多理由要进行数据备份,而其中最主要的原因就是从数据灾难中恢复。数据备份工作关系到数据灾害发生后是否还会有工作。所以,备份是数据库恢复中采用的基本技术。
SQL Server提供了备份整个数据库、事务日志、一个或者多个文件和文件组的Transact-SQL语句。
备份整个数据库的语法如下:
BACKUP DATABASE { database_name | @database_name_var }
TO < backup_device > [ ,...n ]
[ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...m ] ]
[ WITH
     [ BLOCKSIZE = { blocksize | @blocksize_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 } ]
     [ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
     [ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
     [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
     [ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
     [ [ , ] { NOREWIND | REWIND } ]
     [ [ , ] { NOUNLOAD | UNLOAD } ]
     [ [ , ] RESTART ]
     [ [ , ] STATS [ =percentage ] ]
     [ [ , ] COPY_ONLY ]
]
备份特定文件或者文件组的语法如下:
BACKUP DATABASE { database_name | @database_name_var }
     < file_or_filegroup > [ ,...f ]
TO < backup_device > [ ,...n ]
[ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...m ] ]
[ WITH
     [ BLOCKSIZE = { blocksize | @blocksize_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 } ]
     [ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
     [ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
     [ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
     [ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
     [ [ , ] { NOREWIND | REWIND } ]
     [ [ , ] { NOUNLOAD | UNLOAD } ]
     [ [ , ] 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
     }
备份事务日志的语法如下:
BACKUP LOG { database_name | @database_name_var }
{
     TO < backup_device > [ ,...n ] 
[ [ MIRROR TO < backup_device > [ ,...n ] ] [ ...m ] ]
     [ WITH
    [ BLOCKSIZE = { blocksize | @blocksize_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 } ]
    [ [ , ] 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 } ]
    [ [ , ] { NOUNLOAD | UNLOAD } ]
    [ [ , ] 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,指定一个完整的数据库备份。假如指定了一个文件和文件组的列表,那么仅有这些被指定的文件和文件组被备份。
l  { database_name| @database_name_var },指定了一个数据库,从该数据库中对事务日志、部分数据库或完整的数据库进行备份。如果作为变量 (@database_name_var) 提供,则可将该名称指定为字符串常量 (@database_name_var = database name) 或字符串数据类型(ntext text 数据类型除外)的变量。
l  TO,表示备份设备的协作集要么是非镜像媒体集合,要么是镜像媒体集中的一个镜像。
l  MIRROR TO,表示备份设备的协作集是一个镜像媒体集合中的一个镜像。备份设备必须是同一类型,设备的类型在TO子句中指定。在镜像媒体集中,所有的备份设备必须具有相同的属性。
M是一个占位符,表示BACKUP语句能够包含最多三个MIRROR TO子句。
l  < backup_device >,指定备份操作时要使用的逻辑或物理备份设备。
l  { 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 数据类型除外)的变量。
l  { 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'。如果使用的是具有统一命名规则 (UNC) 名称的网络服务器或已重新定向的驱动器号,则请指定磁盘的设备类型。当指定多个文件时,可以混合逻辑文件名(或变量)和物理文件名(或变量)。但是,所有的设备都必须为同一类型(磁盘、磁带或管道)。
n是表示可以指定多个备份设备的占位符。备份设备数目的上限为 64。
l  DESCRIPTION = { 'text'| @text_variable },指定描述备份集的自由格式文本。该字符串最长可以有 255 个字符。
l  DIFFERENTIAL,指定数据库备份或文件备份应该与上一次完整备份后改变的数据库或文件部分保持一致。差异备份一般会比完整备份占用更少的空间。对于上一次完整备份时备份的全部单个日志,使用该选项可以不必再进行备份。
l  EXPIREDATE ={ date| @date_var },指定备份集到期和允许被重写的日期。如果将该日期作为变量 (@date_var) 提供,则可以将该日期指定为字符串常量 (@date_var = date)、字符串数据类型变量(ntext text 数据类型除外)、smalldatetime 或者 datetime 变量,并且该日期必须符合已配置的系统 datetime 格式。
l  RETAINDAYS ={ days| @days_var },指定必须经过多少天才可以重写该备份媒体集。假如用变量 (@days_var) 指定,该变量必须为整型。
l  PASSWORD = { password | @password_variable },指定必须经过多少天才可以重写该备份媒体集。假如用变量 (@days_var) 指定,该变量必须为整型。
l  FORMAT,指定应将媒体头写入用于此备份操作的所有卷。任何现有的媒体头都被重写。FORMAT 选项使整个媒体内容无效,并且忽略任何现有的内容。
l  NOFORMAT,指定媒体头不应写入所有用于该备份操作的卷中,并且不要重写该备份设备除非指定了 INIT。
l  INIT,指定应重写所有备份集,但是保留媒体头。如果指定了 INIT,将重写那个设备上的所有现有的备份集数据。
l  NOINIT,表示备份集将追加到指定的磁盘或磁带设备上,以保留现有的备份集。NOINIT 是默认设置。
l  NOSKIP,指示 BACKUP 语句在可以重写媒体上的所有备份集之前先检查它们的过期日期。
l  SKIP,禁用备份集过期和名称检查,这些检查一般由 BACKUP 语句执行以防重写备份集。
l  MEDIADESCRIPTION = { text | @text_variable },为整个备份媒体集指明媒体名,最多为 128 个字符。假如指定了 MEDIANAME,则它必须与以前指定的媒体名相匹配,该媒体名已存在于备份卷中。假如没有指定 MEDIANAME,或指定了 SKIP 选项,将不会对媒体名进行验证检查。
l  MEDIANAME = { media_name | @media_name_variable },为整个备份媒体集指明媒体名,最多为 128 个字符。假如指定了 MEDIANAME,则它必须与以前指定的媒体名相匹配,该媒体名已存在于备份卷中。假如没有指定 MEDIANAME,或指定了 SKIP 选项,将不会对媒体名进行验证检查。
l  MEDIAPASSWORD = { mediapassword | @mediapassword_variable },为媒体集设置密码。MEDIAPASSWORD 是一个字符串。如果为媒体集定义了密码,则在该媒体集上创建备份集时必须提供此密码。另外,从该媒体集执行任何还原操作时也必须提供媒体密码。只有通过格式化才能重写受密码保护的媒体。
l  NAME ={ backup_set_name| @backup_set_var },指定备份集的名称。名称最长可达 128 个字符。假如没有指定 NAME,它将为空。
l  NORECOVERY,只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于正在还原的状态。当将故障转移到辅助数据库或在 RESTORE 操作前保存日志尾部时,NORECOVERY 很有用。
l  STANDBY =undo_file_name只与 BACKUP LOG 一起使用。备份日志尾部并使数据库处于只读或备用模式。撤消文件名指定了容纳回滚更改的存储,如果随后应用 RESTORE LOG 操作,则必须撤消这些回滚更改。如果指定的撤消文件名不存在,SQL Server 将创建该文件。如果该文件已存在,则 SQL Server 将重写它。
l  NOREWIND,指定 SQL Server 在备份操作完成后使磁带保持打开。NOREWIND 意即 NOUNLOAD。SQL Server 将保留磁带驱动器的所有权,直到 BACKUP或 RESTORE 命令使用 REWIND 为止。
l  REWIND,指定 SQL Server 将释放磁带和倒带。如果 NOREWIND 和 REWIND 均未指定,则默认设置为 REWIND。
l  CHECKSUM,验证数据库页的页效验和。
l  NO_CHECKSUM,显式禁用备份效验和。
l  STOP_ON_ERROR,表示如果无法验证效验和,则指示BACKUP失败。
l  CONTINUE_AFTER_ERROR,表示当遇到错误,如非法效验和时,BACKUP依旧继续。
l  NOUNLOAD,指定不在备份后从磁带驱动器中自动卸载磁带。设置始终为 NOUNLOAD,直到指定 UNLOAD 为止。该选项只用于磁带设备。
l  UNLOAD,指定在备份完成后自动倒带并卸载磁带。启动新用户会话时其默认设置为 UNLOAD。该设置一直保持到用户指定了 NOUNLOAD 时为止。该选项只用于磁带设备。
l  STATS [ =percentage],每当另一个 percentage 结束时显示一条消息,它被用于测量进度。如果省略 percentage,SQL Server 将每完成 10 个百分点显示一条消息。
l  < file_or_filegroup >,指定包含在数据库备份中的文件或文件组的逻辑名。可以指定多个文件或文件组。
l  COPY_ONLY,定义备份不会影响备份的正常序列,COPY_ONLY选项的影响对不同的备份类型式不同的。
l  FILE ={ logical_file_name| @logical_file_name_var },给一个或多个包含在数据库备份中的文件命名。
l  FILEGROUP ={ logical_filegroup_name| @logical_filegroup_name_var },给一个或多个包含在数据库备份中的文件组命名。
l  READ_WRITE_FILEGROUPS,指定部分备份,包括主文件组和任何可读写辅助文件组。对于创建部分备份,必须定义该选项。
F是一个占位符,表示可以指定多个文件和文件组。对文件或文件组的最大个数没有限制。
l  LOG,指定只备份事务日志。该日志是从上一次成功执行了的 LOG 备份到当前日志的末尾。一旦备份日志,可能会截断复制或活动事务不再需要的空间。
l  NO_TRUNCATE,允许在数据库损坏时备份日志。
下面的实例用于显示对在线销售管理系统数据库EAMS进行差异备份。
BACKUP DATABASE EAMS
   TO EMAS_1
   WITH INIT
GO
BACKUP DATABASE EAMS
   TO EMAS_1
   WITH DIFFERENTIAL
GO

4.2  企业信息平台的数据库恢复

SQL Server提供了3种恢复模型,分别是:
l  简单恢复 ,允许将数据库恢复到最新的备份。
l  完全恢复,允许将数据库恢复到故障点状态。
l  大容量日志记录恢复,允许大容量日志记录操作。
这些模型中的每个都是针对不同的性能、磁盘和磁带空间以及保护数据丢失的需要。例如,当选择恢复模型时,必须考虑下列业务要求之间的权衡:
l  大规模操作的性能(如创建索引或大容量装载)。
l  数据丢失表现(如已提交的事务丢失)。
l  事务日志空间损耗
l  备份和恢复过程的简化。
根据正在执行的操作,可以有多个适合的模型。选择了恢复模型后,设计所需的备份和恢复过程。表6提供了三种恢复模型的优点和含义的概述。
表 6备份模型之间的比较
恢复模型 优点 工作损失表现 能否恢复到即时点?
简单 允许高性能大容量复制操作。
收回日志空间以使空间要求最小。
必须重做自最新的数据库或差异备份后所发生的更改。 可以恢复到任何备份的结尾处。随后必须重做更改。
完全 数据文件丢失或损坏不会导致工作损失。
可以恢复到任意即时点(例如,应用程序或用户错误之前)。
正常情况下没有。
如果日志损坏,则必须重做自最新的日志备份后所发生的更改。
可以恢复到任何即时点。
大容量日志记录的 允许高性能大容量复制操作。大容量操作使用最少的日志空间。 如果日志损坏,或者自最新的日志备份后发生了大容量操作,则必须重做自上次备份后所做的更改。否则不丢失任何工作。 可以恢复到任何备份的结尾处。随后必须重做更改。
简单恢复所需的管理最少。在简单恢复模型中,数据只能恢复到最新的完整数据库备份或差异备份的状态。不使用事务日志备份,而使用最小事务日志空间。一旦不再需要日志空间从服务器故障中恢复,日志空间便可重新使用。与完整模型或大容量日志记录模型相比,简单恢复模型更容易管理,但如果数据文件损坏,则数据损失表现会更高。
完全恢复和大容量日志记录恢复模型为数据提供了最大的保护性。这些模型依靠事务日志提供完全的可恢复性,并防止最大范围的故障情形所造成的工作损失。完全恢复模型提供最大的灵活性,可将数据库恢复到更早的即时点。
大容量日志记录模型为某些大规模操作(如创建索引或大容量复制)提供了更高的性能和更低的日志空间损耗。不过这将牺牲时点恢复的某些灵活性。很多数据库都要经历大容量装载或索引创建的阶段,因此可能希望在大容量日志记录模型和完全恢复模型之间进行切换。
SQL Server支持单独使用一种备份方式或组合使用多种备份方式。选择的恢复模型将决定总体备份策略,包括可以使用的备份类型。表7说明适用于每种恢复模型的备份类型。
表 7 支持每种恢复模型的备份类型
模型  备份类型
数据库 数据库差异 事务日志 文件或文件差异
简单 必需 可选 不允许 不允许
完全 必需(或文件备份) 可选 必需 可选
大容量日志记录 必需(或文件备份) 可选 必需 可选
下面的示例恢复创建的完全数据库备份,并使用该备份实现数据库恢复操作。
RESTORE DATABASE EAMS
   FROM EAMS_1
   WITH NORECOVERY
RESTORE DATABASE EAMS
   FROM EAMS_1
   WITH FILE = 2
 

相关教程