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把要生成的数据写在一个文本格式的文件当中,以APS的Base表为例:
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看只能看到一部分,因为太多会导致vi的buffer区溢出)。
上面的这个小程序,在实际的网上环境中可能用不到,因为实际的环境中只有数据导出。在实际的环境中,这个文本文件很可能是用unload从数据库中导出时生成的。
搞定scp213.txt后,还要写一个文件给Dbload用,假设这个文件就叫Load.db,它的格式如下:
file "scp213.txt" delimiter "|" 42;
insert into scp213.basetab_213;
其中,delimiter是分隔符的意思,因为我们上面的数据中是以“|”来做为分隔符的,所以在这里要把它写出来;42的代表的意思是,要插入的表的字段的个数,在这里Basetab_213有42个字段(注意字段个数一定要写正确,否则会出错)。
到了这里,我们就能使用Dbload这个东东了。首先把它的几个常用的参数说明一下:
-d 数据库名
-c 命令文件名(在这里我们的命令文件就是Load.db)
-l 日志文件
-n 每次要导入的数据量
-e 运行中超过多少错误就退出(一般是1条)
-i 本次导入数据从第i条导起
-r 导入时不锁表
-k 导入时所表
其它几个参数,暂时还不懂做何用处,这里先把这几个写出来。
需要注意的是:用DbLoad导入时,如果不指定-n,也就是不指定每次要导入多少条数据,默认的是每次导入100条,还有就是如果不指定是否锁表,一般情况下是锁表的;而锁表后导入数据的速度就比较慢了。所以在导入时,记得加-r,还有一点值得关注的是,如果这里要拿Load命令导入的话,超过一定的数据量,Informix为其分配的锁就会不足,导致导入数据失败(具体的锁的数目是在Informix的onconfig文件中设定的)。
下面举个简单的例子,具体需要的参数可参见上面的说明:
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的使用
1、dbexport
一般使用dbexport dbName即可。
执行后生成dbName.exp目录,其中有许多以数据库表名开头的unl文件,和一个dbName.sql文件。(需要以informix用户执行,在运行时需要独占数据库)
2、dbimport
一般使用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 filename;filename文件中得到sms20数据库中basetab0200表的建表SQL。