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: