InfoSphere Warehouse 数据分区环境中的备份、恢复和前滚操作

知道如何备份和恢复数据库是每个数据库管理员的一项基本技能。在分区数据库环境中有些特殊事项需要注意,在该环境中,通常会跨多个分区或者节点拆分数据库。本文将介绍其基本知识,并逐步演示 IBM® InfoSphere® Warehouse 分区环境中的备份、恢复和前滚流程。

Deepa Vyas, DB2 Advanced Support Level 2 工程师, IBM

Deepa Vyas 的照片Deepa Vyas 是一名 IT 专家,也是 IBM DB2 认证的工程师,她是位于印度普纳 IBM India Software Lab 的一名 DB2 Advanced Support Level 2 工程师。她的大部分时间都用于解决数据库管理员的 DB2 相关问题。



Amitkumar Bamane, 软件工程师, IBM

Amitkumar Bamane 的照片Amitkumar Bamane 是一名 IBM 认证的 DB2 高级技术专家,他是位于印度普纳 IBM India Software Lab 的一名 DB2 高级技术支持分析师,他主要致力于为世界各地的 IBM DB2 客户提供帮助。



2012 年 2 月 09 日

免费下载:IBM® InfoSphere Warehouse 9.7 Enterprise Edition 试用版
下载更多的 IBM 软件试用版,并加入 IBM 软件下载与技术交流群组,参与在线交流。

简介

企业组织的数据处理资源越来越多地依赖于关系型数据管理系统 (RDBMS),以满足日益增长的数据存储和处理需求。当数据库和数据仓库变得越来越大时,管理不断增长的存储数据的成为影响 RDBMS 性能的一个关键因素。要应对数据库的增长,数据库系统必须具有可扩展性能,以便能够应用额外计算资源。IBM InfoSphere Warehouse 提供的数据分区功能支持将单个数据库扩展到多个服务器上。有了分区以后,就可以实现跨分区分布数据。

在 2010 年 7 月之前,该项功能被称之为数据库分区功能 (Database Partitioning Feature, DPF),仅可用于 DB2 Enterprise Server Edition 版本。现在,它不再是一个 DB2 功能,而是 InfoSphere Warehouse 附带的一项功能,它是基于 DB2。在本文中,我们将分区功能称之为 DPF

有了 DPF 之后,您的数据库将变得可伸缩,因为您可以根据您的数据增长添加新机器或者节点,并将您的数据库扩展到它们上面。这意味着每个附加机器可为您的数据库提供更多的 CPU、更多的内存、更多的磁盘。对于管理数据仓储、数据挖掘和在线分析处理 (OLAP) 工作负载而言 DPF 是一个完美的选择。它可以与在线事物处理 (OLTP) 工作负载和睦相处。

对于任何数据库管理系统而言,备份和恢复都是确保数据可恢复性的关键功能。在一个分区数据库环境中执行这些操作有点麻烦。本文旨在提供简单易懂的逐步操作指南,展示如何在一个 DPF 环境中执行备份、恢复和前滚操作。

本文首先回顾概念和注意事项,然后介绍如何完成下列任务:

  • 在 DPF 环境中备份一个数据库
  • 将一个数据库恢复到一个 DPF 环境中
  • 在 DPF 环境中前滚日志
  • 在 DPF 环境中执行一个重定向恢复
  • 在 DPF 环境中执行一个数据库的时间点恢复

最后,包含一个介绍用于归档日志计算日志空间需求的指南。

快速回顾 DPF

顾名思义,如果您要使用数据库分区功能,那么您的数据库肯定包含两个或更多数据库分区,允许数据跨分区分布。数据库分区,也称为数据库节点,包含其自身的数据、索引、配置文件和事务日志文件,这占据的仅仅是一个大型数据库的一部分。来自用户的数据检索和更新请求会被自动分解成子请求,在所有可用的数据库分区之间并行执行。数据库跨多个数据库分区分布这一事实,对于发出 SQL 语句的终端用户而言是透明的。

数据库分区的主要目的是通过并行执行查询提高数据处理性能。并行查询执行指的是能够同时使用多个 CPU 来执行查询的能力。一旦使用,查询并行化可以减少执行大型查询的时间,其方法是通过增加 CPU 来处理查询。DPF 也可以简化数据管理。

在一个分区数据库中,执行 CREATE DATABASE 命令所得到的分区称之为目录分区。目录分区正是所有系统目录表存储的位置。因此,所有系统表访问必须遍历该分区。这个分区或者接受来自客户端连接请求的分区都被称之为协调员分区

