Optim High Performance Unload [HPU]

一、简介

HPU即Optim High Performance Unload,是一款快速的、高效的、灵活的、多功能的数据卸载和迁移工具。在大部分情况下,HPU 卸载数据的速度比 DB2 Export 实用工具要快,因为 HPU 可以绕过 DB2 数据库管理器,直接访问数据库文件。因此在使用它卸载数据时可以达到相当高的性能。不仅如此,HPU还可以以数据不落地的方式在线进行迁移,自动地将数据从一个系统中的 DB2 实例迁移到另一个系统中的 DB2 实例中,其中包括卸载,迁移,加载数据到目标实例的操作。

二、安装

Mark: 通过root用户进行安装和卸载

下载好安装介质, 例如测试的介质为V5.1 Linux x86版本

OHPU_DB2_FOR_LUW_V5.1.0.1_LNX86.tar.gz

提前安装好xinetd

yum install xinetd -y

解压安装包

tar xf /tmp/OHPU_DB2_FOR_LUW_V5.1.0.1_LNX86.tar.gz

进入解压好的安装目录,执行安装程序

[root@host-170-130-106-206] [~]
$ cd /tmp/HPU5101/
[root@host-170-130-106-206] [/tmp/HPU5101]
$ ll
总用量 32964
-rw-r--r--  1 root root 32184320 8月  17 2014 archive_core_linux.tar
-rw-r--r--  1 root root   378880 8月  17 2014 archive_inst_linux.tar
-rw-r--r--  1 root root   358400 8月  17 2014 archive_network_linux.tar
-rw-r--r--  1 root root   133120 8月  17 2014 archive_procedure_linux.tar
-rw-r--r--  1 root root   358400 8月  17 2014 archive_uninst_linux.tar
drwxr-xr-x  2 root root       37 8月  17 2014 config
-r-xr-xr-x  1 root root    59610 8月  17 2014 installer_common.sh
-r-xr-xr-x  1 root root   176208 8月  17 2014 installer_setup.sh
-r-xr-xr-x  1 root root     3051 8月  17 2014 install_hpu.sh
-r--r--r--  1 root root      769 8月  17 2014 InstallInstructions.txt
-r--r--r--  1 root root    10435 8月  17 2014 install_linux.ini
drwxr-xr-x 24 root root     4096 8月  17 2014 license
drwxr-xr-x 20 root root      283 8月  17 2014 messages
-r--r--r--  1 root root    18760 8月  17 2014 Readme.txt
drwxr-xr-x  2 root root       61 8月  17 2014 support
-rw-r--r--  1 root root        0 6月   8 10:40 trace_error_install
-rw-r--r--  1 root root    40286 6月   8 10:40 trace_install
-rw-r--r--  1 root root        0 6月   8 10:40 trace_warning_install
-r-xr-xr-x  1 root root     2080 8月  17 2014 uninstall_hpu.sh
[root@host-170-130-106-206] [/tmp/HPU5101]
$ ./install_hpu.sh 

此脚本将在计算机上安装 Optim High Performance Unload for DB2 for Linux, UNIX and Windows


-------------------------------------------------------------------------------

HPU 5.1.0.1 (Full)
完成 安装

IBM Corp.
//www.ibm.com/software/data/db2imstools

安装目录: /opt/ibm/HPU/V5.1
这是要用于安装产品的目录。

输入 1 进行下一步,输入 2 取消:
1
....
....
....
L/N:  L-DNAA-94TPSX
D/N:  L-DNAA-94TPSX
P/N:  L-DNAA-94TPSX 
输入 1 接受协议,输入 2 拒绝协议
1


........................................................................................................

安装已完成,但存在警告。

在文件 /opt/ibm/HPU/V5.1/install/trace_warning_install 中可找到警告消息。

要允许 DBA 对文件进行更改而不要求 root 用户权限,您可以更改 HPU 配置目录的所有权。要更改所有权,从命令提示符输入:

chown -R mydba:dbagroup HPU_install_directory/cfg 
 
此外,如果 DBA 没有将项添加到缺省实例和数据库的 db2hpu.cfg 文件,需要所有用户在命令行中至少使用 -i 选项,并可选择使用 -d 选项。

默认是安装在/opt/ibm/HPU

检查安装版本

$ /opt/ibm/HPU/V5.1/bin/db2hpu --version
INZM030I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 版本 64 位 05.01.00.001(140816)

卸载软件

