您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页INFORMIX数据库技术手册

INFORMIX数据库技术手册

来源:小侦探旅游网


目 录

数据库对象

数据块 —————————————————— 4 数据空间 ————————————————— 4 数据库 —————————————————— 4 数据表 —————————————————— 4 索引 ——————————————————— 6 视图 ——————————————————— 7 查询 ——————————————————— 7 存储过程 ————————————————— 8 触发器 —————————————————— 10 组合 ——————————————————— 11

性能调节语句分析

Set Isolation ——————————————— 11 Set Optimization ————————————— 11 Set Pdqpriority —————————————— 12 Set Lock Mode —————————————— 12 Set Log ————————————————— 12 Lock Table ———————————————— 12 Set Transaction —————————————— 12

常用命令

Set Explain ——————————————— 12 Unload to ———————————————— 12 Load —————————————————— 12

常用实用程序

onmonitor ———————————————— 13 dbaccess ———————————————— 13 dbschema ———————————————— 13 dbexport、dbimport ——————————— 13 onstat ———————————————— 13 oncheck ———————————————— 13 onmode ———————————————— 13 其他 ————————————————— 13

Esql语法

头文件的引用 ——————————————— 13 嵌入式语法 ———————————————— 13 执行动态语句 ——————————————— 14 游标使用分析 ——————————————— 15 ESQL数据类型 —————————————— 19 UNIX编译命令 —————————————— 20

环境和配置文件sqlhosts ------------------------------- 20

系统安全 ------------------------------------------ 21

配置文件(onconfig) ---------------------------------- 21

1 ADTERR ---------------------------------------- 21 2 ADTMODE -------------------------------------- 21 3 ADTPATH ---------------------------------------- 21 4 ADTSIZE ----------------------------------------- 21 5 AFF_NPROCS ----------------------------------- 22 6 AFF_SPROC ------------------------------------- 22 7 MULTIPROCESSOR ---------------------------- 22 8 NUMCPUVPS ------------------------------------- 22 9 NUMAIOVPS ------------------------------------- 22 10 SINGLE_CPU_VP --------------------------------- 23 11 ALARMPROGRAM ------------------------------- 23 12 CONSOLE ---------------------------------------- 23 13 MSGPATH ---------------------------------------- 23 14 BUFFERS ---------------------------------------- 23 15 SHMADD ---------------------------------------- 24 16 SHMBASE --------------------------------------- 24 17 SHMVIRTSIZE ---------------------------------- 24 18 SHMTOTAL -------------------------------------- 24 19 STACKSIZE -------------------------------------- 24 20 CHUNKS ----------------------------------------- 25 21 DBSPACE ---------------------------------------- 25 22 DBSPACETEMP --------------------------------- 25 23 TBLSPACES -------------------------------------- 25 24 ROOTNAME-------------------------------------- 26 25 ROOTOFFSET ------------------------------------ 26 26 ROOTPATH --------------------------------------- 26 27 ROOTSIZE----------------------------------------- 26 28 SERVERNUM ------------------------------------- 26 29 DBSERVERNAME -------------------------------- 27 30 DBSERVERALIASE ------------------------------ 27 31 NETTYPE ---------------------------------------- 27 32 MIRROR ----------------------------------------- 27 33 MIRRORPATH ----------------------------------- 28 34 MIRROROFFSET -------------------------------- 28 35 LOGFILES -------------------------------------- 28 36 LOGBUFF ---------------------------------------- 28 37 LOGSIZE ----------------------------------------- 29 38 LOGMAX ---------------------------------------- 29 39 DUMPDIR --------------------------------------- 29 40 DUMPCNT -------------------------------------- 29 41 DUMPCORE ------------------------------------- 29

42 DUMPGCORE ------------------------------------ 29

43 DUMPSHMEM ----------------------------------- 30 44 TAPEDEV ---------------------------------------- 30 45 TAPEBLK ---------------------------------------- 30 46 TAPSIZE ---------------------------------------- 31 47 LTAPEDEV -------------------------------------- 31 48 LTAPEBLK -------------------------------------- 31 49 LTAPESIZE -------------------------------------- 31 50 CHPTINTVAL ------------------------------------ 31 51 CLEARNERS ------------------------------------- 31 52 DATASKIP ---------------------------------------- 32 53 NOAGE -------------------------------------------- 32 FILLFACTOR -------------------------------------- 32 55 OPTCOMPIND ------------------------------------ 32 56 RESIDENT ----------------------------------------- 33 57 STAGEBLOB --------------------------------------- 33 58 TXTIMEOUT -------------------------------------- 33 59 USEOSTIME -------------------------------------- 33 60 TRANSACTIONS ------------------------------ ----- 33 61 LOCKS ------------------------------------------ 34 62 DEADLOCK_TIMEOUT ------------------------- 34 63 USERTHREADS ---------------------------------- 34 PHYSDBS ---------------------------------------- 35 65 PHYSFILE --------------------------------------- 35 66 PHYSBUFF --------------------------------------- 35 67 MAX_PDQPRIORITY ---------------------------- 35 68 PDQPRIORITY ---------------------------------- 36 69 DRAUTO ---------------------------------------- 36 70 DRINTERVAL ----------------------------------- 36 71 DRLOSTFOUND ----------------------------------- 36 72 DRTIMEOUT ------------------------------------- 37 73 DS_MAX_QUERIES ------------------------------- 37

74 DS_MAX_SCANS --------------------------------- 37 75 DS_TOTAL_MEMORY ---------------------------- 39 76 LRUS ------------------------------------------- 39 77 LRU_MAX_DIRTY ------------------------------- 39 78 LRU_MIN_DIRTY --------------------------------- 40 79 LTXEHWM --------------------------------------- 40 80 LTXHWM ----------------------------------------- 40 81 OFF_RECVRY_THREADS --------------------------41 82 ON_RECVRY_THREADS ---------------------------- 41 83 RA_PAGES ---------------------------------------- 41 84 RA_THRESHOLD --------------------------------- 42

一 数据库对象分析:

数据库对象的建立,修改与删除操作一般不应放在一个事务中,它的执行会自动

导致提交动作,将破坏事务的完整性。数据对象的引用格式为 DatabaseName@DBServerName:UserName.ObjectName 但某些部分可以不提供而使用缺省值。 Example:

testdb@tellin_server:informix.student.age testdb@tellin_server_net:student.name Drop testdb:student

UNIX操作系统Shell的命令行参数中一般不须指定数据库服务器名。

1:数据块(Chunk)

数据量大的数据块(Chunk)建立在专用裸设备上。对应的设备文件的文件主应为 Informix,其访问权限一般应为666。 touch data01 或 由已有的裸设备 chown informix data01 chmod 666 data01

Informix 的用户与操作系统一致。安装Informix 前必须建立Informix用户并 授予相应的权限。Grant,Revoke 控制表,视图,存储过程的权限。

2: 数据空间(DBSpace)

建立数据空间时要指定设备文件名,偏移,大小,并指定其临时和镜像特性。 Onmonitor工具提供了数据空间的菜单操作,特别注意的是我们可以为一个 DBSpace 扩充 Chunk。BlobSpace 专用于存放BYTE、TEXT型二进制数据 它不经过共享内存缓冲区以直接方式写盘,然而当一个BlobSpace空间大于两 倍DbSpace空间时,数据库性能会降低,BlobPage大小可由用户设置,合适 的值可提高数据库性能,PowerBuild开发工具中有专门从事二进制数据类型操 作的Blob数据类型和相应得语句。

3: 数据库(Database)

Create Database DatabaseName [In Dbspace] [With {[Bufferd]Log|Log Mod Ansi}]

当不指定数据空间时,数据字典系统表建立在Root 数据空间(Root DBSpace)上, 并且在这个库上建其它表时,数据字典所在的表空间为却省表空间,而建立临时表

时,却省数据空间为环境变量 DBSPACETEMP,但使用Fragment语句可以使表空间 分布在多个数据空间上(参考CreateTable), Database DatabaseName 语句切换数据 库。对应的关闭语句为 Close Database没有日志的数据库将不能处理事务功能。 我们可以使用 Ontape –s [-B|-A|-U|-N] DatabaseList 改变数据库的日志状态。 Oninit –p 初始化时将不操作临时表空间。

4: 数据表(Table)

Create {Table TableName(ColumnDefinition [ConstraintDefinition])| TmpTableClause}

[WithRowIds][StorageOption][LockOption]

使用适时变量

1: Current 2:DateTime 2: TODAY 3: User

4: SiteName 5: DBServerName

ConstraintDefinition

1: Unique 2: PrimaryKey 3: Check 4: Default 5: ForeignKey …References…

外键说明

Foreign Key (ref_num,ref_type) References accounts [(acc_num, Acc_type)] [On Delete Cascade]

