需求:
测验DB2能否进行远程异机装载数据(remote load data)
测试环境:
A机器(DB2客户机):192.168.1.115
B机器(DB2服务器):192.168.1.222
Load_Data存储过程:
--------------------------------------------------------------------------
SET CURRENT SCHEMA = BCCS;
SET CURRENT PATH = SYSIBM,SYSFUN,SYSPROC,SYSIBMADM,DB2INST1;
CREATE OR REPLACE PROCEDURE BCCS.LOAD_DATA (
IN FROMSRC VARCHAR(200),
IN TBNAME VARCHAR(30),
IN INFLAG INTEGER )
SPECIFIC "SQL160907111614800"
LANGUAGE SQL
NOT DETERMINISTIC
EXTERNAL ACTION
MODIFIES SQL DATA
CALLED ON NULL INPUT
INHERIT SPECIAL REGISTERS
OLD SAVEPOINT LEVEL
begin
--异常变量
DECLARE sqlcode int default -1;--
declare v_sqlcode INTEGER default -1;
declare v_sqlmessage VARCHAR(2048) default ''; --
declare v_rows_read BIGINT default -1 ; --
declare v_rows_skipped BIGINT default -1; --
declare v_rows_loaded BIGINT default -1; --
declare v_rows_rejected BIGINT default -1; --
declare v_rows_deleted BIGINT default -1; --
declare v_rows_committed BIGINT default -1; --
declare v_rows_part_read BIGINT default -1; --
declare v_rows_part_rejected BIGINT default -1; --
declare v_rows_part_partitioned BIGINT default -1;--
declare v_mpp_load_summary VARCHAR(32672) default NULL;--
declare intype varchar(10) default 'insert';--
if (inflag=1) then set intype = 'replace'; --
end if;--
call sysproc.db2load(1,'','load from '||fromsrc||' of del modified by identityoverride '||intype||' into '||tbname||' nonrecoverable',v_sqlcode,v_sqlmessage,v_rows_read,v_rows_skipped,v_rows_loaded,v_rows_rejected,v_rows_deleted,v_rows_committed,v_rows_part_read,v_rows_part_rejected,v_rows_part_partitioned,v_mpp_load_summary);--
commit;--
begin
DECLARE C1 CURSOR WITH RETURN FOR values (v_sqlcode,v_rows_read,v_rows_skipped,v_rows_loaded,v_rows_rejected,v_rows_deleted,v_rows_committed,v_rows_part_read,v_rows_part_rejected,v_rows_part_partitioned);--
open C1;--
end;--
end;
(一)测试SYSPROC.DB2LOAD存储过程调用LOAD:
(a).在B机器(DB2服务器)上执行存储过程,数据文件也在B机器上。(目的:校验存储过程本身是否有问题 结论:装载成功,存储过程本身没有问题)
call BCCS.Load_Data('/home/db2inst1/del/T_BCCS_FLOWLOG.del','BCCS.T_BCCS_FLOWLOG',1)
(b).在A机器(DB2客户机)上远程调用存储过程,数据文件在B机器(DB2服务器)上。(目的:校验远程通信是否有问题 结论:装载成功,远程调用存储过程没有问题,但此时文件在服务器B上)
(c).在A机器上远程调用存储过程,数据文件在A机器上 (目的:校验数据文件在客户机上时,装载是否成功 结论:失败)
报错SQL3525:
该原因不清楚,继续深究:
单独执行Load_Data中的核心装载语句:
call sysproc.db2load(1,'','load client from /del/T_BCCS_FLOWLOG.del of del modified by identityoverride replace into ABSDB.T_BCCS_FLOWLOG nonrecoverable',?,'',?,?,?,?,?,?,?,?,?,null);
发现db2load内部存储过程不支持client参数。
结论:sysproc.db2load存储过程无法进行异机远程装载。
(二)、
联想到db2load在DB2中属于比较老的一个功能,怀疑是否是sysproc.db2load功能
比较弱造成的。尝试使用sysproc.admin_cmd一下,发现也不行。并且在DB2的
官方文档中,对于在sysproc.admin_cmd使用load的语法中压根就没有client选项
并且官方文档备注如下:
结论是:ADMIN_CMD也无法进行LOAD的异机装载。
(三)、
上述结论显示通过DB2的内部存储过程调用load是无法实现文件异机装载的。
那么不通过DB2内部存储过程,直接load是否可行呢?
实验结果如下:
结果显示:
单独执行LOAD是可以进行异机远程装载。
那么问题和解决方案已经很明显了:
DB2的装载本身是可以进行异机装载,但是如果想通过内部存储过程确受限于文件存放位置不能装载。
解决方案我想到的有这么几种:
1.文件上传服务器,本机文件装载
但这样涉及到安全性,可以在操作系统层面进行配置,服务器单线通信应用机,获取数据文件到服务器上
2.配置存储共享,但这样的安全性更低,不建议
3.单独Load是可以远程装载,可否在JDBC层面实现多线程的单独调DB2的load命令进行装载
这样带来的问题是性能会比较低。
4. 应用服务器上创建一个shell,通过shell命令调用load命令进行加载