$ /opt/ibm/HPU/V5.1/uninstall/uninstall_hpu.sh 


此脚本将卸载计算机上的 Optim High Performance Unload for DB2 for Linux, UNIX and Windows


-------------------------------------------------------------------------------

HPU 5.1.0.1 (Full)
完成 安装

IBM Corp.
//www.ibm.com/software/data/db2imstools

安装目录: /opt/ibm/HPU/V5.1
这是要用于除去产品的目录。

输入 1 进行下一步,输入 2 取消:
1

...............................................................................................

卸载已完成,但存在警告。

请查看文件 /tmp/trace_warning_uninstall 以获取详细信息。

三、基本配置

创建db2hpu的软链接

$ ln -sv /opt/ibm/HPU/V5.1/bin/db2hpu /bin/db2hpu
"/bin/db2hpu" -> "/opt/ibm/HPU/V5.1/bin/db2hpu"

[root@host-170-130-106-206] [/opt/ibm/HPU/V5.1/bin]
$ ls -lrt /bin/db2hpu
lrwxrwxrwx 1 root root 28 6月   8 14:02 /bin/db2hpu -> /opt/ibm/HPU/V5.1/bin/db2hpu

修改如下配置文件,添加下面三行,增强HPU性能

cps             = 5000 10
instances       = 5000
per_source      = 100

最终文件内容如下:

$ cat  /etc/xinetd.d/db2hpudm51
#
# @(#) db2hpudm51
#


service db2hpudm51
{
    disable         = no
    flags           = REUSE
    socket_type     = stream
    protocol        = tcp
    wait            = no
    user            = root
    server          = /opt/ibm/HPU/V5.1/bin/db2hpudm
    server_args     = --tophpu /opt/ibm/HPU/V5.1 --loglevel 3 --inetd --logfile /var/log/hpu/db2hpudm51.log 
    log_on_failure += USERID HOST 
    log_on_success += USERID PID HOST DURATION
    cps             = 5000 10
    instances       = 5000
    per_source      = 100
}

重启xinetd服务

$ systemctl restart xinetd

修改/opt/ibm/HPU/V5.1/cfg/属组为DB2实例owner,则后续实例owner可以修改对应的HPU卸数参数

$ chown -R db2inst1.dbgrp /opt/ibm/HPU/V5.1/cfg/

修改配置文件如下(默认的数据库名和实例名可以按需指定,则调用db2hpu时不需要单独指定实例和数据库)

$ cat /opt/ibm/HPU/V5.1/cfg/db2hpu.cfg 
# HPU default configuration
bufsize=2097152
db2dbdft=sample
db2instance=db2inst1
doubledelim=binary
netservice=db2hpudm51
allow_unlimited_memory=yes
keepalive_time=10
maxthreads=8
maxselects=10
mig_pipe_timeout=60
min_extent_per_thread=4
use_stats=true
nbcpu=8
umask=022

新建HPU凭证

$ su - db2inst1
$ mkdir .db2hpu
$ cd .db2hpu
$ touch db2hpu.creds
$ db2hpu --credentials local
INZM059I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816)
管理“local”良好连接的凭证:
  - 要创建或除去数据吗 (1/2)?1
  - 是新部分吗 (Y/N)?y
  - 提供节名称:db2inst1
  - 提供用户名:db2inst1
  - 提供密码:********
要验证数据吗 (Y/N)?y
INZM061I 已为“db2inst1”创建了连接的凭证

四、卸数

4.1. 命令行导出

db2hpu.cfg 中已经配置了db2inst1实例和sample数据库,这里就不需要单独指定了

--导出成del文件
$ db2hpu --format del -t staff -o /tmp/staff.del
INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 UNLOAD TABLESPACE
000002 PART(ALL)
000003 SELECT * FROM "STAFF";
000004 OUTFILE("/tmp/staff.del")
000005 FORMAT DEL;

INZU462I HPU 控制步骤开始: 14:23:58.213。
INZU463I HPU 控制步骤结束: 14:23:58.375。
INZU464I HPU 运行步骤开始: 14:23:58.376。
INZU410I HPU 实用程序已经卸装 35 行(在 host-170-130-106-206 主机上,针对 DB2INST1.STAFF,在 /tmp/staff.del 中)。
INZU465I HPU 运行步骤结束: 14:23:58.543。
INZI441I HPU 成功结束:实时 -> 0m0.330008s
用户时间 -> 0m0.025528s:父代 -> 0m0.024063s,子代 -> 0m0.001465s
系统时间 -> 0m0.060931s:父代 -> 0m0.052136s,子代 -> 0m0.008795s

