DBLOAD

来源:互联网 发布:范思哲云淡风轻知乎 编辑:程序博客网 时间:2024/06/09 20:57

优化装载数据的环境

在进行批量数据载入时,可以从以下几个方面优化装载数据的环境,以提高数据载入的效率:

·在dbaccess环境中检查载入数据涉及的表所创建的索引,使用命令“DROP INDEX索引名”删除该表所有的索引 

·使用命令“ontape -N 数据库名”将数据库改为 no logging 方式

·使用命令“alter table 表名 modify next size  size值”增大表的next extent  size的大小

·修改onconfig配置文件,将配置项NUMCPUVPS设置为CPU的数目

·修改onconfig配置文件,修改CKPTINTVL的值,增加check point的间隔时间,从而减少check point 的次数

·修改onconfig配置文件,增大LUR_MAX_DIRTY值(如改为80)和LUR_MIN_DIRTY(如改为70),这样也可以减少check point的次数,提高数据载入的效率

 

 

 

                                                Dbload的使用

 

       在实际的开局或升级过程中,往往会用到Dbload这个小工具,虽小,还能帮不少忙,特别是对于工程部的弟兄们。

 

       要使用Dbload,首先要写一个小的shell把要生成的数据写在一个文本格式的文件当中,以APSBase表为例:

 

awk 'BEGIN {ii=9999}

   {

     for (i=1000;i<ii;i++)

     print "0106"i"|0|0106"i"|1|0|00000000|0|0|10000|10000|00|0|0|1|0|0|y001|"i"|2|20020308|20030308|101|1|0|00000000000000|0|0|0|0|0|0106"i"|1|20020308000000|0|0|0|0|0|00000000000000|1|00000000000000|-1|"

         exit

          }'>scp213.txt

有错

 

执行上面这个小程序后,就会把生成的数据放在scp213.txt文件当中,可以用vi查看一下(如果数据很多的话,用vi看只能看到一部分,因为太多会导致vibuffer区溢出)。

       上面的这个小程序,在实际的网上环境中可能用不到,因为实际的环境中只有数据导出。在实际的环境中,这个文本文件很可能是用unload从数据库中导出时生成的。

        搞定scp213.txt后,还要写一个文件给Dbload用,假设这个文件就叫Load.db,它的格式如下:

         file "scp213.txt" delimiter "|" 42;

         insert into scp213.basetab_213;

 

其中,delimiter是分隔符的意思,因为我们上面的数据中是以“|”来做为分隔符的,所以在这里要把它写出来;42的代表的意思是,要插入的表的字段的个数,在这里Basetab_21342个字段(注意字段个数一定要写正确,否则会出错)。

       到了这里,我们就能使用Dbload这个东东了。首先把它的几个常用的参数说明一下:

       -d  数据库名

       -c  命令文件名(在这里我们的命令文件就是Load.db

       -l   日志文件

       -n  每次要导入的数据量

       -e   运行中超过多少错误就退出(一般是1条)

       -i   本次导入数据从第i条导起

       -r  导入时不锁表

       -k  导入时所表

其它几个参数,暂时还不懂做何用处,这里先把这几个写出来。

需要注意的是:用DbLoad导入时,如果不指定-n,也就是不指定每次要导入多少条数据,默认的是每次导入100条,还有就是如果不指定是否锁表,一般情况下是锁表的;而锁表后导入数据的速度就比较慢了。所以在导入时,记得加-r,还有一点值得关注的是,如果这里要拿Load命令导入的话,超过一定的数据量,Informix为其分配的锁就会不足,导致导入数据失败(具体的锁的数目是在Informixonconfig文件中设定的)。

        下面举个简单的例子,具体需要的参数可参见上面的说明:

      Dbload -d scpaps -c load.db -n 10000 -e 1 -l  load.log -r

至此,我所理解的Dbload就介绍完了,兄弟们多多指教,多谢!

 

dbload命令的语法为:

dbload -d   数据库名 -c   命令文件名  -l   日志文件名

 

命令文件内容的格式:

file  "数据文件名"  delimiter  "|"    数据文件一行中域的个数;

insert into数据表名;

 

日志文件名可以随便取。

 

例如,向insmcp数据库中导入卡号,卡号数据文件名称为base.txt,文件中每行有20个域,域与域之间由“|”分隔。

 

首先编辑命令文件,文件名设为base.tgl,文件内容如下:

file  "base.txt"  delimiter "|"   20;

insert  into  basetab_0201;

 

smcp用户下,执行如下命令:

Dbload  -d insmcp  -c  base.tgl  -l  base.log

 

执行上述命令时确保base.txt文件和base.tgl文件在当前目录下。

 

 

dbexport的使用

1dbexport

一般使用dbexport  dbName即可。

执行后生成dbName.exp目录,其中有许多以数据库表名开头的unl文件,和一个dbName.sql文件。(需要以informix用户执行,在运行时需要独占数据库)

2dbimport

一般使用dbimport dbName -l buffered -f dbName.sql即可。-l表示逻辑日志模式,是必须参数,否则将不能对新数据库进行操作。该命令相当于数据库dbname的一个copy

执行该命令需要在dbName.exp目录的同级目录。

 

 

这是我在内蒙古智能网新旧系统数据转换的一个方法,给各位共享,不对的地方,敬请各位同事指正。

新旧系统数据库名及其所属用户名不一致的方法

   在旧系统SMP上数据库名为“insms20”,属主用户为“smp20”,

   在新系统SMP上数据库名为“insms”,属主用户为“sms”,

  要求将“insms20”所有数据转入新系统且数据库名为“insms”

1.旧系统数据卸出

         su - informix

mkdir smpdb

cd smpdb

dbexport insms -o /opt/informix/smpdb -c -ss

tar cvf smpdb.tar *

compress smpdb.tar

用FTP工具bin方式将smpdb.tat.Z文件传入新系统指定目录下

2.新系统数据装入

          su - sms

cd /sms/smpdb

uncompress smpdb.tar.Z

tar xvf smpdb.tar

mkdir insms.exp

mv insms20.exp/*    insms.exp   

 rmdir insms20.exp

 cd insms.exp

 mv insms20.sql insms.sql

 vi insms.sql

:g/insms20/s//insms/g  #将文件中“insms20”替换为“insms”,即原数据库名insms20改为insms

:g/smp20/s//sms/g      #将原用户名smp20改为sms用户

:wq                 # 存盘退出

dbimport insms -i  /sms/smpdb -d workdbs -c

   现在即完成由旧系统数据装入新系统并使其数据库名与旧系统不同

 

 

 

dbschema的使用

dbsehema可以得到一个已经存在的表建表SQL

dbschema -t basetab0200 -d sms20 -ss filenamefilename文件中得到sms20数据库中basetab0200表的建表SQL