按cdcs考试字段,创建主索引,索引名为abcd?怎么操作?说下详...

Informix精华集锦 文件类型:PDF/Adobe Acrobat 文件大小:字节
更多搜索:
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
INFORMIX的监控和管理命令 (Admirer整理)
作者:lovqing 发表时间:2003/01/04 06:21pm
INFORMIX的监控和管理命令
作者: ringwind
监控ONLINE系统动情况的工具主要有以下三类:
; 系统监控接口(SMI)
; t tat
; tbcheck
一, 系统监控接口(SMI):
我们主要通过SQL命令操作online的内部数据库sysmaster中的内部表/结构,来获取
有关的维护信息.Sysmaster是在online初次初始化时,系统自动创建的.它实际主要存储
了一些数据结构,而不是真正的表.使用SMI有如下限制:
; 不能对SMI中的表加锁或使用隔离级别.
; 不允许使用i ert,delete,update等语句(只读)
; 不能使用d chema,dbexport等命令
; 使用select rowid语句将会产生不可预料的结果
主要的SMI表有:
sysdatabases:online中的数据库信息
systa ames:某数据库中所有表的信息
syslogs:逻辑日志信息
sysd aces:数据库信息
syschunks,syslocks等
例1:显示处脱机(offline)状态的chunk的序号和所在数据库空间
Select chknum,d um from syschunks where is_offline=1 or misline=!
例二:显示满chunk的信息
Select chknum,d um from syschunks where nfree=0
二, TBSTAT
; 列出当前时刻的信息(实际也是读取SMI表)
; 不需要磁盘I/O
; 不需要锁等系统资源,因此不会影响系统性能
用法: t tat [-abcdklm tuzBDFPRX] [-r seconds] [-o file] [infile]
-a print all info (optio : bcdklm tu)
-b print buffers(缓冲区)
-c print configuration file(配置文件)
-d print d aces and chunks(d ace和chunk)
-k print locks(锁)
-l print logging(日志)
-m print me age log(消息日志)
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
-p print profile(profile文件)
-s print latches(门闸)
-t print tbl aces(表空间)
-u print users(用户)
-z zero profile counts
-B print all buffers
-D print d aces and detailed chunk stats
-F print page flushers(页刷新进程)
-P print profile, including BIGreads
-R print LRU queues(LRU队列)
-X print entire list of sharers and waiters for buffers
-r repeat optio every n seconds (default: 5)
-o put shared memory into ecified file (default: t tat.out)
infile use infile to obtain shared memory information
三, 几个常用的t tat选项:
; t tat -m :显示消息日志的最20行.
消息日志的内容包括:
1),检查点信息
2),读写错误信息
3),ONLINE模式转换信息
4),长事务
5),日志文件满(LOG FILE FULL )
若想显示完整信息,可直接编译消息日志文件.
; T tat -d:磁盘空间的使用情况,包括DBSPACE和CHUNK的信息
例:RSAM Version 5.03.UC1 -- On-Line -- Up 09:45:41 -- 816 Kbytes
addre number flags fchunk nchunks flags owner name
8040a244 1 1 1 1 N informix rootd 1 active, 8 total
addre chk/d offset size free ages flags pathname
80409d84 1 1 0 300000 231871 PO- /dev/rdata
1 active, 8 total
其中的FREE项,显示了该CHUNK的空闲空间大小(Kbytes).
; T tat -l :日志文件情况
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-2 0 16 0 0 0.00
phybegin physize phypos phyused %used
101782 15000 960 0 0.00
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-2 0 16 1 1 1 1.0 1.0
addre number flags uniqid begin size used %used
8042de94 1 U---C-L 1 10521a 7500 630 8.40
8042deb0 2 F------ 0 106f66 7500 0 0.00
8042decc 3 F------ 0 108cb2 7500 0 0.00
8042dee8 4 F------ 0 10a9fe 7500 0 0.00
8042df04 5 F------ 0 10c74a 7500 0 0.00
8042df20 6 F------ 0 10e496 7500 0 0.00
其中:%USED: 使用百分比
FLAGS字段的含义:
F: 空闲 B:已备份 C: 正在接收事物记录
U: 正在使用 A: 新增日志 L: 包含最一个检查点
; T tat - u:ONLINE的用户情况
addre flags pid user tty wait tout locks nreads nwrites
804019f4 ------D 329 root co ole 0 0 0 179 2
80401a64 ------D 0 root co ole 0 0 0 0 0
80401ad4 ------F 330 root 0 0 0 0 0
3 active, 20 total
Tra actio addre flags user locks log begin isolation retrys coordinator
804022b4 A---- 804019f4 0 0 NOTRANS 0
804028d8 A---- 80401a64 0 0 NOTRANS 0
2 active, 20 total
其中:flages字段的含义:
第一列:(S:等待mutex;Y:等待条件;L:等待锁;B:等待缓冲区;
C:等待检查点;X:长事务清理;G:等待长缓冲写;T:等待事务)
第二列:(*:事务执行时,发生I/O错误)
第三列:(A:正在备份;B:操作已被记录在日志中;P:分布处理已准备好;
C:正在提交;R:正在回滚)
第四列:(P:会话的主线索)
第五列:(R:在read rsam 调用中;X:进程在关键分区)
第七列:(M:特殊监控;D:特殊线索;C:清理线索;F:特殊清页进程;
B:特殊B+树清页线索)
; T tat -k :用户持有锁的情况
锁按照粒度分为6种: 库锁,表锁,页锁,行锁,字节锁,键锁
字节锁:更新包含有VARCHAR类型的行时,加在该行上的锁.
键锁:用索引树上的锁.一般在相应字节上加删除标志.
这几种锁的识别如下:
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
TYPE TBLSNUM ROWID SIZE
库锁 HDR+X 1000002 205 0
表锁 100000e 0 0
页锁 100 0
行锁 101
字节锁 HDR+B 909
键锁 很大的16进制数
锁的生命期:1,不使用事务时,操作完成即会释放对应的锁;
2, 若使用事务,锁将伴随整个事务.(即随这COMMIT WORK或ROLLBACK WORK而
释放)
(**锁的几种类型:共享锁(SHARE),排它锁(EXCLUSIVE),可升级锁**)
; t tat -p : 显示系统资源状况(是否充分)
Profile
dskreads pagreads bufreads %cached dskwrits pagwrits bufwrits %cached
181 199 358 49.44 7 8 2 0.00
isamtot open start read write rewrite delete commit rollbk
3 1 1 0 0 0 0 1 0
ovtbls ovlock ovuser ovbuff usercpu syscpu numckpts flushes
0 0 0 0 0.00 0.00 2 239
bufwaits lokwaits lockreqs deadlks dltouts lchwaits ckpwaits compre 0 0 0 0 0 0 0 0
OVTBLS:指示TBLSPACE值不够 ,TBLSPACES值应增大
OVLOCK:锁溢出 LOCKS应增大
OVUSER:用户表资源不够 USERS
OVBUF:缓冲区资源不够 BUFFERS
以上数字若持续增加,表明相应参数值应调整
DEADLOCKS:检测到的死锁数
DLTOUTS:网络超时死锁
DEADLOCK_TIMEOUT:一般为60秒,若增大此数字,可以减少死锁数,但会增加响应时
间,用户看来性能更差;若减少此数字,死锁数可能会增大,但会减少响应时间,在用户看
来,响应时间变快了.
四, ONCHECK:
; 定位并修复数据与索引的不一致
; 检查磁盘上的数据结构
; 显示不同数据结构的报告
; 某些选项可能回在它所涉及的表上家一个共享锁
用法: tbcheck [-clist] [-plist] [-qny]
[ { database[:[owner.]table] | TBLSpace number | Chunk number }
{ rowid | page number } ]
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
-c - check(检查)
r - reserved pages(保留页)
e - TBLSpace extents and chunk extents
c - database catalogs(目录)
i - table indexes(表的索引)
I - table indexes and rowids in index(表的索引和索引的rowid)
d - TBLSpace data rows including bitma (表空间的数据行包括位图)
D - TBLSpace data rows including bitma , remainder pages and blo -p - print(显示)
r - reserved pages (-cr) (保留页)
e - extents report (-ce)(extent)
c - catalog report (-cc)(目录)
k - keys in index (-ci)(索引的键值)
K - keys and rowids in index (-cI)
l - leaf node keys only (-ci)
L - leaf node keys and rowids (-cI)
d - TBLSpace data rows (-cd)
D - TBLSpace data rows including bitma , remainder pages and blo (-cD)
t - TBLSpace report
T - TBLSpace disk utilization report
p - dump page for the given [table and rowid | TBLSpace and page number]
P - dump page for the given chunk number and page number
B - BLOBSpace utilization for given table(s) [database:[owner.]]table
-q - quiet mode - print only error me ages
-n - a wer NO to all questio -y - a wer YES to all questio 五, 几个主要的tbcheck选项:
; TBCHECK -PT DATABASE:TABLE
产生有关TBLSPACE的报告.包括EXTENT和空间使用信息.信息的输出来自TBLSPACE
TBLSPACE,这是一个特殊的TBLSPACE,用来跟踪ONLINE创建的数据库,是根DBSPACE
中的第二个TBLSPACE,其TBLSNUM为1000002.这个TBLSPACE中的每行保存一个数
据库的信息.
; TBCHECK -Cd DATABASE:TABLE
测试一个表空间的数据.它从表空间中读取所有页做一致性检查,并检测位图也以确认该页
被正确映像.它所做的工作包括:确认数据的有效性,对特殊数据做相应标志(如BLOB页,
剩余页等).
; TBCHECK -Ci DATABASE:TABLE
测试表上的索引,比如是否所有的ROWID都指向表中的有效行,必要时,重建SYSINDEXES
信息.它所做的工作包括:验证索引是否有效,重建被损坏的索引,并对索引树重新做相应
调整.
索引策略:
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
应加索引的字段:用连接(JOIN)的字段,用来过滤的字段(在WHERE条件中使用的字段,
称为过滤器),用排序的字段(ORDER BY).
不应加索引的字段:有高重复值的字段
另外,可以用主键限制索引个数,加复合索引来避免重复,用聚簇索引加快索引速度.
六,其它重要的工具:
; UPDATE STATISTICS [LOW | MEDIUM | HIGH]
此语句的三个主要作用:更新内部表;产生数据分布;优化存储过程
应定期使用
; tbinit
用初始化数据库共享内存.每次开机都必须执行此命令.一般将它放在/etc/rc2.d目录下的一
个自引导文件中.
例如:当以应用软件注册时,系统提示:
DBERR 529/C-ISAM 123 [Open Database]
使用finderr查529错误,提示:
-529 Ca ot attach to shared memory. {不能使用共享内存}
此时,使用tbinit命令将数据库共享内存进行初始化,系统恢复正常.
; tbmode -sy| tbmode -ky
用关闭数据库共享内存.为了数据的安全,每次关机前都必须执行此命令.为了简化操作,
我们经常将它放在/etc/rc0.d目录下的一个自引导文件中,让系统进入多用户时自动来执行此
文件.
; finderr
用来查询数据库的错误.当系统出现数据库错误时,系统处了给你简单的出错提示外,还给
出一个错误号.你可以使用此命令对这种错误进行深入的分析,然针对不同的错误进行相应
的处理.
例如:当你在超级用户root下对储蓄数据库bankstar进行操作时,系统提示:
387: No co ect permi ion.
111: ISAM error: no record found.
意思是:系统出现387错误,错误的原因是:没有co ect权限.
原因分析:
操作数据库至少需要CONNECT权限.解决如下:informix用户注册,执行如下SQL语句:
grant co ect to root
; dbacce (略)
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
Informix动态服务器命令集
作者:大梦 发表时间:2003/01/09 12:17pm
[这个贴子最后由大梦在 2003/01/09 01:34pm 编辑]
Informix动态服务器命令集
操纵动态服务器的运行模式
管理动态服务器系统的数据空间
管理逻辑日志和物理日志
利用o tat命令监控动态服务器系统
oninit 命令
语法 oninit [-s] [-i] [-p] [-y]
oninit 将系统从off-line模式变为on-line模式
oninit -s 将系统从off-line模式变为quiescent模式
oninit -i 初始化系统
oninit -p 在共享内存初始化时,不搜索,删除临时表
oninit -y 对提示自动回答yes
oninit -- 键入此命令可以获得使用帮助
oninit 命令用来改变系统的运行模式.其中-i选项用于初始化系统的root d ace.注意,
root-d ace一旦被初始化,则等于整个数据库系统被初始化.
如果用户希望在计算机启动时自动自动启动动态服务器系统,请在系统初启文件(在许多
UNIX系统中为/etc/rc)中加入o tat命令(不加任何选项).
onmode 命令
语法: onmode [-k] [-m] [-s] [-u] [-y]
onmode -k 执行立即shutdown,将系统变为off-line模式
onmode -m 将系统从quiescent模式变为on-line模式
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
onmode -s 执行graceful shutdown
onmode -u 执行immediate shutdwon
onmode -y 对提示自动回答yes
onmode 命令同样用于改变动态服务器的运行模式.除了上述选项外,onmode还有很多与改
变系统运行模式无关的选项.
利用o aces命令创建数据空间
语法: o aces -c [-b] [-d] [-z] [-m] [-o] [-p] [-s] [-t]
-c 创建blo ace或d ace
-b blo ace blo ace名
-d d ace d ace名
-g page size blo ages大小
-m mirror 镜像设备设的全路径名和偏移量(KB)
-o offset 偏移量(KB)
-p pathname chunk设备的全路径名
-s size d ace大小(KB)
-t 创建临时d ace
o aces命令用于创建数据空间,临时空间和存储blob数据的空间(blo ace).键入
o aces--可以获得该命令的联机帮助.利用o tat -D或o tat -d可以看到系统中的关于数
据空间的重要信息.包括:chunk的状态,空闲,每一chunk读写的次数.系统中可能包括
的多个系统空间,特别当进行数据分片后,我们建议用户最好能利用命令行来创建数据空间.
可以利用如下命令创建数据空间:
o aces -c -d datad 1 -o 0 -p /dev/rrvol3 -s 60000
可以用如下的方式创建临时数据空间:
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
o aces -c -d tempd 1 -t -o 0 -p /dev/rrvol5 -s 80000
在系统中,临时数据空间非常重要,通常情况下,应将多个临时数据空间分布在独立的物理
设备上.
利用o aces命令删除数据空间
增加或删除chunks
语法: o aces -a -d [-m] [-o] [-p]
-a acename 为d ace新增chunk
-m pathname 镜像设备的全路径名和偏移量(KB)
-o offset 主设备的偏移量(KB)
-p pathname chunk设备的全路径名
-s size chunk大小
-d acename 删除chunk
-o offset chunk设备的偏移量(KB)
o aces不仅能创建数据空间还能删除数据空间,临时数据空间或存储blob数据的空间.
在删除数据空间时,必须首先保证它是无用的,即该数据空间上无数据库或表.
如需删除数据空间,请键入如下命令:o aces -d d ace_name /blo ace_name
数据空间最初由一个chunk(first chunk)构成,一旦其空间用尽,用户必须追加chunk为了
提高系统性能,用户在为数据空间分配chunk时需要计算以保证它的大小能适应未来的需
要,否则在追加chunk的时候,它与先前的chunk在物理上不一定相邻,导致增加读取数据
的时间.关于如何计算空间需求将在以后章节中阐述.利用o aces命令可以对数据空间
增加或者删除chunk,除此之外,利用该命令还可以完成如下任务:启动镜像,中止镜像或改
变chunk的状态.
例如可以用如下命令为数据空间增加chunk:
o aces -a -d datad 1 -0 60002 -p /dev/rrvol3 -s 60000
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
再如可以用如下方式从数据空间中删除chunk:
o aces -d datad 1 -o 60002 -p /dev/rrvol3 -s 60000
o arams 命令
语法:o arams -a -d -p [-d] [-s] [-l]
-a 新增逻辑日志
-d d ace 指定日志存放的d ace
-s size 新增逻辑日志的大小(KB)
-d 删除逻辑日志
-l logid 指定删除一个逻辑日志
-p 改变物理日志
-d d ace 新物理日志存放的d ace名
-s size 物理日志大小(KB)
系统在初始化时自动地在root d ace中创建逻辑日志和物理日志.在DBMS系统中,尤其
在OLTP环境下,数据库的操作非常频繁,日志中必须记录大量的信息,所以用户最好能将
多个日志文件分布在不同的设备上.有一种非常简单的方法: 即按所需大小创建逻辑日志,
同时创建一个较小的物理日志,系统初始化完毕后,再将物理日志移至其它设备.关于如何
确定所需的物理日志的大小,将在以后的章节详述.
利用o tat -l命令可以看出系统中所有新增的逻辑日志被标识为A.这些逻辑日志只有在系
统进行归档后才会真正被使用.为了激活这些逻辑日志有一种简单的方法:执行一次"伪"
归档.具体步骤如下:将参数TAPEDEV设置为/dev/null然后运行一次ontape -s.也可以执
行o ar -F命令.由于伪归档并不真正归档系统信息,所以千万要适时地对系统进行真正的
归档操作.
只有在逻辑日志真正无用时才能将其删除.利用o tat -l 可以看出所有的空闲日志被标记为
F.如果逻辑日志中包含事务回滚或快速恢复所需的信息,该逻辑日志是不能被删除的.利
用o tat -l命令可以看出接受当前事务的日志被标记为C.如果逻辑日志包括最后一个检查
点记录,它也是不能被删除的,只有当检查点记录被写入下一个日志忠并且上一个日志被备
份后,该日志才能被删除.利用o tat -l命令可以看出包含最后一个检查点记录的日志被标
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
记为L.用户可以利用onmode -c命令强制写检查点记录直至最后一个检查点记录被写入所
要求的日志为止.
o tat 工具
显示动态服务器共享内存中的信息
涉及少量磁盘I/O操作
将对系统性能的影响极小
提供关于系统有价值得信息
命令行交互式监控系统
在本章中将讲解o tat 的各种重要选项,请熟悉它们的使用
o tat命令是一种非常有用的系统实时监控工具.该命令直接从共享内存的数据结构中读取
信息,报告当时的系统状况.通常o tat 命令不会进行磁盘I/O操作,也不会对系统资源加
锁,所以它对系统性能的影响减少到最小.简言之,o tat是informix提供的一种交互式的
系统监控工具.
o tat 的一些常用选项:
o tat -- 列出所有选项
o tat -i 设置进入交互模式
o tat - 显示运行模式和数据库引擎状态
o tat -g sub_option 运行多线索选项
o tat -r 每隔秒后重复选项
o tat -g act 显示系统中所有的活动线索
o tat -g ath -r 2 每隔两秒显示系统中所有的活动的线索
系统监控界面
sysmaster数据库在系统初始化时自动创建
数据库中包括指向系统共享内存结构数据字典信息
提供瞬时的系统性能和状态信息
提供SQL界面了解数据字典信息
允许管理员将系统管理工作自动化
用于执行重复性的监控任务
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
系统监控界面(system Monitoring Interface --SMI)是一种基于SQL的系统工具,用户通过
SMI可以非常方便地获取系统信息.系统在初始化时,自动地在root dbapace创建sysmaster
系统数据库.每一系统包括一个sysmaster数据库,该数据库中的大部分表为虚表,是指向
共享内存中数据结构的指针.利用SMI可以自动监控系统,特别是在执行重复任务时.
sysmaster数据库是只读的,即不允许对其进行INSERT UPDATE,或DELETE操作.所有用
户都拥有对该数据库的查询权限.
在系统初始化后,用户一定要注意检查sysmaster数据库是否建立成功.创建sysmaster数据
库的信息都保存在消息日志文件中(online.log)请注意由于所有的DDL语句都将被记录在日
志中,所以一定要在日志文件中留出足够的空间以保证创建sysmaster所需.
sysmaster数据库模式记录在$INFORMIXDIR/etc/sysmaster.sql文件中.
oncheck 命令
检查动态服务器磁盘上的数据结构
定位并修补损坏的索引和数据
有磁盘I/O操作
一些操作在处理时将在表上加锁
oncheck命令用于修复磁盘上损坏的索引和数据页,该命令也可用于检查并打印系统的数据
结构.在使用oncheck时一定要当心,因为改命令的某些选项会对表加共享锁,例如:oncheck
为防止对系统的损坏,系统会对所有共享内存中的数据进行一次一致性检查.一旦发现数据
页出现一致性错误或发现索引错误,系统将把问题和可能的解决方案(利用oncheck)写入消
息日志文件,并返回isam错误代码105.
如果发现一致性错误信息,用户应该立即关闭系统并按消息日志文件中的提示运行oncheck.
如果oncheck运行失败,则应尝试卸出表再重新装入;如果是索引得问题,则应先删除索引
再重建之.如果所有这些步骤都失败了,只有根据原有的系统归档备份来恢复系统.
下面的命令可以提供extend信息:
oncheck -pe
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
Informix 数据库函数库
作者:lovqing 发表时间:2003/01/04 06:23pm
Informix 数据库函数库
--------------------------------------------------------------------------------
本函数库共有 38 个函数
目前支持的 Informix 版本为 ODS 7.x,SE 7.x 与 Universal Server (IUS) 9.x 三种.在 ODS
7.x 的版本中,完全支持所有的数据类型,而在 IUS 9.x 中,不支持 SLOB 与 CLOB 二
种类型.
要在 Web Server 上*** Informix Client 端,在编译 PHP 之前 (configure 之前),要先设
好 IFX_LIBDIR,IFX_LIBS 及 IFX_INCDIR 三种环境变量,若是 9.x 版尚要配置
H***E_IFX_IUS 环境变量.同时在配置时要加入 --with_informix=yes 的选项.
ifx_co ect: 打开 Informix 服务器连接.
ifx_pco ect: 打开 Informix 服务器持续连接.
ifx_close: 关闭 Informix 服务器连接.
ifx_query: 送出一个 query 字符串.
ifx_prepare: 准备 query 字符串.
ifx_do: 执行已准备 query 字符串.
ifx_error: 取得 Informix 最后的错误.
ifx_errormsg: 取得 Informix 最后错误信息.
ifx_affected_rows: 得到 Informix 最后操作影响的列数目.
ifx_getsqlca: 取得 query 后的 sqlca 信息.
ifx_fetch_row: 返回单列的各字段.
ifx_htmltbl_result: 将 query 返回资料转成 HTML 表格.
ifx_fieldtypes: 列出 Informix 的 SQL 字段.
ifx_fieldproperties: 列出 Informix 的 SQL 字段属性.
ifx_num_fields: 取得返回字段的数目.
ifx_num_rows: 取得返回列的数目.
ifx_free_result: 释放返回占用内存.
ifx_create_char: 建立字符类.
ifx_free_char: 删除字符类.
ifx_update_char: 更改字符类.
ifx_get_char: 取得字符类.
ifx_create_blob: 建立长位类.
ifx_copy_blob: 复制长位类.
ifx_free_blob: 删除长位类.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
ifx_get_blob: 取得长位类.
ifx_update_blob: 更改长位类.
ifx_blobinfile_mode: 配置长位类模式.
ifx_textasvarchar: 配置文字模式默认值.
ifx_byteasvarchar: 配置位组模式默认值.
ifx_nullformat: 配置空字符模式默认值.
ifxus_create_slob: 建立 slob 类.
ifx_free_slob: 删除 slob 类.
ifxus_close_slob: 删除 slob 类.
ifxus_open_slob: 打开 slob 类.
ifxus_tell_slob: 返回目前文件或找寻位置.
ifxus_seek_slob: 配置目前文件或找寻位置.
ifxus_read_slob: 读取指定数目的 slob 类.
ifxus_write_slob: 将字符串写入 slob 类中.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
Informix系统维护技巧谈 (修复,空间回收,迁移,查询优化)
作者:lovqing 发表时间:2003/01/04 06:22pm
Informix系统维护技巧谈 (表的修复,空间回收,迁移,查询的优化)
作者: 卢守东
Informix是一种大型的数据库管理系统,具有先进的技术,性能与可靠性,在全球范围
的各种应用中使用十分广泛,
包括政府,金融保险,邮政电信,制造及零售等重要行业或领域.本文根据笔者在SCO Unix
/Xenix上使用 Informix-4GL
与Informix-SQL的经验,简要介绍Informix系统维护中的几个较为特殊的问题及其处理方
表文件的修复
Informix的数据库是指由若干张表所构成的集合,其中每一张表对应着两个文件,即数
据文件(缀为.dat)与索引文件
(缀为.idx).当系统出现异常,死机,掉电或非正常关闭时,有时会使一些使用中的表文件
未能正常关闭而出现毁损,
当系统再次对这些表进行相关操作时,就会报告"不能检索下一条记录","不能删除记录"
等错误信息.
通常,数据文件是很少发生问题的.要判别数据文件是否正常,只需执行select * from
〈tablename〉语句或类
似的语句即可, 但不能使用where,order by等子句,以免利用到索引文件, 目的就是纯
粹从数据文件中依次读取数据.
如果数据读取顺利且记录个数正确,表明该文件完好无损;反之,则有问题,通常只能用其
数据备份来恢复.
如果数据文件正确无误,那就该检查相应的索引文件.Informix提供有一个实用程序
bcheck,专门用来检查与修复
索引文件,即依次比较数据文件与索引文件,倘若不一致,就询问是否删除和重建有问题的
索引.bcheck有许多选项可供
选用,其中-n和-y用对所有的提问都回答"no"或"yes",让系统自动进行一系列的操
作.其语法如下:
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
bcheck [选项] 〈表文件名〉
要检查表的索引文件,应先运行bcheck -n命令.如果一切正常, 说明索引没有问题.
一旦发现有错误报告(如有多
少个错误数据记录指针,丢失了多少个数据记录指针或索引结点指针等),则再执行bcheck
-y 命令即可将其修复.
Informix-SQL中的语句check table 〈表名〉与repair table 〈表名〉在运行时分别以
选项-n与-y调用bcheck命令,
功能一样,不同的只是使用表名而不是表文件名.
如果索引文件没有相应的读写权限, 或者没有正确指明其路径, 在bcheck时会出现
"无法打开索引文件"的信息.如
果索引文件被删除或格式被破坏了,也有同样的信息.此时可从数据备份中将对应的索引文
件拷贝回来,也可暂时创建一个
字段与索引均与原表完全一致的新表并将其索引文件拷贝给原表,再运行bcheck -y命令
修复.
表空间的回收
Informix对数据表的管理方式较为特殊,当数据量增加时,表所占用的磁盘空间随之增
加;但数据记录被删除时,原先
所占用的空间暂不释放,依然由该表所控制,作为日增加记录时使用.为提高系统的性能及
有关各表的查询速度,应及时
回收这种"空闲"的磁盘空间.
使用bcheck -s命令可回收索引文件的空间,其中-s 选项的作用是重新估算索引文
件的大小.要同时回收数据文件与
索引文件的空间,可让DBMS(数据库管理系统)去做表结构的修改工作,但修改前的表结构
及有关权限要保证一样.可利用
Informix-SQL达此目的,最为保险的做法是先给相应的表增加一个字段,再将该字段删除.
也可利用alter table 命令
"欺骗"DBMS去修改表的结构,如alter table aa modify( smallint),其中aa表的字段 的类型本来就是smallint.
表的迁移
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
任何一个Informix数据库都有九个系统表,用记录数据库的有关信息,其中系统表
systables(用描述数据库中的各表)
中的字段dirpath指明各表文件的绝对路径或相对路径.
Informix数据库的搜索路径一般由环境变量DBPATH来设定,系统根据DBPATH的正
确设定即可找到相应的数据库及其各表.
迁移Informix数据库表时(比如从Unix/Xenix的根文件系统迁移到分离的文件系统/u),只
要重新设定DBPATH,通常系统即
可正常运行.如果报告某些表找不到了(实际上这些表文件还在,且有关权限也对),问题
就在systables 表中的dirpath
字段值采用了绝对路径, 此时要用update命令修正其值,最好改用相对路径,即直接改为
表文件名.
系统查询的优化
Informix在执行查询(特别是多表查询)指令前,会利用其所提供的优化器(cost-based
optimizer,基成本的优化器),
依据当时系统所记载的有关各表的相关信息,按照一定的判断法则进行分析并选择出一条最
有效率的途径来执行.系统必须掌
握各表的正确数据,才不至做出错误的选择.但出系统效率上的考虑,不可能随时修改记录
各表最新状况的相关文件,
否则会增加许多额外的输入/输出负担.因此, 应定期执行这种信息的更新操作.
在Informix数据库的系统表systables中有一字段nrows,专门用来记录各表的记录个数.
优化器在运行法则判断时,
各表的nrows 值具有很高的参考价值.nrows的更新可通过如下命令来完成,即:
update statistics [for table 〈tablename〉]
其中,方括号[]中的子句是可选的,用指定表名,以对该表进行更新;否则,将对数据库
中的各表进行全部更新.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
Informix数据库的锁技术
作者:lovqing 发表时间:2003/01/04 06:18pm
Informix数据库的锁技术
作者:不详
INFORMIX使用锁技术解决在多用户访问数据库情况下,对同一对象访问的并发控制问题.
INFORMIX
支持复杂的,可伸缩性的锁技术.
锁的类型
INFORMIX有三种不同类型的锁.它们在不同的情况下使用.
1. SHARED锁
SHARED锁只保留对象的可读性.当锁存在时,对象不能改变.多个程序可对同个对象加
SHARED锁.
2. EXCLUSIVE锁
只能使单个程序使用.在程序要改变对象时使用.当其他锁存在时,EXCLUSIVE锁不能使
用.当使用了E
XCLUSIVE 锁,其他锁不能用同一对象.
3. PROMOTABLE锁
实现更新的目的.PROMOTABLE锁可以放在已经有SHARED锁的记录,但不能放在已经
有PROMOTABLE锁和EXCLUSIVE
锁的地方.当记录上无其他锁(含SHARED 锁)情况下,这时在程序准备改变锁的记录时,
PROMOTABLE锁可以提
升为EXCLUSIVE锁.如果在已有SHARED锁的记录上设置了PROMOTABLE锁,在
PROMOTABLE锁可以提升到EXCLUSIVE锁
之前需要删除SHARED 锁.PROMOTABLE锁只能在INFORMIX Universal Server中支持.
锁的范围
INFORMIX对数据锁定提供了三种不同的方式,范围由大到小分别是数据库,表,记录级
锁.使用的时机要看应
用状况而定.
1. 数据库级锁
你可以用CONNECT, DATABASE, 或 CREATE DATABASE语句打开数据库.打开数据库
的操作就在数据库上设置了SHARED
锁.只要程序打开一个数据库,SHARED锁就会阻止其他程序删除数据库或在数据库上设
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
置EXCLUSIVE锁.你可以用语
句DATABASE database name EXCLUSIVE锁定整个数据库.若此时其他用户正在使用该数
据库,该操作将返回错误.
一旦设置了EXCLUSIVE锁,其他程序就不能打开数据库,因为打开时要放置一个SHARED
锁.只有数据库关闭时,数据
库锁才释放.你可以用DISCONNECT或CLOSE DATABASE显示地处理,也可以运行其他
的DATABASE语句隐含的处理.一般
数据库级EXCLUSIVE锁是独占数据库资源,防止其他程序访问数据库.它使得程序非常
简单,不会产生并发效果.常
用在非高峰时期要改变大量数据时如数据库备份过程.
2. 表级锁
INFORMIX提供两种模式表级锁:EXCLUSIVE MODE 和SHARE MODE.你可以锁整个
表.在某些情况下,这个操作是自动
进行.当INFORMIX处理下列语句时,一般锁整个的表:ALTER INDEX ,ALTER TABLE ,
CREATE INDEX,DROP INDEX ,
RENAME COLUMN,RENAME TABLE .该语句结束或事务结束会释放该锁.在某些查询
语句中,INFORMIX也自动锁整个表.
你可以用LOCK TABLE语句显示地锁整个表.该语句允许你对整个表设置EXCLUSIVE锁
或SHARED锁.当你程序从表中读取
数据时,SHARED锁防止表中数据更新.INFORMIX Universal Server 通过设置隔离级别实
现更大程度并发数据保护.
表级EXCLUSIVE锁防止对同个表的并发使用.因此,如果其他许多程序要使用该表时,
系统性能会受到严重影响.类
似数据库级EXCLUSIVE锁,表级EXCLUSIVE锁常用在非高峰时期要改变大量数据时.
例如,有些应用在高峰期间并不更
新表,它们可以在非高峰期间定期以批处理方式更新.
通过UNLOCK TABLE table name 解除锁.当存在事务时,事务结束时解除锁.
3. 记录级,页级,键字级锁
表的一个记录是可设置锁的最小对象.一个程序可以锁一个记录或记录的集合,同时其他程
序可以操作同一个表的其
他记录.Universal Server 以磁盘页面(disk pages)为单位存储数据.一个磁盘页面包含一
个或多个记录.在有
些情况下,页级锁比单个锁更好些.其他数据库服务器可能不存在页级,键字级锁.
在Universal Server上,当你创建表时,你可以选择使用记录级锁或页级锁.其他的数据库
服务器不提供这种选择.
页级,记录级锁有相同的效果.当Universal Server需要锁一个记录时,根据表创建时的锁
模式,锁这个记录或记录
所在的页面.在一定情况下,数据库服务器需要锁一个不存在的记录.它的效果相当在记录
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
将要存在的地方放一个
锁.当表使用记录锁时,对假想的记录使用键字锁.当表使用页级锁时,含有或可能含有键
字的索引页将被设置键级锁.
锁的时期
程序控制数据库级锁的时期.数据库关闭时,数据库锁级也就释放.表级,记录级,索引级
锁的时期依赖使用的SQL
语句以及是否使用事务.如果数据库没有使用事务,也就是说,事务日志不存在并且你没有
使用COMMIT WORK语句,当
运行UNLOCK TABLE语句时,表级锁就释放.当使用了事务时,事务结束,表级,记录级,
索引级锁都释放.修改时锁的
当数据库服务器通过一个更新游标取一条记录时,它在该记录上设置一个PROMOTABLE
锁.如果这个动作成功,数据库服
务器知道其他程序不能改变此记录.因为PROMOTABLE锁不是独占的,其他程序能够继
续读这条记录.由在取此记录的
程序执行UPDATE,DELETE语句或简单地取下一条记录之前,它可能花一些时间.这样
就提高了性能.当它改变一个记录
时,数据库服务器在这条记录上设置一个EXCLUSIVE锁.如果它已经有一个
PROMOTABLE锁,它将锁改为EXCLUSIVE状态.
EXCLUSIVE锁的时期依赖是否使用事务.如果没有使用事务,被修改的记录写到磁盘上就
会释放该锁.当使用了事务时,
锁就会保持到事务的结束.这个动作防止其他程序使用可能回滚到原来状态的记录.
当使用了事务时,只要删除记录键级锁就会设置.使用键级锁解决下列错误:程序A删除
一个记录,程序B插入有同样键的
记录.程序A回滚事务,使数据库服务器恢复了删除的记录,这时程序B插入的记录怎办
通过锁索引,数据库服务器等
到程序A提交事务时才插入记录.
由 Universal Server数据库服务器管理自己的锁,所以它能提供不同类型的锁.其他的数据
库服务器是通过操作系统
的特性实现锁,所以不能提供多种选择.有些操作系统通过操作系统服务方式向外提供锁函
数.在这些系统,数据库支持
SET LOCK MODE语句.而有些操作系统不支持内核级的特性,数据库这时通过在数据库
目录下产生小文件实现锁.这些文
件带有.lok缀.如果你的程序使用单个SELECT语句或没有用FOR UPDATE声明的游标提
取一个记录,此记录不管是否被
一个未完成的交易上锁会马上被提取.这样能产生最好的性能.当你使用FOR UPDATE声
明的游标时,它在提取前将当前
记录上锁.如果当前记录已经有锁,随作选择模式的不同,程序会等待或返回错误.当取下
一个记录时,数据库看当前
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
记录是否更新(使用带WHERE CURRENT OF 的UPDATE
锁的模式
锁的模式决定程序遇到被锁的数据会产生怎样的结果.当程序要提取或修改一个上锁的记录
时,会有下面几种情况:
1, 数据库马上通过SQLCODE变量或SQLSTATE结构给程序返回一个错误代码.
2, 在数据解锁前,数据库将程序挂起.
3,数据库将程序挂起一段时间.如果锁还未解,数据库给程序返回一个错误代码.
你可以通过SET LOCK MODE模式选择以上结果.
如果你喜欢程序等待(对大多数程序而言这是最好的选择),运行下列语句:SET LOCK
MODE TO WAIT.
当设置了锁模式,程序常忽视其他并发程序的存在性.如果程序需要访问其他程序已上锁的
记录时,它等待别的程序
解锁,然继续.延迟的时间常不可预测.
等待解锁不利的一面就是可能会等待很长时间.如果不能接受很长延迟,程序可以运行下列
语句:SET LOCK MODE TO
NOT WAIT选择不等待.当程序需要一个锁记录时,它马上返回一个错误代码,且当前的
SQL语句终止.这时,程序必须回
滚当前的交易再试一次.程序开始时,数据库初始设置为不等待.
当你使用UNIVERSAL SERVER时,你有另外的选择.你可以让数据库设置等待时间的上
限.你可用下列语句:SETLOCK MODE
TO WAIT 18让数据库有18秒等待上限.若期间锁还没有解开,将返回错误代码.
在每个程序都选择了锁等待模式情况下,有可能出现死锁.死锁是程序之间相互阻塞,每个
程序在其他程序要访问的对象
上设置了锁.UNIVERSAL SERVER在单个网络服务器情况下会马上检测到死锁.如果程序
选择了锁等待模式,通过给程序返
回错误代码,你就知道你遇到了死锁.而在多个数据库服务器的情况下,UNIVERSAL
SERVER不能马上检测到.每个数据库
服务器都设置锁等待的上限.如果超时,数据库服务器就认为发生了死锁且返回相关的错误
代码.数据库管理员可以设置
和修改等待时间的上限.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
informix系统一览表!
作者:大梦 发表时间:2002/12/26 00:18am
[这个贴子最后由大梦在 2002/12/26 00:20am 编辑]
systables:描述数据库中的很张表;
syscolum :描述数据库中表的列;
sysindexes:描述数据库中列的索引;
sysfragments:存储了分段索引的片段信息;
sysfragauth:表识别列级权限;
sysviews:描述了数据库中定义的每个视图;
sysdpend:描述了视图是如何依赖其他视图和表的;
sy yntable:定义每一个同义词及其所代表的对象;
sysco traints:记录了加载在数据库表列上的约束;
sysreferences:列出了放置在数据库上的参照约束,它为数据库的每个参照约束建立一行
syscoldepend:记录了涉及检查约束的所有列,包括在约束中每列都会在syscoldepend表中
创建一行;
sy rocedures:存放数据库中每个过程的特征;
sy rocplan:装载了过程执行所需的两项内容(执行计划或查询计划,附属列表);
sy rocauth:描述授予存储过程的权限;
systriggers:装载了关于触发器的信息;
sy lo :确定BLOB列的存储位置;
sysroleauth:描述授予用户的角色;
sysobjstate:存储了关于数据库对象的状态信息;
sysvlolatio :违例或诊断表;
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
informix-4gl 7.2编写的通用菜单函数!!!
作者:大梦 发表时间:2002/12/20 01:42pm
###############################################################################
# 版本号: Ver 1.0 研制时间:2001.2.15 #
###############################################################################
globals
define winopened char(1)
define thrmenu array[4] of char(16)
define popmenu array[4,5] of char(14)
define hlpmenu array[4,5] of char(60)
define poprowno array[4] of smallint
define maxmenuno smallint
define menuno, currow, rstart smallint
define p_branch_no char(6)
define p_branch_name char(60)
define p_today char(13)
define p_clerk_code char(10)
define p_clerk_pa char(15)
end globals
optio me age line last,
comment line last-2,
error line last,
prompt line last-1,
form line first+1,
i ut wrap,
accept key interrupt
optio delete key control-o
optio i ert key control-i
optio next key control-n
optio previous key control-p
optio accept key control-z
defer interrupt
# set isolation to dirty read
# set lock mode to wait 5
# whenever error continue
# call startlog("err.log")
let p_branch_no = arg_val(1)
let p_clerk_code = arg_val(2)
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
let p_clerk_pa = arg_val(3)
call initmenu()
open window mtwin at 2,2 with 1 rows,78 colum attribute(border)
open window mswin at 5,2 with 18 rows,78 colum attribute(border)
while true
call di menu(0)
case menuno
case currow
when 5 exit while
end case
case currow
when 5 exit while
end case
case currow
when 5 exit while
end case
case currow
when 5 exit while
end case
end case
end while
close window popwin
close window mswin
close window mtwin
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
end main
#####################################################
# 函数名称: initmenu() #
# 作 用: 初始化菜单函数 #
#####################################################
function initmenu()
define i smallint
let menuno = 1
let currow = 1
let rstart = 4
initialize thrmenu to null
initialize popmenu to null
let maxmenuno = 4
let thrmenu[1] = " A.柜面处理模块 "
let thrmenu[2] = " B.数据报表模块 "
let thrmenu[3] = " C.参数维护模块 "
let thrmenu[4] = " D.系统帮助模块 "
let poprowno[1] = 5
let popmenu[1,1] = "1.原始数据维护"
let popmenu[1,2] = "2.日清日结处理"
let popmenu[1,3] = "3.佣金数据查询"
let popmenu[1,4] = "4.综合查询处理"
let popmenu[1,5] = "E.退 出"
let hlpmenu[1,1] = "对各机构的原始数据进行查询,增,删,改处理"
let hlpmenu[1,2] = "对各机构录入的数据进行日清日洁处理"
let hlpmenu[1,3] = "对各机构的业务员,部门进行佣金统计处理"
let hlpmenu[1,4] = "对各机构的数据进行综合查询处理"
let hlpmenu[1,5] = "退出柜面处理系统"
let poprowno[2] = 5
let popmenu[2,1] = "1.佣金统计报表"
let popmenu[2,2] = "2.个人统计报表"
let popmenu[2,3] = "3.部门统计报表"
let popmenu[2,4] = "4.机构统计报表"
let popmenu[2,5] = "E.退 出"
let hlpmenu[2,1] = "对各机构业务员的佣金信息进行打印处理"
let hlpmenu[2,2] = "分机构对业务员进行综合统计"
let hlpmenu[2,3] = "分机构对部门进行综合统计"
let hlpmenu[2,4] = "分机构进行综合统计"
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
let hlpmenu[2,5] = "退出柜面处理系统"
let poprowno[3] = 5
let popmenu[3,1] = "1.机构部门维护"
let popmenu[3,2] = "2.人员信息维护"
let popmenu[3,3] = "3.险种信息维护"
let popmenu[3,4] = "4.佣金参数维护"
let popmenu[3,5] = "E.退 出"
let hlpmenu[3,1] = "设定机构,部门信息"
let hlpmenu[3,2] = "设业务员基本信息"
let hlpmenu[3,3] = "设定大类险种,明细险种及交费方式信息"
let hlpmenu[3,4] = "设定各明细险种的佣金参数"
let hlpmenu[3,5] = "退出柜面处理系统"
let poprowno[4] = 5
let popmenu[4,1] = "1.系统版本信息"
let popmenu[4,2] = "2.系统开发环境"
let popmenu[4,3] = "3.系统操作指南"
let popmenu[4,4] = "4.信息反馈简介"
let popmenu[4,5] = "E.退 出"
let hlpmenu[4,1] = "显示柜面处理系统的相关版本信息"
let hlpmenu[4,2] = "显示柜面处理系统的开发及应用环境"
let hlpmenu[4,3] = "显示柜面处理系统的各种操作指南"
let hlpmenu[4,4] = "显示本系统的信息反馈方式或获取相关资料"
let hlpmenu[4,5] = "退出柜面处理系统"
let winopened = "N"
end function
#####################################################
# 函数名称: di menu() #
# 作 用: 显示菜单函数 #
# 参 数: oper: = 0 显示菜单和选择 #
#####################################################
function di menu(oper)
define oper smallint
define i,j,k smallint
define a w char(1)
define cstart smallint
while true
current window is mtwin
let p_today = today using " mmm dd,yyyy "
#di lay p_today at 1,66 attribute(reverse,underline)
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
di lay "作者: 大梦 " at 1,66 attribute(reverse,underline)
for i = 1 to 4
let j = (i-1) * 16 + 1
di lay thrmenu[i] at 1,j
end for
let j = (menuno-1) * 16 + 1
di lay thrmenu[menuno] at 1,j attribute(reverse)
if currow 0 then
let cstart = (menuno-1)*16 + 3
let i = poprowno[menuno] + 1
if winopened = "N" then
open window popwin at rstart, cstart with i rows , 14 colum attribute (border,prompt line i)
let winopened = "Y"
current window is popwin
for i = 1 to poprowno[menuno]
di lay popmenu[menuno,i] at i,1
end for
di lay popmenu[menuno,currow] at currow,1 attribute(reverse)
if oper = 1 then
while true
prompt " 请 选 择:" for char a w on key (up)
if currow = 1 then di lay popmenu[menuno,currow] at currow,1
let currow = poprowno[menuno]
else if currow 1 and currow 0 then
di lay popmenu[menuno,currow] at currow,1
let currow = currow - 1
di lay popmenu[menuno,currow] at currow,1 attribute(reverse)
on key (down)
if currow = poprowno[menuno] then di lay popmenu[menuno,currow] at currow,1
let currow = 1
if currow poprowno[menuno] and currow 0 then
di lay popmenu[menuno,currow] at currow,1
let currow = currow + 1
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
di lay popmenu[menuno,currow] at currow,1 attribute(reverse)
on key (left)
if winopened = "Y" then
close window popwin
let winopened = "N"
if menuno 1 then
let menuno = menuno - 1
let menuno = maxmenuno
if poprowno[menuno] 0 then
let currow = 1
let currow = 0
exit while
on key (tab,right)
if winopened = "Y" then
close window popwin
let winopened = "N"
if menuno = poprowno[menuno] or a w is null or a w 1 then
continue while
if a w , = ,.]]
以上参数代表的意义如下:
中包括的内容为必选项,[ ]中的内容为可选项
-l:指示onunload分别从配置参数TAPEDEV,TAPEBLK和TAPESIZE中读入磁带设备,
块大小和备份设备容量值
-t:指定备份设备名
-b:指定备份设备的块大小
-s:指定备份设备的存储容量
database:指定要备份的数据库
owner:指定表的属主
table:指定要卸出的表
使用onunload需要注意的问题
1)onunload备份的数据必须用onload命令进行恢复;
2)onunload/onload不能实现不同版本的online之间的数据转移;
3)onunload/onload是以磁盘页大小为单位存储的二进制数据,卸出和接受数据的计算机必
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
须具有相同的磁盘页大小;
4)只能将onunload卸出的数据装入online管理的数据库或表;
5)用户必须具有DBA访问权限,才能执行onunload命令;
6)onunload不保留初始表上定义的访问特权;
7)onunload不保留初始表上定义的同义词.
以上三种数据备份方式各有特点,ontape备份对online参数配置前后一致性要求较高,但数
据备份和恢复操作简单,备份和恢复速度较快;onunload备份以页为单位以二进制形式进行
备份效率较高,数据恢复时只要计算机磁盘页大小一致即可;用dbexport所做的备份可以
实现不同版本,不同Informix产品之间的数据转换,数据转移灵活方便.
为保证数据能够安全恢复,数据备份至少应该选择两种方式.通过对Informix-Online数据
库三种常用备份方法分析比较与归纳,用户可以根据实际情况选择适合自己需要的备份方
式,来保证数据的安全恢复与转移
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
逻辑日志管理
作者:lovqing 发表时间:2002/12/16 09:40am
逻辑日志管理
逻辑日志记录所有对数据库服务器进行修改的逻辑操作单元(即存储用于回滚事务和数
据恢复的数据)
逻辑日志的大小与物理日志的大小一样重要.不是对检查点操作有影响,逻辑日志的大小影
响事务并发性.LTXHWM和LTXEHWM参数决定在强制一个事务回滚或暂停所有其它实
例活动使该事务提交或完成回滚操作之前可以填充的逻辑日志百分比.
如果逻辑日志太小,就会填充得太快.尽管这些日志信息往外拷到磁带上的速度更快了,但
依赖于应用程序中事务的长度或用户操作的长度,出现长事务错误的可能性也就越大.
另一方面,较大的逻辑日志意味着你不必太担心长事务问题.但是日志需要长时间才能填满,
结果就不能及时备份到磁带上.如果发生了灾难性的磁盘错误,那么就需要实例备份磁带和
逻辑日志备份到磁带来恢复该实例.如果一天仅填满一个逻辑日志,那么要想恢复就十分困
难了,因为当天的日志还在磁盘上.
依赖一定程度的想象,在实例正常使用的情况下,逻辑日志应当每30~60分钟被填满并
备份到磁带上.
o tat -l
Informix Dynamic Server Version 7.30.UC2 -- On-Line -- Up 6 days 02:22:19 -- 9
66656 Kbytes
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-1 18 32 788070 25374 31.06%
phybegin physize phypos phyused %used
10003f 25000 15495 1874 7.50
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-1 0 160 10353826 702185 464470 14.7 1.5
Su ystem numrecs Log Space used
OLDRSAM 10353826 712439620
addre number flags uniqid begin size used %used
8352f680 1 U-B---- 11544 1061e7 12500 12500 100.00%
8352f69c 2 U-B---- 11545 1092 12500 12500 100.00%
8352f6b8 3 U-B---- 11546 10c38f 12500 12500 100.00%
8352f6d4 4 U-B---- 11547 10f463 12500 12500 100.00%
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
8352f6f0 5 U-B---- 11548 112537 12500 12500 100.00%
8352f70c 6 U-B---- 11549 11560b 12500 12500 100.00%
8352f728 7 U-B---- 11550 6135e6 12500 12500 100.00%
8352f744 8 U---C-L 11551 6166ba 12500 10616 84.93%
8352f760 9 U-B---- 11530 61978e 12500 12500 100.00%
逻辑日志文件的状态显示包括两个区域:
number:标识单个逻辑日志文件的logid.
flags:标明相应逻辑日志文件的状态.flags状态标志有七个位置,但仅第一,三,五,七
有标志值.
第一个位置上,可能出现A,F,U三个标志中的一个;
第三个位置上,标志B可能出现也可能也可能不出现;
第五个位置上,可能为标志C也可能为空;
第七个位置上,可能是标志L也可能为空;
位置 标志 含义
1 A Added,新增加的逻辑日志文件,仅当建立一个(根d ace的)0级archive
后才能使用.
1 F Free,该逻辑日志文件空闲并可以使用.
1 U Used,该逻辑日志文件正在使用而未释放,OnLine恢复时还需要该文件
(回滚一个事务或找到上一个检查点记录)
3 B Backed-UP,该逻辑日志文件已备份.
5 C Current,该逻辑日志文件是当前正在填充的逻辑日志文件.
7 L Last,该逻辑日志文件包含有最近一次检查点记录,在新的检查点记录写
另一个日志文件之前,该文件及后面的逻辑日志文件不能释放.
所有状态标志的可能组合
状态标志 逻辑日志文件的状态
A------ 上次0级archive以来新增加的逻辑日志文件,暂时不能使用
F------ 空闲
U------ 正在使用,还没有备份
U-B---- 日志已备份,恢复时还需要
U-B---L 日志已备份,包含上次检查点记录,恢复时还需要此文件
U---C-- 当前日志文件
U---C-L 当前日志文件,并包含上次检查点记录
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
数据库日志模式
作者:lovqing 发表时间:2002/12/16 09:37am
数据库日志模式
-N No Logging 没有日志
-U U uffered Logging 非缓冲日志
-B Buffered Logging 缓冲日志
-A U uffered Logging, Mode ANSI ANSI模式
No Logging 没有日志
----"没有日志"模式只向逻辑日志写很少的信息,它只记录执行的DDL语句,这些语句
影响到的行并不被写入日志中,只记录命令本身以及返回的代码.一个不带日志的数据库环
境可以具有很高的吞吐率,但在发生严重的实例失败时没有能力重建对数据库的修改.写到
磁盘上的修改才是可以得到的全部信息.对实例中不带日志数据库的恢复只能到最后一次创
建的实例备份中进行.
U uffered Logging 非缓冲日志
----使用"非缓冲日志"模式的数据库环境只要事务提交,就会将包含该事务信息的物理日
志和逻辑日志缓冲区刷新到磁盘上.
----使用非缓冲日志,即使出现严重的实例错误,数据完整性和一致性也可以在事务级得到
保证.但是因为每一次提交事务都会导致缓冲区被刷新到磁盘上,所以增加了磁盘I/O.另
外,因为刷新是按照当前事务的进度将整个缓冲区内容都写到逻辑日志中,所以逻辑日志的
页面中会有很多没有用的数据.日志填充得很快,但其中包含的"真正"数据却比缓冲日志
数据库环境少得多.
Buffered Logging 缓冲日志
----使用"缓冲日志"模式的数据库环境将在逻辑日志和物理日志缓冲区中保留这些事务
信息,直到该缓冲区填满,或者发生检查点操作,或者是当事务还没有被写往日志之前关闭
了产生该事务的用户连接.
----有这样一种情况可以强迫缓冲日志数据库写出它的事务信息:因为实例中只有一组逻
辑日志缓冲区,当实例中的一个非缓冲日志数据库提交一个事务时,缓冲日志信息会随着非
缓冲日志信息一起被写出到磁盘上.
----在"缓冲日志"数据库环境中,每个事务所造成的磁盘I/O大大降低,因此实例会运
行得较快,但是因为事务信息存储在共享内存中,严重的实例错误就会很危险,当实例的共
享内存被释放时,那些还没有写到磁盘上的事务信息就都丢失了.
*非缓冲日志模式和缓冲日志模式的操作方式完全相同,其不同点在于何时将日志记录写到
磁盘上,
U uffered Logging, Mode ANSI ANSI模式
---- ANSI模式的操作与非缓冲日志一样,但它还强制与ANSI事务处理方式一致.ANSI
一致性包括这样一些特点和规则,如对引用表的唯一属主命名,表级权限的不同缺省值,游
标读和更新能力的不同,以及character和decimal数据类型对数据类型越界或定义语句如何
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
反应的不同.
*OnLine Dymanic Server在ANSI数据库环境中并不严格强制遵从所有的ANSI标准,如
果你执行一条非ANSI的SQL语句,实例会产生一条警告信息,但仍然往下处理.除非操
作环境要求使用ANSI标准,否则使用ANSI模式不会得到任何好处.
用onmonitor改变日志模式:
onmonitor --- Logical-Logs --- Database
用ontpae改变日志模式:
ontape –s –L 0 –N cem2 将数据库"cem2"从-U,-B,-A其中一种模式改变到-N模式,
创建0级备份
ontape –s –L 0 –U cem2 将数据库"cem2"从-N改变到-U模式,创建0级备份
ontape –s –L 0 –B cem2 将数据库"cem2"从-N改变到-B模式,创建0级备份
ontape –s –L 0 –A cem2 将数据库"cem2"从-N改变到-A模式,创建0级备份
*ontape工具在-U,-B,-A三种模式中任何一种改变到另一种不需创建系统备份;
要完全从不带日志模式改成带日志模式,或者反过来,需要创建一个0级备份;
用ondblog改变日志模式:
ondblog工具只是设置一个标志,表示在下次0级备份之后将数据库日志模式改成什么.
ondblog工具的选项如下:
nolog 将数据库改为不带日志模式
u uf 非缓冲日志
buf 缓冲日志
a i ANSI日志模式
cancel 取消前面作出的改变日志模式的请求
附加选项:
1.用空格相隔的一些数据库名,这些数据库的日志模式将被改变.
2.–f选项跟一个文件名,该文件中包含要改变日志模式的数据库名,这些数据库名在文件
中单独列出,一个占一行.
*如果没有–f加文件名,也没有列出用空格相隔的数据库名,ondblog工具在下一次0级
备份之后将把实例中所有数据库都改成所要求的日志模式.
* 不管是使用ontape工具,还是使用ondblog 和ontape的组合改变数据库的日志模式,该
实例都不必处于quiescent状态,但是在试图改变日志模式的时候,不能有任何活动用户线
索连接在该实例上.否则的话,就会产生一个"-107"号错误.
* 如果ontape命令已经执行来改变数据库的日志模式,而中途又将其中断,则就用户连接
来说,该数据库仍然是关闭的,直到创建一个完全的实例备份为止,不管是否要改变日志模
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
虚拟处理器 ---- Virtual Proce ors
作者:lovqing 发表时间:2002/12/16 09:42am
虚拟处理器 ---- Virtual Proce ors
虚拟处理器的类型
虚拟处理器根据它们所做处理的类型分为不同的类,每一类虚拟处理器用来处理某些特定类
弄的线索,具体分类如下:
虚拟处理器类 类别 作用
CPU 运行所有的会话线索和一些系统线索,
运行核心异步I/O线索(如果核心异步I/O能用)
PIO 磁盘I/O 运行写物理日志的内部线索
LIO 磁盘I/O 运行写逻辑日志的内部线索
AIO 磁盘I/O 执行除日志以外的所有磁盘I/O
SHM 网络 运行内部共享内存通讯的线索
TLI 网络 使用TLI(传输层接口)进行网络通讯
SOC 网络 使用Sockect(套接字)进行网络通讯
OPT 光盘 执行对光盘的I/O
ADM 管理 执行管理功能(运行闹钟)
ADT 审计 运行安全审计的线索
MSC 多主面 运行多方面任务的线索
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
o tat的每个选项标志和功能
作者:lovqing 发表时间:2002/12/16 09:33am
o tat的每个选项标志和功能:
主题或功能 选项标志
显示使用o tat方法 --
B树刷新请求 -C
缓冲区,所有使用的或未使用的信息 -B
当前使用中的缓冲区信息 -b
显示关于共享或等待缓冲区的线索的精确信息 -X
显示缓冲区杂凑链信息 -h
配置文件信息($INFORMIXDIR/etc/$ONCONFIG) -c
显示各D ace中chunk常用信息 -d
显示各D ace中前50个chunk的页读入/写出信息 -D
交互方式 -I
显示latch的常用信息 -s
显示关于活动锁的信息 -k
日志信息(逻辑日志和物理日志,包括页地址) -l
显示LRU队列,FLRU队列, MLRU队列的详细信息 -R
监控多线索等信息 -g
显示OnLine系统消息日志的最后20行内容 -m
显示OnLine活动简要表(profile)统计数据 -p
周期性地重复o tat 命令 -r
将当前共享内存段的副本存储到一个指定的文件中 -o
面向用户(小写)选项汇总 -a
显示活动tbl ace的常用信息 -t
显示事务信息 -x
用户线索和事务 -u
显示页刷新到磁盘时发生的各种写操作类型计数信息 -F
将所有统计计数置0 (清空简要表统计) -z
等同于o tat –cuskbtdlp -a
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
几个常用的o tat选项:
作者:zhangt 发表时间:2002/10/30 03:14pm
几个常用的o tat选项:
ONstat -m :显示消息日志的最后20行.
消息日志的内容包括:
1),检查点信息
2),读写错误信息
3),ONLINE模式转换信息
4),长事务
5),日志文件满(LOG FILE FULL )
若想显示完整信息,可直接编译消息日志文件.
ONstat -d:磁盘空间的使用情况,包括DBSPACE和CHUNK的信息
addre number flags fchunk nchunks flags owner name
c57ef158 1 1 1 1 N informix rootd c57efd18 2 2001 2 1 N T informix tmpd c57efdd8 3 1 3 1 N informix llogd c57efe98 4 1 4 1 N informix plogd c57eff58 5 1 5 8 N informix datad 1
5 active, 2047 maximum
addre chk/d offset size free ages flags pathname
c57ef218 1 1 0 150000 148715 PO- /dev/vg01/lvol1
c57ef378 2 2 0 250000 249881 PO- /dev/vg01/lvol2
c57ef458 3 3 0 125000 197 PO- /dev/vg01/lvol3
c57ef538 4 4 0 125000 2447 PO- /dev/vg01/lvol4
其中的FREE项,显示了该CHUNK的空闲空间大小(Kbytes).
ONstat -l :日志文件情况
Physical Logging
Buffer bufused bufsize numpages numwrits pages/io
P-2 42 256 123414 1068 115.56
phybegin physize phypos phyused %used
400035 122500 110222 42 0.03
Logical Logging
Buffer bufused bufsize numrecs numpages numwrits recs/pages pages/io
L-2 0 64 6150454 194478 8434 31.6 23.1
Su ystem numrecs Log Space used
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
OLDRSAM 6150454 385076912
addre number flags uniqid begin size used %used
c128d020 1 U-B---- 6776 300035 12500 12500 100.00
c128d03c 2 U-B---- 6777 303109 12500 12500 100.00
c128d058 3 U-B---- 6778 3061dd 12500 12500 100.00
c128d074 4 U-B---- 6779 3092b1 12500 12500 100.00
c128d090 5 U-B---- 6780 30c385 12500 12500 100.00
c128d0ac 6 U---C-L 6781 30f459 12500 6768 54.14
c128d0c8 7 U-B---- 6772 31252d 12500 12500 100.00
c128d0e4 8 U-B---- 6773 315601 12500 12500 100.00
c128d100 9 U-B---- 6774 3186d5 12500 12500 100.00
c128d11c 10 U-B---- 6775 31b7a9 12250 12250 100.00
其中:%USED: 使用百分比
FLAGS字段的含义:
F: 空闲 B:已备份 C: 正在接收事物记录
U: 正在使用 A: 新增日志 L: 包含最后一个检查点
ONstat - u:ONLINE的用户情况
Userthreads
addre flags se id user tty wait tout locks nreads nwrites
c57f1018 ---P--D 1 informix - 0 0 0 757 36481
c57f1504 ---P--F 0 informix - 0 0 0 0 377273
c57f19f0 ---P--- 5 informix - 0 0 0 0 6742
c57f1edc ---P--B 6 informix - 0 0 0 29 257
其中:flages字段的含义:
第一列:(S:等待mutex;Y:等待条件;L:等待锁;B:等待缓冲区;
C:等待检查点;X:长事务清理;G:等待长缓冲写;T:等待事务)
第二列:(*:事务执行时,发生I/O错误)
第三列:(A:正在备份;B:操作已被记录在日志中;P:分布处理已准备好;
C:正在提交;R:正在回滚)
第四列:(P:会话的主线索)
第五列:(R:在read rsam 调用中;X:进程在关键分区)
第七列:(M:特殊监控;D:特殊线索;C:清理线索;F:特殊清页进程;
B:特殊B+树清页线索)
ONstat -k :用户持有锁的情况
锁按照粒度分为6种: 库锁,表锁,页锁,行锁,字节锁,键锁
字节锁:更新包含有VARCHAR类型的行时,加在该行上的锁.
键锁:用于索引树上的锁.一般在相应字节上加删除标志.
这几种锁的识别如下:
TYPE ONLSNUM ROWID SIZE
库锁 HDR+X 1000002 205 0
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
表锁 100000e 0 0
页锁 100 0
行锁 101
字节锁 HDR+B 909
键锁 很大的16进制数
锁的生命期:1,不使用事务时,操作完成即会释放对应的锁;
2, 若使用事务,锁将伴随整个事务.(即随这COMMIT WORK或ROLLBACK WORK而
释放)
(**锁的几种类型:共享锁(SHARE),排它锁(EXCLUSIVE),可升级锁**)
ONstat -p : 显示系统资源状况(是否充分)
Profile
dskreads pagreads bufreads %cached dskwrits pagwrits bufwrits %cached
2112876 5085802 697502689 99.70 469082 1154138 9885314 95.25
isamtot open start read write rewrite delete commit rollbk
269117818 4202839 19282008 199402561 3286406 981022 270765 261330 20733
gp_read gp_write gp_rewrt gp_del gp_alloc gp_free gp_curs
0 0 0 0 0 0 0
ovlock ovuserthread ovbuff usercpu syscpu numckpts flushes
0 0 0 66354.52 3954.04 341 682
bufwaits lokwaits lockreqs deadlks dltouts ckpwaits compre seqsca 721270 153 794000443 0 0 246 72878 784815
ixda-RA idx-RA da-RA RA-pgsused lchwaits
458268 5293 1041489 1480397 1904
OVONLS:指示ONLSPACE值不够 ,ONLSPACES值应增大
OVLOCK:锁溢出 LOCKS应增大
OVUSER:用户表资源不够 USERS
OVBUF:缓冲区资源不够 BUFFERS
以上数字若持续增加,表明相应参数值应调整
DEADLOCKS:检测到的死锁数
DLTOUTS:网络超时死锁
DEADLOCK_TIMEOUT:一般为60秒,若增大此数字,可以减少死锁数,但会增加响应时
间,用户看来性能更差;若减少此数字,死锁数可能会增大,但会减少响应时间,在用户看
来,响应时间变快了. :em53:
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
SELECT 语句与其子句的详解
作者:atb1999 发表时间:2002/09/26 04:50pm
闲来没事做,整理了一下SELECT语句的一点用法,不过这是SQL SERVER 2000 下的,整
体的语法和informix 的SQL语法差不多,仅供参考,对于初学SQL语句的新手来说还是有
帮助的,嘿嘿~~~ 其实我就是新手,以后还请各位大侠多多执教!!!
从数据库中检索行,并允许从一个或多个表中选择一个或多个行或列.虽然 SELECT 语句
的完整语法较复杂,但是其主要的子句可归纳如下:
SELECT select_list
[ INTO new_table ]
FROM table_source
[ WHERE search_condition ]
[ GROUP BY group_by_expre ion ]
[ H***ING search_condition ]
[ ORDER BY order_expre ion [ ASC | DESC ] ]
可以在查询之间使用 UNION 运算符,以将查询的结果组合成单个结果集.
SELECT statement ::=
[ ORDER BY { order_by_expre ion | column_position [ ASC | DESC ] }
[ ,...n ] ]
[ COMPUTE
{ { ***G | COUNT | MAX | MIN | SUM } ( expre ion ) } [ ,...n ]
[ BY expre ion [ ,...n ] ]
[ FOR { BROWSE | XML { RAW | AUTO | EXPLICIT }
[ , XMLDATA ]
[ , ELEMENTS ]
[ , BINARY base64 ]
[ OPTION ( [ ,...n ]) ]
{ | ( ) }
[ UNION [ ALL ] query ecification | ( ) [...n ] ]
SELECT [ ALL | DISTINCT ]
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
[ { TOP integer | TOP integer PERCENT } [ WITH TIES ] ]
[ INTO new_table ]
[ FROM { } [ ,...n ] ]
[ WHERE ]
[ GROUP BY [ ALL ] group_by_expre ion [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
[H***ING ]
由于 SELECT 语句的复杂性,下面按子句说明详细的语法元素和参数:
SELECT 子句
指定由查询返回的列.
SELECT [ ALL | DISTINCT ]
[ TOP n [ PERCENT ] [ WITH TIES ] ]
| { table_name | view_name | table_alias }.*
| { column_name | expre ion | IDENTITYCOL | ROWGUIDCOL }
[ [ AS ] column_alias ]
| column_alias = expre ion
} [ ,...n ]
指定在结果集中可以显示重复行.ALL 是默认设置.
DISTINCT
指定在结果集中只能显示唯一行.为了 DISTINCT 关键字的用途,空值被认为相等.
TOP n [PERCENT]
指定只从查询结果集中输出前 n 行.n 是介于 0 和 4294967295 之间的整数.如果还指定
了 PERCENT,则只从结果集中输出前百分之 n 行.当指定时带 PERCENT 时,n 必须是
介于 0 和 100 之间的整数.
如果查询包含 ORDER BY 子句,将输出由 ORDER BY 子句排序的前 n 行(或前百分之 n
行).如果查询没有 ORDER BY 子句,行的顺序将任意.
WITH TIES
指定从基本结果集中返回附加的行,这些行包含与出现在 TOP n (PERCENT) 行最后的
ORDER BY 列中的值相同的值.如果指定了 ORDER BY 子句,则只能指定 TOP ...WITH
为结果集选择的列.选择列表是以逗号分隔的一系列表达式.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
指定在 FROM 子句内返回所有表和视图内的所有列.列按 FROM 子句所指定的由表或视
图返回,并按它们在表或视图中的顺序返回.
table_name | view_name | table_alias.*
将 * 的作用域限制为指定的表或视图.
column_name
是要返回的列名.限定 column_name 以避免二义性引用,当 FROM 子句中的两个表内有
包含重复名的列时会出现这种情况.例如,Northwind 数据库中的 Customers 和 Orders 表
内都有名为 ColumnID 的列.如果在查询中联接这两个表,可以在选择列表中将客户 ID 指
定为 Customers.CustomerID.
expre ion
是列名,常量,函数以及由运算符连接的列名,常量和函数的任意组合,或者是子查询.
IDENTITYCOL
返回标识列.有关更多信息,请参见 IDENTITY(属性),ALTER TABLE 和 CREATE
如果 FROM 子句中的多个表内有包含 IDENTITY 属性的列,则必须用特定的表名(如
T1.IDENTITYCOL)限定 IDENTITYCOL.
ROWGUIDCOL
返回行全局唯一标识列.
如果在 FROM 子句中有多个表具有 ROWGUIDCOL 属性,则必须用特定的表名(如
T1.ROWGUIDCOL)限定 ROWGUIDCOL.
column_alias
是查询结果集内替换列名的可选名.例如,可以为名为 quantity 的列指定别名,如"Quantity"
或"Quantity to Date"或"Qty".
别名还可用于为表达式结果指定名称,例如:
USE Northwind
SELECT ***G(UnitPrice) AS 'Average Price'
FROM [Order Details]
column_alias 可用于 ORDER BY 子句.然而,不能用于 WHERE,GROUP BY 或 H***ING
子句.如果查询表达式是 DECLARE CURSOR 语句的一部分,则 column_alias 不能用在
FOR UPDATE 子句中.
INTO 子句
创建新表并将结果行从查询插入新表中.
用户若要执行带 INTO 子句的 SELECT 语句,必须在目的数据库内具有 CREATE TABLE
权限.SELECT...INTO 不能与 COMPUTE 子句一起使用.有关更多信息,请参见事务和显
式事务.
通过在 WHERE 子句中包含 FALSE 条件,可以使用 SELECT...INTO 创建没有数据的相
同表定义(不同表名).
[ INTO new_table ]
new_table
根据选择列表中的列和 WHERE 子句选择的行,指定要创建的新表名.new_table 的格式
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
通过对选择列表中的表达式进行取值来确定.new_table 中的列按选择列表指定的顺序创
建.new_table 中的每列有与选择列表中的相应表达式相同的名称,数据类型和值.
当选择列表中包含计算列时,新表中的相应列不是计算列.新列中的值是在执行
SELECT...INTO 时计算出的.
在此次发布的 SQL Server 版本中,select into/bulkcopy 数据库选项对是否可以使用
SELECT INTO 创建永久表没有影响.对包括 SELECT INTO 在内的某些大容量操作的记录
量,取决于对数据库有效的恢复模式.有关更多信息,请参见使用恢复模型.
在以前发布的版本中,如果设置了 select into/bulk copy,则可用 SELECT INTO 创建永久
select into/bulk copy 用于向后兼容,但在以后的版本中可能不支持该选项.有关更多信息,
请参考"恢复模式"和"向后兼容性"主题以及 ALTER DATABASE 主题.
FROM 子句
指定从其中检索行的表.需要 FROM 子句,除非选择列表只包含常量,变量和算术表达式
(没有列名).有关更多信息,请参见 FROM.
[ FROM { } [ ,...n ] ]
table_name [ [ AS ] table_alias ] [ WITH ( [ ,...n ] ) ]
| view_name [ [ AS ] table_alias ]
| rowset_function [ [ AS ] table_alias ]
| OPENXML
| derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ]
| CROSS JOIN
[ INNER | { { LEFT | RIGHT | FULL } [OUTER] } ]
指定用于 SELECT 语句的表,视图,派生表和联接表.
table_name [[AS] table_alias ]
指定表名和可选别名.
view_name [ [ AS ] table_alias ]
指定名称,视图和可选别名.
rowset_function [ [AS] table_alias ]
是行集函数名和可选别名.有关行集函数列表的更多信息,请参见行集函数.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
OPENXML
在 XML 文档上提供行集视图.有关更多信息,请参见 OPENXML.
WITH ( [ ,...n ] )
指定一个或更多表提示.有关表提示的更多信息,请参见 FROM.
derived_table [ [ AS ] table_alias ]
是嵌套 SELECT 语句,可从指定的数据库和表中检索行.
column_alias
替换结果集内列名的可选别名.
是两个或更多表的积的结果集.例如:
SELECT *
FROM tab1 LEFT OUTER JOIN tab2 ON tab1.c3 = tab2.c3
RIGHT OUTER JOIN tab3 LEFT OUTER JOIN tab4
ON tab3.c1 = tab4.c1
ON tab2.c3 = tab4.c3
对于多个 CROSS 联接,请使用圆括号来更改联接的自然顺序.
指定联接操作的类型.
指定返回所有相匹配的行对.废弃两个表中不匹配的行.如果未指定联接类型,则这是默认
设置.
LEFT [OUTER]
指定除所有由内联接返回的行外,所有来自左表的不符合指定条件的行也包含在结果集内.
来自左表的输出列设置为 NULL.
RIGHT [OUTER]
指定除所有由内联接返回的行外,所有来自右表的不符合指定条件的行也包含在结果集内.
来自右表的输出列设置为 NULL.
FULL [OUTER]
如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一
个表对应的输出列设置为 NULL.除此之外,结果集中还包含通常由内联接返回的所有行.
指定联接提示或执行算法.如果指定了 ,也必须明确指定 INNER,LEFT,RIGHT
或 FULL.有关联接提示的更多信息,请参见 FROM.
表示联接所指定的表或视图.
指定联接所基于的条件.此条件可指定任何谓词,但通常使用列和比较运算符.例如:
SELECT ProductID, Su liers.Su lierID
FROM Su liers JOIN Products
ON (Su liers.Su lierID = Products.Su lierID)
当条件指定列时,列不必有相同的名称或相同的数据类型.但是如果数据类型不同,则它们
必须是兼容或可由 Microsoft SQL Server 进行隐性转换的类型.如果数据类型不能隐式转
换,则条件必须使用 CAST 函数显式转换数据类型.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
有关搜索条件和谓词的更多信息,请参见搜索条件.
CROSS JOIN
指定两个表的矢量积.返回同样的行,就像要联接的表只列于 FROM 子句中,并且未指定
WHERE 子句.例如,这两个查询返回的结果集都由 T1 和 T2 中所有行的完全联接组成:
SELECT * FROM T1, T2
SELECT * FROM T1 CROSS JOIN T2
WHERE 子句
指定用于限制返回的行的搜索条件.
[ WHERE | ]
column_name { * = | = * } column_name
通过使用谓词限制结果集内返回的行.对搜索条件中可以包含的谓词数量没有限制.有关搜
索条件和谓词的更多信息,请参见搜索条件.
使用不标准的产品专用语法和 WHERE 子句指定外联接.*= 运算符用于指定左向外联接,
=* 运算符用于指定右向外联接.
下例指定一个左向外联接,并在结果集内包含 Tab1 中不满足指定条件的行:
SELECT Tab1.name, Tab2.id
FROM Tab1, Tab2
WHERE Tab1.id *=Tab2.id
说明 这种语法具有潜在的二义性解释并且不标准,因此不提倡使用这种语法进行外联接.
而应在 FROM 子句中指定联接.
可以通过在 FROM 子句中使用联接运算符,或通过在 WHERE 子句中使用不标准的 *=
和 =* 运算符来指定外联接.不能在同一语句中同时使用这两种方法.
GROUP BY 子句
指定用来放置输出行的组,并且如果 SELECT 子句 中包含聚合函数,则计算
每组的汇总值.指定 GROUP BY 时,选择列表中任一非聚合表达式内的所有列都应包含在
GROUP BY 列表中,或者 GROUP BY 表达式必须与选择列表表达式完全匹配.
说明 如果未指定 ORDER BY 子句,则使用 GROUP BY 子句不按任何特定的顺序返回
组.建议始终使用 ORDER BY 子句指定具体的数据顺序.
[ GROUP BY [ ALL ] group_by_expre ion [ ,...n ]
[ WITH { CUBE | ROLLUP } ]
] 参数
包含所有组和结果集,甚至包含那些任何行都不满足 WHERE 子句指定的搜索条件的组和
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
结果集.如果指定了 ALL,将对组中不满足搜索条件的汇总列返回空值.不能用 CUBE 或
ROLLUP 运算符指定 ALL.
如果访问远程表的查询中有 WHERE 子句,则不支持 GROUP BY ALL 操作.
group_by_expre ion
是对其执行分组的表达式.group_by_expre ion 也称为分组列.group_by expre ion 可以是
列或引用列的非聚合表达式.在选择列表内定义的列的别名不能用于指定分组列.
说明 text,ntext 和 image 类型的列不能用于 group_by_expre ion.
对于不包含 CUBE 或 ROLLUP 的 GROUP BY 子句,group_by_expre ion 的项数受查询
所涉及的 GROUP BY 列的大小,聚合列和聚合值的限制.该限制从 8,060 字节的限制开
始,对保存中间查询结果所需的中间级工作表有 8,060 字节的限制.如果指定了 CUBE 或
ROLLUP,则最多只能有 10 个分组表达式.
指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行.在结果集内返回每
个可能的组和子组组合的 GROUP BY 汇总行.GROUP BY 汇总行在结果中显示为
NULL,但可用来表示所有值.使用 GROUPING 函数确定结果集内的空值是否是 GROUP
BY 汇总值.
结果集内的汇总行数取决于 GROUP BY 子句内包含的列数.GROUP BY 子句中的每个操
作数(列)绑定在分组 NULL 下,并且分组适用于所有其它操作数(列).由于 CUBE 返
回每个可能的组和子组组合,因此不论指定分组列时所使用的是什么顺序,行数都相同.
指定在结果集内不仅包含由 GROUP BY 提供的正常行,还包含汇总行.按层次结构顺序,
从组内的最低级别到最高级别汇总组.组的层次结构取决于指定分组列时所使用的顺序.更
改分组列的顺序会影响在结果集内生成的行数.
重要 使用 CUBE 或 ROLLUP 时,不支持区分聚合,如 ***G(DISTINCT column_name),
COUNT(DISTINCT column_name) 和 SUM(DISTINCT column_name).如果使用这类聚合,
SQL Server 将返回错误信息并取消查询.
H***ING 子句
指定组或聚合的搜索条件.H***ING 通常与 GROUP BY 子句一起使用.如果不使用
GROUP BY 子句,H***ING 的行为与 WHERE 子句一样.
[H***ING ]
指定组或聚合应满足的搜索条件.当 H***ING 与 GROUP BY ALL 一起使用时,H***ING
子句替代 ALL.有关更多信息,请参见搜索条件.
在 H***ING 子句中不能使用 text,image 和 ntext 数据类型.
说明 在 SELECT 语句中使用 H***ING 子句不影响 CUBE 运算符分组结果集和返回汇
总聚合行的方式.
UNION 运算符
将两个或更多查询的结果组合为单个结果集,该结果集包含联合查询中的所有查询的全部
行.这与使用联接组合两个表中的列不同.
使用 UNION 组合两个查询的结果集的两个基本规则是:
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
所有查询中的列数和列的顺序必须相同.
数据类型必须兼容.
{ | ( ) }
UNION [ ALL ]
query ecification | ( )
[ UNION [ ALL ] 99 and tabtype='T' (OK)
例子2:返回任何表中插入的最后一个SERIAL值
select dbinfo('sqlca.sqlerrd1') from systables where tabid = 1
例子3:返回最后一个SELECT,INSERT,UPDATE,DELETE或EXECUTE
PROCEDURE语句处理的行数;
select dbinfo('sqlca.sqlerrd2') from systables where tabid=1;
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
使用d chema工具卸出数据库的结构
作者:hero99zy 发表时间:2002/07/26 05:05pm
如何使用d chema工具卸出数据库的结构
例如:
1)导出数据库中所有的表结构到文件db.sql
$d chema -d your_database -t all db.sql
2)导出数据库中所有的存储过程到文件db.sql
$d chema -d your_database -f all db.sql
3)导出数据库中的所有对象(包含表,存储过程,触发器……)到文件db.sql
$d chema -d your_database db.sql
4)导出数据库中一个表的结构到文件db.sql
$d chema -d your_database_name -t your_table_name db.sql
5)导出一个存储过程定义到文件db.sql
$d chema -d your_database_name -f your_procedure_name db.sql
6)如果导出更多的表的信息(EXTENT...)
$d chema -d your_database_name - db.sql
7)导出数据库中对用户或角色的授权信息
$d chema -d your_database_name -p all
$d chema -d your_database_name -r all
8)导出数据库中的同义词
$d chema -d your_database_name -s all
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
ESQL/C的数据类型
作者:knetfox 发表时间:2002/07/10 01:57pm
1,SQL与C数据类型的对应
简单类型
CHAR(n) char(n+1)
CHARCTER(n) char *
SMALLINT short int
INTERGER
INT long int
SMALLFLOAT
REAL float
DOUBLE PRECISIONdouble
SERIAL long int
DATE long int
复杂类型
DECIMAL
DEC NUMERIC dec_t or struct decimal
MONEY dec_t or struct decimal
DATETIME dtime_t or struct dtime
INREVER intrvl_t or struct intrvl
VARCHAR varchar or string
2,数据类型转换
转换类型 转换后
FLOAT DECIMAL(16)
SMALLFLOAT DECIMAL(8)
INTERGER DECIMAL(10,0)
SAMLLINT DECIMAL(5,0)
二,数据类型的转换函数
(一)有关CHAR类型的函数
1,以空值结尾的串的操作函数
rdow hift(char *s) 把一个字符串中的所有字母转换成小写形式.
ru hift(char *s) 把一个字符串中的所有字母转换成大写形式.
stcat(char *s, char *dest) 把一个字符串同另一个字符串相连接.
stcmpr(char *s1, char *s2) 比较两个字符串.
stcopy(char *from, char *to) 把一个字符串拷贝到另一个字符串.
stleng(char *string) 统计字符串的长度.
2,定长串的操作函数
bycmpr(char byte1, byte2, rpt len) 比较两组连续的字节内存块.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
bycopy(char *from, char *to, int len) 把一块内存的内容拷贝到另一块内存.
byfill(char *to, int len, char ch) 用字符填充指定的内存块.
byleng(char from, int count) 统计有效字符的数目.有效字符是指字符串去除了末尾
空格所剩的字符.
3,字符串操作函数
ldchar(char *from, int num, char *to) 拷贝定长串到空值结尾的串.
stchar(char *from, char *to, int num) 拷贝空值结尾的串到定长串.
4,字符串函数简单数值转换
rstod(char *str, double *dblval) 把以空值结束的字符串转换成C的double型
rstoi(char *str, int *intval) 把以空值结束的字符串转换成C的int类型.
rstol(char *str, long *lngval) 把以空值结束的字符串转换成C的long类型.
(二)DATE类型的函数
1,创建内部日期
rdefmtdate(long *jdate, char *frmt char *str) 生成具有确定格式的日期字符串.(str字符串和
fmt必须按月,日,年的同一顺序)
返回代码:
0操作成功.
-1204在str参数中有非法的月份.
-1206在str参数中有非法的日期.
-1209由于str中没有包含年,月,日各部分间的定界符,str的长
度必须准确定义为6或8个字节长.
-1212fmt中没有包含年,月,日部分.
fmt和str的有效组合
fmt str
"mmddyy" "DEC 25th 1997"
"mmm.dd.yyyy" "dec 25 1997"
"mmm.dd.yyyy" "DEC-25-1997"
"mmm.dd.yyyy" "12251997"
"mmm.dd.yyyy" "12/25/1997"
"yy/mm/dd" "97/12/25"
"yy/mm/dd" "1997,December, 25th"
"yy/mm/dd" "In the year 1997, the month of December, its 25th day"
"dd-mm-yy" "This 25th day of December, 1997"
rmdyjul(short mdy[3], long *jdate) 用三个短整数生成一个内部日期这三个整数是有关年,月,
日的数字值.(年必须以完整的形式表达)
返回代码:
0操作成功.
-1204在mdy[2]中有非法年份.
-1205在mdy[1]中有非法月份.
-1206在mdy[0]中有非法日期.
rstrdate(char *str, long *jdate) 将一个字符串日期转换成一内部格式的日期.
rtoday(long *jdate) 从系统日期创建一个内部日期值.
2,从内部日期转换成其他类型
rfmtdate(ling jdate, char *fmt, char *str) 从内部格式的日期类型值创建格式化的字符串.
《Informix精华集锦》 仅限CU会员内部交流学习之用 (admirer整理)
返回代码:
0操作成功.
-1210内部日期不能被转换成月-日-年格式.
-1211程序存储溢出,即存储分配错误.
rjulmdy(long jdate, short mdy[3]) 从一个内部日期生成一个含有3个短整数的数组对应内部
日期的月,日,年.
rdatestr(long jdate, char *str) 从一个内部日期值创建缺省的日期字符串.
rdayofweek(long jdate) 给定一内部格式表示的日期,此函数返回所对应的星期中的某一天.
rleapyear(int year) 用来判断给定的年份是否为闰年.
返回值:
TRUE(1)

参考资料

 

随机推荐