$ cat /tmp/staff.del
10,"Sanders",20,"Mgr  ",7,+98357.50,
20,"Pernal",20,"Sales",8,+78171.25,+00612.45
30,"Marenghi",38,"Mgr  ",5,+77506.75,
40,"O'Brien",38,"Sales",6,+78006.00,+00846.55
50,"Hanes",15,"Mgr  ",10,+80659.80,
60,"Quigley",38,"Sales",,+66808.30,+00650.25
70,"Rothman",15,"Sales",7,+76502.83,+01152.00
80,"James",20,"Clerk",,+43504.60,+00128.20
90,"Koonitz",42,"Sales",6,+38001.75,+01386.70
100,"Plotz",42,"Mgr  ",7,+78352.80,

也可以单独指定实例和数据库,例如

$ db2hpu -i db2inst1 -d sample --format ixf -t emp -o /tmp/emp.ixf
INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 GLOBAL CONNECT TO SAMPLE;
000002 UNLOAD TABLESPACE
000003 PART(ALL)
000004 SELECT * FROM "EMP";
000005 OUTFILE("/tmp/emp.ixf")
000006 FORMAT IXF;

INZU462I HPU 控制步骤开始: 14:26:55.716。
INZU463I HPU 控制步骤结束: 14:26:55.751。
INZU464I HPU 运行步骤开始: 14:26:55.752。
INZU410I HPU 实用程序已经卸装 42 行(在 host-170-130-106-206 主机上,针对 DB2INST1.EMPLOYEE,在 /tmp/emp.ixf 中)。
INZU465I HPU 运行步骤结束: 14:26:55.973。
INZI441I HPU 成功结束:实时 -> 0m0.256954s
用户时间 -> 0m0.036646s:父代 -> 0m0.034759s,子代 -> 0m0.001887s
系统时间 -> 0m0.052511s:父代 -> 0m0.046850s,子代 -> 0m0.005661s

4.2. 控制文件

4.2.1. 从表空间容器卸数

有时候卸数的真实场景会更复杂些,这时候可以通过指定控制文件来达成更复杂的场景需求,例如:

cat > sample.ctl << EOF 
GLOBAL CONNECT TO SAMPLE;
unload tablespace USERSPACE1
SELECT * FROM db2inst1.staff WHERE job ='Sales';
OUTPUT("/home/db2inst1/export/staff_sales.del" REPLACE)
FORMAT DEL;

unload tablespace USERSPACE1
SELECT * FROM db2inst1.staff WHERE job ='Mgr';
OUTPUT("/home/db2inst1/export/staff_mgr.del" REPLACE)
FORMAT DEL;

unload tablespace USERSPACE1
SELECT * FROM db2inst1.EMP_PHOTO;
OUTPUT("/home/db2inst1/export/EMP_PHOTO" REPLACE)
LOB IN ("/home/db2inst1/export/lobs")                    
LOBFILE("EMP_PHOTO")               
FORMAT DEL;  
EOF

上面的控制文件中含3段卸数逻辑

  • 导出staff表中job为Sales的数据
  • 导出staff表中job为Mrg的数据
  • 导出EMP_PHOTO表并且指定了BLOB数据导出位置
$ db2hpu -f sample.ctl 
INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 GLOBAL CONNECT TO SAMPLE;
000002 unload tablespace USERSPACE1
000003 SELECT * FROM db2inst1.staff WHERE job ='Sales';
000004 OUTPUT("/home/db2inst1/export/staff_sales.del" REPLACE)
000005 FORMAT DEL;
000006 
000007 unload tablespace USERSPACE1
000008 SELECT * FROM db2inst1.staff WHERE job ='Mgr';
000009 OUTPUT("/home/db2inst1/export/staff_mgr.del" REPLACE)
000010 FORMAT DEL;
000011 
000012 unload tablespace USERSPACE1
000013 SELECT * FROM db2inst1.EMP_PHOTO;
000014 OUTPUT("/home/db2inst1/export/EMP_PHOTO" REPLACE)
000015 LOB IN ("/home/db2inst1/export/lobs")                    
000016 LOBFILE("EMP_PHOTO")               
000017 FORMAT DEL;  