外键用于保证表间数据的逻辑一致性,只有在主键表(父表 )中已存在该主 键列值,外键表(子表 )才能插入相应列值记录。而删除主键表记录时,必须保证 与之对应的外键列值的外键表中的记录都已删除。当不指定主键表中主键列时, 缺省为该表已存在的主键,而 On Delete Cascade 属性保证,在删除父表记录 时,对应子表中的记录将由数据库自动删除。

LockOption

Lock Mode {Page|Row}

行锁可以提高是务的并行性,甚至可以申请多于设置的最大锁数,但锁的开 销将很大 。对于需要成块操作的聚族索引表,设置成行锁是一个极好的方案。 它不仅可以减少锁的开销,而且大大提高数据的访问速度。例如,银行营业数据 表宜采用行锁,而库存数据经常设置成页锁。

StoregeOption

建立的表只有分段时才能带WithRowIds属性。非分段表总是包含一个隐含的 RowId 域。而分段表必须有WithRowIds属性时才会有这个命名为RowId 的字段, 它将用于服务器查询时定位记录,然而它会增加磁盘开销。

ExtentSize firstZKB NextSize nextKB 分别指定分配接新表空间的大小(KB为单 位),最小值为4页,缺省值为8Kb,最大值为整个数据块。AlterTable语句可以修改 NextSize的值。

非分段表在所在数据空间用完时,可以为该数据空间增加数据块。分段表空间 可以为其增加段,但无论何时,插入的记录如果未安排段,插入操作将失败。 指定存储分段有四种方案 Expression

1:Rang 2: Hash 3: Arbitrary Round Robin

4: Round Robin DBSpaceList

FrangmentClause将用于制定表的存储表空间DbSpace、BlobSpace,数据量大的 表安排在多个设备可提高并发处理能力。

使用Alter Fragment 可以重新指定或修改表或索引的分段方案。 Alter Fragment On {SurivingTableName|SurivingIndexName}

{ AttachClause|DetachClause|InitClause|AddClause|DropClause|ModifyClause}

AttachClause将多个分段或未分段表和并到一个表,但要求这些表结构完全一

致。

InitClause重新安排表的分段属性或去掉其分段属性。 AddClause和DropClause用语增加和删除表的分段。 ModifyClause用语重新调整表的分段。

DetachClause 会分离出一个数据空间并建立一个新表。

影响数据一致性性的AlterFragment将失败。 Example

Alter Fragment On Table cur_acct Attach cur_acct,new_acct; Alter Fragment On Table cur_acct Attach old_acct As a>=10; 当old_acct 中有a<10的数据时,操作将失败。

Alter Fragment On Table cur_acct Init With RowIds Fragment By testdbspace,workdbs;

Alter Fragment On Table cur_acct Modify dpsp1 To acct_num<35 In dpsp2 当表cur_acct为空或有a<=35的记录时,操作将失败。 Alter Fragment On Table cur_acct Detach dpsp3 cli_acct; 当cur_acct在dpsp3上有数据时操作将失败。

5: 索引(Index)

Create [Unique|Distinct][Cluster] Index IndexName On {TableName|Synonym} (ColumnNameListWithAscOrDesc) FillFactor percent [In DBSpace| FragmentClause]

当在一个表上某列已建立UniqueConstraint 时,便已在该表上建立对应该列 的UniqueAscIndex,所以再次在该列上建立Asc索引将失败。

我们可以在一个表上建立对应某些列的多个索引,单要求某列的索引顺序只有 一种。

Cluster指定索引的聚族属性,具有聚族索引属性表的物理存储顺序将重新安 排与其索引一致。它将加速表的查询与修改,但对表的插入和删除将需要更大的开 销。并且索引的聚族属性对应单位为DBSpace,而非整个表。一个表最多只能有一 个聚族索引,但 Alter Index IndexName To [Not] Cluster 语句可以将聚族属性移 到另外一个索引上。

FillFactor的缺省值为90,它确定了索引数据结构(B+树,Hash桶)的紧凑程度, 低紧凑度的索引将使数据的插入操作变的非常的快。而高紧凑度的索引将使数据的 查询性能大大提高。但需要注意的是,装填因子只有在表的记录数超过5,000条并 且占用空间超过100页时才发生效用,再分段表上建立索引或建立分段索引时, FillFactor的缺省值也可以设置在Onconfig配置文件的FILLFACTOR上。

当不指定DBSpace时,其存储位置与表的数据空间安排方案一致,Fragment 也可以重新安排表的存储数据空间。

6:视图(View)

Create ViewName(ColumnName)As SelectClause [WithCheckOption]

在查询子句中,OrderBy,IntoTemp,Union操作是不容许的,并且不能使用 列显示标志,它们为相应表的列名。WithCheckOption子句是我们不能通过视图 对相应表不可视的记录进行访问,也不能插入不符合视图定义的记录。

7: 查询(Query)

Select [All|Unique|Distinct] {Expression As ShowLabel|ColumnName,…} FromClause[WhereClause][HavingClause][GroupByClause][OrderByClause] [IntoTemp TableName[With No Log]] [Union[All] SelectClause]

SQLCOD(sqlca.sqlcode)检查查询结果,也可以使用函数

DbInfo(“sqlca.sqlerrd2”)来检查查询结果。ForUpdate一般用于Prepare语句 中,此时的Declare语句中省略ForUpdate,但游标具有可修改属性。

Into Temp建立的临时表的缺省数据空间为RootDBSpace,而环境变量 DBSPACETEMP的优先级高于ONCONFIG配致文件中DBSPACETEMP 的设置值。

Union 操作要求每个查询中的查询项目数相同,并且对应项目的数据类型 相兼容。如果没有All属性,相同的记录将合并为一个。

外(Outer)查询保证即使第二个表或视图中没有符合条件的记录,它也能以 空值与第一个表中相应的记录结合生成一条查询结果。

在WhereClause中,数据库系统先扫描前面的表,再扫描后面的表,所以 一般将数据量较少的表或视图放在前面,因为这样设计可以减少时间和内存开 销(SetExplainOn跟踪报告)。

Example 1:

Select Tab1.name,Tab2.name From customer Tab1,Outer Company Tab2 Where Tab1.dp_no=Tab2.dp_no;

此时,即使某个顾客没有工作单位信息,也能生成一条单位名为空值的记 录。

Example 2:

$Decalre q_curs Cursor For Select lname,Company Into :p_lname, :p_compay From customer; $Open q_curs;

while(SQLCODE==0) { $Fetch q_curs;

printf(“name=%s Company= %s \\n”,p_lname,p_compay) }

$Close q_curs; $Free q_curs;

Example 3:

$Decalre q_curs Cursor For Select lname,Company From customer; $Open q_curs;

while(SQLCODE==0)

{ $Fetch q_curs Into :p_lname,:p_company;

printf(“name=%s Company= %s \\n”,p_lname,p_compay) }

$Close q_curs; $Free q_curs;

Example 4:

$Select lname ,Company Into :p_lname,:p_company From customer Where sale_no=”705”;

此时,如果返回记录多余一条时,操作将出错。这种方式一般用于sale_no 能唯一确定一条记录时,例如这个域为唯一索引,主键或有UniqueConstraint属性。

8 : 存储过程(Procedure)

Create [dba] Procedure ProcedureName(ParameterList) [ReturningClause] [OnExceptionProcess][MainStatementBlock]EndProcedure;

带有dba 属性时,存储过程对象便具有dba(DatabaseAmphitryon)特权 (dba_privilege)属性,否则,它为主人特权 (owner_privilege) 属性。

OnExceptionProcess处理意外事件。Return VariableList[With Resume]将结果返

回,WithResume标识使存储过程返回后再次跳到返回点执行后面的语句,所以,

Informix存储过程有返回多行结果的特性,它可以作为Powerbuild数据窗口的数据源, 在各种数据库开发工具中,我们可以使用游标来取得它的多行返回结果。

执行存储过程 Example 1:

Execute Procedure ProcedureName(ParameterList); Example 2:

Call ProcedureName(ParameterList) Returning VariableList; 仅用于返回一行结果。 Example 3:

Foreach [exe_curs For] Execute ProcedureName(ParameterList); …

End Foreach; Example 4:

$Declare exe_curs For Execute ProcedureName(ParameterList); $Open exe_curs; …

$Close exe_curs; $Free exe_curs;

Informix的存储过程中在定义变量时没有进行初始化工作,后面的语句如果访问未

初始化的变量会发生例外错,如不对它进行处理,执行便会终止返回。变量的类型会最 可能地根据使用的方式不同而自动转换,转换失败同样回触发意外错。

Set Debuge File To pathname 可以设置存储过程执行中的踪迹文件,利用它可以调

试存储过程,但已调试好的存储过程应将跟踪语句去掉,因为它会大大增加执行时的开 销,Trace On打开跟踪,Trace off 关闭跟踪。 存储过程定义 Example 1:

