Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5561
  • 博文数量: 1
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2015-09-16 16:14
文章分类

全部博文(1)

文章存档

2016年(1)

我的朋友
最近访客

分类: DB2/Informix

2016-09-09 09:52:57


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

阅读(819) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:没有了

给主人留下些什么吧!~~