INZU462I HPU 控制步骤开始: 15:09:54.683。
INZU463I HPU 控制步骤结束: 15:09:54.760。
INZU464I HPU 运行步骤开始: 15:09:54.760。
INZU410I HPU 实用程序已经卸装 12 行(在 host-170-130-106-206 主机上,针对 DB2INST1.STAFF,在 /home/db2inst1/export/staff_sales.del 中)。
INZU410I HPU 实用程序已经卸装 11 行(在 host-170-130-106-206 主机上,针对 DB2INST1.STAFF,在 /home/db2inst1/export/staff_mgr.del 中)。
INZU410I HPU 实用程序已经卸装 8 行(在 host-170-130-106-206 主机上,针对 DB2INST1.EMP_PHOTO,在 /home/db2inst1/export/EMP_PHOTO 中)。
INZU465I HPU 运行步骤结束: 15:09:55.387。
INZI441I HPU 成功结束:实时 -> 0m0.704005s
用户时间 -> 0m0.025539s:父代 -> 0m0.025539s,子代 -> 0m0.000000s
系统时间 -> 0m0.081912s:父代 -> 0m0.068758s,子代 -> 0m0.013154s

导出结果:

[db2inst1@host-170-130-106-206] [~/export]
$ ls -lrt
总用量 16
-rw-r--r-- 1 db2inst1 dbgrp 537 6月   8 15:09 sample.ctl
-rw-r--r-- 1 db2inst1 dbgrp 554 6月   8 15:09 staff_sales.del
-rw-r--r-- 1 db2inst1 dbgrp 402 6月   8 15:09 staff_mgr.del
drwxr-xr-x 2 db2inst1 dbgrp 230 6月   8 15:09 lobs
-rw-r--r-- 1 db2inst1 dbgrp 532 6月   8 15:09 EMP_PHOTO
[db2inst1@host-170-130-106-206] [~/export]
$ ls -l lobs/
总用量 392
-rw-r--r-- 1 db2inst1 dbgrp 43690 6月   8 15:09 EMP_PHOTO.e00001.000
-rw-r--r-- 1 db2inst1 dbgrp 29540 6月   8 15:09 EMP_PHOTO.e00002.000
-rw-r--r-- 1 db2inst1 dbgrp 71798 6月   8 15:09 EMP_PHOTO.e00003.000
-rw-r--r-- 1 db2inst1 dbgrp 29143 6月   8 15:09 EMP_PHOTO.e00004.000
-rw-r--r-- 1 db2inst1 dbgrp 73438 6月   8 15:09 EMP_PHOTO.e00005.000
-rw-r--r-- 1 db2inst1 dbgrp 39795 6月   8 15:09 EMP_PHOTO.e00006.000
-rw-r--r-- 1 db2inst1 dbgrp 63542 6月   8 15:09 EMP_PHOTO.e00007.000
-rw-r--r-- 1 db2inst1 dbgrp 36088 6月   8 15:09 EMP_PHOTO.e00008.000
[db2inst1@host-170-130-106-206] [~/export]
$ cat EMP_PHOTO 
"000130","bitmap","/home/db2inst1/export/lobs/EMP_PHOTO.e00001.000"
"000130","gif","/home/db2inst1/export/lobs/EMP_PHOTO.e00002.000"
"000140","bitmap","/home/db2inst1/export/lobs/EMP_PHOTO.e00003.000"
"000140","gif","/home/db2inst1/export/lobs/EMP_PHOTO.e00004.000"
"000150","bitmap","/home/db2inst1/export/lobs/EMP_PHOTO.e00005.000"
"000150","gif","/home/db2inst1/export/lobs/EMP_PHOTO.e00006.000"
"000190","bitmap","/home/db2inst1/export/lobs/EMP_PHOTO.e00007.000"
"000190","gif","/home/db2inst1/export/lobs/EMP_PHOTO.e00008.000"

4.2.2. 从备份镜像中卸数

另外除了从表空间container中卸数,也可以从数据库的备份文件中进行卸数,这对于数据实时性要求不高的场景很适合,还避免了直接操作在运行的数据库。

$ db2 backup db sample online to /home/db2inst1/export

Backup successful. The timestamp for this backup image is : 20210608152001

cat > sample01.ctl << EOF       
GLOBAL CONNECT TO SAMPLE ;
UNLOAD TABLESPACE USERSPACE1           
USING BACKUP DATABASE SAMPLE FROM "/home/db2inst1/export/" TAKEN AT 20210608152001;
SELECT * FROM db2inst1.EMPLOYEE;            
OUTPUT ("/home/db2inst1/export/emp.del" REPLACE)    
FORMAT DEL                            
;                                     
EOF