create dba Procedure sel_stu() Returning Varchar(20);

Define tmp_name Varchar(20);

Set Debug File To \"/opt/informix/sel_stu.trace\"; Trace On;

Let tmp_name=\"\";

Foreach sel_stu For select name Into tmp_name From student

Return tmp_name With Resume; End Foreach;

Return \"mamamama\"; Return \"babababa\"; Trace off; End Procedure

Example 2:

Create Procedure ins_stu(beg int, end int,ObNo int,ObName Varchar(40)) Returning int,Varchar(40); Define ret_code Int;

Define ret_msg Varchar(40); Define tmp_no Int; Define err,IsamErr Int;

Define ErrText Varchar(40);

On Excepton Set err,IsamErr,ErrText; Return err,ErrText; End Exception;

Let ret_code=0; Let ret_msg=””; Let tmp_no=0; Let err_flag=0; If endRaise Exception 1001,1001, ”终止号应大于起始号!”; End If;

Begin Work;

For tmp_no=beg To end Step 1

Inserto Into store_tab Values(ObNo,ObName,tmp_no,); If DbInfo(‘sqlca.sqlerrd2’)<>1 Then

Raise Exception 1002,1002, ”插入库存表失败!”; End If; End For;

Commit Work; Let ret_code=0;

Let ret_msg=”加入库存成功!”; Return ret_code,ret_msg; End Procedure;

Esql 中可使用 Create Procedure From {‘FileName|VariableName} 从文件中生成 一个存储过程。

9: 触发器(Tigger)

Create Trigger TriggerName [Operation]On[TableName]{ActionClause|

[ReferencingClause][ActionClauseReferencing]}

ActionClause

[Before ActionList ] [ForeachRow ActionList] [After ActionList]

触发器可用于保证数据的逻辑一致性,使程序员在每一次对数据进行修改操作

(Update,Insert,Delete)时,能截取相应的操作参数,并可执行相应的处理,大大简化数 据库程序设计的难度。

值得注意的是,再对触发器的处理中,不应再执行触发触发器自身的操作,这用会 造成四循环,其次,触发器中要特别谨慎执行引起事务提交的动作,这样易造成事务的 不完整性。

在触发器或触发的存储过程中,我们可以访问这次会话所定义的全局变量,这样, 一次会话中各执行单元的联系变得非常容易。

10: 组合(Schema)

Create Schema Authorization UserName { CreateOprationList & GrantRevokeOperationList}

组合容许程序员将创建一组对象(Table,View,Index等)并为之授权形成一个完整的 组合,这样保证了数据库对象的完整性。

二 性能调节语句分析:

1: Set Isolation To {DirtyRead|CommitedRead|CursorStability|RepeateableRead}

隔离级别影响进程提取数据的并发性。非日志数据库的隔离级别不能被改变。我 们可以通过GetDiagnostics的RETURNED-SQLSTATE或sqlca来得到每一次数 据的结果。

Dirty Read:

在一个事务未结束时,只有这个级别容许进程读取不真实的数据 (PhantomRow),它是无日志数据库的却省级别。

Committed Row:

保证每次读到的都是最近依次提交时的数据。在读完一个记录后,由于再 也没有锁加在其上,故其他进程可以删除或修改这个记录。他是非ANSI-compliant 有日志数据库的缺省隔离级别。

Cursor Stability:

共享锁被加在取得的行上,其它进程可以获得当前记录上的共享锁,但不 能获得进行删除或修改访问的排它锁。当取到另外一行或游标关闭时,锁被释放。

Repeatable Read:

共享锁被加再一个事务中取到的每一行上,直到这个事物结束或游标关闭。 它是ANSI-compliant数据库的缺省隔离级别。

2: Set Optimization [High|Low]

优化级别作用于所有数据库,但仅应用于当前数据库服务器,缺省值为 High,它将耗用非常大时间和资源开销,并且很有可能会超出内存,但 InformixOnlineSever会比较提供结我们一个最好的数据库决策。Low优化级别 使某些操作速度会提高,但Online可能使用的并不是一个最佳策略。

一般来说,我们在创建(Create)数据库对象时使用High 优化级别采用最 佳策略,而在执行对象(Select,Update,Insert,Delete,Execute)时使用Low 优化级 别以提高速度。

3: Set Pdqpriority [Default|Low|Off|High|PercentOfResources]

不管环境变量Pdqpriority或Onconfig中的Pdqpriority设置为何值,Set Pdqpriority将使它们无效,但有效值总不能超过Onconfig中的Max_Pdqpriority 值。它指定数据查询的并行优化程度。

Default 使用Onconfig文件的Pdqpriority值,它是 -1 的标志。

Low 是缺省设置值,从表中查询数据的并仅以分段为单位。它是 1的 标志。

Off 并行执行方案被关闭,它的标志值为 0 。

High 最恰当的Pdqpriority值被使用,它将由处理器的数目,表的分段 数目,查询难度来确定。

PercentOfResourcse 它指定一个查询使用资源(内存,处理器等)使用百 分比,高的资源占用率当然表示查询执行的更好,但其他操作所能使用的资源 将得不到满足而使数据库性能下降。

4: Set Lock Mode To {Waite [Seconds]|Not Waite} Set [Bufferd] Log

缺省值为UnbufferedLog,BufferedLog使每次事务提交时都完整地写入

磁盘,保证了机器出故障时事务能完整回滚。而设置为BufferedLog可使事物提 交返回的快一些,但要承担由于突然故障而使事务不能回滚的风险,ANSI_ Compliant 数据库不能使用BufferedLog。

Set Transaction ReadWrite|ReadOnly|IsolationLevel{ReadCommitted| ReadUncommitted|RepeateableRead|Serializable} Lock Table TableName In {Share|Exclusive} Mode

如果数据库是带事物建立的,Lock Table 语句只能放在事务段的语句块中才能成 功,如果其他事务已排它锁定该表或当前事务欲排它锁定其它事务已共享锁定的表将会 失败,放在事务前后可以防止事务因等待锁而效率降低。

三 常用命令:

Set Explain {on|off}

控制每一次操作的开销存入一个名叫sqexplain.out的文件。

Unload to ‘FileName’ Delimiter ‘delimiter’ SelectClause 导出查询到数据文件。

Load ‘FileName’ Delimiter ‘delimiter’ InsertIntoClause 导入数据文件。

四 常用适用程序:

onmonitor提供建立数据空间、修改数据库配置、配份、日志等菜单操作。

dbaccess提供数据库、表,操作菜单,以及执行数据库命令的多行编辑界面。

dbschema以数据库命令形式导出数据库的对象。

dbexport、dbimport用于导入,导出数据库。

onstat报告数据库运行状态。

oncheck检查数据库信息。

onmode修改数据库运行状态。

onparams、onarchive、onlog、onload、onunload、ontape、onaudit等都是常用适用 程序,它们位于$INFORMIX/bin目录。

五 Esql 语法:

1:头文件的引用:

exec sql include sqlca; exec sql include sqltypes; $include sqlda; $Database tellin; $Close Database;

$Connect to ‘tellin@tellin_server’ As ‘A’ With Concurrent Transaction; $Set Connection ‘A’; $Disconnect ‘A’;

$Disconnect Current; $Disconnect All;

#include “/opt/informix/incl/esql/sqlhdr.h” $include “Sqlhdr.h”

/* 编译时使用参数 -I/opt/informix/incl/esql */

/* 使用Esql 编译时,这些库一般再编译脚码中引用 */

2: 嵌入式语法:

Exec Sql 或 美元符 置于句首,可执行绝大多数SQL语句,其中访问变量时应在 加冒号前缀,结构类型的定义应在BeginDeclareSection 和 EndDeclareSection之间。

3:执行动态语句:

Execute {statementId|StatementVairable} [Using Clause] [Into Clause]

Using {StorageVariable|SQL DESCRIPTOR{ StorageDescriptorQuote| StorageDescriptorVariable}|DESCRIPTOR StorageSqldaPointer}

Into {OutputVariable|SQL DESCRIPTOR { OutputDescriptorQuote| OutputDescriptorVariable} |DESCRIPTOR OutputSqldaPointer}

访问Sqlca全局变量检查执行结果

Example:

$Prepare sel_1 From “ Select fname,lname From custom Where customer_num=?”

$Execute sel_1 Into :fname,:lname Using :cust_num; printf(“fname: %s lname: %s” fnam,lname);

Execute Immediate {StatementVariableName|QuotedString}

不能立即执行下列语句:

Close Connect Declare Execute Execute Procedure(IfReturnValues) Fetch Get Diagnostics Open Get Descriptor Prepare

Select Set Connection Set Descriptor Whenever

Execute Procedure ProcedureName( [ArgumentList] ) [Into HostVariableList]

Example:

Exec Sql Execute Procedure add_col(t=”customer”,d=”integer” )

