ITPub博客

首页 > 数据库 > 数据库开发技术 > DB2远程异机装载失败原因

DB2远程异机装载失败原因

原创 数据库开发技术 作者:少卿2015 时间:2016-09-12 15:07:45 0 删除 编辑

需求:
测验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命令进行加载

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

上一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2015-09-16

  • 博文量
    2
  • 访问量
    2530