$ db2hpu -f sample01.ctl 
INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 GLOBAL CONNECT TO SAMPLE ;
000002 UNLOAD TABLESPACE USERSPACE1           
000003 USING BACKUP DATABASE SAMPLE FROM "/home/db2inst1/export/" ;
000004 SELECT * FROM db2inst1.EMPLOYEE;            
000005 OUTPUT ("/home/db2inst1/export/emp.del" REPLACE)    
000006 FORMAT DEL                            
000007 ;                                     

INZU462I HPU 控制步骤开始: 15:22:39.126。
INZU420W DB2 YES 与从备份卸装不兼容,已转换成 DB2 NO
INZU520W 为分区 0 指定的备份映像是“联机”备份映像
INZU463I HPU 控制步骤结束: 15:22:39.211。
INZU464I HPU 运行步骤开始: 15:22:39.212。
INZU557I 卸装中涉及分区 0 备份图像(获取于 20210608152001)(类型 FULL ONLINE DATABASE,设备 DISK)。
INZU410I HPU 实用程序已经卸装 42 行(在 host-170-130-106-206 主机上,针对 DB2INST1.EMPLOYEE,在 /home/db2inst1/export/emp.del 中)。
INZU465I HPU 运行步骤结束: 15:22:39.514。
INZI441I HPU 成功结束:实时 -> 0m0.388620s
用户时间 -> 0m0.023377s:父代 -> 0m0.023377s,子代 -> 0m0.000000s
系统时间 -> 0m0.320603s:父代 -> 0m0.320603s,子代 -> 0m0.000000s

4.2.3. 控制文件语法参考

//www.ibm.com/docs/en/iohpufdflu-and-w/6.1?topic=syntax-unload-block

4.3. 存储过程

4.3.1. 创建存储过程

HPU也可以以DB2 存储过程的方式来运行

安装完毕后,在如下目录中可以找到创建存储过程所需的文件

$ ls -rlt /opt/ibm/HPU/V5.1/install/function
总用量 132
-rwxr-xr-x 1 root root 124581 8月  17 2014 db2hpuproc.so             --动态库文件
-r-xr-xr-x 1 root root   5491 8月  17 2014 hpu_stored_proc_inst.sh   --创建procedure的脚本

通过实例用户来执行脚本创建HPU存储过程:

创建语法hpu_stored_proc_inst.sh <HPU INSTALL PATH> <Database Name>

[db2inst1@host-170-130-106-206] [/opt/ibm/HPU/V5.1/install/function]
$ ./hpu_stored_proc_inst.sh /opt/ibm/HPU/V5.1 sample
Copy file "db2hpuproc.so" to stored procedures directory
Connection to database "sample" 
Creation of stored procedure in database "sample" 
Disconnection from database "sample" 
Ending of database use

查看存储过程

$ db2 "select substr(ROUTINESCHEMA,1,15) AS ROUTINESCHEMA,substr(ROUTINENAME,1,15) AS ROUTINENAME,ROUTINETYPE,VALID,CREATE_TIME,ALTER_TIME from syscat.routines where ROUTINETYPE = 'P' and ROUTINESCHEMA ='DB2INST1' and ROUTINENAME='DB2HPU'"

ROUTINESCHEMA   ROUTINENAME     ROUTINETYPE VALID CREATE_TIME                ALTER_TIME                
--------------- --------------- ----------- ----- -------------------------- --------------------------
DB2INST1        DB2HPU          P                 2021-06-08-15.31.01.417755 2021-06-08-15.31.01.417755

  1 record(s) selected.

4.3.2. 调用存储过程

--语法
db2 "call db2hpu('<HPU installation path>','<HPU command-line arguments>','<request to submit>','<HPU report>','<HPU return code>')

其中的参数官网解释如下:

Where:

  • The parameter represents the Optim High Performance Unload installation path and is expressed as a VARCHAR(512) string.

  • The parameter contains the Optim High Performance Unload command line arguments and is expressed as a CLOB(1024) string.
    The parameter represents the Optim High Performance Unload request and is expressed as a CLOB(64K) string. Use this parameter for what is normally included in a control file.

  • The parameter represents the Optim High Performance Unload report and is expressed as a CLOB(64K) string. This parameter is used for output purposes only. You need to specify it on the command line by using the question mark (?) character.

  • The parameter represents the Optim High Performance Unload return code and is expressed as an integer. This parameter is also used for output purposes only. You need to specify it on the command line by using the question mark (?) character.