本文通过一个样例 DPF 环境介绍备份和恢复,该样例 DPF 含有两个物理分区,每一个都有里两个逻辑分区。也就是说,这里有 4 个分区(分区 0、1、2 和 3),分区 0 和 1 位于一个服务器 (SERVER_A),分区 2 和 3 位于另外一个服务器 (SERVER_B)。分区 0 被视为目录节点,如 图 1 所示。

图 1. 分区数据库环境
位于服务器 A 的分区 0 和 1 通过高速网络连接至服务器 B 上的分区 2 和 3

db2nodes.cfg 文件显示分区列表,第一列代表分区数目,第 2 列代表服务器地址或者主机名,第 3 行代表逻辑端口。

清单 1. db2nodes.cfg 输出
$cat db2nodes.cfg     #this file exist in the sqllib directory of your instance directory
0     SERVER_A         0
1     SERVER_A         1
2     SERVER_B         0
3     SERVER_B         1

备份数据库

DB2 中的备份操作可以是在线操作,也可以是离线操作。您不可能知道系统何时会出现灾难或故障而导致停机,因此,最好就是随时做好准备,不仅仅要保护数据不受外部因素干扰,也要考虑来自内部的因素,例如,某一个内部用户可能不小心使用非正确信息而导致数据库损坏。鉴于这些原因,理解备份和恢复功能如何用于您的数据库管理系统是至关重要的,您应该有一个计划周密的备份策略。

在 DPF 中,您可以在一个数据库分区服务器上逐个运行命令,也可以并行运行。您可以使用 db2_all 在所有指定的数据库分区服务器上运行命令。您可以使用 <<-xxx<<<+xxx< 前缀序列限制数据库分区服务器的个数。您可以使用 <<-xxx< 前缀向 DPF 中的所有分区发出命令,除了 xxx 指定的节点外。类似地,您可以使用 '<<+xxx<' 前缀仅向 xxx 指定的分区发出命令。db2_all 可前置下列任务到您的命令中。

export DB2NODE=xxx(Korn shell 语法)

在此任务中,xxx 是数据库分区号,可以从 db2nodes.cfg 文件中获取,因此,该命令被路由到一个特定数据库分区服务器上。

这里是一个跨所有节点并行执行数据备份的示例。

清单 2. 跨所有节点的备份
$ db2 backup db TEST on all dbpartitionnums
Part  Result
----  ------------------------------------------------------------------------
0000  DB20000I  The BACKUP DATABASE command completed successfully.
0001  DB20000I  The BACKUP DATABASE command completed successfully.
0002  DB20000I  The BACKUP DATABASE command completed successfully.
0003  DB20000I  The BACKUP DATABASE command completed successfully.
Backup successful. The timestamp for this backup image is : 20110302231028

每个数据库分区被单独备份。所有数据库分区同时进行的备份称之为版本备份。所有数据库分区中的备份镜像保存在当前目录下。

清单 3. 列出所有备份文件
$ls -l
-rw------- 1 root root 78454784 Mar 02 23:10 
TEST.0.inst_test.NODE0000.CATN0000.20110302231028.001
-rw------- 1 root root 18116608 Mar 02 23:10 
TEST.0.inst_test.NODE0001.CATN0000.20110302231028.001
-rw------- 1 root root 18116608 Mar 02 23:10 
TEST.0.inst_test.NODE0002.CATN0000.20110302231028.001
-rw------- 1 root root 18116608 Mar 02 23:10 
TEST.0.inst_test.NODE0003.CATN0000.20110302231028.001

您有 4 个备份镜像,代表此环境中的 4 个备份。备份文件名提供关于备份的详细信息。例如,我们来看一下备份文件名 TEST.0.inst_test.NODE0000.CATN0000.20110302231028.001

  • TEST:代表的数据库名
  • 0:备份操作类型,0 代表完全离线数据库级备份
  • inst_test:实例名
  • NODE0000:分区号
  • CATN0000:目录节点 (syscatspace) 驻留的数据库分区号
  • 0110302231028:时间戳
  • 001:序列号

这里是单节点上的数据库备份。

清单 4. 单节点上的数据库备份
# Backup taken at Node 2
$ export DB2NODE=2 
$ db2 terminate
DB20000I  The TERMINATE command completed successfully.
$ db2 backup db TEST
Backup successful. The timestamp for this backup image is : 20151010061808
$ ls
TEST.0.inst_test.NODE0002.CATN0000.20110302231028.001

