需求:1.由于我们有2台服务器SEVER A 和SERVER B,日常我们都将在SEVER
A机子SCHEMA=AIS上加载数据,
但希望SEVER B上也需要将有数据的表加载
2.SERVER A与SERVER B两台机子上对应表的结构的列顺序不一致
分析:1.由于在SERVER A上的各个表的数据文件已经无法找到,这时我们就需要将SERVER A机器上的数据
卸出来加载到SERVER
B中
2.SERVE A与SERVER B两台机器的列顺序不一致,因此需要对表进行指定列加载
执行步骤如下:
1.由于批量将SERVER
A表中的数据卸数变成文件,因此利用系统表SYSCAT.TABLES及SYSCAT.COLUMNS
系统视图拼出EXPORT语句
2.假设表TABLEA的列为(id int,name varchar(100),sex
varchar(2)),其EXPORT语句为:
EXPORT TO ./TABLEA.del of del
select
id
,name
,sex
from TABLEA
3.根据2中的EXPORT语法,因此我们将需要拼出3段语句出来,第一段:EXPORT
TO ./TABLEA.del
of
del select和第段: from TABLEA我们
可以根据SYSCAT.TABLES中拼出,中间的列信息使用
SYSCAT.COLUMNS中得出,然后使用UNION ALL 连接,如下所示:
db2 -o -x " select aa from
( select tabname,colno,case when
colno<>0 then ', ' else
' ' end ||
colname aa
from syscat.columns
A where tabschema='AIS' AND TABNAME LIKE 'S04%'
AND EXISTS
(SELECT * FROM syscat.tables B WHERE
A.TABNAME=B.TABNAME AND CARD>0 AND
tabschema='AIS' )
union
all
select tabname,-1,'export to
./'||tabname||'.del of del
select ' from syscat.tables
where tabschema='AIS' AND TABNAME LIKE 'S04%' AND
CARD>0
union
all
select tabname,9999,'from
'||tabname ||'@' from
syscat.tables
where
tabschema='AIS' AND TABNAME LIKE 'S04%' AND
CARD>0
) B order by tabname,colno
">export.sql
注:1.由于3个SQL使用UNION
ALL拼出后的结果就三块,如需得到2中的结果将需要按表名及对应的列序号排
序
select tabname,-1,'export to
./'||tabname||'.del of del
select ' from
syscat.tables
where tabschema='AIS' AND TABNAME LIKE
'S04%' AND CARD>0
这句SQL是每张表的抬头而SYSCAT.COLUMNS中的列号都是从0开始的,因此给它赋值“-1”,同样第3个语
句是因为没有含有9999字段的表,赋值这个将在表的最后
2.由于每个表中的第一列不需要拼出逗号,因此使用了CASE WHEN判断,若colno=0,则直接拼空,否则拼
逗号
3.需要将拼出的语句放在一个文本中,然后执行此SQL文本即将各个表的数据卸载出来
(使用db2 -td@ -v -f命令) ,因此需要将每个SQL命令指定分隔符(这个分隔符可自定义)
4. db2 -td @ -v -f export.sql
5.在SERVER A中拼出load语句:
db2 -o -x " select aa from
(
select tabname,colno,case when
colno<>0 then ', ' else
' ' end || colname aa
from syscat.columns
A where
tabschema='AIS' AND TABNAME LIKE 'S03%'
AND
EXISTS(SELECT * FROM syscat.tables B WHERE
A.TABNAME=B.TABNAME AND CARD>0
AND tabschema='AIS'
)
union
all
select tabname,-1,'load from
./'||tabname||'.del of del savecount 10000
insert into
'||tabname||'(' from
syscat.tables where
tabschema='AIS' AND TABNAME
LIKE 'S04%' AND
CARD>0
union
all
select tabname,9999,') ' ||' nonrecorverable @'
from syscat.tables
where tabschema='AIS' AND TABNAME LIKE 'S04%' AND
CARD>0
)
B order by tabname,colno"
>load.sql
6.将load.sql文件与执行4后生成的数据文件传到server B中
7.执行import.sql文件进行加载数据
db2 -td@ -v -f load.sql
加载中,请稍候......