调用存储过程卸数,有两种方式可以实现

  • 触发一个select 请求
  • 触发一个HPU unload请求

两种方式的区别在于:如果客户的需求可以用一个 select 语句来实现,则 select 请求只需在 <HPU command-line arguments> 中指定 -select 选项,并在<request to submit>参数中指定这个 select 语句。否则,将需要提供一个完整的 HPU 请求。

触发一个HPU unload请求

$ db2 connect to sample

   Database Connection Information

 Database server        = DB2/LINUXX8664 10.1.3
 SQL authorization ID   = DB2INST1
 Local database alias   = SAMPLE

--触发一个HPU unload请求
$ db2 "call db2hpu('/opt/ibm/HPU/V5.1', '-i db2inst1 -d sample -o /home/db2inst1/export/emp.out', 'unload tablespace db2 no select * from employee; format del;', ?, ?)"

  Value of output parameters
  --------------------------
  Parameter Name  : STDERR
  Parameter Value : INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 unload tablespace db2 no select * from employee; format del;
INZU462I HPU 控制步骤开始: 15:46:23.531。
INZU463I HPU 控制步骤结束: 15:46:23.544。
INZU464I HPU 运行步骤开始: 15:46:23.550。
INZU410I HPU 实用程序已经卸装 42 行(在 host-170-130-106-206 主机上,针对 DB2INST1.EMPLOYEE,在 /home/db2inst1/export/emp.out 中)。
INZU465I HPU 运行步骤结束: 15:46:23.756。
INZI441I HPU 成功结束:实时 -> 0m0.225495s
用户时间 -> 0m0.039064s:父代 -> 0m0.039064s,子代 -> 0m0.000000s
系统时间 -> 0m0.084047s:父代 -> 0m0.062503s,子代 -> 0m0.021544s


  Parameter Name  : RC
  Parameter Value : 0

  Return Status = 0

触发一个select 请求

$ db2 "call db2hpu('/opt/ibm/HPU/V5.1', '-i db2inst1 -d sample -o /home/db2inst1/export/emp1.out -select', 'select * from employee', ?, ?)"

  Value of output parameters
  --------------------------
  Parameter Name  : STDERR
  Parameter Value : INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 select * from employee
INZU462I HPU 控制步骤开始: 16:43:45.431。
INZU463I HPU 控制步骤结束: 16:43:45.580。
INZU464I HPU 运行步骤开始: 16:43:45.581。
INZU410I HPU 实用程序已经卸装 42 行(在 host-170-130-106-206 主机上,针对 DB2INST1.EMPLOYEE,在 /home/db2inst1/export/emp1.out 中)。
INZU465I HPU 运行步骤结束: 16:43:45.888。
INZI441I HPU 成功结束:实时 -> 0m0.457295s
用户时间 -> 0m0.038746s:父代 -> 0m0.035555s,子代 -> 0m0.003191s
系统时间 -> 0m0.093540s:父代 -> 0m0.061630s,子代 -> 0m0.031910s


  Parameter Name  : RC
  Parameter Value : 0

  Return Status = 0

4.4. 数据迁移

DB2到DB2的数据迁移,我们通常的做法有:

表级别

  • export —> 网络传输介质 —> import/load

库级别

  • db2look/db2move export —>网络传输介质 —> db2move load
  • backup —>网络传输介质 —> restore/rollforward

HPU也可以实现将数据从一个DB2系统迁移至另一个DB2系统,包括数据库级别、表空间级别以及表级别,且相比于以上列举的方法,HPU的实现更为快速和高效。

使用HPU迁移的前提条件

  • 源系统和目标系统的HPU版本必须相同

  • 源系统和目标系统必须能进行网络通讯

  • 源系统和目标系统中 HPU 使用的网络端口必须一致

    $ cat /etc/services|grep hpu
    db2hpudm51  54008/tcp    # Optim HPU Services V5.1
    
    [root@host-170-130-106-206] [/opt/ibm/HPU/V5.1/cfg]
    $ netstat -nltp|grep xinetd
    tcp6       0      0 :::54008                :::*                    LISTEN      31621/xinetd
    
  • 目标系统上必须有和源系统上执行 HPU 的用户相同的用户名,并且此用户能对目标系统中要操作的数据库有 LOAD 权限,要操作的表有 INSERT 权限及其它相应的操作权限

4.4.1. 实验环境

