简介 文提供了执行数据库备份、恢复和前滚日志文件这些基本操作的循序渐进指南。以下示例将介绍这些实用程序句法上的变体,以便展示 db2® 产品的灵活性。
通常,本主题将解决权限、所需连接、语法和有益的用法注释等问题,以成功执行备份、恢复或前滚过程。假设您熟悉 db2 universal database™(db2 udb)引擎,并且系统满足下列要求:
- 安装了 db2 udb 版本 6 或 7。
- 已在 db2 中创建了一个实例。
- 操作系统是 unix®、microsoft windows 98、windows 2000 或 windows nt。
- db2 的版本是个人版、工作组版、企业版(ee)或扩展企业版(eee)。
- 本地机器或存储设备上有足够的磁盘空间保存备份映象。
注:本文中的所有示例都是从 db2 命令行环境创建的。
创建 sample 数据库
这些示例中所用的数据库是一个“sample”数据库,可以通过执行下列操作创建该数据库:
- 在用于 db2 v7.1 的 windows nt 上:
- 单击屏幕左下角处的 start 菜单。
- 单击 programs。
- 单击(ibm db2)。
- 单击 first steps。
- 单击 create the sample databases。
- 选择 sample。
- 在 unix 上:
- 将用户切换成 db2 实例所有者。
- 执行位于 $home/instance owner/sqllib 的 db2profile
- 在命令行上输入 db2sampl。
注:如果没有找到 db2sampl,则意味着可选的 db2sampl 脚本没有与其余 db2 产品一起安装。需要手工创建一个数据库。
测试前滚命令的效果
如果将使用 sample 数据库作为对下面示例的测试,请在 sample 数据库的一个表中更新或插入几行。这样,您将能够看到使用前滚过程与不使用前滚过程相对比的效果。例如,驻留在 sample 数据库中的一个表是 employee 表。在备份之后恢复数据库前,请发出与下面类似的命令:
db2 "update employee set empno = ''11'' where firstnme = ''christine''"
the "empno" field for ''christine'' is changed from ''10'' to ''11''.
然后,如果决定使用前滚选项,您将会看到这一更新已从日志文件中恢复。如果没有使用前滚选项,您将会看到先前的值“10”。
高级概述
在进行备份、恢复和前滚的过程前,从图形观点看一下该过程可能会有所获益。在我们单步执行该过程时,请参考下图以获取更清晰的信息。
数据库备份
在备份数据库前,请确保对 db2 具有下列权限之一:
对于这些示例,创建一个存储数据库映象的目录,如 c:\backup。没有必要为了执行备份而与数据库连接,因为备份命令会自动创建连接。另外,请确保在执行脱机备份时没有其它应用程序与数据库连接,否则您将接收到一条 sql1035n 错误消息。db2“list applications”和 db2“force applications all”是完成这一任务的有用命令。
有两种可以执行备份的方式。第一种是脱机数据库备份。这种备份方式需要至数据库的独占连接,因为将备份数据库中的所有表空间。第二种是联机数据库备份。这种备份方式对于那些运行生产数据库并且需要数据库中连续不断地运行一个或多个表空间的用户特别有用。当使用联机备份时,仅要备份的表空间需要用户有独占连接。这样允许数据库内的其它不需要备份的表空间仍保持联机,以供其它应用程序访问。
注:如果执行联机备份,请确保在数据库管理器配置文件中启用了前滚恢复参数 logretain = on
或 userexit
**。如果还没有这样做,您将会接收到一条 sql2413n 错误,并需要执行下列命令:
db2 "update dbm configuration using logretain on" > db2stop > db2start
**因为 userexit
选项需要详细的用法说明,所以本文将不对此进行讨论。
启用了 logretain 和/或 userexit 参数后,进行完整的数据库脱机备份。可以通过执行下列命令进行验证,以查看数据库是否处于备份挂起状态:
db2 "get database configuration for sample"
然后,查找“backup pending”值(它将被设置为“yes”或“no”)。进行了完整数据库备份后,您将能够在此后的任何时候执行联机表空间备份。
示例 1 — 将数据库脱机备份至本地目录
db2 "backup database sample user db2admin using db2admin
to c:\backup with 3 buffers buffer 1000 without prompting"
该命令将使用用户 db2admin 和密码 db2admin(仅在当前用户不具备必需的数据库权限时才需要使用该用户和密码)产生数据库“sample”的备份映象。将使用 3 个缓冲区把该映象存储在 c:\backup 中,每个缓冲区的缓冲区大小为 1000 页面。“without prompting”键短语指定备份将以无人照看方式运行,并且任何通常需要用户介入的操作都将返回一条错误消息。
示例 2 — 将表空间级别联机备份至磁带设备
db2 "backup database sample tablespace (syscatspace,
userspace1) online to /dev/rmt0 without prompting"
该命令将产生数据库内指定表空间的备份映象。syscatspace 和 userspace1 是驻留在 sample 数据库中两个要备份的表空间。磁带机是 /dev/rmt0。由于命令中没有定义缓冲区和缓冲区页面的数量,所以缺省值将为 buffers = 2 和 buffer(size) = 1024 页面。当在 sco unixware 7 上使用磁带设备时,必须指定缓冲区大小为 16 页面。
联机表空间备份的优点在于:数据库中的所有其它表空间都可用于处理。缺省值是“offline”,这要求在执行备份时断开所有应用程序与数据库的连接。
执行这些命令后,您应该在 db2 命令行上接收到下列消息:
"backup successful. the timestamp for this backup image is: timestamp"
timestamp 是每个数据库备份映象的唯一标识,如果单个文件夹中有多个备份映象,则在您执行恢复时需要该标识。在 unix 系统上,时间戳记与备份映象文件名连接:
"dbname.type.instance.nodexxx.catnxxxx.yyyymmddhhmmss.seq"
在 windows nt 系统上,备份映象存储在一个有 5 个层次的目录树中,该目录中也包含该时间戳记信息:
"dbname.type\db2instance\nodexxx\catnxxxx\yyyymmdd\hhmmss.seq"
如需以前备份的数据库的信息,请输入下列命令:
db2 "list history backup all for database sample"
数据库恢复
在恢复数据库前,对 db2 具有下列权限之一:
如果恢复至一个新数据库(不是现有的数据库),则需要 sysadm 或 sysctrl。
脱机数据库恢复将需要一个独占连接;所以在这一任务期间应该无应用程序连接至数据库。而且,请确保在执行脱机恢复时没有其它应用程序与数据库连接,否则您将接收到一条 sql1035 错误消息。
示例 1 — 从本地目录脱机恢复到一个现有数据库中
db2 "restore database sample user db2admin using db2admin
from c:\backup taken at 20010222145404 with 3 buffers buffer
1000 without rolling forward without prompting"
该命令将把保存在 c:\backup 中带有时间戳记 20010222145404 的数据库映象恢复到现有 sample 数据库中(请参考数据库备份一节中有关如何获取前面提到的时间戳记值的信息)。该命令将用备份的数据库映象文件有效地覆盖旧的 sample 数据库文件。键短语“without rolling forward”将阻止数据库管理器使恢复的数据库处于前滚挂起状态(如果在备份数据库时没有为前滚恢复启用该数据库,则不需要该短语)。如果您对将所有数据库文件恢复到上次成功的事务那一点感兴趣,而且在备份数据库时为前滚恢复启用了它,则忽略“without rolling forward”键短语。
如果没有使用关键字“from”,则当前目录将是备份映象的缺省位置。而且,如果只有一个数据库备份映象驻留在目标文件夹中,则不需要键短语“taken at timestamp”。
示例 2 — 将表空间从磁带设备联机恢复到现有数据库中
db2 "restore database sample tablespace (syscatspace,
userspace1) online from /dev/rmt0 taken at 20010222151429 newlogpath
/home/db2v71/samplelogs without prompting"
该命令在允许无限制地处理联机恢复命令未涉及的其它表空间的同时,把 syscatspace 和 userspace1 表空间恢复到现有 sample 数据库。而且,如果在同一个文件夹中有多个备份映象,则必须声明“taken at timestamp”键短语。如果恢复后不适合使用备份映象中的 logpath,则可以包括“newlogpath”关键字。例如,在路径不再有效或它当前正由另一个数据库使用时。
示例 3 — 脱机恢复到 aix® 上新的数据库中
db2 "restore database sample from /home/db2v71/backup into
newsamp without prompting"
该命令将把 sample 数据库备份映象恢复到数据库 newsamp。执行了恢复命令后,db2 将立即创建“newsamp”数据库。然后,将把备份映象恢复到“newsamp”数据库中。
注:如果 /home/db2v71/backup 目录中只有一个备份数据库映象,则不使用“taken at timestamp”键短语。
当创建现有数据库的副本时,以上命令是有用的。sample 数据库将不受恢复过程的影响,因此仍可供将来使用。也可以使用相同的恢复命令恢复到现有数据库中。例如,在执行以上命令前,您可能已经创建了 newsamp 数据库。
注:如果打算执行该功能,要恢复到其中的数据库的代码页必须与备份数据库映象的代码页匹配。
附加注释:如果平台、db2 版本号和版本分序号都相同,则可以恢复到现有的远程数据库去。根据哪台机器正在认证用户标识,请确保在本地机器或服务器上有前面提到的权限,以执行远程恢复。此外,将要恢复的数据库编目到本地机器上,以便执行远程恢复(为了连接至要恢复的数据库,这是必需的)。
前滚数据库
在对数据库执行前滚之前,请确保对 db2 具有下列权限之一:
在执行前滚过程前,不需要连接至数据库,因为该命令会建立一个数据库连接。
注:在多节点环境中,只能从编目的节点发出该命令。而且,如果数据库处于前滚挂起状态,并且成功执行该命令,则数据库管理器将使数据库脱离前滚挂起状态。
示例 1 — 将数据库脱机前滚至某一时间点
db2 "rollforward database sample user db2admin using
db2admin to 2001-02-22-14.54.21.253422 and stop"
该命令将 sample 的数据库配置文件中指定的日志文件夹中的所有日志前滚到并且包括上面声明的时间点*。“and stop”键短语通过回滚未完成的事务并关闭数据库的前滚挂起状态,来完成前滚恢复过程。
* 数据库配置文件包含有关数据库日志文件路径的信息。要查看这一路径,输入下列命令:
db2 "get database configuration for sample"
然后,查找参数名称 — logpath。这是存储数据库日志文件的路径。
注:当将表空间前滚至某一时间点时,表空间处于备份挂起状态,并且将是不可用的,直到执行了数据库备份为止。
示例 2 — 将表空间级别联机前滚至日志结尾
db2 "rollforward database sample to end of logs and stop
tablespace (userspace1) online"
该命令将前滚“sample”数据库配置文件中指定的日志文件夹中的所有日志。只前滚 syscatspace 和 userspace1 表空间。因为这是一个联机前滚,所以其它应用程序可以访问数据库中的所有其它表空间。
示例 3 — 在多节点数据库上执行表空间级别联机前滚
db2 "rollforward database sample to end of logs on nodes
(0,2) and stop tablespace userspace1 online"
该命令前滚节点 0 和 2 上与表空间 userspace1 关联的所有日志文件。如果未使用“nodes”关键字,则 db2 将检查所有与数据库关联的节点。例如,如果上面的命令中未使用“nodes”关键字,而且节点 1 没有准备好进行前滚,则命令失败。
这里是执行前滚后返回至命令行的样本输出:
rollforward status input database alias = sample number of nodes have returned status = 1 node number = 0 rollforward status = not pending next log file to be read = log files processed = s0000001.log - s0000001.log last committed transaction = 2001-02-26-21.54.54.000000db20000i the rollforward command completed successfully.
注:在表空间前滚至某一时间点的情况下,不接受“node”关键字。这是因为必须前滚所有数据库分区,以确保所有分区都在同一级别。
结束语
正如我们所看到的,根据每种唯一情况,有不同的方法执行备份、恢复和前滚命令。上面的命令试图提供一些基本方案,但可能并不适合某些特定情况的要求。有关使用这些命令的详细信息,请参考 db2 command reference 一书。如果无法获得这本命令书籍,可以查找在线的 。