4: 游标使用分析:

Fetch[Next]Previous|Prior|First|Current|Relative[+|-]RowPositon| AbsoluteRowPosition] {CursorId|CursorVariable}

[Into {DataVariableList|DataStruct}| Using

{SQL DESCRIPTOR {DescriptorQuote|DescriptorVariable}|DESCRIPTOR SqldaPointer}]

使用步骤:

1:定义游标 2:打开游标

3:访问结果 4:关闭并释放游标

Example 1:

$Begin Declare Section;

char wanted_state[2]=”00”; short row_count=0; struct{

int c_no;

char fname[15]; char lname[15]; }cust_rec[100]; $End Declare Section;

$Conntect To “In@tellin_server_net”

$Declare cust_sel Cursor For Select * From customer Where state= :wanted_state; /***************

$Prepare cust_stmt From “Select * From customer Where state= :wanted_state”;

Declare cust_sel Cursor For cust_stmt; ***************/

$Open cust_sel;

$Fetch cust_sel Into:cust_rec[row_count];

while(SQLCODE==0)

{ printf(“\\n%s %s”, cust_rec[row_count]. fname,cust_rec[row_count].Lname); row_count++;

$Fetch cust_sel Into :cust_rec[row_count]; }

printf(“ \\n\\r” );

$Close cust_sel; $Free cust_sel; Example 2:

$Fetch selcurs Using Sql Descriptor ‘desc’; $Fetch selcurs Using Descriptor Point2;

游标访问冲突分析:

1:隔离级别为Cursor Stability时:

共享锁被加在取得的行上,其它进程可以获得当前记录上的共享锁,但不能获 得进行删除或修改访问的排它锁。当取到另外一行或游标关闭时,锁被释放。

2:隔离级别为Repeatable Read时:

共享锁被加再一个事务中取到的每一行上,直到这个事物结束或游标关闭。 它是ANSI-compliant数据库的缺省隔离级别。

3: 当建立的游标带有可修改属性(ForUpdate或写类型)时:

提升锁被加在每一个被提取的记录上,其他进程可以读它们(读锁),但不能获 得提升锁或写锁。

请参考Set Isolation语句分析。

Describe {StatementId|StatementIdVairant} {Using Sql Descriptor {DescriptorQuote| DescriptorVariable}|Into SqldaPointer}

我们通过sqlca来访问执行结果。

Example 1:

$Allocate Descriptor ‘desc1’ with max 3; $Prepare curs1 From ‘Select * From tab’; $Describe curs1 Using Sql Descriptor ‘desc1’; $Deallocate Descriptor ‘desc1’;

Get Descriptor {DescriptorQuote|DescriptorVariable}{HostVariable=COUNT| VALUE {ItemNumber|ItemNumberVariable} DescribedItemInfoList}

Example :

$Get Descriptror ‘desc1’ :h_count=COUNT; printf(“COUNT=%d\\n\\r”,h_count);

$Get Descriptor ‘desc1’ VALUE :Index :type=TYPE,:len=LENGTH,:name=NAME; printf(“Column %d: type= %d, len= %d,name=%s \\n\\r”,index,type,len,name);

Descriptor在 Fetch 和 Execute 语句中的使用(参见Fetch&Execute)举例: Main( ) {

Struct sqlda *demodesc; Int i;

$Begin Declare Section; char demo_select[200]; $End Declare Section;

$Database in@tellin_server_net;

sprintf(demo_select,”select * from student”); $Prepare iid From :demo_select; $Describe iid Into demodesc; for(i=0;isqld;i++) prsqlda(demodesc->sqlvar[i]); for(i=0;isqld;i++)

{ switch(demodesc->sqlvar[i].sqltype&sqltype) { case SQLCHAR:

demodesc->sqlvar[i].sqltype=CCHARTYPE; demodesc->sqlvar[i].sqllen++;

demodesc->sqlvar[i].sqldata=malloc(demodesc->sqlvar[i].sqllen);

break; case SQLSMINT: case SQLINT: case SQLSERIAL:

demodesc->sqlvar[I].sqltype=CINTTYPE;

demodesc->sqlvar[i].sqldata=malloc(sizeof(int)); break;

/* And So On For Each Type */ } }

$Prepare d_stmt from :demoselect; $Declare d_curs cursor for d_stmt; $Open d_cus; for(;;)

{ $Fetch d_curs Using Descriptor demodesc; if(sqlca.sqlcode!=0) break; for(i=0;Isqld;i++)

{ switch(demodesc->sqlvar[i].sqltype) { case CCHARTYPE:

printf(“%s: %s”,demodesc->sqlvar[I].sqlname, demodesc->sqlvar[I].sqldata); break;

case CINTTYPE:

printf(“%s: %d”,demodesc->sqlvar[I].sqlname, *((int *)demodesc->sqlvar[I].sqldata)); break;

/* And So On For Each Type */ } } }

$Close d_curs; $Free d_curs;

for(I=0;Isqld;I++)

free(demodesc->sqlvar[I].sqldata); }

prsqlda(struct sqlvar_struct * sp)

{ printf(“type=%d\\n”,sp->sqltype); printf(“len=%d\\n”,sp->sqllen); printf(“data=%lx\\n”,sp->sqldata); printf(“ind=%lx\\n”,sp->sqlind); printf(“name=%s\\n”,sp->sqlname); }

总结:

这是一个对任意表结构都适用的通用查询模块设计,它先从Describe语句获得 一个查询的描述,并为其数据域分配空间,然后为该查询定义游标,将Fetch得到 的查询结果置入描述对象中。

而对于确定的查询或存储过程的结果,我们可以直接为其定义游标,将Fetch得到 的返回数据赋给主机变量。

Example:

Exec Sql Prepare pre_exe From ‘Execute Procedure ins_proc(?,?,?)’

Exec Sql Declare s_curs For pre_exe Using :in_name,:in_age,:in_deptNo; Exec Sql Open s_curs;

Exec Sql Fetch s_curs Into :ret_code,:ret_msg; Exec Sql Close s_curs; Exec Sql Free s_curs;

游标种类:

1: Excute Procdure 2: Select … From …

3: Update … Where … 4: Select Into Temp … where … 5: Insert Into … Where … 6: Delete From … Where …

put语句强制将游标缓冲区得数据写入数据库。