恢复数据库

万一发生数据损坏或者数据丢失,数据库的副本将被用于恢复数据库,至少可以恢复到执行备份操作时数据库的状态。恢复也是数据库升级或者迁移的一部分。在 DPF 中,恢复是一个较为麻烦的操作。如果您正在使用 DPF,那您首先需要恢复目录节点,然后继续恢复其余节点。在该示例中,分区 0 是目录节点。

清单 5. 恢复目录节点上的数据库
$ db2_all '<<+0< db2 RESTORE DATABASE TEST into TEST REPLACE EXISTING'

SQL2539W  Warning!  Restoring to an existing database that is the same as the
backup image database.  The database files will be deleted.

DB20000I  The RESTORE DATABASE command completed successfully.
9.183.162.255: db2 RESTORE DATABASE ... completed ok

现在恢复其余分区。

清单 6. 恢复其余分区上的数据库
$ db2_all '<<-0< db2 RESTORE DATABASE TEST into TEST REPLACE EXISTING'
rah: omitting logical node 0

SQL2539W  Warning!  Restoring to an existing database that is the same as the
backup image database.  The database files will be deleted.
DB20000I  The RESTORE DATABASE command completed successfully.
9.183.162.255: db2 RESTORE DATABASE ... completed ok

SQL2539W  Warning!  Restoring to an existing database that is the same as the
backup image database.  The database files will be deleted.
DB20000I  The RESTORE DATABASE command completed successfully.
9.183.162.254: db2 RESTORE DATABASE ... completed ok

SQL2539W  Warning!  Restoring to an existing database that is the same as the
backup image database.  The database files will be deleted.
DB20000I  The RESTORE DATABASE command completed successfully.
9.183.162.254: db2 RESTORE DATABASE ... completed ok

如果您启用了归档逻辑,并且想在恢复数据库后尝试连接到数据库,那么您将会看到这样一个错误,数据库正处于前滚悬挂状态 (rollforward pending state)。

清单 7. 恢复后,数据处于前滚悬挂状态
$ db2 connect to test
SQL1117N  A connection to or activation of database "TEST" cannot be made
because of ROLL-FORWARD PENDING.  SQLSTATE=57019

要解决这个不一致性问题,需要前滚数据库到日志终点,使其达到一致。对于离线备份恢复,如果您在恢复命令中指定 WITHOUT ROLLING FORWARD 选项,那么数据库在成功恢复以后不会置于前滚悬挂状态。对于在线备份恢复,前滚是强制性的。


前滚

数据库前滚使您可以维护数据库的一致性,通过应用记录在数据库日志文件中的事务来恢复数据库,前滚是在数据库或者表空间备份镜像恢复之后调用的一个进程。如果启用归档日志记录,据说数据库是可恢复的,也就是说,如果 logarchmeth1 或者 logarchmeth2 数据库配置参数被设置成一个具体值,而不是 OFF,那么数据库就是可恢复的。仅当数据是可恢复的时,前滚方适用于数据库或者表空间。

在一个分区数据库环境中,此命令仅可以从目录分区调用。前滚到一个特定时间点的数据库或表空间前滚操作将会影响 db2nodes.cfg 文件中列出的所有分区。前滚到 end of logs 的数据库或者表空间前滚操作可能是特定于分区的,它只影响指定的分区。如果没有指定分区,将会影响 db2nodes.cfg 文件中列出的所有分区。如果一个具体分区不需要前滚恢复,您就可以忽略该分区。

清单 8. 数据库前滚
$ db2 rollforward db test to end of logs and complete

                                 Rollforward Status

 Input database alias                   = test
 Number of nodes have returned status   = 4

 Node number  Rollforward  Next log    Log files   Last committed
              status       to be read  processed    transaction
-----------  ------------- ---------- -----------  ------------------------------
  0           not pending                  -       2011-03-03-06.28.31.000000 UTC
  1           not pending                  -       2011-03-03-06.28.28.000000 UTC
  2           not pending                  -       2011-03-03-06.31.45.000000 UTC
  3           not pending                  -       2011-03-03-06.31.45.000000 UTC

DB20000I  The ROLLFORWARD command completed successfully.

现在,数据已经完成前滚了,可以成功连接到数据库了。命令 db2 rollforward db test to end of logs and complete 指定归档日志文件(在数据库配置参数 “logpath” 中列出)中的所有承诺事务将被应用。