源端 目标端
IP 170.130.106.206 170.130.106.214
实例 db2inst1 db2inst1
数据库 sample target
EMPLOYEE EMPLOYEE_T

4.4.2. 创建目标表

预先在目标库创建好表,这里除了db2look,也可以使用HPU导出DDL

$ cat > ddl.ctl << EOF       
GLOBAL CONNECT TO SAMPLE ;

UNLOAD TABLESPACE       
USING BACKUP DATABASE SAMPLE FROM "/home/db2inst1/export/" TAKEN AT 20210608152001;
SELECT * FROM db2inst1.EMPLOYEE;
OUTPUT ("/home/db2inst1/export/EMPLOYEE.del" REPLACE)              
DDLFILE("/home/db2inst1/export/EMPLOYEE.ddl")                              
;                                       
EOF

$ db2hpu -f ddl.ctl 
INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 GLOBAL CONNECT TO SAMPLE ;
000002 
000003 UNLOAD TABLESPACE       
000004 USING BACKUP DATABASE SAMPLE FROM "/home/db2inst1/export/" TAKEN AT 20210608152001;
000005 SELECT * FROM db2inst1.EMPLOYEE;
000006 OUTPUT ("/home/db2inst1/export/EMPLOYEE.del" REPLACE)              
000007 DDLFILE("/home/db2inst1/export/EMPLOYEE.ddl")                              
000008 ;                                       

INZU462I HPU 控制步骤开始: 18:20:11.777。
INZU420W DB2 YES 与从备份卸装不兼容,已转换成 DB2 NO
INZU520W 为分区 0 指定的备份映像是“联机”备份映像
INZU463I HPU 控制步骤结束: 18:20:11.822。
INZU464I HPU 运行步骤开始: 18:20:11.822。
INZU557I 卸装中涉及分区 0 备份图像(获取于 20210608152001)(类型 FULL ONLINE DATABASE,设备 DISK)。
INZU410I HPU 实用程序已经卸装 42 行(在 host-170-130-106-206 主机上,针对 DB2INST1.EMPLOYEE,在 /home/db2inst1/export/EMPLOYEE.del 中)。
INZU622I HPU 实用程序已经生成 DDL 文件 /home/db2inst1/export/EMPLOYEE.ddl。
INZU465I HPU 运行步骤结束: 18:20:12.081。
INZI441I HPU 成功结束:实时 -> 0m0.304557s
用户时间 -> 0m0.028983s:父代 -> 0m0.028983s,子代 -> 0m0.000000s
系统时间 -> 0m0.264076s:父代 -> 0m0.264076s,子代 -> 0m0.000000s

$ cat EMPLOYEE.ddl
CREATE TABLE "DB2INST1"."EMPLOYEE"  (
                "EMPNO" CHAR(6) NOT NULL , 
                "FIRSTNME" VARCHAR(12) NOT NULL , 
                "MIDINIT" CHAR(1) , 
                "LASTNAME" VARCHAR(15) NOT NULL , 
                "WORKDEPT" CHAR(3) , 
                "PHONENO" CHAR(4) , 
                "HIREDATE" DATE , 
                "JOB" CHAR(8) , 
                "EDLEVEL" SMALLINT NOT NULL , 
                "SEX" CHAR(1) , 
                "BIRTHDATE" DATE , 
                "SALARY" DECIMAL(9,2) , 
                "BONUS" DECIMAL(9,2) , 
                "COMM" DECIMAL(9,2) )
             ;
             
--在目标数据库中创建表
$ db2 connect to target

[db2inst1@host-170-130-106-214] [~]
$ db2 "CREATE TABLE "DB2INST1"."EMPLOYEE_T"  (
>                 "EMPNO" CHAR(6) NOT NULL , 
>                 "FIRSTNME" VARCHAR(12) NOT NULL , 
>                 "MIDINIT" CHAR(1) , 
>                 "LASTNAME" VARCHAR(15) NOT NULL , 
>                 "WORKDEPT" CHAR(3) , 
>                 "PHONENO" CHAR(4) , 
>                 "HIREDATE" DATE , 
>                 "JOB" CHAR(8) , 
>                 "EDLEVEL" SMALLINT NOT NULL , 
>                 "SEX" CHAR(1) , 
>                 "BIRTHDATE" DATE , 
>                 "SALARY" DECIMAL(9,2) , 
>                 "BONUS" DECIMAL(9,2) , 
>                 "COMM" DECIMAL(9,2) )"
DB20000I  The SQL command completed successfully.

