A Cooly Weblog

   ::  ::  ::  ::  :: 管理

【原创】BCP分页

Posted on 2006-07-17 17:59 acooly 阅读(198) 评论(0)  编辑  收藏 所属分类: Linux/Unix

   最近重庆移动BOSS1.0系统升级为BOSS1.5,原有与BOSS1.0相关的很多外围系统都需要做数据迁移,我们公司负责的渠道系统CMSS也需要做大量的数据迁移。在过程中,遇到一个问题。具体情况是:CMSS系统使用的是Sybase ASA 12.5数据库,BOSS1.5使用的是ORACLE,现在从sybase到oracle做数据迁移,有很多细节的问题会发生,比如日期格式问题等等,这些都好解决,最大的问题是BOSS1.5系统的迁移接口只能接受10万条记录的数据文件,但我们很多需要迁移的业务表都在几千万以上,没办法,为了解决这个问题,我只有使用向WEB系统查询时用的“分页”方式来处理我们的大业务表数据的导出,也就是BCP分页导入数据了。
   我是在Solaris上做了个shell程序来完成的。主要实现方式是:
   1.通过sybase的sp_spaceused系统存储过程得到大概的整表记录数,然后计算每页的起始记录位置。
   2.通过每页的起始记录位置,使用BCP工具导出每页数据到每个文件中。

代码如下:

1.按BOSS要求的命名方式生成文件名称(genfilename.sh)

 1 #  bash
 2 # author : zpu
 3 # generate file name
 4
 5
 6 function genfilename()
 7 {
 8 if  [  " $# "   !=   " 3 "  ] 
 9 then
10   echo Usage : genfilename tablename dirname filesequ type{ 0 : datafile; 1 : validatefile}
11    return   1
12 fi 
13
14 TABLENAME = $ 1
15 DIRNAME = $ 2
16 PREFIX = ${ 1 } @_ ${ 2 }_
17 if  [  " $4 "   !=   " 0 "  ]
18 then
19   PERFIX = ${ 1 }_${ 2 }_
20 fi
21 # echo $PREFIX
22 FID = $ 3
23 FID_LEN = `expr ${ # 3}`
24 POS = 00000
25 POS_LEN = 5  
26
27 POS = `expr ${ POS : 0 : ( 5 - $FID_LEN )}` $FID
28 # echo $POS
29 echo ${PREFIX}${ POS }
30 return   0
31 }
32 genfilename $ 1  $ 2  $ 3



2.计算目标业务表的总记录数(gettbcount.sh)

 1 #  bash
 2 # author : zpu
 3 # to do:calu table counts 
 4
 5 # env
 6 SYBASE =/ app / sybase /
 7 SYBASE_ASE = ASE - 12_5
 8 SYBASE_OCS = OCS - 12_5 
 9
10 APP_HOME =/ app / sybase / cmss2boss
11 DATA_TEMP =/ app / sybase / cmss2boss / temp
12 DBRESULT = $APP_HOME / dbresult . txt
13 .   $SYBASE / SYBASE . sh
14 TABLE = $ 1  
15
16 if  [  " $# "   !=   " 1 "  ]
17 then
18   echo Usage : getdbcount . sh tablename
19    exit
20 fi 
21
22 if  [  - " $DBRESULT "  ]
23 then
24   rm  - $DBRESULT
25 fi 
26
27 isql  - SINFO1  - Ucmssuser  - Pinfocmss_  << EOF   >   $DBRESULT
28 sp_spaceused  $TABLE
29 go
30 exit
31 EOF  
32
33 if  [  - " $DBRESULT "  ]
34 then
35  cat  $DBRESULT | grep   $TABLE | awk  ' {print $2} '   
36 fi 

 

3.FTP数据文件到接口机器(ftp.sh)

 1 #  bash
 2 # author : zpu
 3 # ftp data file to BOSS 
 4
 5 IP = 10.191 . xxx . xxx
 6 USER = myftp
 7 PSWD = myftp
 8 DATA_PATH =/ app / sybase / cmss2boss / temp
 9 cd  $DATA_PATH
10 ftp  - $IP   << EOF
11 $USER   $PSWD
12 bin
13 prompt
14 mput  *
15 EOF

 

4.主程序,分页生成数据文件(main.sh)

 

 1 # !/bin/sh
 2 # todo: main.sh 
 3
 4 if  [  " $# "   !=   " 1 "  ]
 5 then
 6   echo Usage : main . sh tablename
 7    exit
 8 fi 
 9
10 #  env
11 SYBASE =/ app / sybase /
12 SYBASE_ASE = ASE - 12_5
13 SYBASE_OCS = OCS - 12_5 
14
15 APP_HOME =/ app / sybase / cmss2boss
16 DATA_TEMP =/ app / sybase / cmss2boss / temp
17 # . $SYBASE/SYBASE.sh
18 TBCOUNT = ` $APP_HOME / getdbcount . sh IC_STOCK_DETAIL`
19 PAGECOUNT = 1
20 PAGESIZE = 100000  
21
22 TABLENAME = $ 1
23 OVERFLAG_FILENAME = COMPLETE 
24
25 if  [  " `expr $TBCOUNT % $PAGESIZE` "   !=   " 0 "  ]
26 then
27   PAGECOUNT = `expr  $TBCOUNT   /   $PAGESIZE `
28   PAGECOUNT = `expr  $PAGECOUNT   +   1 `
29 else
30   PAGECOUNT = `expr  $TBCOUNT   /  PAGESIZE`
31 fi 
32
33 echo  $PAGECOUNT  
34
35 i = 1
36 while  [  $i   - le  $PAGECOUNT  ];  do
37   echo bcp page  $i
38   FILENAME = ` $APP_HOME / genfilename . sh  $TABLENAME  ROOT  $i   0 `
39   START = `expr  $i   -   1 `
40   START = `expr  $START   \*   $PAGESIZE `
41   START = `expr  $START   +   1 `
42   END = `expr  $i   \*   $PAGESIZE `
43   echo star : $START
44   echo end : $END
45   bcp CMSS .. $TABLENAME  out  $DATA_TEMP / $FILENAME   - - t "  "   - r " \r\n "   - F $START   - L $END   - SINFO1  - Ucmssuser  - Pinfocmss_
46   VALIDATE_FILENAME = ` $APP_HOME / genfilename . sh  $TABLENAME  ROOT  $i   1 `
47   touch  $DATA_TEMP / ${VALIDATE_FILENAME}
48   i = `expr  $i   +   1
49 done
50 # complete flag file
51 touch  $DATA_TEMP / ${OVERFLAG_FILENAME} 
52
53 $APP_PATH / ftp . sh 
54
55 rm  - $DATA_TEMP /*  
56

 


 


 


只有注册用户登录后才能发表评论。


网站导航: