Informix 数据库目前最新的版本是(shì) 11.5,从 Informix 9、Informix 10 到 Informix 11.5,在数据(jù)库性能、数(shù)据库管(guǎn)理(lǐ)及(jí)应用开发等方(fāng)面都有了(le)很(hěn)大的(de)提(tí)高,而且(qiě)推出了很(hěn)多非常有用的新特性。通(tōng)过对(duì)这些特性的使用,可(kě)以大大(dà)提高数据库性能、增强数据库可管理性及应用开发的(de)灵活性。我(wǒ)们这里,给大家介绍其(qí)中的(de)一些特性,希(xī)望对大家能有所帮助。
数(shù)据库管理(lǐ)方面的一些实用(yòng)特性
使用可配置的页面大小
我们知(zhī)道,在 Informix 中(zhōng),数据存(cún)储(chǔ)的最基本的单位是(shì)页,在 Informix 10 版本之(zhī)前(qián),数据页面的(de)大小是固定的,不(bú)能被改变,通常,在(zài) sun、HP 等平台上,数(shù)据页的(de)大小为 2K,AIX 及 windows 平台,数(shù)据页的大(dà)小为 4K 。从 Informix 10 版本开始,我们可(kě)以配置 Informix 数据库页面的大小,数据库页(yè)面的大小可以是 2K-16K 。通过提供可配置(zhì)的页面大(dà)小功能,可以给我们带来很多(duō)好(hǎo)处:
空间使用的(de)效率(lǜ)会更高
从 Informix 10 开始,一个页面可以达到 16K 的连续(xù)空间,可(kě)以更有效的使(shǐ)用数据空间。比如说,我们表中一(yī)行的数据大小为 1200 字节,那么,当使用 2K 大小页面时,只能存放 1 行数据,3 行数据需要 6K 大小空间;如(rú)果采用 4K 大小页面,那么 3 行数据(jù)可以放(fàng)在(zài)一(yī)个 4K 页面(miàn)上,空(kōng)间会节省 %33 。那么,当对 30 行(háng)数据而言,如果采用 2K 大小页面(miàn)时,需要(yào)占用(yòng) 60k 大小空间,如果采用 4K 大小页面时,只需要占用 40k 大(dà)小(xiǎo)空(kōng)间,如果(guǒ)采用 6k 大小页面时,则仅需要(yào)占用(yòng) 36k 大小空间 , 可(kě)以节(jiē)省 40% 的空间。 支持(chí)更大的索引键(jiàn)值, 最大可以达到(dào) 3K 。
这样,我们可以在一个(gè)索引页面上放置更多(duō)的索引(yǐn)键,支持更大的键(jiàn)值(zhí),而不需要增加(jiā)索引树的层次。采用可配(pèi)置页面大小功能,可以显著提(tí)高具(jù)有(yǒu)大量重复索引键值情况下的处理(lǐ)性能(néng)。 存取效率(lǜ)的(de)提高
通(tōng)过采用可(kě)配置(zhì)页面大小功能,可以降低数据页和索(suǒ)引(yǐn)页的 IO 操作次(cì)数,提高(gāo)存取效率。通(tōng)过配置页面大小,很长(zhǎng)的记录(lù)行可以只(zhī)存放在单个页(yè)面上,降低(dī)了读取每条记录的页面数目;在以(yǐ)前的版本中,超(chāo)长的记录(lù)需要 remainders pages,采用大的页面足够用来存放整条记录,略(luè)去(qù)了访问 remainders pages 的时间;大的索引页面可以存放更多(duō)的索引项,从而降低了索(suǒ)引的层(céng)数(shù),减少了在索引树上(shàng)遍(biàn)历(lì)的开销;在决(jué)策(cè)支持应用的环境中,使用大的(de)页面可以降(jiàng)低全表扫描的页面的数(shù)目,提高运行效率(lǜ)。 我们可以(yǐ)在数据库空(kōng)间(dbspace)级别以及(jí)缓(huǎn)冲(chōng)池(buffer pool)级别来定义(yì)数(shù)据页面的大小(xiǎo),其范围可以(yǐ)是 2K-16K,而(ér)且定义的数(shù)据(jù)页面大小必(bì)须是系统缺省页面大小的倍数(shù)。可配置的页(yè)面大小功能需要系统开启大(dà)块(large chunk)功能。
在(zài)创建 dbspace 时(shí),这个特性允许指定标(biāo)准或临时 dbspace 的页(yè)大(dà)小。如果要使用比默认页大(dà)小所允许的键长更长的键(jiàn),可能需要指定(dìng)非默认的页大小。 根 dbspace 使用默认(rèn)的页(yè)大小。如果希望指(zhǐ)定页大小,指定的值必须是默(mò)认页大小的整数倍,而且(qiě)不能(néng)超过 16 KB 。
使(shǐ)用(yòng) onspaces 命(mìng)令创建(jiàn) dbspace 的(de)基本语法如下:
onspaces – c – d dbs – k pgsize – p path -o offset -s size ;其中,pgsize 用(yòng)来指定 dbspace 的页(yè)面大小 (in K):
页面大小的范围从 2K 到 16K 。 页面(miàn)大小必须是缺(quē)省页面大小 (2k or 4K) 的(de)倍数。 Dbspace 创建之后,页(yè)面大小(xiǎo)不能(néng)修改。 如果相对应(yīng)的页面大小的(de)缓(huǎn)冲池不存在,online 将通过配置参数 BUFFERS_DEF 自动创建一个。 rootdbs 必(bì)须使用系(xì)统(tǒng)默(mò)认的(de)页面大小。 动态创建(jiàn)的日志文件必须在使用系统默认的页面大小的数据库空间上分配。 在创建缓冲池时,我(wǒ)们(men)可以使(shǐ)用新的 BUFFERPOOL 配置参数或者 onparams 工具为 dbspace 中所有非默认页大小对应的页定义缓(huǎn)冲池(chí)。在(zài)使用 BUFFERPOOL 配(pèi)置(zhì)参数或者 onparams 工具定(dìng)义(yì)缓冲池(chí)时,需要指定缓冲(chōng)池的信息,包(bāo)括大小、缓冲池中的 LRUS 个数、缓(huǎn)冲池中的缓冲区个数、lru_min_dirty 和 lru_max_dirty 的值。 BUFFERS、LRUS、LRU_MAX_DIRTY 和 LRU_MIN_DIRTY 配置参数都不再使用。在(zài) Version 10.0 中,以(yǐ)前在 BUFFERS、LRUS、LRU_MAX_DIRTY 和 LRU_MIN_DIRTY 配置参数中指定的(de)那些信息,现在要使用 BUFFERPOOL 配置参数或者 onparams 工(gōng)具指定(dìng)。使用 BUFFERPOOL 配置参数或 onparams 工具输(shū)入的信息代替了以前用过时的参数指定(dìng)的信息。
通(tōng)过 onparams 指定(dìng)缓冲池的(de)基本语法如下:
onparams – b – g pgsize – n buffs – r lrus – x max – m min ;其中:
pgsize – 缓冲(chōng)池的(de)页面大小,必须是(shì)缺省(shěng)页面(miàn)大小 (2k or 4K) 的倍数(shù); buffs – 缓冲池(chí)中的页(yè)面数目; lrus – 缓冲池(chí)中的 LRU 队列的(de)数(shù)目(mù); max – 缓冲池中最大脏页(yè)的百分比; min - 缓冲池中最小脏页(yè)的(de)百(bǎi)分(fèn)比; 使用 onparams 创(chuàng)建(jiàn)缓冲池举例(lì):
onparams – b – g 8 – n 3000 – r 4 – x .9 – m .5 ;通过上述命令,我们,
创建一个(gè) 8k 页面大小(xiǎo)的缓冲池,该缓(huǎn)冲池具有(yǒu) 3000 个页(yè)面,由 4 个 LRU 队列(liè)组成。 最(zuì)大脏(zāng)页百(bǎi)分(fèn)比为(wéi) 0.9% , 最小脏页百(bǎi)分比为(wéi) 0.5% 。 每个不同页面(miàn)大小的缓冲池只能(néng)有一个。 缓冲池创建之后,需要重启(qǐ) online 才能生效。 在创(chuàng)建 dbspace 时,不需要通(tōng)过(guò) onparams 来(lái)创建缓(huǎn)冲(chōng)池 . online 将通过(guò)配置参(cān)数(shù) BUFFERS_DEF 自动创建一个(gè)。 当采用可(kě)配置(zhì)的(de)页(yè)面大小后,Informix 数据库中(zhōng)的 onstat 和 oncheck 命(mìng)令的输(shū)出也发(fā)生了相应的变(biàn)化:
onstat – d – b – B – P – R – X 的输出都发生了(le)变化
onstat -d 命令的输出增(zēng)加了数(shù)据页大小(xiǎo)项:Dbspaces
address number flags fchunk nchunks pgsize flags owner name
ad357e8 1 0x60001 1 1 2048 N B informix rootdbs
b62a5b0 2 0x60001 2 1 4096 N B informix dbsp1
2 active, 2047 maximum
Chunks
address chunk/dbs offset page Rd page Wr pathname
ad35948 1 1 0 493 5803 /local0/engines/ol_tuxedo/ifmxdata/rootdbs
b62a710 2 2 0 4 20 /local0/engines/ol_tuxedo/ifmxdata/dbsp1
2 active, 32766 maximum
NOTE: The values in the "page Rd" and "page Wr" columns for DBspace chunks are displayed
in terms of system base page size.
Expanded chunk capacity mode: alwaysonstat -b 命令的输出变(biàn)化: IBM Informix Dynamic Server Version 11.10.UC1 -- On-Line -- Up 00:01:39
-- 1075308 Kbytes Buffer pool page size: 2048
44454970 0 84 1:30563 4472f000 18 801 80 ffffffffffffffff 0
4445d418 0 84 1:30562 447b1800 18 801 80 ffffffffffffffff 45d654e0
44468b60 0 84 1:30567 4485e000 18 801 80 ffffffffffffffff 0
44476ec0 0 84 1:30565 44934000 18 801 80 ffffffffffffffff 0
444875b8 0 84 1:30564 44a2b800 18 801 80 ffffffffffffffff 0
4449dc50 0 84 1:30566 44b7d000 18 801 80 ffffffffffffffff 0
444d0700 0 c23 1:34245 44e78000 18 801 10 0 0
444d1800 0 c23 1:34253 44e88000 18 801 10 0 0
444d2900 0 c23 1:34261 44e98000 18 801 10 0 0
444d3a00 0 c23 1:34269 44ea8000 18 801 10 0 0
444d4b00 0 c23 1:34277 44eb8000 18 801 10 0 0
444d5c00 0 c23 1:34285 44ec8000 18 801 10 0 0
444d6c78 0 84 1:30568 44ed7800 18 801 80 ffffffffffffffff 0
444d6d00 0 c23 1:34293 44ed8000 18 801 10 0 0
444d7e00 0 c23 1:34301 44ee8000 18 801 10 0 0
444d8f00 0 c23 1:34309 44ef8000 18 801 10 0 0
444da000 0 c23 1:34317 44f08000 18 801 10 0 0
444db100 0 c23 1:34325 44f18000 18 801 10 0 0
444dc200 0 c23 1:34333 44f28000 18 801 10 0 0
444dca80 0 c23 1:36184 44f30000 18 801 10 0 0
444dd300 0 c23 1:34341 44f38000 18 801 10 0 0
444ddb80 0 c23 1:34346 44f40000 18 801 10 0 0
444ed288 0 84 1:30569 45028800 18 801 80 ffffffffffffffff 0
4472 modified, 5000 total, 8192 hash buckets, 2048 buffer size
Buffer pool page size: 8192 0 modified, 1000 total, 1024 hash buckets, 8192 buffer size新增加 onstat -g buf 显示定义的缓冲池的信息(xī) onstat -g buf 命令的输出显示:
IBM Informix Dynamic Server Version 11.10.F -- On-Line -- Up 00:00:25 -- 1075788 Kbytes
Profile Buffer pool page size: 2048
dskreads pagreads bufreads %cached dskwrits pagwrits bufwrits %cached
2065 2067 274619 99.25 4418 36043 81649 94.59
bufwrits_sinceckpt bufwaits ovbuff flushes
14850 0 0 6
Fg Writes LRU Writes Avg. LRU Time Chunk Writes
0 0 nan 2909 Buffer pool page size: 8192
dskreads pagreads bufreads %cached dskwrits pagwrits bufwrits %cached
0 0 0 0.00 0 0 0 0.00
bufwrits_sinceckpt bufwaits ovbuff flushes
0 0 0 0 Fg Writes LRU Writes Avg. LRU Time Chunk Writes
0 0 nan 0onchecks 命令将显示相(xiàng)应的(de)页面大(dà)小(xiǎo) 以下示例显示了 oncheck -pt 命(mìng)令的输出示例:
TBLspace Report for testdb:tab1
Physical Address 2:10
Creation date 10/07/2004 17:01:16
TBLspace Flags 801 Page Locking TBLspace use 4 bit bit-maps
Maximum row size 14 Number of special columns 0 Number of keys 0 Number of
extents 1 Current serial value 1 Pagesize (k) 4 First extent size 4 Next extent
size 4 Number of pages allocated 340 Number of pages used 337 Number of
data pages 336 Number of rows 75806 Partition partnum 2097154 Partition
lockid 2097154 Extents Logical Page Physical Page Size Physical Pages 0 2:106 340 680RTO 策略
我们知道(dào),当 Informix 数据库执行崩溃恢复时,以前(qián)我们(men)没有任何方法可以预(yù)测崩溃恢(huī)复将在(zài)什么时间完成,Informix 11 提出了 RTO 技术(shù),当采用 RTO 技术后,我们可以指定(dìng)测(cè)崩溃(kuì)恢(huī)操作完成的时间,这样,使得崩溃(kuì)恢复时间(jiān)可(kě)以被我们把握。
关(guān)于非阻塞检查点技(jì)术的特点(diǎn)及技术实现(xiàn),请(qǐng)参(cān)考文章“ Informix 11 非阻塞检查点及(jí) RTO 策(cè)略应用(yòng)实践”。
SQL 管(guǎn)理 API (SQL Administration API)
我们知道,Informix 数据(jù)库有(yǒu)很多(duō)实用程序来进行数(shù)据库管理工作,比如,我们(men)会(huì)使(shǐ)用 onspace 命(mìng)令来创建新的数据空间,使用 oncheck 命令(lìng)来对(duì)磁(cí)盘上的数据及索引进行检(jiǎn)查。但(dàn)是,这些实(shí)用程序只(zhī)能在命(mìng)令行执行,不能在 SQL 语句中进行调用,这(zhè)样,我们很难在应用程序中来执行数据库(kù)管理操作(zuò),也很难进行远程数据库管理操作。为了解决上(shàng)述问题,Informix 11 版本中增加(jiā)了 admin( ) 或 task( ) 函(hán)数,DBA 现在可以通过调用新的内置的 admin( ) 或 task( ) 函数通过(guò)发出(chū) SQL 语(yǔ)句就可以完成数据库(kù)管理任务了(le)。由于是通(tōng)过 SQL 语句来调用 admin( ) 或 task( ) 函数,我(wǒ)们还可以实现(xiàn)远程数据库管理任务,这两个函数具(jù)有模拟相应实用程序的命令(lìng)行参数的(de)参数。例如,下面(miàn)的(de) SQL 语句(jù)相(xiàng)当于 oncheck -ce 命令,它指示数(shù)据库服务器检查区段:
EXECUTE FUNCTION admin('check extents');
有些选项还可(kě)以完成没(méi)有相应实用程(chéng)序的(de)任务。
现在,我们可(kě)以(yǐ)使用 EXECUTE FUNCTION 语句来调用内置(zhì) admin( ) 或(huò) task( ) 函数,以完(wán)成与执行 Informix 的各(gè)种(zhǒng)管理实用程序等同的管(guǎn)理任务。主要包括管理空间,管理(lǐ)配置,运行例程作业和系统验证(zhèng)(oncheck 功能)等(děng)方面的管理操作。
两个(gè)内置管理函数(task() 和 admin())仅在 sysadmin 数据(jù)库(kù)中可用。仅(jǐn) DBSA 可运行 task() 和 admin() 函数。但是缺省情况下,只有用(yòng)户 informix 可连接到 sysadmin 数据(jù)库(kù)。
例如(rú),如果 sysadmin 数据库是当前(qián)的数据库(kù),那么以下语句执行用(yòng)于缓慢关闭数据库服务器的任(rèn)务:
EXECUTE FUNCTION task ('onmode','k') ;如果 sysadmin 数据库不是当前的数据(jù)库,但您是有权连接到 sysadmin 数据(jù)库的用户,您可以执行以下命(mìng)令:
Execute function sysadmin:task ('onmode','k');task() 和 admin() 函(hán)数提(tí)供相同的功(gōng)能;它们的不同仅在于返回码(mǎ)。 task() 函数返回描述命令结(jié)果的(de)字符(fú)串。 admin() 函数返回整数(shù),该数(shù)值和 command_history 表相关联。
下边(biān)显(xiǎn)示(shì)了 task() 和 admin() 函数运行输出结果:
EXECUTE FUNCTION task('create dbspace', 'dbspace2', '/CHUNKS/dbspace2');
(expression) created dbspace number 2 named dbspace2
EXECUTE FUNCTION admin('create dbspace', 'dbspace2', '/CHUNKS/dbspace2');
(expression) 107每次尝试调(diào)用 ADMIN 或 TASK 函数都会产生(shēng)两个结果:
执行(háng)一个(gè) command 任务,通常是(shì)模拟管理(lǐ)实用(yòng)程序 将新行插(chā)入到(dào) sysadmin 数据库的 command_history 表中。 command_history 表(biǎo)
command_history 表包含(hán)管(guǎn)理 API 已运行(háng)的所有(yǒu)命令的列表。该表还会显(xiǎn)示(shì)命令(lìng)的结果。该表位于 sysadmin 数据库中,是一个 RAW(无日(rì)志记录)表。
command_history 表显示管理任务是通(tōng)过 admin() 还是 task() 函数(shù)执行的(de),并显示执行命(mìng)令的用户的相关信息、命令的执(zhí)行时间、命令,以及数据库服务(wù)器(qì)完成命令运行(háng)时返回(huí)的消息。
下(xià)表显示 command_history 表信息的示例:
列 数据类型(xíng) 描述
cmd_number serial 每行(háng)的唯一(yī)标识
cmd_exec_time datetime year-to-second 命令的启(qǐ)动时间
cmd_user varchar 执行命令的用户(hù)
cmd_hostname varchar 执行命令的主机的名称
cmd_executed varchar 所执行的命令
cmd_ret_status integer 返回码
cmd_ret_msg lvarchar 返回消息
下表(biǎo)显(xiǎn)示了示例命令和 command_history 表(biǎo)中的关联结果。
所执(zhí)行的(de)命令(lìng) 返(fǎn)回消息示例
set sql tracing on 对 1000 个 2024 字节的缓冲区打开 SQL 跟(gēn)踪。
create dbspace 已(yǐ)添加空(kōng)间“ space12 ”。
检查点(diǎn) 检(jiǎn)查(chá)点(diǎn)已完成。
add log 已向(xiàng)数据(jù)库(kù)空间 logdbs 添加了(le) 3 个逻辑日(rì)志。
ADMIN 或 TASK 指(zhǐ)定的(de) command 任务发生在由于在(zài) command_history 表中插(chā)入(rù)新行而引起的单独事务中。如果命(mìng)令(lìng)成(chéng)功执行(háng),但是到 command_history 中的插入操作失败,那么命令将生效,而 online.log 错(cuò)误条目将指(zhǐ)示(shì)问(wèn)题。
这两个函数不(bú)同之处主要在于它们(men)的名称(chēng)以及它(tā)们的返回(huí)值(zhí),返回值指示当调用函数时将发(fā)生什(shí)么:
TASK 返回(huí)了在其插(chā)入 command_history 表的新行中 cmd_ret_msg 列(liè)的(de)值。此 LVARCHAR 值指示命(mìng)令的结果(或失败)。 ADMIN 基(jī)于 ADMIN 插入 command_history 表的新行中 cmd_number 列(liè)的串行值返回了(le)一个整数值。
如果该值大(dà)于 0,那(nà)么命令成(chéng)功,且新(xīn)行已插入(rù)到 command_history 表中。 如果该值等于 0,那么命令成功,但是 Dynamic Server 无法将新行插入(rù)到 command_history 中。 如(rú)果该值小于 0,那么命令失败(bài),但是新行已插(chā)入到 command_history 表(biǎo)中(zhōng)。 command 规范和任何其(qí)他(tā)的参(cān)数都可以为(wéi) ADMIN 或(huò) TASK 函数定义管理任务。例(lì)如,等价(jià)于 oncheck -ce 命(mìng)令的此 SQL 语句可指导数(shù)据库(kù)服务器检查扩展数据块(kuài):
EXECUTE FUNCTION admin('check extents');如果(guǒ)调用此函数时 command_history 表有(yǒu) 200 行,且命令已成功,那么 informix 会执(zhí)行(háng)该命令并返回整数 201 。如果(guǒ)命令失败,那么此示例(lì)会返回值 -201 。
要显示命令历史记录(lù),请(qǐng)运行以下 SQL 语句:
SELECT * from command_history ;比(bǐ)如,当我(wǒ)们创(chuàng)建(jiàn)了一个 dbspace2 数据空间后,系(xì)统(tǒng)执行成功,返回(huí)码为 108,我们可以在 command_history 表中查看相关信息:
EXECUTE FUNCTION admin('create dbspace','dbspace2',
'$INFORMIXDIR/SPACE/dbspace2', '20MB');
(expression) 108
SELECT * FROM command_history WHERE cmd_number IN (108)
cmd_number 108
cmd_exec_time 2005-11-17 16:26:15
cmd_user informix
cmd_hostname olympia.beaverton.ibm.com
cmd_executed create dbspace
cmd_ret_status 0
cmd_ret_msg created dbspace number 2 named dbspace2在一个固定(dìng)的时间周期之(zhī)后(hòu),将会自动除去 command_history 表中(zhōng)的任务。您可以通过更改 ph_threshold 表中的(de) COMMAND HISTORY RETENTION 行来修改(gǎi)该时间周(zhōu)期。 COMMAND HISTORY RETENTION 参数设置数据行在 command_history 表(biǎo)中保留的时间长度。
您可以(yǐ)使用诸如(rú) delete 或 truncate table 之类的 SQL 命令(lìng)从表中(zhōng)手(shǒu)动除去(qù)数据。
您必须对 sysadmin 数据库(kù)执行 task() 和 admin() 函数。
task() 和 admin() 函数支持的主要管理命(mìng)令(lìng)列表如下,具体语法大(dà)家(jiā)可参考 Informix 信息中心中相关命令语法内容。
ADD BUFFERPOOLADD CHUNKADD LOGADD MEMORYADD MIRRORALTER CHUNK OFFLINEALTER CHUNK ONLINEALTER LOGMODEALTER PLOGARCHIVE FAKECHECK DATACHECK EXTENTSCHECK PARTITIONCHECKPOINTCLEAN SBSPACECREATE BLOBSPACECREATE CHUNKCREATE DBSPACECREATE SBSPACECREATE TEMPDBSPACECREATE BLOBSPACEDROP BLOBSPACEDROP CHUNKDROP DBSPACEDROP LOGDROP SBSPACEDROP TEMPDBSPACEONMODEPRINT ERRORPRINT PARTITIONQUIESCENTRENAME SPACESET CHUNK OFFLINESET CHUNK ONLINESET DATASKIP ONSET DATASKIP OFFSET SBSPACE ACCESSTIME ONSET SBSPACE ACCESSTIME OFFSET SBSPACE AVG_LO_SIZESET SBSPACE LOGGING ONSET SBSPACE LOGGING OFFSET SQL TRACINGSET SQL TRACING OFFSET SQL TRACING ONSET SQL TRACING RESIZESET SQL USER TRACINGSET SQL USER TRACING CLEARSET SQL USER TRACING OFFSHUTDOWNSTART MIRRORING spaceSTOP MIRRORING
行数据压缩(suō)及存(cún)储(chǔ)优化(huà)技术
我(wǒ)们知道,从 Informix 11.5 xC4 开始,Informix 数据库提(tí)供了行压缩(suō)技术(shù),它采用一种静态(tài)的基于字典的压缩算法(fǎ),将表(table)或(huò)表(biǎo)分区(table fragments)中的数据行中重复的数据模式(shì)映射到一个占用空间较(jiào)少的符号,从而减(jiǎn)少表格或(huò)表分区数据的总大小。这些(xiē)重复的数据模式(shì)不仅可以是一(yī)列中的(de)数据(jù),也可以是一列中的部分数据,甚至可以是跨数据列的数据。通(tōng)过采用(yòng)行(háng)压缩技术,Informix 11.5 可(kě)以节省高(gāo)达 80% 的(de)存储空间。同(tóng)时,由于数据是采用压缩方式存(cún)储,I/O 读取效率会有 20% 左右的提高,内(nèi)存(cún)使用效率会更高,数据库备份及恢复的时间也得到相应(yīng)的减少。
关于非阻(zǔ)塞检查(chá)点技术的(de)特(tè)点(diǎn)及技术实现,请参考文章“ Informix 11.5 行数据压缩及(jí)存储优化技术(shù)应用实践”。
使(shǐ)用 ontape 备(bèi)份数据到指定目录中
从 Informix 11 版本开始,ontape 命令(lìng)可(kě)以将数(shù)据(jù)及日志备份(fèn)到目录中,ontape 命令将在(zài)该(gāi)目(mù)录(lù)下自(zì)动为备(bèi)份数据(jù)及日志建立新的文件。你(nǐ)可以通过(guò)设置 TAPEDEV 及 LTAPEDEV 参数(shù)指向一个目录来实(shí)现。使(shǐ)用(yòng) ontape 命令将数(shù)据及日志备份到目录中 , 可以为我们带来如下好处:
多个实例可以同时(shí)备份到相同的目录下(xià) 可以通(tōng)过操作(zuò)系统工具(jù)对数据进(jìn)行压缩(suō)等操作 当日志文(wén)件填(tián)满后,可以配置系统自动备份该日志文件 使用时,你必须对该目录拥有写权限,并保证有足够的(de)空间(jiān)保存(cún)备份数据。
在使用 ontape 命(mìng)令可以将数据及日志备份到目录时,我们(men)要选(xuǎn)择 -y 选项关闭 ontape 的交互提示信(xìn)息(xī)。
下边例子用(yòng)来执行 0 级备份:
ontape -s -L 0 -y备份到目(mù)录中的数据文件名的格式(shì)为:hostname_servernum_Ln ;而日志文件的文(wén)件名为 hostname_servernum_Lognnnnnnnnnn 。
当(dāng)我们为 TAPEDEV 和 LTAPEDEV 指定目录时,可以使(shǐ)用 IFX_ONTAPE_FILE_PREFIX 环境变(biàn)量来指定备份文(wén)件(jiàn)名的前(qián)缀(替换(huàn) hostname_servernum 格式)。
如果(guǒ)将 IFX_ONTAPE_FILE_PREFIX 的(de)值设(shè)置为 My_Backup,那么备(bèi)份(fèn)文(wén)件名具有以下名(míng)称:
My_Backup_L0My_Backup_L1My_Backup_L2My_Backup_Log0000000001My_Backup_Log0000000002我们可以使用下述(shù)命(mìng)令设置 IFX_ONTAPE_FILE_PREFIX 环境变(biàn)量:
>>-setenv--IFX_ONTAPE_FILE_PREFIX--string---------------------->另外,我们还可以在目录中创建(jiàn)连续逻辑日志文件备份(fèn)。如果空(kōng)间(jiān)可用,逻辑日(rì)志将自动备份。 设置过程如下:
将 LTAPEDEV 参数设置为现有目录。
在 UNIX 上将 ALARMPROGRAM 参数设置为(wéi) log_full.sh 的完整(zhěng)路径,在 Windows 上将 ALARMPROGRAM 设置为(wéi) log_full.bat 的完(wán)整(zhěng)路径。
将 ALARMPROGRAM 参数中的备份程序从 onbar -b -l 更改为 ontape -a -y 。
重(chóng)新启动数据库服务器。
SQL 下钻查(chá)询(xún)特性
在 SQL 语句性能监控时,我们经常要(yào)了(le)解 SQL 语句执行(háng)了多长时间; SQL 语句(jù)运行时占用了(le)多少(shǎo)系统资源(yuán),如 CPU 占用情况、内(nèi)存占(zhàn)用情(qíng)况、磁盘 I/O 读写情(qíng)况; SQL 语句等待(dài)系统资源如(rú)磁盘 I/O 及锁的时(shí)间及次数等(děng)。通过 SQL 语句对系统的资源使用及等(děng)待情况,我们可(kě)以了解到 SQL 语句运行的瓶(píng)颈(jǐng),并及时调整(zhěng)系(xì)统资源配置,或者(zhě)调整(zhěng)用户的应用程序。我们虽然可以(yǐ)使用(yòng) set explain 命令帮(bāng)助我们了解一些 SQL 语句(jù)性(xìng)能问题,但是(shì)当我们启(qǐ)用 SET EXPLAIN 功能时,SQL 语句性能可能已经出(chū)现了问题,为了能够让 DBA 更及时、更详细地了解 SQL 语句的资源使用(yòng)情(qíng)况(kuàng)并做出相应的调整(zhěng),在 Informix 11 版本(běn)中(zhōng),提供了 SQL 下钻查(chá)询特性(xìng)来满足(zú)上述功能。
关于 SQL 下(xià)钻查询特(tè)性的技术特点(diǎn)、使用范围及技(jì)术实现,请参(cān)考(kǎo)发表在 developerWorks 中国网(wǎng)站 Information Management 专(zhuān)区中文章“ Informix 11.5 SQL 语句性能监(jiān)控方法及实现 ”中的相关(guān)内(nèi)容。
--------------------------------------------------------------------------------
回页首(shǒu)
数据库性能方面(miàn)的(de)一些实用特性
非阻塞检(jiǎn)查点
在 Informix 数据库使用(yòng)过程(chéng)中(zhōng),当发生检(jiǎn)查点操作时,会阻塞数据库应(yīng)用程序的运行,直到检查点操作完成(chéng)为止。这(zhè)样,会显(xiǎn)著降低数(shù)据库的性能。这时,我们往往需要调整数据库参数来减少检查点操(cāo)作对系(xì)统性能(néng)的影响(xiǎng),但这种调整往往比较复杂,很难(nán)达到最优效果。为了解决(jué)上(shàng)述问题,Informix 11 提(tí)出了非阻(zǔ)塞检(jiǎn)查点技(jì)术,采用该技术后,检(jiǎn)查点操作不再阻塞数据库应用(yòng)程序的运行,系统效率得到显著(zhe)的提高,也(yě)不再需(xū)要(yào)进行复杂的数据库调整操作。
关于非(fēi)阻塞检(jiǎn)查点技术的特点及(jí)技术实现,请参考文章(zhāng)“ Informix 11 非阻塞检(jiǎn)查点及 RTO 策略应用实践”。
已落实(shí)读取隔离的并行性增强(LAST COMMITTED)
在 Informix 中,当用户在(zài)对一行(háng)或多行(háng)数(shù)据(jù)进行修改,另(lìng)外用(yòng)户要对相同数据(jù)进(jìn)行读操作时,会出现(xiàn)锁等待(Lock Wait)现象,该用户要等到锁释放才可以继续(xù)操(cāo)作。这会影(yǐng)响(xiǎng)应用程序的效率。特别是在 OLTP 系统中,还容易产生死锁(Deadlocks)现(xiàn)象,影响系统的运(yùn)行效率。为了提高应用程序效率(lǜ),我们往(wǎng)往要调整 lock timeout 参数,将其设(shè)置(zhì)为(wéi) 30-60 秒,当锁等待超时后,中断该会话。另外,有些用户可能会将隔离(lí)级别设置为脏读,但对(duì)于有大量(liàng) update 操(cāo)作的应(yīng)用(yòng),这种隔离级(jí)别会读(dú)取幻(huàn)象数据(phantom data),数据(jù)准确性不能得到保证。
如(rú)下面例(lì)子(zǐ),采(cǎi)用 committed read 隔离级别(bié),会(huì)产生锁(suǒ)等(děng)待现象(xiàng)。
begin work;
create table tab(col1 int, col2 int) lock mode row;
insert into tab values(10,11);
insert into tab values(20,21);
commit work;
session 1:
--------------
begin work;
update tab set col2=99 where col1=10;
session 2:
--------------
begin work;
set isolation to committed read ;
select * from tab where col1=10;
244:Could not do a physical-order read to fetch next row.
107: ISAM error: record is locked.如下面例子,采用 committed read 隔离级别,会(huì)产生死锁(suǒ)现象。
begin work;
create table tab(col1 int, col2 int) lock mode row;
insert into tab values(10,11);
insert into tab values(20,21);
commit work;
session 1:
--------------
begin work;
set lock mode to wait;
update tab set col2=99 where col1=10;
select * from tab where col1=20;
session 2:
--------------
begin work;
set lock mode to wait;
update tab set col2=99 where col1=20;
select * from tab where col1=10;为了解决上述(shù)问(wèn)题,提高应用系统(tǒng)并发执行效率,Informix 11 提(tí)供(gòng)已落实(shí)读取隔离(lí)的并行性增强(qiáng)功能,通(tōng)过为(wéi) SET ISOLATION TO COMMITTED READ 语句引入了新的 LAST COMMITTED 关键字选项(xiàng),可(kě)减少尝试读(dú)取表时发生锁(suǒ)定(dìng)冲突的风险。采(cǎi)用该语句,当用户(hù)读(dú)取正在被其他用户修改(gǎi)的(de)数据时不在处于锁等待状(zhuàng)态,而是可以读取修改前最近(jìn)落(luò)实版(bǎn)本的数据值。 这样,由于(yú)不会产生锁等(děng)待,应(yīng)用程序效率会显(xiǎn)著(zhe)提高,而且,由于是读取修改前最近落实版本的数据(jù)值,也(yě)不(bú)会产生读取幻(huàn)象数据(phantom data)的问题,同时,也会大大减少(shǎo)产生死锁的现象。
如(rú)下面例子(zǐ),当采用(yòng) committed read last committed 隔离级别后,用户将读取修改前(qián)最近落实(shí)版本的数据(jù)值,不会(huì)产生锁等待现象。
begin work;
create table tab(col1 int, col2 int) lock mode row;
insert into tab values(10,11);
insert into tab values(20,21);
commit work;
session 1:
--------------
begin work;
update tab set col2=99 where col1=10;
session 2:
--------------
begin work;
set isolation to committed read last committed;
select * from tab where col1=10;
C1 C2
10 11我(wǒ)们可以(yǐ)通(tōng)过以下几种方(fāng)法来提高(gāo)使用“已落(luò)实(shí)读”、“脏读”、“读已落实”或“读未落实(shí)”隔离级别的会话中的并行性能(néng):
使用 Set Isolation to Committed Read Last Committed 语句 通过设置新的 USELASTCOMMITTED 配置参数扩展到脏(zāng)读(Dirty Read)、未落实(shí)读取(Read Uncommitted)和(hé)已(yǐ)落实读(dú)取(Read Committed)隔离级别。 USELASTCOMMITTED 选项可具有以(yǐ)下四个值中的任意一个:
如果值为“ COMMITTED READ ”,那(nà)么当(dāng)数据库服务器尝试(shì)读取(qǔ)处(chù)于(yú)“已(yǐ)落(luò)实读(dú)”或“读(dú)已落实”隔离级别的行(háng)而遇到(dào)互(hù)斥锁时,它将读取最(zuì)近落实的数(shù)据(jù)版本。
如果(guǒ)值为(wéi)“ DIRTY READ ”,那么当数据(jù)库(kù)服(fú)务器尝试读取处于“脏读”或“读已(yǐ)落实”隔离级别(bié)的行(háng)而遇到互斥锁时,它(tā)将读(dú)取最近落实的数据(jù)版本。
如果值(zhí)为“ ALL ”,那么当数据库服务器尝试读(dú)取处于“已落实读(dú)”、“脏读”、“读已落(luò)实”或“读未落实”隔离级别的行而遇(yù)到互斥锁时,它将读(dú)取最近落实的数据版(bǎn)本。
如果值为(wéi)“ NONE ”,那么此值将(jiāng)禁(jìn)用可访问已锁定(dìng)行中上次落实(shí)的数据版本的 USELASTCOMMITTED 功能。在此设置(zhì)下,如果会话在尝试读取处(chù)于“已落实读”、“脏(zāng)读”、“读已落实”或“读未落实(shí)”隔离级别的行时遇到互斥锁,那(nà)么在落实或回(huí)滚持有互斥锁的并发事务(wù)之前,事务不能读取该行。
SET ENVIRONMENT USELASTCOMMITTED 语句 SET ENVIRONMENT 语句可以在(zài)运行(háng)时指定影响相同例程中(zhōng)随后提交的查询的选项。 SET ENVIRONMENT USELASTCOMMITTED 可指定遇到由其他(tā)会话持有的互斥锁的查询和其他操作在更改数据值时是否应使用最近落实的数(shù)据版(bǎn)本,而不是等待锁被释放(fàng)。
此(cǐ)语句(jù)在执行当前会话期间可覆(fù)盖 USELASTCOMMITTED 配置参数设(shè)置。您可以使(shǐ)用 SET ISOLATION 语句来覆盖 USELASTCOMMITTED 会话环境(jìng)设置。
例(lì)如,以下语句指定“已落实(shí)读(dú)”隔离方式,并将系统(tǒng)缺省 USELASTCOMMITTED 配置参数设置替换为(wéi)读取最近落实的数据(jù)版(bǎn)本(数据位(wèi)于并发阅读器持(chí)有互斥锁的(de)行中(zhōng))的(de)设(shè)置。
SET ISOLATION COMMITTED READ;
SET ENVIRONMENT USELASTCOMMITTED 'ALL';任(rèn)何 SPL 例程都(dōu)可(kě)使用(yòng)这些语句在(zài)会话期间指定“已落实读上次已(yǐ)落实”事务隔离级别。这些语句启用读取数(shù)据(jù)的(de) SQL 操作,从而在执行读取行的(de)操作期间遇(yù)到互斥(chì)锁时使用上次落实的版本。当(dāng)另一个(gè)会话尝试修改同一(yī)行时,这样可避(bì)免死(sǐ)锁情况或其他(tā)锁(suǒ)定错(cuò)误。
例如,PUBLIC.sysdbopen 或 user.sysdbopen 过程(chéng)中(zhōng)的以下语(yǔ)句在(zài)连接时指定“已(yǐ)落实读”隔离方式,并将显式或缺省 USELASTCOMMITTED 配置参数设置替换为读取表(其(qí)中并发阅读器持有互斥锁)中最(zuì)近落实的(de)数据版(bǎn)本的设置:
create procedure PUBLIC.sysdbopen()
SET ISOLATION COMMITTED READ;
SET ENVIRONMENT USELASTCOMMITTED 'ALL';
end procedure;除 sysdbopen( ) 之外,任何 SPL 例(lì)程都(dōu)可使用这些语(yǔ)句在会话期间指定(dìng)“已(yǐ)落实读上次已落实”事(shì)务隔离级别(bié)。这些语句启用读取数据的 SQL 操作以在执行(háng)读取表的操作期间遇到互斥锁时使用上次落实(shí)的版本。当另一个会话(huà)尝试修改同一个行(háng)或表(biǎo)时(shí),这样可避免死锁情况或其他锁定(dìng)错误(wù)。
当启用(yòng) LAST COMMITTED 选项后, onstat 命令的输出(chū)也进行了相应的变化:
-k 选项增加了新(xīn)的(de)内容 -x 选项(xiàng)增加了“ LC ”作为隔离(lí)级别 “ -g sql ” 选项增加了“ LC ”作(zuò)为(wéi)隔离级别 该功能支持(chí) B 树(shù)索引和函数型索引,但不支持 R 树索(suǒ)引。它(tā)只支持“行”级别锁(suǒ)定,它不支持(chí)以下这(zhè)些表:正在被(bèi) DataBlade 模块访问(wèn)的(de)表、列(liè)中(zhōng)具有集合数据类型的(de)表、使用虚拟(nǐ)表界面创建的表、具有(yǒu)页面级别锁定的表、具有专用(yòng)表级别锁定(dìng)的表或(huò)无事务(wù)记录的数据库中的表(biǎo)。 它也不支持 HDR Secondary 。
在跨服务器的分布式(shì)查询中(zhōng),如果发出查询的会话的隔离级别(bié)具有有效的 LAST COMMITTED 隔(gé)离(lí)级(jí)别,但一个或(huò)多个(gè)参与操作的(de)数(shù)据(jù)库(kù)不支持该 LAST COMMITTED 功能,那(nà)么整个事务符合(hé)发出(chū)该事务的(de)会(huì)话的“已落实读”或“脏读”隔离级别,而不启用 LAST COMMITTED 选项。
在 UNIX 上用 direct I/O 提(tí)高(gāo) cooked 文件的性能
在 Informix 11 中(zhōng),随着 direct I/O 特(tè)性(xìng)的引(yǐn)入,可以提高用于常规数据库空间块的 cooked 文(wén)件的 I/O 性能。使用(yòng)文件(jiàn)系统的 I/O 通常慢于使用原始设(shè)备的 I/O 。这是因(yīn)为通过文(wén)件系统进行读写有附加的开销。这增加了(le)另一层(céng)的工(gōng)作。此外,可能(néng)存在一个缓冲(chōng)系统。这种缓冲会降低性能,而(ér) IDS 不能控(kòng)制操作系统的这个子(zǐ)系统。 Direct I/O 可(kě)以绕过文件系统层,包(bāo)括任(rèn)何缓(huǎn)冲,因此读(dú)和写的效率更高。可以使用 DIRECT_IO 配置参数(shù)启用 direct I/O 。 cooked 文件的(de)性能可(kě)以(yǐ)接近用于数据库空间块(kuài)的原(yuán)始设备的性能(néng)。
DIRECT_IO 不(bú)能(néng)用于临时数(shù)据库空间,只能用(yòng)于常规的数据库空间块。文件(jiàn)系统和(hé)操作系统必须支持(chí)给定页大小的 direct I/O 。对于原始(shǐ)设备,不支持 direct I/O 。对于原始设备(bèi)上的块,更可取的 I/O 方法(fǎ)是 KAIO(kernel asynchronous I/O) 。
DIRECT_IO ONCONFIG 参数(shù):
DIRECT_IO 设(shè)置 描述
0 Direct I/O 被关闭
1 Direct I/O 被(bèi)打开
注意: 有些操作系统启用 direct I/O,并且实现使用 KAIO (kernel asynchronous i/o) 。如果启用了 direct I/O,数据库服务(wù)器会(huì)尝试使用 KAIO 以(yǐ)完(wán)成这项工作。如果启用了 KAIO,可以减少 AIO 虚拟处理器的数量。这(zhè)里假(jiǎ)设 KAIO 已被启用(KAIOOFF 在环境中没(méi)有被(bèi)设(shè)置)。
Windows 不支持 DIRECT_IO ONCONFIG 参数,因为在 Windows 平台上 direct I/O 是(shì)默认被启(qǐ)用(yòng)的。
使用非日志记录原始表(RAW TABLE)
在 Informix 数(shù)据库中,如果采用日志模式的数据库,那么当对(duì)表进行大批量数据装载时,会消耗大(dà)量的日(rì)志,如果没(méi)有合适大小的日志空间,可能造成日志(zhì)用(yòng)满而挂起(qǐ)的问题(tí)。从 Informix 9.2 开始,您(nín)可在日志记录数据(jù)库中使用(yòng)非(fēi)日志记录原始表(raw table)来(lái)加(jiā)快最初的装入(rù)和数据验证。数据仓库及(jí)其他应用程序可能具(jù)有非常大的表(biǎo),需要很长的装入时间。装入非日志记录表(biǎo)比(bǐ)装(zhuāng)入(rù)日志记录表要快(kuài)。
RAW 表是非日志记录永久表(biǎo)并且(qiě)类似于非日志记录数据库(kù)中(zhōng)的表。 RAW 表使用(yòng)轻附加,这会将行快速添加(jiā)到每个(gè)表分段的(de)末尾(wěi)。支(zhī)持但不记录 RAW 表(biǎo)中的更新(xīn)、插入和删除(chú)。 RAW 表不支持引用约束、唯一约束和(hé)回滚(gǔn)。如果(guǒ)从上次物理备(bèi)份后还未更新 RAW 表,那么可以(yǐ)从该(gāi)次备(bèi)份中恢(huī)复该表。快速恢复将回滚 STANDARD 表(但非 RAW 表)上未完成的(de)事务。无论(lùn)是存储(chǔ)在日志记录数据库还是非(fēi)日(rì)志记录数(shù)据库中,RAW 表的属性(xìng)都相(xiàng)同。
要创(chuàng)建(jiàn)用于装入的非日志记录表,您可使用(yòng) CREATE RAW TABLE 语句(jù)或 ALTER TABLE 语句将表类型(xíng)从 STANDARD 更改为 RAW 。 RAW 类型(xíng)的表(biǎo)不允许引用约束,这样最(zuì)初的(de)装入就比 STANDARD 类型的表要快。原始表的(de)装入完成后,您(nín)可通过将表类型更改为 STANDARD 来将其更(gèng)改为(wéi)日志(zhì)记(jì)录(lù)表(在(zài)日(rì)志记录数(shù)据库(kù)中(zhōng))。然后可使(shǐ)用 ALTER TABLE 语句将引用约束(shù)添加(jiā)到表(biǎo)中并(bìng)使(shǐ)用 CREATE INDEX 语句来添加索引。
下面例(lì)子显示了 raw table 创(chuàng)建的方法:
create raw table xyz
( col1 INT, col2 CHAR(10)
)
in dbspace {fragment by whatever};
or
alter table xyz type raw ;下面例子显(xiǎn)示了 raw table 恢复为(wéi) standard table 的方法
alter table xyz type standard ;要装入原始表,您可使用任何数据装入实用程序,例如快(kuài)速方式的(de) dbimport 或 HPL 。装入数据后,请执(zhí)行 0 级(level-0)备份。修改原始表中的任何数据或在事务(wù)中使用它之前,请(qǐng)将表类型更改为(wéi) STANDARD 。
如果在原始表的装入(rù)期间发生错误或(huò)故(gù)障(zhàng),结果数(shù)据将是故障时留在磁盘上的任(rèn)何(hé)数(shù)据。
dbexport 和(hé) dbschema 实用程序支持 CREATE RAW TABLE 和 ALTER TABLE...TYPE(RAW)语句。
注(zhù)意:请(qǐng)勿在(zài)事务中使用 RAW 表。在已装入数据后(hòu),请首先使(shǐ)用(yòng) ALTER TABLE 语(yǔ)句将表更改为 STANDARD 类型(xíng)并(bìng)执行(háng) 0 级(jí)备(bèi)份,然后再在事务(wù)中使用该表。
--------------------------------------------------------------------------------
回页首
数据库应用开(kāi)发方面的一些实用特(tè)性
会话配置例程(Session Configuration Routines)
在 Informix 11 版本中(zhōng),新增加了 sysdbopen( ) 和 sysdbclose( ) 内置 SPL 过程,使数据库管理员能在用户连接(jiē)到数据库或从数(shù)据库断开连(lián)接时,自动执行相关的 SQL 和 SPL 语(yǔ)句。通过使用(yòng)这两个 SPL 过程(chéng),我们可以(yǐ)在连接或访问时更改数据库服务器会话的属性,而不(bú)更改会话(huà)所运行的应(yīng)用程(chéng)序。这样,对于那(nà)些不能通过修改应(yīng)用程序的(de)源代(dài)码来设(shè)置环(huán)境选项(或环境(jìng)变量)或包含(hán)与会话(huà)相关的 SQL 语句(例(lì)如,由于 SQL 语句(jù)包含从供应(yīng)商(shāng)处获得的代码)的情况,该操作非常有用。同样(yàng),对于自动化应用程序终止之后需(xū)要(yào)执行(háng)的操作,主要(yào)是清(qīng)除操作(zuò),这两个程序也很有用。
如果(guǒ) DBA 将用户的(de)登录标识指定为名称是(shì) sysdbopen( ) 的过程的所有(yǒu)者,当(dāng)指定(dìng)用户连接到数(shù)据库或从数据库断开连接(jiē)时,Informix Dynamic Server 会执行(háng)该过程。如果 DBA 将 PUBLIC 指(zhǐ)定为所(suǒ)有(yǒu)者,当不(bú)是任何这些内(nèi)置会话(huà)配置过(guò)程所有者的用户连接到数据库时,会自(zì)动执行该(gāi)例程。同(tóng)样,当已连接到数据库(kù)的用(yòng)户执行(háng)引用其他数(shù)据库中对象的分布式操作(如跨(kuà)数据库或跨服务器查询)时,不会调用 sysdbopen( ) 例程。
同样,如果没(méi)有为该用户在数(shù)据库中注(zhù)册 user.sysdbclose( ),当该用户关(guān)闭与数据库的(de)连(lián)接时,将会自动(dòng)调(diào)用另一内(nèi)置(zhì)过程 user.sysdbclose( ) 或(huò) public.sysdbclose( ) 。
如果要更改会话的属(shǔ)性,可为各种数据库设计(jì)定制 sysdbopen( ) 和 sysdbclose( ) 过程以支持特定用户或 PUBLIC 组的(de)应(yīng)用程序。 sysdbopen( ) 和 sysdbclose( ) 过程(chéng)可(kě)包含数据库服务器在(zài)数据库打开或关(guān)闭时为用户(hù)或 PUBLIC 组执行的一系列 SET、SET ENVIRONMENT、SQL 或 SPL 语句。
例(lì)如,对于 user1,可定义包含(hán) SET PDQPRIORITY、SET ISOLATION LEVEL、SET LOCK MODE、SET ROLE 或 SET EXPLAIN ON 语句的过程,无论何(hé)时 user1 使用 DATABASE 或 CONNECT TO 语句打(dǎ)开数据库时,这些过程都将(jiāng)执行。
sysdbopen( ) 过程中由 SET ENVIRONMENT 语句指定(dìng)的会话(huà)环境变量(liàng) PDQPRIORITY 和(hé) OPTCOMPIND 的任何设置都将在整个(gè)会话期间保持。对于(yú)常规过程非持久的 SET PDQPRIORITY 和 SET ENVIRONMENT OPTCOMPIND 语(yǔ)句,在 sysdbopen( ) 过程包含(hán)它们时将(jiāng)保持。
当作为过程所有者的用户从数据库断(duàn)开连接(jiē)时,将运行 user.sysdbclose( ) 过(guò)程(chéng)(或者(zhě)此时将运行 PUBLIC.sysdbclose( ),前(qián)提是此过程存(cún)在且当前用户不具有任何(hé) sysdbclose( ) 过程)。
使用 sysdbopen( ) 和 sysdbclose( ) 内置(zhì) SPL 过程的先决条件:只有(yǒu) DBA 或用户(hù) informix 能够在 SQL 的 ALTER PROCEDURE、ALTER ROUTINE、CREATE PROCEDURE、CREATE PROCEDURE FROM、CREATE ROUTINE FROM、DROP PROCEDURE 或 DROP ROUTINE 语(yǔ)句(jù)中创建或(huò)更(gèng)改 sysdbopen( ) 或 sysdbclose( ) 。
设置 sysdbopen() 和 sysdbclose() 过(guò)程以配置(zhì)会话属性的基(jī)本操作步骤:
将(jiāng) IFX_NODBPROC 环境(jìng)变量设置为任何值(包括(kuò) 0)以使数据库服(fú)务(wù)器绕过和防止 sysdbopen( ) 或 sysdbclose( ) 过程的执行。
编(biān)写 CREATE PROCEDURE 或 CREATE PROCEDURE FROM 语句以(yǐ)定义特定用户或 PUBLIC 组的(de)过程。
测试过程(例如,通过使用 EXECUTE PROCEDURE 语句中的(de) sysdbclose( ))。
取消设置 IFX_NODBPROC 环境变(biàn)量以使数(shù)据库服务器能够运行 sysdbopen( ) 或(huò) sysdbclose( ) 过程(chéng)。
下面的(de)程序为特定用户(hù) usr1 设置角色,并将隔离(lí)级别设为(wéi) committed read 。
create procedure usr1.sysdbopen()
set role oltp;
set isolation to committed read;
end procedure;这样,当用户(hù) usr1 通过 DATABASE 或 CONNECT 语句连接到(dào)数据库时,将设置 oltp 角色,并(bìng)将隔离级别(bié)设为 committed read 。
下面的程序设置 PUBLIC 组的角色和 PDQ 优先级(jí)。
create procedure public.sysdbopen()
set role others;
set pdqpriority 1;
end procedure;这样,当(dāng)用户通过(guò) DATABASE 或 CONNECT 语句连接到数据库时,如(rú)果没有(yǒu)为该用(yòng)户创(chuàng)建自(zì)己的 sysdbopen( ) 过(guò)程,他将执行 public.sysdbopen() 过程,设置(zhì) oltp 角色,并(bìng)将 PDQ 优(yōu)先级设为 1 。
下面的程序(xù)为 PUBLIC 组创建(jiàn) sysdbclose() 过程(chéng)。
CREATE PROCEDURE public.sysdbclose() INSERT INTO logit
VALUES(USER, “ O “ ,CURRENT::DATETIME YEAR TO SECOND);
END PROCEDURE;这样,当用户断开数据库连接时,如果没有为该用户创建自己的 sysdbclose() 过程(chéng),他将执行 public.sysdbclose() 过程(chéng),将用(yòng)户信(xìn)息、操作状态及相应的时间戳的信息保存到 logit 表中。
Disabling logging for temporary tables
在(zài) Informix 数据(jù)库中,我们(men)经常会创建(jiàn)一些临时表来处理应(yīng)用中的临时信息(xī)。系统可以采用如下(xià)两种方式创建临时(shí)表:
使用 SELECT INTO TEMP 语句隐(yǐn)含地创建临时表 使用(yòng) CREATE TEMP TABLE 语(yǔ)句显示(shì)地(dì)创建(jiàn)临时表 如果数据库采用非(fēi)日(rì)志模式,DBSPACETEMP 环(huán)境变量或配置参数设置后,临时表(biǎo)会自动创建(jiàn)在由 DBSPACETEMP 环境变(biàn)量或配置参数指定的数据空间上;如果数据库(kù)采用日志模式,那么创建的临时表缺省情况(kuàng)下是(shì)记日志的,不(bú)会被创建(jiàn)在由 DBSPACETEMP 环境变量或配置(zhì)参数指定的数据空间上(shàng),那么由 SELECT ... INTO TEMP 语句创建的临时表将被(bèi)创建在根(gēn)数(shù)据(jù)空间(jiān)(Root dbspace)上,由(yóu) CREATE TEMP TABLE 语句创(chuàng)建的临时(shí)表将被创建在(zài)数据库所在的(de)数据空间上。如果(guǒ)希望临时(shí)表(biǎo)创建在(zài)由 DBSPACETEMP 环境变量或配置参数指定(dìng)的数据空间(jiān)上,我们需要使用 SELECT INTO TEMP with no log 语句或 CREATE TEMP TABLE with no log 语句(jù)来创(chuàng)建临(lín)时表。
下(xià)边(biān)例子显示了在日志模(mó)式数据库(kù)中创建(jiàn)临时表的(de)方法:
$ export DBSPACETEMP=dbs1,dbs2
SELECT number FROM account INTO TEMP tp1
Use with a logged database:
Temp table tp1 is created in the rootdbs:
SELECT number FROM account INTO TEMP tp2 WITH NO LOG
Temp table tp2 is fragmented across dbs1,dbs2:临(lín)时(shí)表按照如下优先顺序创建在相应的数据(jù)空(kōng)间上(shàng):
由 DBSPACETEMP 环(huán)境变量(liàng)指定(dìng)的数据空间 由 DBSPACETEMP 配置参数指(zhǐ)定的数据空间 如果设置(zhì)了(le) DBSPACETEMP 环境变量,那么临时表会创建在由 DBSPACETEMP 环境变(biàn)量指定(dìng)的(de)数据空间上,如(rú)果没有设(shè)置(zhì) DBSPACETEMP 环境变量,那(nà)么临时表(biǎo)会创(chuàng)建在由 DBSPACETEMPP 配置参(cān)数(shù)指(zhǐ)定的数据空间上(shàng)。
出于(yú)性能(néng)考虑,一(yī)般我们建议在多个物理(lǐ)磁(cí)盘上创建多个临时表空间,这样,当创建临时表时,它(tā)会(huì)分片到所有临时表空间上,提(tí)高并发处理效率。
在采用日志模式(shì)的数据(jù)库中,对临时表的所有 DML 操作都要记日志(zhì),而(ér)且(qiě)不加 with no log 选项,临时表不会(huì)创建(jiàn)在由 DBSPACETEMP 环境变量或配置参(cān)数指定的临(lín)时数据空间(jiān)上,往(wǎng)往数据会写到根数据空(kōng)间(Root dbspace)上,影(yǐng)响系(xì)统性能,而且用户在创建临时表时(shí),往往总(zǒng)是忘记 with no log 选(xuǎn)项。为了解(jiě)决上述问题,Informix 11 版本开始提供了关闭(bì)对临时表(biǎo)记日志(zhì)的(de)方法,这样,建临时表时,即使没加 with no log 选项,临(lín)时表也会创建在由 DBSPACETEMP 环境变(biàn)量或配置参数指定的临时数据空(kōng)间上。
我们可(kě)以采(cǎi)用下述两种方法来关(guān)闭(bì)对临时表记日志:
修改 onconfig 配置参数 TEMPTAB_NOLOG 1通(tōng)过(guò) onmode 命令动态(tài)改变 onmode -Wf "TEMPTAB_NOLOG =1"
onmode -Wm "TEMPTAB_NOLOG =1"其中(zhōng),-Wm 选项改变参(cān)数(shù)值(zhí)后立即(jí)生(shēng)效; -Wf 选项(xiàng)改变参数值后立即生(shēng)效,同时将新的参数值写到 onconfig 配置(zhì)文件中。
使(shǐ)用 TEMPTAB_NOLOG 参数来禁用临时表上(shàng)的日(rì)志(zhì)记(jì)录。该参(cān)数可(kě)以改进(jìn)应(yīng)用程序(xù)的性能,尤其是在(zài)有 HDR 辅助服务器、RS 辅助服务器或 SD 辅助服务器(qì)的数(shù)据复制环境中,因为其(qí)防止 Informix 通过网络传(chuán)输(shū)临时(shí)表。
--------------------------------------------------------------------------------
回页首
数据库高可用集群方面的(de)一些实用特性
用户的关(guān)键业务系统,特别是 OLTP 系统,都要(yào)求提供(gòng) 24X7 不间断的应用服务(wù),这(zhè)就要求数据库系统能够提供强大的(de)高(gāo)可用能力。这(zhè)种能力不仅仅体现在(zài)主机及备机(jī)的接管方面,同时要能够提供远程容灾能力,以及本地的负(fù)载均衡能力。针对上述对数据(jù)库的要求(qiú),Informix 从版本 6 开始, 就提供了 HDR 技术,它(tā)是通过数据库的(de)事务(wù)日(rì)志(zhì)的(de)方式实现了主、备(bèi)机互相接(jiē)管的(de)功能,当主机工作时,备机提供只(zhī)读功(gōng)能(néng),因(yīn)此(cǐ),备(bèi)机可以提供查询、报表等功能,实现负载分(fèn)担的功能,当(dāng)主机(jī)发生故(gù)障,备(bèi)机(jī)会(huì)自动接管(guǎn),实现主机及备机的接(jiē)管功能。从(cóng) Informix 7.2.2 版本开始,Informix 数据库提供了 ER(Enterprise Replication) 数据库复制技(jì)术,它也是(shì)通过读取数据库日(rì)志(zhì)的方式实现(xiàn)数(shù)据同步(bù)功能,当源(yuán)数据库数据发生变化后,Informix 数据库(kù)通过读取(qǔ)数据库日(rì)志,将变化的数(shù)据及时同步到目标数(shù)据库,采(cǎi)用 ER 的方(fāng)式,和 HDR 不同(tóng),HDR 数据库的接管是基于数据库(kù)服(fú)务(wù)器的,也(yě)就(jiù)是它的作用范围是基于整个实(shí)例的,而(ér) ER 的(de)作用(yòng)范围是作用于一个表,你(nǐ)可以(yǐ)灵活定义需要复制哪些数据列及数据行,而(ér)且可以灵(líng)活定义数据复制的方(fāng)式,是采(cǎi)用主从方式、汇总方(fāng)式(shì)还是双向复制方式。从 Informix 11 开始,Informix 数(shù)据库提供了(le) SDS(Shared Disk Secondary)、RSS(Remote Standalone Secondary)、CLR(Continuous Log Restore) 等高可(kě)用集(jí)群(qún)技(jì)术,提供了更加强大的高可(kě)用(yòng)能力。从 Informix 11.5 开始(shǐ),HDR、SDS、RSS 备机都支持读写能力,提供了更强大的(de)负载(zǎi)均衡能力。同时,从 Informix 11.5 开始,Informix 还(hái)提供了(le) Connection Manager 功能部件,它可(kě)以提供 SLA(Service Level Agreement) 功能,更好地(dì)实现负载均衡的能(néng)力,同时提供了 FOC(Fail Over Connection) 功能,实现(xiàn)透明故(gù)障接管能力,而且,所有这些对客户端应用来说是透明(míng)的。