Put {CursorId|CursorVariable} [From VariableList|Using {SqlDescriptor {DescriptorQuote| DescriptorVariable}|Descriptor SqldaPointer]

Example:

$Prepare pre_ins From “Insert Into customer Values(?,?,?,?); $Declare ins_curs Cursor For pre_ins;

/*要写入的数据放在结构中时,打开游标失败 */ $Open ins_curs;

$Put ins_curs From :name,:age,:pay_no,:address; $Close ins_curs; $Free ins_curs; $Commit Work;

Flush 语句强制游标调用Put将数据从缓冲区写入数据库。 Flush {CursorId|CursorVariable}

执行结果检查:

1: 数据被写入缓冲区,虽然未写入数据库,SQLCODE(sqlca.sqlcode) 和sqlca.sqlerrd[2] 被置零。 2: 数据被Put语句写入数据库时,SQLCODE 被置零, 并且sqlca.sqlerrd[2] 为写入的记录数。 3: 数据写入错误时,SQLCODE 置为非零, 并且sqlca.sqlerrd[2] 为已写入的记录数。 带日志数据库写入的数据只有在提交后才真正写入数据库。

5:ESQL数据类型:

#include”/opt/informix/esql/incl/sqltypes.h”

/******************** ClanguageTypes ***************************/ #define CCHARTYPE 100 #define CSHORTTYPE 101 #define CINTTYPE 102 #define CLONGTYPE 103 #define CFLOATTYPE 104 #define CDOUBLETYPE 105 #define CDECIMALTYPE 107 #define CFIXCHARTYPE 108 #define CSTRINGTYPE 109 #define CDATETYPE 110 #define CMONEYTYPE 111 #define CDTIMETYPE 112 #define CLOCATORTYPE 113 #define CVCHARTYPE 114 #define CINVTYPE 115 #define CFILETYPE 116 #define USERCOLL(x) ((x))

/********************************* *****************************/

/************C-ISAM types here as well as in isam.h*****************/ #define SQLCHAR 0 #define SQLSMINT 1 #define SQLINT 2 #define SQLFLOAT 3 #define SQLSMFLOAT 4 #define SQLDECIMAL 5 #define SQLSERIAL 6 #define SQLDATE 7 #define SQLMONEY 8 #define SQLNULL 9 #define SQLDTIME 10 #define SQLBYTES 11 #define SQLTEXT 12 #define SQLVCHAR 13 #define SQLINTERVAL 14 #define SQLNCHAR 15 #define SQLNVCHAR 16 #define SQLMAXTYPES 17 #define SQLTYPE 0x1F /* type mask */

#define SQLNONULL 0x100 /* disallow nulls */ #define SQLLABEL SQLINT

/********************************* *****************************/

6:UNIX编译命令:

1: Esqlc ObName.ec

2: cc –c -I/opt/informix/incl/esql ObName.c 3: rm ObName.c

4: cc -L/opt/informix/lib -L/opt/informix/lib/esql -lsql -lnsl_s -los -lgen –lasf ObName.o –o ObName 5: rm ObName.o 或者

1:Esql ObName.ec –o ObName 2:Rm ObName.c

都生成可执行文件ObName。

六 环境和配置文件$INFROMIX/etc/sqlhosts: /etc/hosts

DbserverName NetType HostName ServiceName rOption sOption kOption bValueOption

DbserverName对应Onconfig中的DBSERVERNAME,DBSERVERALIASES

NetType s1s2i1i2p1p2

s1s2 : on(Online),ol(Online),se(Informix-SE),dr(Informix_Getway with DRDA)

i1i2: ipc(interprocess communications), soc(sockets), tli(transport level interface)

p1p2: shm(shared-memory communication),tcp(TCP/IP network protocol), spx(IPX/SPX network protocol) HostName /etc/hosts中的对应主机名

SeriviceName /etc/service 中对应服务端口号 rOption 0/1 禁止或容许客户端的~/.netr对照

sOption 0 禁止服务器端的 /etc/hosts.equiv 和 /etc/.rhosts对照 1 禁止 /etc/hosts.equiv对照 2 禁止 ~/.rhosts对照

3 容许 /etc/hosts.equiv和~/.rhosts对照

kOption 0/1 禁止或容许周期检查网络服务连接(缺省为1) bValueOptiont 网络通讯缓冲区大小

$INFROMIX/etc/onconfig DBSERVERNAME ROOTPATH ROOTNAME %setenv ONCONFIG onconfig(缺省值为onconfig.std) %setenv INFORMIXSERVER tellin_server %setenv INFORMIXDIR /opt/informix %setenv PAHT $PATH;$INFORMIX/lib

如果机器上安装有Informix 5.0 产品 %setenv SQLEXEC $INFORMIX/lib/sqlrm %unsetenv SQLRM %unsetenv SQLRMDIR

Informix系统运行时会在 /tmp 目录下建立 .inf.ServiceName,VP.servernameC,而某些 UNXI系统管理员在cron例行处理中定时删除临时文件,可能会破坏Informix的运行。

使用自然语言支持(NLS)时,环境变量DBNLS,LANG,LC_xxx需要配置适当值。 /etc/system设置共享内存参数以使informix_online能分配到足够的共享内存。

七 系统安全:

chmod, grant/revoke /etc/passwd, /etc/shadow /etc/host.equiv,~/.rhosts

指定远程信托主机或用户 ~./netrc(Client Hosts)

指定连接用户和口令

八 配置文件(onconfig):

$setenv ONCONFIG onconfig(缺省值为 onconfig.std) 命令格式:

ParamName ParamValue # Comment

除编辑器可以直接修改外,Onmonitor实用程序可以修改大部分参数的值,修改 ParamValue 只能在指定范围内,并且修改后,必须重新Oninit启动后才生效,甚至 有些只有在共享内存初始化之后才起作用。

/************************ Audit **********************/ 1 ADTERR:

指定Online-server写稽核错时的动作。

0(halt, 缺省值)

当写稽核(audit)记录错误时,触发错误的会话停止直至写成功。 1(continue)

当写稽核(audit)记录错误时, Online-server将写一条错误放在信息日志中, 继续尝试写稽核,触发错误的会话继续运行。

Create Audit For {TableName|SynonymName} In ‘’PathName’ Drop Audit For {TableName|SynonymName}

当运行onaudit或共享内存初始化之后,ADTERR值必须为一。

2 ADTMODE:

控制用户的稽核是否有效。

0(disabled,缺省值)

打开稽核。 1(on)

使稽核无效。

3 ADTPATH:

指定稽核写路径。

取值范围 任何有效路径名 缺省值 /tmp

4 ADTSIZE:

指定稽核文件的最大尺寸。

取值范围 10000~2*10 ^9

缺省值 50000

当稽核文件达到最大尺寸时,Online将创建新的稽核文件。

/*********************** AffCpu&VitualCpu **********************/ 5 AFF_NPROCS:

指定绑定到虚拟Cpu的实际Cpu数,绑定将使虚拟Cpu 独占使用该Cpu。

取值范围 0~NumberOfCpus

6 AFF_SPROC:

指定虚拟Cpu绑定的起始位置。

取值范围 0~AFF_NPROCS 缺省值 0

7 MULTIPROCESSOR:

指定机器的多Cpu属性。

取值范围 0~1 缺省值 0

当MULTIPROCESSOR 设置为0时,AFF_NPROCS,AFF_SPROCS 被忽略。

8 NUMCPUVPS:

指定虚拟Cpu的数目。

取值范围 1~NumberOfCpus 缺省值 1

onmode -p [+] number {CPU|AIO|SHM|TLI|SOC} onmode - number CPU

onmode -r 重新产共享内存,$INFORMIX/etc/.infos.dbservername文件,必须设 置INFORMIXSERVER环境变量,用户不应修改此文件,它由Online产生和管理。

9 NUMAIOVPS:

指定AIO处理的虚拟Cpu数。

取值范围 大于或等于1

缺省值 2 MULTIPROCESSOR=0 或在单Cpu机器上

2*NumberOfChunks 或者 6 MULTIPROCESSOR>0

如果内核异步IO已启动,AIO虚拟处理Cpu执行所有磁盘I/O,包括写日志。否则, AIO用于写CookedFileSpace。

10 SINGLE_CPU_VP:

指定OnLine是否运行于单Cpu虚拟处理器方式。

取值范围 0或非零 缺省值 0

单Cpu虚拟处理器,指定SINGLE_CPU_VP为零时,OnLine将执行优化代码,减 少Multex互斥信号的调用,提高数据库性能。

/*****************DiaGnostics********************/ 11 ALARMPROGRAM:

指定Online记录NoteWorthy事件的应用程序。

取值范围 任何有效路径名 缺省值 空白

NoteWorthy事件包括 DataBase,Table,Index,Blob Failure Chunk,Dbspace TakenOffline

Initialization,InternalSubsystem Failure DetectionOfLongTransaction等

12 CONSOLE:

指定控制台消息的输出文件。

取值范围 任何有效文件名 缺省值 /dev/console

13 MSGPATH:

指定信息日志的路径。

取值范围 任何有效路径(各用户应有写权) 缺省值 /usr/informix/Online.log 未显示 /dev/tty

/****************ShareMemory********************/ 14 BUFFERS:

指定客户应用线索进行磁盘IO时的最大共享内存(系统页大小为单位)。

取值范围 4*NumberOfTransactions 或者 2000 小于500个用户时 2000 大于或等于500个用户时 缺省值 200

通常设为物理内存的百分之20~25,足够的共享内存可以使应用尽可能的从缓冲区中 取得数据,减少磁盘IO,达到好的性能。

oncheck -pr 检查根磁盘空间保留页,并显示系统页尺寸。

15 SHMADD:

附加共享内存段虚拟部分的大小(KB为单位)。

取值范围 1024~524288 缺省值 8192

足够的附加内存将使运行更有效

onstat -g seg 显示共享段的大小,已使用及未使用的空间

16 SHMBASE:

附加虚处理机存储空间上共享内存基地址值。

取值范围 明确的有效地址 缺省值 随平台而变

用户不应修改变此值

17 SHMVIRTSIZE:

虚拟共享内存段初始值大小(KB为单位)

取值范围 Min(UserThreads*200,8000)~MemoryVailable 缺省值 8000

未显示 UserThreads*200

如果信息日志中记录了共享内存虚拟部分正在增加段,则应考虑增加此值。

18 SHMTOTAL:

定Online使用的所有(Resident,Virtual,Communication)共享内存的大小(KB为单位)。

取值范围 大于或等于零 缺省值 0(不大小)

SHMTOTAL过小应用会失败,Online写一条错误信息到日志。

SizeOfResident + VirtualSegments + y > z Total Allowed by Configuration paramter SHMTOTAL

19 STACKSIZE:

指定用户线索堆栈的大小(KB为单位)。

取值范围 32~LimitOfConfiguration 缺省值 32

32KB已满足大部分数据库活动,取值过大只会浪费内存空间,并且容易导致磁盘交换 出错,对于递归数据库活动出现堆栈溢出时,Online会自动扩展堆栈空间,但这种决 策通常是不明智的。

/******************DataStore********************/ 20 CHUNKS:

指定Online可以支持的最大数据块数。

取值范围 MaxOpen-6 ~ 2047 缺省值 8

我们通常取接近系统容许的最大值。

21 DBSPACE:

指定Online所能管理的最大数据空间数。

取值范围 1~CHUNKS 缺省值 1

22 DBSPACETEMP:

指定Online用于存储临时表的数据空间列表,它们可以是标准数据空间,也可以是临 时数据空间。

取值范围 不大于2的字符串 缺省值 RootName

如果有足够的空间,排序,备份将建立在临时数据空间中,而带With No Log 选项的 临时表将建立在标准的数据空间上。

所有数据空间必须建立在原始设备(CHUNK)上。

如果没有设置该值时,GroupBy子句的HASH连接溢出将写到 /tmp 目录下。 Onmonitor,onspace用于建立数据空间。 用户可以设置环境变量DBSPACETEMP。

PSORT_DBTEM环境变量用语指定隐式分类文件目录。

23 TBLSPACES:

指定活动表空间数。

取值范围 100 ~ 3200 缺省值 200 未显示 100

计算时,包括临时表,系统表。

最小值必须大于任何某个数据库中最大表数,系统库计算时加2,这样才能执行

Drop Database 操作。

对于分段表应为其分成的段数。

24 ROOTNAME:

指定根数据空间名。

取值范围 长小于18的字符串

缺省值 rootdbs

25 ROOTOFFSET:

指定系统文件,设备文件中数据块离起始位置的偏移(KB为单位)。

取值范围 大于或等于零 缺省值 0

26 ROOTPATH:

指定初始数据块的位置。

取值范围 任何有效文件名 缺省值 /dev/online_root

ROOTPATH 作为一个数据块名存放在Online保留页内,对应的数据设备名 为ROOTNAME

必须为ROOTPATH授权为660

如为裸设备,Informix建议使用它的连接别名 在做oninit -is时,文件中的数据将丢失

27 ROOTSIZE:

指定根数据块的初始尺寸(KB为单位)

取值范围 0 ~ MaxCapacityOfDeviceStorage 缺省值 20000

/**************** DataServer &Connect ********************/ 28 SERVERNUM:

指出共享内存的相对位置。

取值范围 0 ~ 255 缺省值 0

该值的安排并不重要,但要求它必须唯一标识主机上的数据库服务器,而在网上并不要 求唯一。

Informix建议选定一个非零值来得到一个明智的服务器号。

29 DBSERVERNAME:

唯一标识Online-Server名称。

取值范围 长为18的小写字符串 缺省值 主机名

DBSERVERNAME 必须与sqlhosts文件中的配置一致 客户应用经常使用环境变量INFORMIXSERVER进行连接

30 DBSERVERALIASE:

多协议连接时,用于建立一个可以区别的服务器别名。

取值范围 长度小于或等于18的字符串 缺省值 无

sqlhosts文件中应与其一致

客户应用经常使用环境变量INFORMIXSERVER进行连接

31 NETTYPE:

指定网络连接类型。

Protocol ,PollThreads,Users,VPClass

Protocol i1i2p1p2(不应与sqlhosts文件配置冲突)

i1i2: ipc(interprocess communications), soc(sockets), tli(transport level interface)

p1p2: shm(shared-memory communication),tcp(TCP/IP network protocol), spx(IPX/SPX network protocol)

PollThreads 通常每个 PollThreads(管理连接线索数)大约可以处理200 ~ 250 个用户连

接,过多的客户应用需要增加PollThreads以提高性能,一般每个 PollThread 需要一个虚拟处理器。在单Cpu机器上, PollThreads运行多个虚拟处理器 可能不会提高数据库性能。

Users 指定这个Protocol在同一时间可以连接的最大用户数,过大的设置会浪费内 存,所以应根据实际应用来设置。

VPClass 指定PollThreads的运行位置。单Cpu机器一般指定为CPU,多客户应用连接在多 处理器服务器上时,却省时,如果客户使用DBSERVERNAME相连,则值为CPU, 用DBSERVERALIASES相连时,缺省值为NET,Online认为这样会达到更高的 效能。 取值范围

Protocol sqlhosts 文件中NetType格式减去头缀on或ol PollThreads 大于或等于1 Users 1 ~ USERTHREADS VPClass CPU 或 NET

缺省值

Protolcol sqlhosts 文件中NetType减去头缀on或ol PollThreads 1

Users USERTHREADS VPClass CPU

/****************** Mirror *********************/ 32 MIRROR:

指定镜像是否容许。

取值范围 0 ~ 1 缺省值 0

33 MIRRORPATH:

指定根数据块的路径,好象ROOTPATH一样,Informix建议使用实际数据块的连接 名。

取值范围 任何有效文件名 缺省值 无

34 MIRROROFFSET:

指定镜像数据块离文件起始位置的偏移(单位为KB)。

取值范围 大于或等于零 缺省值 0

/****************** LogicalLog ************************/ 35 LOGFILES:

指定初始化时逻辑日志文件数。

取值范围 3 ~ LOGMAX 缺省值 3

onparams或onmonitor可以增加或删除逻辑日志文件,修改其大小 onstat -l 显示逻辑日志文件

36 LOGBUFF:

指定共享内存中3个逻辑日志的大小(KB为单位)。

取值范围 2*PageSize ~ LOGSIZE 缺省值 32

如果其中一个再写磁盘时,则用户线索写向另一日志,另一日志满则写向第三日志 缓冲区。

Informix建议值为 16页

37 LOGSIZE:

指定逻辑日志文件建立时的大小(KB为单位),它不改变现存日志文件的尺寸。

取值范围 200 ~ (ROOTSIZE-PHYSILE-512-(63*((PageSize/1024)))/LOGFILES 缺省值 500

38 LOGMAX:

指定一个Online-server实例能支持的逻辑日志文件最大数。

取值范围 LOGFILES ~ 32767 缺省值 6 未显示 3

通常取值为LOGFILES,如果Online启动后需要再申请新的日志文件,Informix 建议值为3*LOGFILES。

/****************** Dump *********************/ 39 DUMPDIR:

指定ShareMemory,GcoreFiles,MessageFomFailedAssertion的存放位置。

取值范围 任何Informix可以访问到的路径 缺省值 /tmp

因为SharedMemory可能很大,应保证DUMPDIR有足够得空间

40 DUMPCNT:

单线索达到的最大故障数,达到最大次数时,Online卸出共享内存或调用gcore产生 一个core文件。

取值范围 任意整数 缺省值 2 未显示 1

41 DUMPCORE:

控制断言故障是否使得虚处理机卸出内核。

取值范围 0或1 缺省值 0

core文件存放在Online的最后激发路径,它不受DUMPDIR的影响 onmonitor.Parameters.diGnostics.DumpCore 修改配置值

42 DUMPGCORE:

仅同支持gcore实用程序的操作系统一起使用,在不支持gcore的操作系统上设置 DUMPGCORE为一,Online将在信息日志中写入

An attempt was made to dump core,but that Online is unable to find expectd file 此时,我们应设置DUMPCORE为一来代替。

取值范围 0或1 缺省值 1

core文件命名格式为 core.pid.cnt

pid为虚拟处理器进程标识号,cnt为断言故障序号,取值范围为1 ~ DUMPCNT

当cnt达到DUMPCNT时,Online不会生成更多的core文件,错误消息将写入 信息日志

43 DUMPSHMEM:

指定一个断言故障是否卸出共享内存

取值范围 0或1 缺省值 1

共享内存文件可能会非常大 命名格式 shmem.pid.cnt

pid为虚拟处理器进程标识号,cnt为断言故障序号,取值范围为1 ~ DUMPCNT

当cnt达到DUMPCNT时,Online不会生成更多的shmem文件,错误消息将写入 信息日志

/****************** Archive ********************/ 44 TAPEDEV:

指定ontape归档数据的设备文件。

取值范围 任何有效裸设备文件 缺省值 /dev/tapedev 未显示 /dev/null

它也是onload,onunload 的却省设备名

使用连接文件别名时,我们可以不通过改变TAPEDEV值而更改设备 系统容许指定远程设备 RemoteHostName:TapeDeviceName

Online备份数据到TAPEDEV时,它总是先打开并重绕设备,然后立即关闭,并再次打开设备开始写操作,保证提供一个正确的设备头给以后的读操作

45 TAPEBLK:

指定备份到TAPEDEV上的数据块的大小(KB为单位)。

取值范围 大于PageSize/1024 缺省值 16

它也是onload,onunload的却省块大小

Onmonitor.SharedMemory,Onmonitor.parameter.Initialize,oncheck -pr 都能显示系 统页的大小

46 TAPSIZE:

指定ontape备份时的设备大小(单位为KB)。

取值范围 正整数 缺省值 10240

它同样指定onload,onunload备份时的缺省设备大小

47 LTAPEDEV: 48 LTAPEBLK: 49 LTAPESIZE:

47,48,49指定逻辑日志归档时的参数,他们的使用方法跟44,45,46一样。

onload,onunload 带 -l 时的缺省设备参数

改变日志记录状态

ontape -s {-A|-B|-U|-N} DatabaseName

建立备份档案

ontape -s [ -L {0|1|2}] -L 指定备份级别

开始自动逻辑日志备份 ontape -a

一个逻辑日志满时

连续逻辑日志备份 ontape -c

Ctrl + c 终止连续备份 恢复指定数据空间备份 ontape -r [-D DBSpace]

不指定数据空间时,恢复所有数据

Off-line方式为离线恢复,On-line方式为热恢复,先冷后热为混合恢复。

/***************** SomeOther ******************/ 50 CHPTINTVAL:

指定服务器执行事务检查点的时间间隔(单位为秒),而不论此时是否有必要,执行事 务检查点后,Online用共享内存页刷新磁盘页。

取值范围 大于或等于0 缺省值 300

设置值过小会由于频繁执行检查点而影响其他处理,所以一般应大于30,过大会造成 快速恢复执行时间太长,设置为零时表示不执行检查点

物理日志空间白分之75满后,Online会自动执行事务检查点

51 CLEARNERS:

指定操作期间可用页清理线索数。

取值范围 1 ~ 128 却省值 1

一般每个磁盘一个页清理线索。

页清理线索数并不影响共享内存的大小。

CLEARNERS为零时,由tbinit的daemon进程负担刷新工作。

用户一般为各个的物理设备各配一个刷新进程,但多个设备共享控制通道时,并

不能改进刷新性能,除非用户将Blobspace和Dbspace从连续的Chunk上分离开来, 此时,理想的做法是将的设备设置成连续的Chunk(divvy)。

52 DATASKIP:

指定是否跳过磁盘介质故障点。Online跳过一些或所有无效表段将使应用效率更高。

取值范围 ALL,ON DBSpaceList,OFF 缺省值 OFF

实用程序onspace -f {ON|OFF} 修改设置值

Esql中可利用Set DataSkip {On DBSpaceList|Off|Default} 修改设置

不论何时应用查询处理跳过一个DBSpace时,Online将返回一个警告,在Esql中, sqlwarn.sqlwarn7设置值为’W’

53 NOAGE:

指定UNIX系统是否执行Cpu老化机制,某些系统会随着虚拟处理器占用时间片长 度增加而降低优先极。

取值范围 0或1

缺省值 0(UsePriorityAgeing)

如果系统支持优先极老化制度,Informix建议设置NOAGE之值为1

FILLFACTOR:

指定索引页的紧密度。

取值范围 1 ~ 100 缺省值 90

值越小插入操作越容易,但磁盘空间使用率低。值过大插入操作会变得非常难,因为 很可能先要对结点进行分离操作

建立索引时,FILLFACTOR选项将使索引采用新的装填因子

55 OPTCOMPIND:

该配置协助优化器为应用程序选择一个合适的连接方法。

取值范围 0,1,2

缺省值 0(为了何以前版本兼容)

据HashJoins 和sort-merge的性能,分离模式(IsolationMode)设置为重复读

(RepeatableRead)时,应用临时锁住所有参加连接查询的记录是可能的,但将导致用 户间的大量锁竞争(请参考Informix 学习No.1中的 Set Isolation语句)

相反,嵌套循环连接(nested-loop joins)将锁住较少的记录,但访问大量数据时,性能 却不理想

我们可以设置OPTCOMPIND环境变量来设置此值

0 只要索引存在,优化器便采用索引扫描方式(nested-loop joins)

1 如果分离模式设置为重复读,优化器按值0选择扫描方式,否则,优化器按值2 进行, Informix建议我们采用值1

2 优化器进根据开销大小来选择索引扫描(nested-loop joins)或表扫描方式(hash joins 或sort-merge) 56 RESIDENT:

指定共享内存是否长驻于内存。

取值范围 0或1 缺省值 0(不长驻)

当操作系统支持强制驻留时,我们没有必要指定共享内存在磁盘上交换,在机器物理 内存足够多时,足够满足Online,操作系统,应用进程,指定共享内存长驻内存会提 高数据库性能

57 STAGEBLOB:

它仅用于Informix-Online/Optical指定大块的存储的光介质设备文件。

取值范围 长不大于18的小写字符串 缺省值 无

58 TXTIMEOUT:

指定双阶段提交(two-phase commit)参与者等待恢复的时间(单位为秒),它仅应用于远 程服务器分布式查询中。

取值范围 大于或等于零的整数 缺省值 300

双阶段提交指操作系统或磁介质失败时所有Online-server进行数据完整性自动恢复 (automatic recovery) 的保护方案。

59 USEOSTIME:

指定Informix 取得操作系统时间是否为亚秒粒度。

取值范围 0或1 缺省值 1

值设定为1时,执行性能将下降4 ~ 5 %,这个设定并不影响任何Esql中应用程序所取 得的时间

/***************** Lock&Transaction&UserThreads************************/

60 TRANSACTIONS

指定Online能并行处理的事务的最大数目

取值范围 12+CLEANERS+MIRROR ~ 32767 缺省值 20

未显示 USERTHREADS

每启动一个事务,一个250字节的条目将建立在事务表中

Informix建议设置为USERTHREADS,如果USERTHREADS接近Online的实际 用户数,则宜设置为1.2*USERTHREADS,因为在进行逻辑存储时,逻辑日志记录 了发一个事务开始标志时,也会向事务表申请一个条目,如果TRANSACTION 过小 会减慢逻辑存储,甚至导致其失败

61 LOCKS:

指定所有Online线索能处理的最大锁数。

取值范围 Max(2000,100*sqrt(TRANSACTIONS)) ~ 8,000,000 却省值 2000

每个锁占用44字节共享内存,在较小的共享内存,LOCKS过大会使内存资源很快 被耗净

62 DEADLOCK_TIMEOUT:

指定Online线索等待锁分配的最长时间(单位为秒)。

取值范围 大于或等于零的所有整数 缺省值 60

这个设置仅影响远程数据库的分布式查询,非分布式不用此参数。

63 USERTHREADS:

指定访问数据库的客户最大有效线索数。

取值范围 12+CLEANERS+MIRROR ~ 32767 缺省值 20 未显示 50

一个客户连接可能对应一个或多个线索,包括客户请求服务,页清除,并行索引生成 等,但不包括运行在I/O(AIO,PIO,LIP)和网络虚拟处理器上的外部线索 Informix建议此值得计算式为 CLEANERS +

3(internal threads for main_loop,index redo,SMI等) + 1(btree cleaner) +

1(onmode and onmonitor) + 1(mirroring if turned on) +

6(max(ON_RECVRY_THREADS,OFF_RECVRY_THREADS)) + 1(each connection) +

n(fragments*MaxNumberConcurrentQueriesRequiringParallelProcessing)

Example:

USERTHREADS=30(MinimunRequiredToBringOnlineUp) + 100(EachConnection/User)

5(Fragments)*20ParallelDataQueries

=230

/***************** PhysicalLogs ************************/ PHYSDBS:

指定物理日志存放的物理设备名称。

取值范围 长不大于18的字符串 缺省值 ROOTNAME

从ROOTNAME移动物理日志到其他数据设备可减少根数据设备的使用竞争

65 PHYSFILE:

指定物理日志的大小(KB为单位)。

取值范围 大于或等于200 缺省值 1000 未显示 200

66 PHYSBUFF:

指定2个物理日志缓冲区中每一个的大小(KB为单位)。

取值范围 PageSize ~ PHYSFILE 缺省值 32

物理日志缓冲区的大小决定Online刷新日志文件的频率,刷新时以页为单位,如果 PHYSBUFF不能被页长整除,Online将使用最接近的页长整数倍值。 Informix建议使用16页作为物理日志缓冲区大小

Onmonitor.SharedMemory,Onmonitor.Parameters.Initialize,onstat -pr可用于显示页 的大小

/***************** PdqPriority**************/ 67 MAX_PDQPRIORITY:

指定用户查询申请PDQ资源的上限值

取值范围 0 ~ 100,HIGH,LOW,OFF 缺省值 HIGH

此值的设置使得PDQ资源设置值(PDBPRIORITY)即使超过它,但查询能申请到的 有效值却不会超过它,这使得Online运行决策支持(OLTP),却没有受到OLTP降低 系统性能的影响

onmode可以修改此设置

68 PDQPRIORITY:

指定查询处理中,申请相关系统资源的百分比,Online和其他应用根据设置值来分

配Cpu和内存等系统资源。

取值范围 0 ~ 100,OFF,LOW,HIGH 缺省值 0FF

OFF或0 PDQ(ParallelDataQuery)被关闭,系统没有并行查询 LOW或1 系统仅以表段(fragment)方式从磁盘上读取数据 HIGH 启用所有资源

Number 指定查询优先极,值越大,Online将到更多的系统资源,然而,过多的 资源占用将使其他查询申请资源的不到满足,系统性能反而会下降。 如果环境变量PDQPRIORITY被设定,它将使这个配置无效(请参考Informix 学习 No.1中的 Set Pdqpriority语句)。

Onmonitor.Parameter.Pdq 用于查看和修改该设置。

/***************** DataReplication **********************/ 69 DRAUTO:

指定二级数据库在数据复制失败时的工作模式,两个服务器应具有相同的设置。

取值范围 0(OFF) 禁止自动切换,复制失败时,二级数据库仍为ReadOnly模式 1(RETAIN_TYPE) 复制失败时,将二级数据库切换为标准数据库,恢 复后又还原为二级数据库模式

2(REVERSE_TYPE) 复制失败时,将二级数据库切换为标准数据库,恢 复后为主数据库模式,原来的主数据库切换到次级模式

缺省值 0

这个值应谨慎使用,因为有时二级数据库会把网络响应延迟理解为数据复制失败。

70 DRINTERVAL:

指定两个数据服务器上复制缓冲区刷新的最大时间间隔(单位为秒)。

取值范围 -1,正整数 缺省值 30

执行异步刷新时,请赋值为-1,异步刷新在主服务器出现故障时,可能存在主服务器 上已提交但次级服务器却将其回滚的事务,而同步刷新时,主服务器只有在接收到次 级服务器将接收到的复制数据处理完毕的信息才刷新逻辑缓冲日志区,保证了主次服 务器上事务的一致性。

71 DRLOSTFOUND:

指定保存主服务器失败时,已在主服务器上提交,但次级服务器上却回滚的事物。

取值范围 Informix可写访问的有效路径名 缺省值 $INFORMIX/etc/dr.lostfound

这个文件带有时间戳(timetamp),所以不用担心已存在内容被重写覆盖。

72 DRTIMEOUT:

数据复制时,其中一个服务器等待另一个服务器的最大时间(单位为秒),如果超时未 响应,系统认为数据复制失败。

取值范围 正整数 缺省值 30

网络未产生响应市,主次服务器互相发送一个信号,如果未得到对方响应,则系统认 为数据复制失败。

数据复制失败时,Online想信息文件中写一条消息。 Example DR: receive error

/***************** DecisionSupport ***************/ 73 DS_MAX_QUERIES:

设置Online能并行处理查询的最大数目。

取值范围 1 ~ 8*1024*1024

缺省值 DS_TOTAL_MEMORYc 不显示 DS_TOTAL_MEMORY/128

onmode -D priority 修改MAX_PDQPRIORITY onmode -M kilobytes 修改DS_TOTAL_MEMORY onmode -Q queries 修改DS_MAX_QUERIES onmode -S scans 修改DS_MAX_SCANS onstat -t mgm 显示共享内存统计数据 onmonitor.Parameters.pdQ 显示或修改设置值

决策支持配置还包括PDQPRIORITY,MAX_ PDQPRIORITY。

74 DS_MAX_SCANS:

指定可一个查询可申请的最大并发扫描线索数。

取值范围 10 ~ 1024* 1024 缺省值 1024*1024

用于禁止某些用户过度使用Online资源。

Online依据PDQPRIORITY 和DS_MAX_SCANS 分配扫描线索,得不到满足时, 查询会暂时阻塞。

75 DS_TOTAL_MEMORY:

指定并发数据查询(PDQ)的可用内存总量(KB为单位)。

取值范围 128 ~ 1024*1024

缺省值 SHMTOTAL/2 SHMTOTAL>0时 SHMVIRTSIZE/2 其他

这个设置值应该小于PhysicalMemory - OperatingSystem - InformixBufferPool

Informix警告不应将DS_TOTAL_MEMORY和SHMTOTAL相混淆

/***************** Lrus ************************/ 76 LRUS:

指定管理共享内存的LRU(least-recently-used)队列数目。

取值范围 3 ~ 128

缺省值 Min(8,USERTHREADS/2)

共享内存中每页缓冲区对应一个缓冲区头指针,每个头指针对应LRU队列中的一个 接点。

LRU为从共享内存无空闲页时,新的缓冲区申请将淘汰最近未使用页。 BUFFERS/LRUS为每个队列的长度(结点数)。 一个LRU队列由一个MLRU和一个FLRU组成 tbstat -r 监控LRU队列状态。

77 LRU_MAX_DIRTY:

指定开始精灵(daemon)进程开始将LRU队列中MLRU队列刷新磁盘时MLRU所占 百分比。

取值范围 0 ~ 100 缺省值 60

LRU写只tbinit接到提醒后引发页刷新操作,而非页刷新进程自己周期性醒来。 刷新已修改的页面必须首先先将其前映象物理日志刷新后才能进行。

需刷新整个逻辑日志或物理日志,无日志缓冲区登录进行事务提交,执行一次事务检 查点都会触发MLRU队列的刷新活动。

执行事务检查点后会使数据库达到最佳性能,但检查点执行会使数据事务库处于悬挂 状态

78 LRU_MIN_DIRTY:

指定daemon进程终止将LRU队列中MLRU队列刷新磁盘时MLRU所占百分比。

取值范围 0 ~ 100 缺省值 50

如果读高速缓冲区百分比低于95%,用户应减低LRU_MAX_DIRTY, LRU_MIN_DIRTY值,缩小MLRU队列长度,来提高读性能。

如果写高速缓冲区百分比低于82%,用户应增加LRU_MAX_DIRTY, LRU_MIN_DIRTY值,增大MLRU队列长度,来提高写性能。

/***************** LongTransactionAcessLogicalLog ********************/ 79 LTXEHWM:

指定长事务进行独占访问逻辑日志时,逻辑日志的填充百分比。

取值范围 1 ~ 100 缺省值 90

独占并不绝对精确,正在提交或回滚的事务会继续访问逻辑日志,其他访问日志活动 会暂时悬挂直至该长事务处理结束。

80 LTXHWM:

当逻辑日志填充度达到这个百分比时,Online被触发去检查长事务,检测到的长事务 将被回滚取消,而其他事务将继续执行。

取值范围 1 ~ 100 缺省值 80

回滚过程自身会产生逻辑记录,所以逻辑日志会继续填满,这正是设置LTXEHWM 的原因。

如果长事务比较频繁,可设置LTXHWM 为 50,LTXEHWM 为 60会使长事务的 处理性能提高,但是用这个设置时,逻辑日志应该设置为它们取缺省值时的2倍。

/***************** RecvryThreads **************/ 81 OFF_RECVRY_THREADS:

脱机方式(off-line)冷恢复(cold-restore)期间逻辑恢复线索的最大数,这个参数也用于 逻辑日志的快速恢复。

取值范围 1 ~ USERTHREADS 缺省值 10

虽然冷恢复时,因为不存在用户会话线索,不必要调整USERTHREADS来适 应OFF_RECVRY_THREADS的增加,但由于USERTHREADS 包括

OFF_RECOVRY_THREADS,我们仍不能让OFF_RECOVRY_THREADS的设置 值超过USERTHREADS。

Informix建议OFF_RECOVRY_THREADS设置为与很多事务都在逻辑日志中进行 处理的数据表的数目。

82 ON_RECVRY_THREADS:

联机方式(on-line)热恢复(warn-restore)期间逻辑恢复线索的最大数,这个参数也用于 逻辑日志的快速恢复。

取值范围 1 ~ USERTHREADS 缺省值 1

USERTHREADS包括ON_RECVRY_THREADS,所以ON_RECVRY_THREADS 的设置值不应超过USERTHREADS,否则,在热恢复期间,Online可能回没有足够 线索资源来满足新的活动请求,如果增加ON_RECVRY_THREADS设置值,则应考 虑增加USERTHREADS设置值来数据库活动满足要求。

Informix建议ON_RECVRY_THREADS设置为很可能被恢复的数据表的数目,因 为恢复时,逻辑日志记录数是按表的数目来分配的,所以这样会达到最大的并行处 理性能。

/***************** ReadOfAheadPages ************************/ 83 RA_PAGES:

指定连续扫描数据或索引时,预先读入缓冲区磁盘页的数目。

取值范围 RA_THRESHOLD ~ BUFFERS 缺省值 4 MULTIPROCESSOR=0 8 MULTIPROCESSOR=1

onmonitor.Parameters.perFormance.NumOfReadAheadPage显示和修改该设置。 Read-ahead会大大改善低速外设I/O和高速CPU处理的协调。

84 RA_THRESHOLD:

指定向前读的门槛值,当未处理的页达到这个数目时,Online便指示缓冲区执行先前 读动作。

取值范围 0 ~ RA_PAGES - 1 缺省值 RA_PAGES/24

RA_PAGES和RA_THRESHOLD过大会剧烈增加缓冲区活动而恶化Online性能。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务