前滚到一个时间点

在 DB2 中,您可以通过时间点前滚将数据库恢复到任何指定的时间点,假设您指定的时间点远远大于最小恢复时间 (MRT),最小恢复时间是回滚中最早的时间点,如果数据库是一致的话。最小时间点确保表空间和日志与系统目录保持一致。当 DDL SQL 针对表空间或者表空间上的表运行时,将更新最小时间点。当您想要撤销一些无意更改,或者当您想对数据库进行灾难恢复时,而您又丢失了日志,时间点恢复是非常方便的。

前滚操作的特定时间点必须等于或者迟于 MRT。如果前滚被用于恢复在线备份操作镜像,在这种情况下时间点应该晚于在线备份操作完成时间。数据库历史(list history backup all for db <dbname> 命令)和备份镜像本身('db2ckbkp' 命令)可以为您提供备份的完成时间戳,之后,任何时间戳都将可用于前滚。

如果您正在执行一个时间点前滚恢复,所有数据库分区必须被前滚,以确保所有分区在同一水平。时间点恢复应用于所有数据库分区。

以下是识别最小时间点的各种方法。

  1. 在前滚命令中使用一个非常古老的时间戳(比如,2 年前)。DB2 将抛出一个错误,提示您可以前滚的最小前滚时间。
  2. 发出一个前滚停止命令,不需要指定日志或 PIT 终端。
    例如:db2 rollforward db <dbname> stop。该命令将返回 SQL1276N,给出一个协调世界时 (Coordinated Universal Time, CUT) 的 PIT,这就是最小 PIT。
  3. 发出 db2 list history backup all for db <dbname> 命令并寻找您备份镜像的时间戳。一旦找到,寻找 'Earliest Log' 和 'Current Log' 值。这些值显示为了前滚到一个最小 PIT 需要应用的日志范围。您可以将这些日志复制到某个目录下,然后通过 overflow log pathnoretrieve 选项发出前滚命令。

注意,您在前滚命令中指出的时间是 CUT 时间,除非您还指定了 ‘使用标准时间 (using local time)’。您可以执行 db2 "values current timezone" 命令获取 CUT 和本地时间之差。以下展示了前滚到 PIT 的示例。

清单 9. 前滚到 PIT
$ db2 "rollforward db TESTDB to 2011-09-05-04.58.47 using local time and stop"
                                 Rollforward Status

 Input database alias                   = TESTDB
 Number of nodes have returned status   = 1

 Node number                            = 0
 Rollforward status                     = not pending
 Next log file to be read               =
 Log files processed                    = S0000024.LOG - S0000025.LOG
 Last committed transaction             = 2011-09-05-04.54.04.000000 Local
or more containers is inaccessible
DB20000I  The ROLLFORWARD command completed successfully.

若要确定一个表空间的最小恢复时间点,您可以使用下列两个命令之一:

  1. 使用 LIST TABLESPACES SHOW DETAIL 命令。
  2. 使用 GET SNAPSHOT FOR TABLESPACE ON <dbname> 命令获取一个表空间快照。

尽管您可以前滚您的数据或者表空间到任何时间点(最小时间点范围内),但是这并不能保证选择前滚的终止时间可以让所有数据保持一致。


在 DPF 环境中执行一个重定向恢复

如果您想要恢复一个备份镜像到目标机器(与源机器不同),那么您可以使用重定向恢复选项恢复备份镜像。通常在下列情况中,您可以选择重定向恢复:

  1. 如果您想要恢复数据库的表空间容器到不同的物理位置,或者
  2. 因为一个或多个容器不可访问,恢复操作失败

在重定向恢复过程中,如果没有目录和文件容器,那么会自动创建这些。DB2 支持移除、添加或更改只有 DMS 表空间的表空间容器。对于 SMS 表空间,修改表空间容器配置唯一的方法是重定向恢复。

