DB2远程异机装载失败原因

需求:
测验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)
 qY5PAAAAAElFTkSuQmCC


    (b).在A机器(DB2客户机)上远程调用存储过程,数据文件在B机器(DB2服务器)上。(目的:校验远程通信是否有问题 结论:装载成功,远程调用存储过程没有问题,但此时文件在服务器B上)


Ay8z76YNN2GuAAAAAElFTkSuQmCC

   (c).在A机器上远程调用存储过程,数据文件在A机器上 (目的:校验数据文件在客户机上时,装载是否成功   结论:失败)

P56Ru8zQfkHGAAAAAElFTkSuQmCC



报错SQL3525:

H+mQDyop9eV+AAAAABJRU5ErkJggg==



该原因不清楚,继续深究:

单独执行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参数。

wGt5JC7RY8zlAAAAABJRU5ErkJggg==



结论:sysproc.db2load存储过程无法进行异机远程装载。



(二)、
联想到db2load在DB2中属于比较老的一个功能,怀疑是否是sysproc.db2load功能
比较弱造成的。尝试使用sysproc.admin_cmd一下,发现也不行。并且在DB2的
官方文档中,对于在sysproc.admin_cmd使用load的语法中压根就没有client选项

bz2AAAAAASUVORK5CYII=


并且官方文档备注如下:

B8kA6iqEvHNZAAAAAElFTkSuQmCC


结论是:ADMIN_CMD也无法进行LOAD的异机装载。


(三)、
上述结论显示通过DB2的内部存储过程调用load是无法实现文件异机装载的。
那么不通过DB2内部存储过程,直接load是否可行呢?

实验结果如下:

wP8um12h4yuvgAAAABJRU5ErkJggg==

kQywRiCx+OgAAAAASUVORK5CYII=

结果显示:
单独执行LOAD是可以进行异机远程装载。

那么问题和解决方案已经很明显了:
DB2的装载本身是可以进行异机装载,但是如果想通过内部存储过程确受限于文件存放位置不能装载。
解决方案我想到的有这么几种:

1.文件上传服务器,本机文件装载
      但这样涉及到安全性,可以在操作系统层面进行配置,服务器单线通信应用机,获取数据文件到服务器上
2.配置存储共享,但这样的安全性更低,不建议
3.单独Load是可以远程装载,可否在JDBC层面实现多线程的单独调DB2的load命令进行装载
      这样带来的问题是性能会比较低。

4. 应用服务器上创建一个shell,通过shell命令调用load命令进行加载

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30487710/viewspace-2124839/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30487710/viewspace-2124839/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值