$ db2 list tables;

Table/View                      Schema          Type  Creation time             
------------------------------- --------------- ----- --------------------------
EMPLOYEE_T                      DB2INST1        T     2021-06-08-18.10.34.696381

4.4.3. 准备迁移控制文件

这里可以根据需要进行定制化,比如迁移多张表,或者筛选数据

cat > migrate.ctl << EOF       
GLOBAL CONNECT TO SAMPLE
UMASK "022"
;

MIGRATE TABLESPACE
SELECT * FROM db2inst1.EMPLOYEE;           
TARGET ENVIRONMENT(INSTANCE "db2inst1" on "170.130.106.214" IN target)
WORKING IN ("/home/db2inst1/export")
FORMAT MIGRATION into db2inst1.EMPLOYEE_T
;
EOF

4.4.4. 迁移数据

$ db2hpu  -f migrate.ctl 
INZI466W 配置参数“use_stats”的值无效:将使用 NO。
INZM031I Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-206 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZI473I 内存限制:虚拟内存为 'unlimited' 且数据段为 'unlimited'
       ----+----1----+----2----+----3----+----4----+----5----+----6----+----7----+----8----+----9----+----10---+----11---+----12---+----13-
000001 GLOBAL CONNECT TO SAMPLE
000002 UMASK "022"
000003 ;
000004 
000005 MIGRATE TABLESPACE
000006 SELECT * FROM db2inst1.EMPLOYEE;           
000007 TARGET ENVIRONMENT(INSTANCE "db2inst1" on "170.130.106.214" IN target)
000008 WORKING IN ("/home/db2inst1/export")
000009 FORMAT MIGRATION into db2inst1.EMPLOYEE_T
000010 ;

INZU462I HPU 控制步骤开始: 18:26:31.474。
INZU463I HPU 控制步骤结束: 18:26:31.650。
INZU464I HPU 运行步骤开始: 18:26:31.660。
INZU398I 没有卸装要在 host-170-130-106-206 上完成
INZU543I HPU 实用程序将在 host-170-130-106-214 主机上执行装入操作。
INZM031I [host-170-130-106-214] Optim High Performance Unload for DB2 for Linux, UNIX and Windows 05.01.00.001(140816) 64 位 2021年06月08日 (Linux host-170-130-106-214 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64)
INZM054I [host-170-130-106-214] HPU 实用程序将使用 umask 值 022。
INZU539I [host-170-130-106-214] HPU 实用程序已执行装入(INSERT 方式)到 DB2INST1.EMPLOYEE_T(在数据库 TARGET 中,此数据库属于实例 db2inst1)中的操作:在 /home/db2inst1/export/DB2INST1.EMPLOYEE_T.msg 中报告(已读取 42,已跳过 0,已装入 42,已拒绝 0,已删除 0,已落实 42)
INZU465I HPU 运行步骤结束: 18:26:33.273。
INZI441I HPU 成功结束:实时 -> 0m1.799026s
用户时间 -> 0m0.119623s:父代 -> 0m0.115451s,子代 -> 0m0.004172s
系统时间 -> 0m0.052782s:父代 -> 0m0.048610s,子代 -> 0m0.004172s

检查目标环境数据

$ db2 connect to target

   Database Connection Information

 Database server        = DB2/LINUXX8664 10.1.3
 SQL authorization ID   = DB2INST1
 Local database alias   = TARGET
 
$ db2 "select count(*) from employee_t"

1          
-----------
         42

  1 record(s) selected.

4.4.5. 遇到的问题

控制文件中指定的工作目录WORKING IN ("/home/db2inst1/export") 必须在源端和目标端都存在,不存在则报如下错误

...
INZM054I [host-170-130-106-214] HPU 实用程序将使用 umask 值 022。
INZI347E [host-170-130-106-214] mkfifo 故障发生于 /home/db2inst1/export/out_USERSPACE1_DB2INST1_EMPLOYEE.000 (没有那个文件或目录)
INZM053E HPU 主机上发生 host-170-130-106-214 远程执行失败
...

目标环境没有给db2inst1用户创建HPU工作凭证,报了如下错。参照安装章节中的工作凭证创建

...
INZM053E HPU 主机上发生 host-170-130-106-214 远程执行失败
INZU664E [host-170-130-106-214] 用户 db2inst1 的目标实例 db2inst1 需要“local”类型的凭证。
...
Tags: