一、简介
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.
http://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.
http://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. 控制文件语法参考
https://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>')
其中的参数官网解释如下:
调用存储过程卸数,有两种方式可以实现
- 触发一个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. 实验环境
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”类型的凭证。
...