informix-4gl常见错误
- 格式:doc
- 大小:46.00 KB
- 文档页数:5
-101 ISAM错误:文件未打开。
ISAM处理器被要求使用一个未打开的文件(表)。
对C-ISAM程序,程序试图在调用isopen打开文件前使用该文件,或是试图写一个只读方式打开的文件。
如果错误再次出现,请参考INFORMIX-Online的“管理员指南”附录B,“陷井错误”以得到进一步诊断。
有关诊断信息请与Informix技术支持部联系。
-102 ISAM错误: 不合法的ISAM函数参数。
一个传递给C-ISAM函数的参数值超出了可接受的范围。
对C-ISAM程序,检查这个函数调用中使用的参数,并与该函数的文档比较。
如果错误再次出现,请参考INFORMIX- Online的“管理员指南”附录B,“陷井错误”以得到进一步诊断。
有关诊断信息请与Informix技术支持部联系。
-103 ISAM错误: 不合法的键描述符(部分过多或是太长)。
ISAM处理器被给予了一个无效的键描述符。
对C-ISAM程序,检查键描述符。
每个键描述符最多可以有8个部分和120个字符。
如果错误再次出现,请参考INFORMIX-Online 的“管理员指南”附录B,“陷井错误”以得到进一步诊断。
有关诊断信息请与Informix技术支持部联系。
-104 ISAM错误: 打开文件过多。
ISAM处理器已经到达了打开文件数的极限。
对C-ISAM程序,检查并改变程序逻辑使得它同时打开较少的文件。
使用isclose来关闭不需要的文件。
对SQL产品,这个查询过于复杂;它同时使用了过多的表。
分步执行查询并使用临时表。
-105 ISAM错误: 坏的ISAM文件格式。
一个ISAM文件(表或索引)的内容已被损坏。
对C-ISAM,如果已使用了事务日志,你可以用isrecover程序来恢复该文件。
否则,重新建立或是从备份上恢复该文件。
对SQL 产品,使用bcheck或secheck实用工具来获取有关此问题的进一步信息,可能的话改正错误(在INFORMIX-OnLine数据库服务器中使用tbcheck或是在INFORMIX-OnLine动态服务器中使用oncheck)。
Informix - 4GL 初级进阶Informix - 4GL 初级进阶 (1)第一章INFORMIX-4GL基本组成 (1)第二章INFORMIX-4GL的处理逻辑 (3)第三章INFORMIX-4GL中的数据类型 (6)第四章定义程序变量 (11)第五章函数间传值 (14)第一章INFORMIX-4GL基本组成程序INFORMIX-4GL中的程序可以处理大量的应用需求,可以管理小型商业或主要银行的资金。
INFORMIX-4GL程序包括执行特定函数所需的所有部分。
程序:为解决一个问题或处理数据由计算机执行的操作逻辑顺序。
模块文件INFORMIX-4GL的一个构件是模块(module),模块是INFORMIX-4GL指令的机器文件,是整个程序的一部分。
把一组模块组合在一起,就成为整个程序,上图中有三个模块,合在一起就组成了客户程序。
在上图,跟踪记录客户的程序分成了三个模块,每个模块有其特殊的作用,cust_main.4gl 模块用于驱动和控制程序,cust_add.4gl模块用于管理新增客户记录,cust_edit.4gl模块包括改变或删除客户记录的INFORMIX-4GL代码。
模块包括一个或多个函数的集合。
函数(function)是INFORMIX-4GL代码最基本的单元,它是在被调用时执行的一组INFORMIX-4GL语句序列。
在INFORMIX-4GL程序中函数一次也没执行过也是有可能的,例如,如果从没删除过客户,那么函数delete_cust就不会被调用函数类型在INFORMIX-4GL中有四种函数,不同的函数名表示不同种类的INFORMIX-4GL语句功能。
GLOBALS:在这个函数只用于说明变量声明语句,它也让其它模块知道变量的存在,每个程序只允许有一个GLOBALS函数。
MAIN:给出INFORMIX-4GL开始的位置,INFORMIX-4GL首先总是先读MAIN函数,MAIN函数驱动程序的其余部分,因此,每个程序要有一个MAIN函数(否则INFORMIX-4GL不知从哪儿开始)执行。
-401 试图在 NULL 游标上进行Fetch。
这个 FETCH 语句传递一个无效的游标数据结构或一个 null 指针。
该游标可能已经用FREE语句释放,或者该游标数据结构可能在内存被覆盖。
5.0及以后版本的数据库服务器不返回这个错误代码。
参见错误-267 和 -404。
-402 主机变量的地址为 NULL。
检查程序构造 sqlda 和相关数据结构的方法,弄清它被设置为 null 指针的原因。
如果程序是用 INFORMIX-4GL 或其它语言编写的(在这种语言中,sqlda 不是由程序直接构造的),或者如果该语句只是通过名称来引用宿主变量,这个错误就不应当产生。
如果这个错误产生了,请注意所有的环境状况,并与 Informix 技术支持部门联系。
-403 接收行的大小与期望的大小矛盾。
这个内部错误说明在数据库服务器和调用它的函数库函数之间通讯有问题。
检查你的程序与使用的数据库服务器有相同的软件级。
如果该错误再出现,请记下全部细节并与 Informix 技术支持部联系。
-404 一个 NULL 控制块已经作为一个参数传递。
检查程序构造 sqlda 和相关的数据结构的方式;检查它是否以某种方法设置一个null 指针。
如果程序是用INFORMIX-4GL语言或在其内没有用程序直接构造 sqlda 的其它语言编写的,或者如果这个语句只用名字参考了主机变量,这个错误就不应该出现。
请与Informix 技术支持部联系。
在4.1版及更早版本的数据库服务器按所指明的意义上返回这个错误信息。
对于5.0版之后的数据库服务器版本,参见下一个条目。
-404 无游标或语句可供使用。
这个语句为一个游标命名,而此游标已与FREE语句同时发布。
重新检视此程序的逻辑,并检查在到达这个语句之前,所指定的游标是有所说明,打开的,但没有释放。
当使用5.0版本及其後版本时,这出错码的意义如上。
对於较老的数据库服务器,参见上一个说明。
-405 一个主机变量的地址不是严格地匹配的。
一个档(loc_loctype 包含LOCFILE,或在一个4GL程序,该变量已被定位在一个文
件)被定位时,这个错误表示系统提供的loc_write() 函数不能写到该档。
可能的
原因包括: 磁盘是满的,你没有对该磁盘的写许可;发生了一个硬件错误。
-456 指示器值不能适合宿主变数。
这个内部错误给出在数据库服务器和调用它的库函数之间通讯的问题。
检查你的程序与使用的数据库服务器在相同的软件级。
如果该错误再出现,请记下全部细节并与Informix 技术支持部联系。
-457 数据库服务器意外终止。
你的应用程序正在工作的数据库服务器进程或线索已经终止。
DBA 可能关闭该系统。
后面的大多数的可能原因是一个内部错误。
寻找操作系统信息可以得到更多的信息。
如果该错误再出现,请记下全部细节并与Informix 技术支持部联系。
检查伴随这个错误返回的ISAM 错误代码。
如果它是-129,数据库服务器没有终止,而只是达到当前用户会话数限制(看错误-129的解释)
-458 长事务失败。
数据库服务器(可能是OnLine 或INFORMIX-OnLine for NetWare) 用完记录这个事。
informix-4GL三運⽤資料庫1.指定⼀個欲使⽤的資料庫指定⼀個欲使⽤的資料庫的⽅法很簡單。
只要鍵⼊DATABASSE及資料庫名稱即可<語法> DATABASE 資料庫名稱2.⽤DEFINE命令定義程式變量<語法> DEFINE 變數串列資料型能[…]①變數串列,是⼀個或多個變數,以逗號分開。
②資料型能,是該變數串列的資料型能③DEFINE命令,須緊跟在GLOBAlS,MAIN,FUNCTION或REPORT四個關鍵字之後,或者,在END GLOBALS之後MAIN,FUNCTION,REPORT之前。
後者定義模組變量時。
④變量名稱,不得超過18個字元,但僅有前8個字元作為辨認之⽤不可重複。
同時⼤⼩寫視為相同。
⑤變量名稱,不得⽤保留字。
⑥城市變量名稱,與資料變量表格,或欄位,或資料庫名稱相同時,以程式變量名稱為準,欲使⽤后三者,須在其前加上⼀個@符號。
⑦程式變量的資料型能:注意:程式變數沒有SERIAL型能。
⑧LIKE關鍵字,讓你定義與資料庫欄位資料型能相同的程式變量名稱。
<語法>DEFINE變數名稱[,…] LIKE資料型能·欄位名稱eg: DEFINECUST_name CHAR(20),CUST_balance MONEYEg: DEFINECUST_lname LIKE customer.lname,c_order_date,c_ship_date DATE⑨程式變數,依他們被宣告(DEFINE)的位置,可分為整體變數(GLOBAL),模組變數(MODULE)與局部變數(LOCAL)三種。
⽽有效範圍也不同(1)整體變數(GLOBAL):通常被宣告在獨⽴的⼀個⽂字檔案(.4GL)中,⽽在各程式模組中以GLOBALS“整體變數檔名”的命令,它包進來。
如下⾯這個gl_data.4gl的內容:(與其他模組⼀樣須編譯接到主程式上)(2)模組變數(MODULE):宣告的位置,在每個程式檔案上。
第一章 Informix环境变量的设定一.环境范例:二.环境范例:.profile (环境变量的等号前后不得为空格)stty -istrip -isig (防止用户非法中断)INFORMIXDIR=/usr/informixINFORMIXSERVER=ld420501_tcpONCONFIG=onconfig.lifePATH=$PATH:$INFORMIXDIR/bin:$HOME/bin:$HOME/form:$HOME/prg DBPATH=/u/cbps/form:/u/cbps/binFORMDIR=/u/cbps/formDBDATE=Y4MD/LANG=english_us.8859DBLANG=english_us.8859DBNLS=2TERMCAP=/usr/informix/etc/termcapTERM=vt100export INFORMIXDIR INFORMIXSERVER ONCONFIG PATH DBPATH FORMDIR DBDATE LANGexport DBLANG DBNLS TERMCAP TERM环境变量的设置文件中还可加入其它Shell语句第二章 Informix产品线及DB应用开发工具简介一.Informix(英孚美)产品线简介(三大类):1.数据库服务器(Database Server):①.ODS (Informix-Online Dynemic Server)联机动态服务器,多线索,多性能的DB server(数据库服务器)②.XPS (Informix-Online Extended Parallel Server)将DSA扩展至松耦合或非共享的计算体系结构,动态可申缩性体系结构(Dynemic Scerable Architerta),适用于大型数据库的应用,并行SQL操作。
③.IUS (Informix-Universbl Server)处理丰富而复杂的数据而设计,并用Datablade模块技术,用来存储和检索丰富的多媒体Data及其他复杂的插入或对象扩展模块。
Informix-SPL(过程)语法详解Informix数据库用户一般都熟悉的使用SQL语句进行简单的查询和统计,而在Informix-Online的数据库服务器中提供了用结构化查询语言SQL语句和流程控制存储语言SPL创建存储例程,以减少Informix的处理。
存储例程是SQL语句和SPL的集合。
它们存放在数据库中,SQL语句会被分析.优化,在例程的执行中,高速缓存中会有一执行规划,使后续操作的执行速度很快。
而单独的SQL语句只有在执行时才会被优化,并且存储例程可以被不同的开发工具调用(4GL、ESQL/C、POWERBUILDER.DELPHI),在SELECT 语句中也调用过程。
例程调试简单,不必重新编译应有软件包。
在例程创建时Informix查询处理器会分析它,并产生一执行规划,永久存放于SPROCEDURES.SYSPROBODY.和SYSPROPLAN中,其后例程按此规划执行,由于大部分查询处理已经完成,存储例程可以在瞬间执行完毕。
由于存储例程所具有的优越性,它已成为进行Informix数据库核心开发的有力工具,掌握它对Informix的开发人员有积极意义,现将我在实际工作中使用的语法和例子详解于下,疏漏和错误请来信指教。
1.创建和执行例程①.创建例程语法:CRAETEPROCEDURE[OWNER.]PROCEDURE_NAME(参数1参数类型=[DEFAULT],参数2参数类型=[DEFAULT],参数n参数类型=[DEFAULT])RETURNING值1类型,值2类型,值n类型;<......>语句体;ENDRPOCEDURE例程大小不可超过64K,这包括所有的SQL.SPL.空格.跳格符,例程名最多18个字符,并在数据库中唯一存在,语句间用";"分隔,例程只能在当前数据库中创建,例程创建后是一标准执行模板块,可在不同的应有中对其调用,这对开发不同版本的应用将更为便利。
4GL语言开发原则及规范中科软件股份有限公司2002年04月27日目录1编码规范 (1)1.1命名规范 (1)1.1.1对象命名 (1)1.1.2常量和变量命名 (5)1.2注释规范 (7)1.2.1程序文件部分的注释 (8)1.2.2函数部分的注释 (9)1.2.3函数(过程)程序的增、删、改的注释说明约定 (11)1.2.4函数体内部的代码段修改注释 (12)1.2.5函数体内部的代码段说明约定 (13)1.3书写规范 (13)1.3.1基本原则 (13)1.3.2保留字引用规则 (14)1.3.3LET语句 (14)1.3.4IF语句 (15)1.3.5DEFINE语句 (15)1.3.6CALL语句 (16)1.3.7函数体内部组织 (16)1.4注意事项 (18)1编码规范1.1命名规范1.1.1对象命名1.1.1.1数据库命名规范●数据库名长度:不超过INFORMIX规定长度(十八位);●采用英文形式,规则如下:数据库名由两部分组成:系统名+DB;PrpInsDB系统名由英文单词构成,每个单词首字母大写,单词可采取缩写形式;●附表提供的词根表作为构词的唯一依据。
●本小节规范适用于各种语言版本的系统。
1.1.1.2数据库表命名规范●数据库表名长度:不超过INFORMIX规定长度(十八位);●采用英文和“_”组成形式,规则如下:数据库表名由三部分组成:系统名+业务类型+表的英文名(+“_”+子对象名),业务类型用1位大写字母表示,如承保业务为C、批改业务为P、理赔业务为L、收付费业务的数据表为J、通用代码为D;PrpCmain;货物运输保险保单信息表(继承了保单基本信息):PrpCmain_Cargo。
●业务类型采用附表提供的词根表中规定的字母;表名由英文单词构成,保险类别和业务类型的首字母大写,表的英文名采取小写形式,单词可采取缩写形式;●当一个对象继承主对象时,体现在数据表上则使用“_”分割;:货物运输保险保单信息表,继承了保单基本信息。
-101 ISAM错误:文件未打开。
ISAM处理器被要求使用一个未打开的文件(表)。
对C-ISAM程序,程序试图在调用isopen打开文件前使用该文件,或是试图写一个只读方式打开的文件。
如果错误再次出现,请参考INFORMIX-Online的“管理员指南”附录B,“陷井错误”以得到进一步诊断。
有关诊断信息请与Informix技术支持部联系。
-102 ISAM错误: 不合法的ISAM函数参数。
一个传递给C-ISAM函数的参数值超出了可接受的范围。
对C-ISAM程序,检查这个函数调用中使用的参数,并与该函数的文档比较。
如果错误再次出现,请参考INFORMIX- Online的“管理员指南”附录B,“陷井错误”以得到进一步诊断。
有关诊断信息请与Informix技术支持部联系。
-103 ISAM错误: 不合法的键描述符(部分过多或是太长)。
ISAM处理器被给予了一个无效的键描述符。
对C-ISAM程序,检查键描述符。
每个键描述符最多可以有8个部分和120个字符。
如果错误再次出现,请参考INFORMIX-Online 的“管理员指南”附录B,“陷井错误”以得到进一步诊断。
有关诊断信息请与Informix技术支持部联系。
-104 ISAM错误: 打开文件过多。
ISAM处理器已经到达了打开文件数的极限。
对C-ISAM程序,检查并改变程序逻辑使得它同时打开较少的文件。
使用isclose来关闭不需要的文件。
对SQL产品,这个查询过于复杂;它同时使用了过多的表。
分步执行查询并使用临时表。
-105 ISAM错误: 坏的ISAM文件格式。
一个ISAM文件(表或索引)的内容已被损坏。
对C-ISAM,如果已使用了事务日志,你可以用isrecover程序来恢复该文件。
否则,重新建立或是从备份上恢复该文件。
对SQL 产品,使用bcheck或secheck实用工具来获取有关此问题的进一步信息,可能的话改正错误(在INFORMIX-OnLine数据库服务器中使用tbcheck或是在INFORMIX-OnLine动态服务器中使用oncheck)。
-807 不能打开文件进行输出。
程序不能够打开你在Save选项中指定的文件。
这个文件应该被保存在当前目录下。
这可能是由于你的帐户没有对该目录的写权限。
也可能是由于那个目录中存在一个同名的只读文件(你可以试试换一个名字保存来消除这种可能性)。
也可能是由于磁盘已满。
请检查操作系统信息,它可能告诉你更多的信息。
-808 不能打开选择文件。
你为Choose菜单选项指定的SQL命令文件不能被打开进行输入。
请确保此文件在当前目录中,而且对你的帐户是可读的。
-809 发生SQL句法错误。
当前LOAD语句中的INSERT语句的句法无效。
请检查它的标点符号以及关键字的用法。
-810 不能打开用来保存的文件。
SQL命令文件不能被保存。
请检查你的帐户是否有对当前目录的写权限,以及磁盘是否已满。
-811 不能打开打印机进行输出。
应用程序试图打开DBPRINT环境变量中指定的设备,结果失败了。
请检查变量的设置,然后重新运行程序。
-812 不能打开管道进行输出。
在Output选项下你选择了To-pipe并且指定了一个程序或者命令来接收该输出。
然而,INFORMIX-SQL不能够打开到那个程序或者命令的管道。
请重新检查一下你键入的命令或者程序,看它是否是有效的UNIX或DOS命令,而且它必须在当前的可执行程序路径中可以找到。
同时看一下操作系统的错误信息,因为你可能超出了系统在内存或者进程方面的定额限制。
-813 不能将输出写入管道(没有读取进程)。
在Output选项下,你通过管道将输出送给命令或者程序。
尽管管道已经建立起来(表明命令有正确的句法并且命名了已存在的程序),它可能被关闭了。
这表明管道中的(第一个)程序在接收完所有输出之前终止了。
它可能是由于一个错误而退出,也可能是由于你或者其他用户使用kill命令使它终止了。
请检查一下管道程序的信息,这可能会对它退出的原因予以解释。
-816 不能写文件(检查文件的许可权限)。
不能对前一个命令中指定的文件进行写操作。
Informix错误代码中文解释(5xx~600)-501 索引<索引名>;已经未被聚类。
表不再在(如果曾经在)本索引上被聚类。
确认本索引是用户意指的索引;如果这样,则不必变更本索引。
查看哪一个表已被聚类的方法,参见出错号 -500的讨论。
-502 不能聚类索引。
当数据库服务器以行的聚集顺序建立表的新拷贝时,得到一个不期望的错误。
检查ISAM 出错代码以获取更多的信息。
典型的原因包括磁盘空间的短缺。
-503 锁定的表太多。
在本主机操作系统的数据库服务器中,有一个关于一次可锁定的表的数量的限制。
它不能锁定用户请求的表。
滚回当前的事务,然后重新设计操作以锁定较少的表,或者代之以行级的锁定,或者以互斥方式打开数据库。
-504 不能锁定视图。
本 LOCK TABLE 命令不能被执行,因为指定的表实际是一个视图。
只有实际的表可以被锁定。
滚回当前的事务。
然后重新设计操作针对视图所基于的实际的表进行工作,或者以互斥方式打开数据库。
-505 在 UPDATE 中的字段数与 VALUES 的数目不匹配。
本 UPDATE 语句使用一个 SET 子句,在其中一个字段名字的列表设置为等于表达式的列表,或者等于SELECT语句。
等式左边的字段数并不等同于右边产生的数据值。
滚回当前的事务,然后重写语句。
如果表达式的列表被使用,检查标点以确认每个表达式是不同的。
如果SELECT 语句被使用,检查看有多少字段返回。
-506 没有更新所有字段的许可。
用户的账户已经被授予更新特别字段的权限,但是本 UPDATE 语句更新所有的字段,或者更新用户没有权限的字段。
与表的拥有者联系或与本数据库中某个有数据库管理员权限的人员联系,并要求授予完全的UPDATE 权限。
列出表的拥有者的方法,参见出错号 -313的讨论。
-507 游标 <游标名>; 没有找到。
在本 UPDATE 或 DELETE 语句中 WHERE CURRENT OF子句命名的游标不存在。
所有错误可以用finderr+错误代码查到,英文的,这里中文注释便于理解。
-100 错误的描述:C—ISAM错误;向具有唯一索引的字段加入一个重复值。
系统的操作:该语句不被处理。
更正的方法:检查是否用iswrite,isrewrite,isrewcurr或isaddindex的方法,向一个具有唯一索引的字段加入一重复值。
-101 错误的描述:C-ISAM错误;文件没有打开。
系统的操作:该语句不被处理。
更正的方法:检查C-ISAM错误:C-ISAM文件是否已用isopen调用打开,或者是否向一个以只读打开的C-ISAM文件中执行写操作。
-102 错误的描述:C—ISAM错误:C—ISAM函数含有非法参数系统的操作:该语句不被处理更正的方法:检查C—ISAM调用的第一个参数,是否超出相应的值域-103 错误的描述:C—ISAM错误;非法的关键字说明(太多的分量或太长)系统的操作:该语句不被处理。
更正的方法:检查组成该关键字说明的一个或多个元素,是否超出相应的值域。
(每个关键字的说明最多允许8个分量和120个字符)-104 错误的描述:C—ISAM错误:打开文件太多系统的操作:该语句不被处理。
更正的方法:在UNIX系统中(以及多数DOS系统中),每个进程打开文件夹的最大个数为20。
-105 错误的描述:C—ISAM错误:C—ISAM文件格式有误。
系统的操作:该语句不被处理。
更正的方法:C—ISAM文件的格式已被破坏,对该文件运行bcheck程序,修复被破坏了的索引。
如果bcheck不能修复该文件,须从后援存储介质上重新装入数据。
-106 错误的描述:C—ISAM错误;非互斥访问。
系统的操作:该语句不被处理。
更正的方法:当要增加或删除一个索引时,必须以互斥访问打开文件。
-107 错误的描述:C—ISAM错误:记录被锁住。
系统的操作:该语句不被处理。
更正的方法:由该调用请求的文件或记录不能被访问,这是因为该文件被其它用户锁住。
Informix 计算长事务回滚时间及解决办法如何估算长事务回滚的时间环境:IDS9.40及其以上版本问题描述:用户往往由于一次操作的数据量过大,导致长事务,使整个数据库服务器暂时挂起而不可用。
用户需要估算长事务回滚完成的时间,以便做出安排。
解答:可以使用onstat -x -r 10监控该事务的回滚状态.并通过日志回滚的速率来估算回滚的时间。
“-r 10”表示每10秒显示一次。
下面是两次的间隔10秒输出:address flags userthread locks beginlg curlog logposit isol retrys coordd745b58 A-R-- d715e7c 4904 51 53 0x8f61c8 COMMIT 0address flags userthread locks beginlg curlog logposit isol retrys coordd745b58 A-R-- d715e7c 4904 51 53 0x5a1acc COMMIT 0从输出可以看到,该事务起始的逻辑日志号是51,当前回滚到53,还需要继续回滚2个逻辑日志。
在这10秒中回滚的逻辑日志大小可以通过两次的logposit相减得出,方法为:去掉每个logposit的后三位,剩下的数字相减就是日志回滚的page数目,再乘以page size 就可得到这10秒回滚的日志大小。
例如:(0x8f6 - 0x5a1)*4 = 3412 K (4表示当前系统的page size是4K),那么一分钟逻辑日志能够回滚 3412/10*60=20472 K假设每个逻辑日志的大小为50M,则该长事务还需要回滚的时间大约是5.28分钟((1024*50) * 2 + 0x5a1*4)/20472 =5.28一、查看数据库状态正常情况下是onstat -IBM Informix Dynamic Server Version 9.40.FC7 -- On-Line -- Up 35 days 16:51:16 -- 3920896 Kbytes长事务情况下是onstat -IBM Informix Dynamic Server Version 9.40.FC7 -- On-Line (LONGTX) -- Up 35 days 16:41:40 -- 3920896 KbytesBlocked:LONGTX二、显示事务(transaction)信息其中flag字段中第三个标志位为R说明事务在rollback,说明这个事务是长事务onstat -xIBM Informix Dynamic Server Version 9.40.FC7 -- On-Line (LONGTX) -- Up 35 days 16:41:56 -- 3920896 KbytesBlocked:LONGTXTransactions1cf0a6748 A-R-- 1cd55c618 642073 119403 119405 0x1aa91e4 DIRTY 0三、通过长事务的userthread值找出session idonstat -u |grep 1cd55c6181cd55c618 --RPX-- 1880841 informix - 0 0 642073 256446 323049四、显示会话连接信息,找出造成长事务的SQL语句,并优化onstat -g ses 1880841informix锁表处理步骤:锁表处理步骤:1、onstat -ks|grep HDR+X //查询是那个表被锁address wtlist owner lklist type tblsnum rowid key#/bsizc1809510 0 d656e774 c181cb3c HDR+X 6002e1 2c602 0需要关注lklist和type项,从上面来看tblsnum为6002e1(十六进制转换成十进制)的表被锁了。
Informix-4gl编程过程中常见错误Informix -244 错误:Could not do a physical-order read to fetch next row.具体错误解释:#finderr -244原因:a.锁表b.记录太多c.页损坏d.某个进程死了以后资源未释放导致在数据库端用 onstat –g ses/onstat –g sql /Onstat –k 等找出锁表进程,用onmode –z结束该进程,不行,重启数据库释放。
锁方式:行方式(row),页方式(默认page),表方式(table)。
解决:1.降低锁级别2.减少加锁事务的时间跨度3.设置等待解琐时间相关命令:)检查索引及页损坏情况#oncheck –cID database_name:table_name) 查看锁级别#oncheck –pt database_name:table_name)设置锁级别(行方式)#alter table table_name lock mode(row))设置隔离级别#set isolation to dirty read)设置等待解锁时间(不宜过大)#set lock mode to wait second(秒)不等待#set lock mode to not wait1:$ onstat -k | grep HDR+XHDR+X 为排他锁HDR 头X 互斥owner是正持有锁的线程的共享内存地址2:$ onstat -u |grep c60a363cc60a363c 为1中查到的owner内容。
sessid是会话标识符编号3:$ onstat -g ses sessid根据sessid得到进程pidpid与此会话的前端关联的进程标识$ onstat -g sql sessid通过上面命令查看执行的sql语句4:$ ps -ef |grep pid由此,我们可得到锁表的进程,可根据实际锁表进程的重要程度的具体情况采取相映处理方法:对于重要且该进程可以自动重联数据库的进程,可以用onmode -z sesid 的方法杀掉锁表session,$ onmode –z sessid否则也可直接杀掉锁表的进程kill pid。
Informix-4gl编程过程中常见错误
Informix -244 错误:
Could not do a physical-order read to fetch next row.具体错误解释:
#finderr -244
原因:
a.锁表
b.记录太多
c.页损坏
d.某个进程死了以后资源未释放导致
在数据库端用 onstat –g ses/onstat –g sql /
Onstat –k 等找出锁表进程,用onmode –z结束该进程,不行,重启数据库释放。
锁方式:
行方式(row),页方式(默认page),表方式(table)。
解决:
1.降低锁级别
2.减少加锁事务的时间跨度
3.设置等待解琐时间
相关命令:
)检查索引及页损坏情况
#oncheck –cID database_name:table_name
) 查看锁级别
#oncheck –pt database_name:table_name
)设置锁级别(行方式)
#alter table table_name lock mode(row)
)设置隔离级别
#set isolation to dirty read
)设置等待解锁时间(不宜过大)
#set lock mode to wait second(秒)
不等待
#set lock mode to not wait
1:$ onstat -k | grep HDR+X
HDR+X 为排他锁
HDR 头
X 互斥
owner
是正持有锁的线程的共享内存地址
2:$ onstat -u |grep c60a363c
c60a363c 为1中查到的owner内容。
sessid
是会话标识符编号
3:$ onstat -g ses sessid
根据sessid得到进程pid
pid
与此会话的前端关联的进程标识
$ onstat -g sql sessid
通过上面命令查看执行的sql语句
4:$ ps -ef |grep pid
由此,我们可得到锁表的进程,可根据实际锁表进程的重要程度的具体情况采取相映处理方法:
对于重要且该进程可以自动重联数据库的进程,可以用onmode -z sesid 的方法杀掉锁表session,
$ onmode –z sessid
否则也可直接杀掉锁表的进程kill pid。
$ kill -9 pid
将表的页锁改为行锁
参考语句为
unload to optimize.sql delimiter "" select 'alter table
'||tabname||
' lock mode(row)'||';'from systables where locklevel=" P" and tabid > 99
将卸载的optimize.sql稍微删除一下其中出现的字符或乱码,后运行,即可把表的页锁改为行锁。