若要在分区环境中执行重定向恢复,必须在每个分区上恢复数据库,从目录分区开始,设置表空间,然后继续恢复。这将在后续的 3 个步骤中执行。

  1. 在所有分区上备份数据库 TESTDB。在目录节点发出下列命令,在此示例中为节点 0。执行下述命令后,您可以在 ‘/home/backup’ 目录下看到备份镜像。
    清单 10. DPF 中的备份。
     $ db2_all '<<+0< db2 BACKUP DATABASE testdb to /home/backup' 
     $ db2_all '<<-0< db2 BACKUP DATABASE testdb to /home/backup'
  2. 现在,使用不同容器进行一个重定向恢复,恢复到 newdb。在分区 0 中,发出如下命令:
    清单 11. 目录节点上的重定向恢复
    $ db2_all '<<+0< db2 create db NEWDB on /db2/newdb'
    $ db2_all '<<+0< db2 restore db TESTDB from /home/backup/
      into NEWDB redirect without prompting'
    $ db2_all '<<+0< db2 set tablespace containers for 0
      using (path '/db2/newdb/NODE0000/catalog'
    $ db2_all '<<+0< db2 set tablespace containers for 1
       using (path '/db2/newdb/NODE0000/temp" 
    $ db2_all '<<+0< db2 set tablespace containers for 2
       using (path '/db2/newdb/NODE0000/user'
    $ db2_all '<<+0< db2 set tablespace containers for 3
       using (path '/db2/newdb/NODE0000/table'
    $ db2_all '<<+0< db2 restore database TESTDB continue'

    现在,必须恢复数据库,且必须在每个数据库分区中单独设置表空间容器。

    清单 12. 目录节点上的重定向恢复
    //For node 1
    $ db2_all '<<+1< db2 restore db TESTDB from /home/backup/
     into NEWDB redirect without prompting'
    $ db2_all '<<+1< db2 set tablespace containers for 1
     using (path '/db2/newdb/NODE0001/temp'
    $ db2_all '<<+1< db2 set tablespace containers for 2
     using (path '/db2/newdb/NODE0001/user'
    $ db2_all '<<+1< db2 set tablespace containers for 3
     using (path '/db2/newdb/NODE0001/table'
    $ db2_all '<<+1< db2 restore database TESTDB continue'
    
    //For node 2
    $ db2_all '<<+2< db2 restore db TESTDB from /home/backup/
     into NEWDB redirect without prompting'
    $ db2_all '<<+2< db2 set tablespace containers for 1
     using (path '/db2/newdb/NODE0002/temp')' 
    $ db2_all '<<+2< db2 set tablespace containers for 2
     using (path '/db2/newdb/NODE0002/user')'
    $ db2_all '<<+2< db2 set tablespace containers for 2
     using (path '/db2/newdb/NODE0002/user')'
    $ db2_all '<<+2< db2 set tablespace containers for 3
     using (path '/db2/newdb/NODE0002/table')'
    $ db2_all '<<+2< db2 restore database TESTDB continue'
    
    //For node 3
    $ db2_all '<<+3< db2 restore db TESTDB from /home/backup/
     into NEWDB redirect without prompting'
    $ db2_all '<<+3< db2 set tablespace containers for 1 
    using (path '/db2/newdb/NODE0003/temp')' 
    $ db2_all '<<+3< db2 set tablespace containers for 2 
    using (path '/db2/newdb/NODE0003/user')'
    $ db2_all '<<+3< db2 set tablespace containers for 3 
    using (path '/db2/newdb/NODE0003/table')'
    $ db2_all '<<+3< db2 restore database TESTDB continue'
  3. 最后,使用目录节点前滚到日志末端。将归档日志文件复制到一个目录下,例如 '/home/logs'。恢复完成后,您就可以使用下列命令进行前滚。
    清单 13. 前滚到日志末端
    $ export DB2NODE=0 
    $ db2 terminate 
    $ db2 rollforward database newdb to end of logs on all dbpartitionnums 
      overflow log path /home/logs 
    $ db2 rollforward database newdb complete

计算日志空间需求

如果您采用循环日志记录,而且希望在 DPF 环境中启用归档日志文件,那就需要确定 'logprimary' 和 'logsecond' 值。首先需要使用 db2pd -logs 计算您每天需要的日志数量,检查日志写入的次数。对于不同工作负载需要定期监控系统。一旦完成,您就可以预测系统可以使用的最大活动日志数。在观察期间允许计算 20-30% 额外日志,这确保没有活动日志被归档。该计算日志空间可根据便利程度划分为 'logprimary''logsecond'


结束语

本文介绍了使用 InfoSphere Warehouse 数据分区功能进行备份和恢复的基础概念。在一个 DPF 环境中逐步介绍了执行备份、恢复和前滚步骤。一旦掌握了如何执行这些操作,就可以利用该 InfoSphere Warehouse 提供的扩展功能,提升您的数据库系统性能。

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Information Management
ArticleID=792372
ArticleTitle=InfoSphere Warehouse 数据分区环境中的备份、恢复和前滚操作
publish-date=02092012