Informix快速导入海量数据

需求:创建一个informix数据库和关系表,并且向表中导入一亿数据量,数据源是50GB左右的unl文件。

1.迁移物理日志和逻辑日志

Informix数据库默认的物理日志和逻辑日志均在rootdbs,通常配置较低。通常对大表的数据操作,会因为逻辑日志文件太小而导致long transaction的事务失败。如果磁盘空间充足,应将物理日志和逻辑日志迁移到独立的数据库空间,每个逻辑日志的最大大小是1GB。

#1.创建物理日志和逻辑日志chunk
cd $INFORMIXDIR/tmp
touch plogchk
touch llogchk
chmod 660 *chk
#2.新建物理日志和逻辑日志专用数据库空间plogdbs和llogdbs(依据onstat -g ckp提示建议的空间大小设定)
onspaces -c -d plogdbs -p $INFORMIXDIR/tmp/plogchk -o 0 -s 10240000
onspaces -c -d llogdbs -p $INFORMIXDIR/tmp/llogchk -o 0 -s 10240000
#3.迁移物理日志
onparams -p -s 10000000 -d plogdbs -y
#4.onstat -l查看逻辑存储空间个数,并创建6个逻辑存储空间
onparams -a -d llogdbs -s 1024000
onparams -a -d llogdbs -s 1024000
onparams -a -d llogdbs -s 1024000
onparams -a -d llogdbs -s 1024000
onparams -a -d llogdbs -s 1024000
onparams -a -d llogdbs -s 1024000
#5.不断运行以下命令,使当前逻辑日志切换到下一个,同时onstat -l查看,直到切换到非根空间的逻辑日志文件上为止
onmode -l
#6.确认所有旧的逻辑日志状态为UB,若存在UBL状态的逻辑日志,执行以下命令来强制执行检查点,确保状态切换到UB
onmode -c
#7.删除UB状态的旧逻辑日志
onparams -d -l <逻辑日志号>

2.为大表所在库创建独立的存储空间和临时表空间

临时数据库空间中禁止使用逻辑日志可减少在逻辑恢复期间要前滚的日志记录数,从而提高关键停机时间内的性能。并且还会减少存储空间备份的大小,因为数据库服务器不会备份临时数据库空间。

为大表创建独立的数据库空间和创建多个临时表空间,可以提高效率。如果是时间序列表使用TSL_Put装入数据,还应创建智能大对象空间SBSPACE。

#创建页大小为16KB的数据存储空间
cd $INFORMIXDIR/tmp
touch datachk
chmod 660 *chk
onspaces -c -d k16dbs -p $INFORMIXDIR/tmp/k16chk -o 0 -s 81920000 -k 16
#创建多个临时表空间
cd $INFORMIXDIR/tmp
touch temp_1_chk
touch temp_2_chk
touch temp_3_chk
chmod 660 *chk
onspaces -c -t -d tempdbs1 -p $INFORMIXDIR/tmp/temp_1_chk -o 0 -s 10240000
onspaces -c -t -d tempdbs2 -p $INFORMIXDIR/tmp/temp_2_chk -o 0 -s 10240000
onspaces -c -t -d tempdbs3 -p $INFORMIXDIR/tmp/temp_3_chk -o 0 -s 10240000
#修改配置文件的DBSPACETEMP参数为:
DBSPACETEMP tempdbs1, tempdbs2, tempdbs3

#时间序列装入数据,其中时间序列表名elec_ts,时间序列字段名meter_data
EXECUTE FUNCTION TSL_Init ('elec_ts','meter_data',3,4, NULL, '%Y-%m-%d %H:%M:%S.%F5','/tmp/rejects.log',NULL);
EXECUTE FUNCTION TSL_Put ('elec_ts|meter_data',FileToClob('/home/informix/7543/sino_without_id.unl','server'));
begin work;
EXECUTE FUNCTION TSL_Flush('elec_ts|meter_data', NULL, 257);
commit;
EXECUTE FUNCTION TSL_SessionClose ('elec_ts|meter_data');
EXECute PROCEDURE TSL_Shutdown ('elec_ts|meter_data');

3.数据库切换到无日志模式

数据插入阶段,切换到无日志模式可以提高数据库的吞吐量,插入完毕后还原数据库模式。测试环境如果不需要保留数据库的备份,切换之前使用onmode -wf TAPEDEV=/dev/null命令更改配置,使备份更迅速。切换后改回原来配置即可。

ontape -s -L 0 -N test 将数据库test从-U,-B,-A其中一种模式改变到-N模式,创建0级备份 

ontape -s -L 0 -U test将数据库test从-N改变到-U模式,创建0级备份 

ontape -s -L 0 -B test将数据库test从-N改变到-B模式,创建0级备份 

ontape -s -L 0 -A test将数据库test从-N改变到-A模式,创建0级备份 

-N  No Logging  没有日志

-U  Unbuffered Logging   非缓冲日志 

-B  Buffered Logging   缓冲日志 

-A  Unbuffered Logging, Mode ANSI   ANSI模式

查看当前数据库的日志模式:select * from sysmaster:sysdatabases;

4.使用load导入

对比以下工具后,选取load和dbload方式导入,经测试前者明显更快。load每次导入200万数据,循环50次,中间有失败的,二次执行重新导入失败的语句,1亿数据导入耗时约2+2小时;dbload设定每个事务导入200万行数据,执行24小时导入约3000万数据。

工具 描述 优点 不足 可用性
dbexport 和 dbimport 实用程序

向存储在磁盘或磁带中的文本文件导入或导出数据库

可以修改数据库模式并更改数据格式

可以在操作系统间移动数据

可选的日志记录功能

可以从非Informix数据源导入数据

速度比 dbload 实用程序快,但比 onload 实用程序慢。

移动整个数据库

 
dbload 实用程序

将数据从一个或多个文本文件传送到一个或多个现有表中。

可以修改数据库模式

可以在操作系统间移动数据

可选的日志记录功能

适中的易用性

可以从非Informix数据源导入数据

速度比 dbexport dbimport和 onload 实用程序慢  
onunload 和 onload实用程序

将数据库中的数据卸载到磁带或磁盘中的文件中;将通过 onunload命令创建的数据装入到数据库服务器中

速度快 可选的日志记录功能

只在同一操作系统上具有相同版本的数据库服务器间移动数据

无法修改数据库模式

日志记录必须关闭

使用难度大

不可用于:

  • SE 7.22-7.25 SE 5.1 或更早版本
  • OnLine 5.1 或更早版本
UNLOAD 和 LOAD 语句

卸载和装入特定的行

可以修改数据库模式

可以在操作系统间移动数据

易于使用

可选的日志记录功能

仅接受指定的数据格式

 
HPL

从符合某些格式要求的任何 ASCII 或 COBOL 文件装入数据

对于特大型数据库,与其他Informix数据迁移实用程序相比具有性能优势,因为它以并行方式执行 I/O 和代码集转换。

可以修改数据库模式

可以在操作系统间移动数据

可以从非Informix数据源导入数据

需要较长的准备时间

不可用于:

SE 7.22-7.25 SE 5.1x OnLine 5.1x

非日志记录原始表 装入特定类型的大型表 可以快速装入特大型的数据仓储表

不支持主要约束、唯一约束和回滚

需要 SQL

不建议在事务中使用

 
外部表 允许您从数据库服务器外部的源执行读写操作,从而为由操作系统管理的文本文件中的数据或 FIFO 设备中的数据提供 SQL 接口。 执行快速(高速)和高级(数据检查)传输

需要 SQL

 

你可能感兴趣的:(Informix)