Informix 數(shù)據(jù)庫(kù)目前最新的版本是 11.5,從 Informix 9、Informix 10 到 Informix 11.5,在數(shù)據(jù)庫(kù)性能、數(shù)據(jù)庫(kù)管理及應(yīng)用開(kāi)發(fā)等方面都有了很大的提高,而且推出了很多非常有用的新特性。通過(guò)對(duì)這些特性的使用,可以大大提高數(shù)據(jù)庫(kù)性能、增強(qiáng)數(shù)據(jù)庫(kù)可管理性及應(yīng)用開(kāi)發(fā)的靈活性。我們這里,給大家介紹其中的一些特性,希望對(duì)大家能有所幫助。
數(shù)據(jù)庫(kù)管理方面的一些實(shí)用特性
使用可配置的頁(yè)面大小
我們知道,在 Informix 中,數(shù)據(jù)存儲(chǔ)的最基本的單位是頁(yè),在 Informix 10 版本之前,數(shù)據(jù)頁(yè)面的大小是固定的,不能被改變,通常,在 sun、HP 等平臺(tái)上,數(shù)據(jù)頁(yè)的大小為 2K,AIX 及 windows 平臺(tái),數(shù)據(jù)頁(yè)的大小為 4K 。從 Informix 10 版本開(kāi)始,我們可以配置 Informix 數(shù)據(jù)庫(kù)頁(yè)面的大小,數(shù)據(jù)庫(kù)頁(yè)面的大小可以是 2K-16K 。通過(guò)提供可配置的頁(yè)面大小功能,可以給我們帶來(lái)很多好處:
空間使用的效率會(huì)更高
從 Informix 10 開(kāi)始,一個(gè)頁(yè)面可以達(dá)到 16K 的連續(xù)空間,可以更有效的使用數(shù)據(jù)空間。比如說(shuō),我們表中一行的數(shù)據(jù)大小為 1200 字節(jié),那么,當(dāng)使用 2K 大小頁(yè)面時(shí),只能存放 1 行數(shù)據(jù),3 行數(shù)據(jù)需要 6K 大小空間;如果采用 4K 大小頁(yè)面,那么 3 行數(shù)據(jù)可以放在一個(gè) 4K 頁(yè)面上,空間會(huì)節(jié)省 %33 。那么,當(dāng)對(duì) 30 行數(shù)據(jù)而言,如果采用 2K 大小頁(yè)面時(shí),需要占用 60k 大小空間,如果采用 4K 大小頁(yè)面時(shí),只需要占用 40k 大小空間,如果采用 6k 大小頁(yè)面時(shí),則僅需要占用 36k 大小空間 , 可以節(jié)省 40% 的空間。 支持更大的索引鍵值, 最大可以達(dá)到 3K 。
這樣,我們可以在一個(gè)索引頁(yè)面上放置更多的索引鍵,支持更大的鍵值,而不需要增加索引樹(shù)的層次。采用可配置頁(yè)面大小功能,可以顯著提高具有大量重復(fù)索引鍵值情況下的處理性能。 存取效率的提高
通過(guò)采用可配置頁(yè)面大小功能,可以降低數(shù)據(jù)頁(yè)和索引頁(yè)的 IO 操作次數(shù),提高存取效率。通過(guò)配置頁(yè)面大小,很長(zhǎng)的記錄行可以只存放在單個(gè)頁(yè)面上,降低了讀取每條記錄的頁(yè)面數(shù)目;在以前的版本中,超長(zhǎng)的記錄需要 remainders pages,采用大的頁(yè)面足夠用來(lái)存放整條記錄,略去了訪問(wèn) remainders pages 的時(shí)間;大的索引頁(yè)面可以存放更多的索引項(xiàng),從而降低了索引的層數(shù),減少了在索引樹(shù)上遍歷的開(kāi)銷(xiāo);在決策支持應(yīng)用的環(huán)境中,使用大的頁(yè)面可以降低全表掃描的頁(yè)面的數(shù)目,提高運(yùn)行效率。 我們可以在數(shù)據(jù)庫(kù)空間(dbspace)級(jí)別以及緩沖池(buffer pool)級(jí)別來(lái)定義數(shù)據(jù)頁(yè)面的大小,其范圍可以是 2K-16K,而且定義的數(shù)據(jù)頁(yè)面大小必須是系統(tǒng)缺省頁(yè)面大小的倍數(shù)?膳渲玫捻(yè)面大小功能需要系統(tǒng)開(kāi)啟大塊(large chunk)功能。
在創(chuàng)建 dbspace 時(shí),這個(gè)特性允許指定標(biāo)準(zhǔn)或臨時(shí) dbspace 的頁(yè)大小。如果要使用比默認(rèn)頁(yè)大小所允許的鍵長(zhǎng)更長(zhǎng)的鍵,可能需要指定非默認(rèn)的頁(yè)大小。 根 dbspace 使用默認(rèn)的頁(yè)大小。如果希望指定頁(yè)大小,指定的值必須是默認(rèn)頁(yè)大小的整數(shù)倍,而且不能超過(guò) 16 KB 。
使用 onspaces 命令創(chuàng)建 dbspace 的基本語(yǔ)法如下:
onspaces – c – d dbs – k pgsize – p path -o offset -s size ;其中,pgsize 用來(lái)指定 dbspace 的頁(yè)面大小 (in K):
頁(yè)面大小的范圍從 2K 到 16K 。 頁(yè)面大小必須是缺省頁(yè)面大小 (2k or 4K) 的倍數(shù)。 Dbspace 創(chuàng)建之后,頁(yè)面大小不能修改。 如果相對(duì)應(yīng)的頁(yè)面大小的緩沖池不存在,online 將通過(guò)配置參數(shù) BUFFERS_DEF 自動(dòng)創(chuàng)建一個(gè)。 rootdbs 必須使用系統(tǒng)默認(rèn)的頁(yè)面大小。 動(dòng)態(tài)創(chuàng)建的日志文件必須在使用系統(tǒng)默認(rèn)的頁(yè)面大小的數(shù)據(jù)庫(kù)空間上分配。 在創(chuàng)建緩沖池時(shí),我們可以使用新的 BUFFERPOOL 配置參數(shù)或者 onparams 工具為 dbspace 中所有非默認(rèn)頁(yè)大小對(duì)應(yīng)的頁(yè)定義緩沖池。在使用 BUFFERPOOL 配置參數(shù)或者 onparams 工具定義緩沖池時(shí),需要指定緩沖池的信息,包括大小、緩沖池中的 LRUS 個(gè)數(shù)、緩沖池中的緩沖區(qū)個(gè)數(shù)、lru_min_dirty 和 lru_max_dirty 的值。 BUFFERS、LRUS、LRU_MAX_DIRTY 和 LRU_MIN_DIRTY 配置參數(shù)都不再使用。在 Version 10.0 中,以前在 BUFFERS、LRUS、LRU_MAX_DIRTY 和 LRU_MIN_DIRTY 配置參數(shù)中指定的那些信息,現(xiàn)在要使用 BUFFERPOOL 配置參數(shù)或者 onparams 工具指定。使用 BUFFERPOOL 配置參數(shù)或 onparams 工具輸入的信息代替了以前用過(guò)時(shí)的參數(shù)指定的信息。
通過(guò) onparams 指定緩沖池的基本語(yǔ)法如下:
onparams – b – g pgsize – n buffs – r lrus – x max – m min ;其中:
pgsize – 緩沖池的頁(yè)面大小,必須是缺省頁(yè)面大小 (2k or 4K) 的倍數(shù); buffs – 緩沖池中的頁(yè)面數(shù)目; lrus – 緩沖池中的 LRU 隊(duì)列的數(shù)目; max – 緩沖池中最大臟頁(yè)的百分比; min - 緩沖池中最小臟頁(yè)的百分比; 使用 onparams 創(chuàng)建緩沖池舉例:
onparams – b – g 8 – n 3000 – r 4 – x .9 – m .5 ;通過(guò)上述命令,我們,
創(chuàng)建一個(gè) 8k 頁(yè)面大小的緩沖池,該緩沖池具有 3000 個(gè)頁(yè)面,由 4 個(gè) LRU 隊(duì)列組成。 最大臟頁(yè)百分比為 0.9% , 最小臟頁(yè)百分比為 0.5% 。 每個(gè)不同頁(yè)面大小的緩沖池只能有一個(gè)。 緩沖池創(chuàng)建之后,需要重啟 online 才能生效。 在創(chuàng)建 dbspace 時(shí),不需要通過(guò) onparams 來(lái)創(chuàng)建緩沖池 . online 將通過(guò)配置參數(shù) BUFFERS_DEF 自動(dòng)創(chuàng)建一個(gè)。 當(dāng)采用可配置的頁(yè)面大小后,Informix 數(shù)據(jù)庫(kù)中的 onstat 和 oncheck 命令的輸出也發(fā)生了相應(yīng)的變化:
onstat – d – b – B – P – R – X 的輸出都發(fā)生了變化
onstat -d 命令的輸出增加了數(shù)據(jù)頁(yè)大小項(xiàng):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 命令的輸出變化: 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 顯示定義的緩沖池的信息 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 命令將顯示相應(yīng)的頁(yè)面大小 以下示例顯示了 oncheck -pt 命令的輸出示例:
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āng) Informix 數(shù)據(jù)庫(kù)執(zhí)行崩潰恢復(fù)時(shí),以前我們沒(méi)有任何方法可以預(yù)測(cè)崩潰恢復(fù)將在什么時(shí)間完成,Informix 11 提出了 RTO 技術(shù),當(dāng)采用 RTO 技術(shù)后,我們可以指定測(cè)崩潰恢操作完成的時(shí)間,這樣,使得崩潰恢復(fù)時(shí)間可以被我們把握。
關(guān)于非阻塞檢查點(diǎn)技術(shù)的特點(diǎn)及技術(shù)實(shí)現(xiàn),請(qǐng)參考文章“ Informix 11 非阻塞檢查點(diǎn)及 RTO 策略應(yīng)用實(shí)踐”。
SQL 管理 API (SQL Administration API)
我們知道,Informix 數(shù)據(jù)庫(kù)有很多實(shí)用程序來(lái)進(jìn)行數(shù)據(jù)庫(kù)管理工作,比如,我們會(huì)使用 onspace 命令來(lái)創(chuàng)建新的數(shù)據(jù)空間,使用 oncheck 命令來(lái)對(duì)磁盤(pán)上的數(shù)據(jù)及索引進(jìn)行檢查。但是,這些實(shí)用程序只能在命令行執(zhí)行,不能在 SQL 語(yǔ)句中進(jìn)行調(diào)用,這樣,我們很難在應(yīng)用程序中來(lái)執(zhí)行數(shù)據(jù)庫(kù)管理操作,也很難進(jìn)行遠(yuǎn)程數(shù)據(jù)庫(kù)管理操作。為了解決上述問(wèn)題,Informix 11 版本中增加了 admin( ) 或 task( ) 函數(shù),DBA 現(xiàn)在可以通過(guò)調(diào)用新的內(nèi)置的 admin( ) 或 task( ) 函數(shù)通過(guò)發(fā)出 SQL 語(yǔ)句就可以完成數(shù)據(jù)庫(kù)管理任務(wù)了。由于是通過(guò) SQL 語(yǔ)句來(lái)調(diào)用 admin( ) 或 task( ) 函數(shù),我們還可以實(shí)現(xiàn)遠(yuǎn)程數(shù)據(jù)庫(kù)管理任務(wù),這兩個(gè)函數(shù)具有模擬相應(yīng)實(shí)用程序的命令行參數(shù)的參數(shù)。例如,下面的 SQL 語(yǔ)句相當(dāng)于 oncheck -ce 命令,它指示數(shù)據(jù)庫(kù)服務(wù)器檢查區(qū)段:
EXECUTE FUNCTION admin('check extents');
有些選項(xiàng)還可以完成沒(méi)有相應(yīng)實(shí)用程序的任務(wù)。
現(xiàn)在,我們可以使用 EXECUTE FUNCTION 語(yǔ)句來(lái)調(diào)用內(nèi)置 admin( ) 或 task( ) 函數(shù),以完成與執(zhí)行 Informix 的各種管理實(shí)用程序等同的管理任務(wù)。主要包括管理空間,管理配置,運(yùn)行例程作業(yè)和系統(tǒng)驗(yàn)證(oncheck 功能)等方面的管理操作。
兩個(gè)內(nèi)置管理函數(shù)(task() 和 admin())僅在 sysadmin 數(shù)據(jù)庫(kù)中可用。僅 DBSA 可運(yùn)行 task() 和 admin() 函數(shù)。但是缺省情況下,只有用戶 informix 可連接到 sysadmin 數(shù)據(jù)庫(kù)。
例如,如果 sysadmin 數(shù)據(jù)庫(kù)是當(dāng)前的數(shù)據(jù)庫(kù),那么以下語(yǔ)句執(zhí)行用于緩慢關(guān)閉數(shù)據(jù)庫(kù)服務(wù)器的任務(wù):
EXECUTE FUNCTION task ('onmode','k') ;如果 sysadmin 數(shù)據(jù)庫(kù)不是當(dāng)前的數(shù)據(jù)庫(kù),但您是有權(quán)連接到 sysadmin 數(shù)據(jù)庫(kù)的用戶,您可以執(zhí)行以下命令:
Execute function sysadmin:task ('onmode','k');task() 和 admin() 函數(shù)提供相同的功能;它們的不同僅在于返回碼。 task() 函數(shù)返回描述命令結(jié)果的字符串。 admin() 函數(shù)返回整數(shù),該數(shù)值和 command_history 表相關(guān)聯(lián)。
下邊顯示了 task() 和 admin() 函數(shù)運(yùn)行輸出結(jié)果:
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ù)都會(huì)產(chǎn)生兩個(gè)結(jié)果:
執(zhí)行一個(gè) command 任務(wù),通常是模擬管理實(shí)用程序 將新行插入到 sysadmin 數(shù)據(jù)庫(kù)的 command_history 表中。 command_history 表
command_history 表包含管理 API 已運(yùn)行的所有命令的列表。該表還會(huì)顯示命令的結(jié)果。該表位于 sysadmin 數(shù)據(jù)庫(kù)中,是一個(gè) RAW(無(wú)日志記錄)表。
command_history 表顯示管理任務(wù)是通過(guò) admin() 還是 task() 函數(shù)執(zhí)行的,并顯示執(zhí)行命令的用戶的相關(guān)信息、命令的執(zhí)行時(shí)間、命令,以及數(shù)據(jù)庫(kù)服務(wù)器完成命令運(yùn)行時(shí)返回的消息。
下表顯示 command_history 表信息的示例:
列 數(shù)據(jù)類(lèi)型 描述
cmd_number serial 每行的唯一標(biāo)識(shí)
cmd_exec_time datetime year-to-second 命令的啟動(dòng)時(shí)間
cmd_user varchar 執(zhí)行命令的用戶
cmd_hostname varchar 執(zhí)行命令的主機(jī)的名稱
cmd_executed varchar 所執(zhí)行的命令
cmd_ret_status integer 返回碼
cmd_ret_msg lvarchar 返回消息
下表顯示了示例命令和 command_history 表中的關(guān)聯(lián)結(jié)果。
所執(zhí)行的命令 返回消息示例
set sql tracing on 對(duì) 1000 個(gè) 2024 字節(jié)的緩沖區(qū)打開(kāi) SQL 跟蹤。
create dbspace 已添加空間“ space12 ”。
檢查點(diǎn) 檢查點(diǎn)已完成。
add log 已向數(shù)據(jù)庫(kù)空間 logdbs 添加了 3 個(gè)邏輯日志。
ADMIN 或 TASK 指定的 command 任務(wù)發(fā)生在由于在 command_history 表中插入新行而引起的單獨(dú)事務(wù)中。如果命令成功執(zhí)行,但是到 command_history 中的插入操作失敗,那么命令將生效,而 online.log 錯(cuò)誤條目將指示問(wèn)題。
這兩個(gè)函數(shù)不同之處主要在于它們的名稱以及它們的返回值,返回值指示當(dāng)調(diào)用函數(shù)時(shí)將發(fā)生什么:
TASK 返回了在其插入 command_history 表的新行中 cmd_ret_msg 列的值。此 LVARCHAR 值指示命令的結(jié)果(或失。 ADMIN 基于 ADMIN 插入 command_history 表的新行中 cmd_number 列的串行值返回了一個(gè)整數(shù)值。
如果該值大于 0,那么命令成功,且新行已插入到 command_history 表中。 如果該值等于 0,那么命令成功,但是 Dynamic Server 無(wú)法將新行插入到 command_history 中。 如果該值小于 0,那么命令失敗,但是新行已插入到 command_history 表中。 command 規(guī)范和任何其他的參數(shù)都可以為 ADMIN 或 TASK 函數(shù)定義管理任務(wù)。例如,等價(jià)于 oncheck -ce 命令的此 SQL 語(yǔ)句可指導(dǎo)數(shù)據(jù)庫(kù)服務(wù)器檢查擴(kuò)展數(shù)據(jù)塊:
EXECUTE FUNCTION admin('check extents');如果調(diào)用此函數(shù)時(shí) command_history 表有 200 行,且命令已成功,那么 informix 會(huì)執(zhí)行該命令并返回整數(shù) 201 。如果命令失敗,那么此示例會(huì)返回值 -201 。
要顯示命令歷史記錄,請(qǐng)運(yùn)行以下 SQL 語(yǔ)句:
SELECT * from command_history ;比如,當(dāng)我們創(chuàng)建了一個(gè) dbspace2 數(shù)據(jù)空間后,系統(tǒng)執(zhí)行成功,返回碼為 108,我們可以在 command_history 表中查看相關(guān)信息:
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在一個(gè)固定的時(shí)間周期之后,將會(huì)自動(dòng)除去 command_history 表中的任務(wù)。您可以通過(guò)更改 ph_threshold 表中的 COMMAND HISTORY RETENTION 行來(lái)修改該時(shí)間周期。 COMMAND HISTORY RETENTION 參數(shù)設(shè)置數(shù)據(jù)行在 command_history 表中保留的時(shí)間長(zhǎng)度。
您可以使用諸如 delete 或 truncate table 之類(lèi)的 SQL 命令從表中手動(dòng)除去數(shù)據(jù)。
您必須對(duì) sysadmin 數(shù)據(jù)庫(kù)執(zhí)行 task() 和 admin() 函數(shù)。
task() 和 admin() 函數(shù)支持的主要管理命令列表如下,具體語(yǔ)法大家可參考 Informix 信息中心中相關(guān)命令語(yǔ)法內(nèi)容。
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
行數(shù)據(jù)壓縮及存儲(chǔ)優(yōu)化技術(shù)
我們知道,從 Informix 11.5 xC4 開(kāi)始,Informix 數(shù)據(jù)庫(kù)提供了行壓縮技術(shù),它采用一種靜態(tài)的基于字典的壓縮算法,將表(table)或表分區(qū)(table fragments)中的數(shù)據(jù)行中重復(fù)的數(shù)據(jù)模式映射到一個(gè)占用空間較少的符號(hào),從而減少表格或表分區(qū)數(shù)據(jù)的總大小。這些重復(fù)的數(shù)據(jù)模式不僅可以是一列中的數(shù)據(jù),也可以是一列中的部分?jǐn)?shù)據(jù),甚至可以是跨數(shù)據(jù)列的數(shù)據(jù)。通過(guò)采用行壓縮技術(shù),Informix 11.5 可以節(jié)省高達(dá) 80% 的存儲(chǔ)空間。同時(shí),由于數(shù)據(jù)是采用壓縮方式存儲(chǔ),I/O 讀取效率會(huì)有 20% 左右的提高,內(nèi)存使用效率會(huì)更高,數(shù)據(jù)庫(kù)備份及恢復(fù)的時(shí)間也得到相應(yīng)的減少。
關(guān)于非阻塞檢查點(diǎn)技術(shù)的特點(diǎn)及技術(shù)實(shí)現(xiàn),請(qǐng)參考文章“ Informix 11.5 行數(shù)據(jù)壓縮及存儲(chǔ)優(yōu)化技術(shù)應(yīng)用實(shí)踐”。
使用 ontape 備份數(shù)據(jù)到指定目錄中
從 Informix 11 版本開(kāi)始,ontape 命令可以將數(shù)據(jù)及日志備份到目錄中,ontape 命令將在該目錄下自動(dòng)為備份數(shù)據(jù)及日志建立新的文件。你可以通過(guò)設(shè)置 TAPEDEV 及 LTAPEDEV 參數(shù)指向一個(gè)目錄來(lái)實(shí)現(xiàn)。使用 ontape 命令將數(shù)據(jù)及日志備份到目錄中 , 可以為我們帶來(lái)如下好處:
多個(gè)實(shí)例可以同時(shí)備份到相同的目錄下 可以通過(guò)操作系統(tǒng)工具對(duì)數(shù)據(jù)進(jìn)行壓縮等操作 當(dāng)日志文件填滿后,可以配置系統(tǒng)自動(dòng)備份該日志文件 使用時(shí),你必須對(duì)該目錄擁有寫(xiě)權(quán)限,并保證有足夠的空間保存?zhèn)浞輸?shù)據(jù)。
在使用 ontape 命令可以將數(shù)據(jù)及日志備份到目錄時(shí),我們要選擇 -y 選項(xiàng)關(guān)閉 ontape 的交互提示信息。
下邊例子用來(lái)執(zhí)行 0 級(jí)備份:
ontape -s -L 0 -y備份到目錄中的數(shù)據(jù)文件名的格式為:hostname_servernum_Ln ;而日志文件的文件名為 hostname_servernum_Lognnnnnnnnnn 。
當(dāng)我們?yōu)?TAPEDEV 和 LTAPEDEV 指定目錄時(shí),可以使用 IFX_ONTAPE_FILE_PREFIX 環(huán)境變量來(lái)指定備份文件名的前綴(替換 hostname_servernum 格式)。
如果將 IFX_ONTAPE_FILE_PREFIX 的值設(shè)置為 My_Backup,那么備份文件名具有以下名稱:
My_Backup_L0My_Backup_L1My_Backup_L2My_Backup_Log0000000001My_Backup_Log0000000002我們可以使用下述命令設(shè)置 IFX_ONTAPE_FILE_PREFIX 環(huán)境變量:
>>-setenv--IFX_ONTAPE_FILE_PREFIX--string---------------------->另外,我們還可以在目錄中創(chuàng)建連續(xù)邏輯日志文件備份。如果空間可用,邏輯日志將自動(dòng)備份。 設(shè)置過(guò)程如下:
將 LTAPEDEV 參數(shù)設(shè)置為現(xiàn)有目錄。
在 UNIX 上將 ALARMPROGRAM 參數(shù)設(shè)置為 log_full.sh 的完整路徑,在 Windows 上將 ALARMPROGRAM 設(shè)置為 log_full.bat 的完整路徑。
將 ALARMPROGRAM 參數(shù)中的備份程序從 onbar -b -l 更改為 ontape -a -y 。
重新啟動(dòng)數(shù)據(jù)庫(kù)服務(wù)器。
SQL 下鉆查詢特性
在 SQL 語(yǔ)句性能監(jiān)控時(shí),我們經(jīng)常要了解 SQL 語(yǔ)句執(zhí)行了多長(zhǎng)時(shí)間; SQL 語(yǔ)句運(yùn)行時(shí)占用了多少系統(tǒng)資源,如 CPU 占用情況、內(nèi)存占用情況、磁盤(pán) I/O 讀寫(xiě)情況; SQL 語(yǔ)句等待系統(tǒng)資源如磁盤(pán) I/O 及鎖的時(shí)間及次數(shù)等。通過(guò) SQL 語(yǔ)句對(duì)系統(tǒng)的資源使用及等待情況,我們可以了解到 SQL 語(yǔ)句運(yùn)行的瓶頸,并及時(shí)調(diào)整系統(tǒng)資源配置,或者調(diào)整用戶的應(yīng)用程序。我們雖然可以使用 set explain 命令幫助我們了解一些 SQL 語(yǔ)句性能問(wèn)題,但是當(dāng)我們啟用 SET EXPLAIN 功能時(shí),SQL 語(yǔ)句性能可能已經(jīng)出現(xiàn)了問(wèn)題,為了能夠讓 DBA 更及時(shí)、更詳細(xì)地了解 SQL 語(yǔ)句的資源使用情況并做出相應(yīng)的調(diào)整,在 Informix 11 版本中,提供了 SQL 下鉆查詢特性來(lái)滿足上述功能。
關(guān)于 SQL 下鉆查詢特性的技術(shù)特點(diǎn)、使用范圍及技術(shù)實(shí)現(xiàn),請(qǐng)參考發(fā)表在 developerWorks 中國(guó)網(wǎng)站 Information Management 專(zhuān)區(qū)中文章“ Informix 11.5 SQL 語(yǔ)句性能監(jiān)控方法及實(shí)現(xiàn) ”中的相關(guān)內(nèi)容。
--------------------------------------------------------------------------------
回頁(yè)首
數(shù)據(jù)庫(kù)性能方面的一些實(shí)用特性
非阻塞檢查點(diǎn)
在 Informix 數(shù)據(jù)庫(kù)使用過(guò)程中,當(dāng)發(fā)生檢查點(diǎn)操作時(shí),會(huì)阻塞數(shù)據(jù)庫(kù)應(yīng)用程序的運(yùn)行,直到檢查點(diǎn)操作完成為止。這樣,會(huì)顯著降低數(shù)據(jù)庫(kù)的性能。這時(shí),我們往往需要調(diào)整數(shù)據(jù)庫(kù)參數(shù)來(lái)減少檢查點(diǎn)操作對(duì)系統(tǒng)性能的影響,但這種調(diào)整往往比較復(fù)雜,很難達(dá)到最優(yōu)效果。為了解決上述問(wèn)題,Informix 11 提出了非阻塞檢查點(diǎn)技術(shù),采用該技術(shù)后,檢查點(diǎn)操作不再阻塞數(shù)據(jù)庫(kù)應(yīng)用程序的運(yùn)行,系統(tǒng)效率得到顯著的提高,也不再需要進(jìn)行復(fù)雜的數(shù)據(jù)庫(kù)調(diào)整操作。
關(guān)于非阻塞檢查點(diǎn)技術(shù)的特點(diǎn)及技術(shù)實(shí)現(xiàn),請(qǐng)參考文章“ Informix 11 非阻塞檢查點(diǎn)及 RTO 策略應(yīng)用實(shí)踐”。
已落實(shí)讀取隔離的并行性增強(qiáng)(LAST COMMITTED)
在 Informix 中,當(dāng)用戶在對(duì)一行或多行數(shù)據(jù)進(jìn)行修改,另外用戶要對(duì)相同數(shù)據(jù)進(jìn)行讀操作時(shí),會(huì)出現(xiàn)鎖等待(Lock Wait)現(xiàn)象,該用戶要等到鎖釋放才可以繼續(xù)操作。這會(huì)影響應(yīng)用程序的效率。特別是在 OLTP 系統(tǒng)中,還容易產(chǎn)生死鎖(Deadlocks)現(xiàn)象,影響系統(tǒng)的運(yùn)行效率。為了提高應(yīng)用程序效率,我們往往要調(diào)整 lock timeout 參數(shù),將其設(shè)置為 30-60 秒,當(dāng)鎖等待超時(shí)后,中斷該會(huì)話。另外,有些用戶可能會(huì)將隔離級(jí)別設(shè)置為臟讀,但對(duì)于有大量 update 操作的應(yīng)用,這種隔離級(jí)別會(huì)讀取幻象數(shù)據(jù)(phantom data),數(shù)據(jù)準(zhǔn)確性不能得到保證。
如下面例子,采用 committed read 隔離級(jí)別,會(huì)產(chǎn)生鎖等待現(xiàn)象。
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 隔離級(jí)別,會(huì)產(chǎn)生死鎖現(xiàn)象。
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;為了解決上述問(wèn)題,提高應(yīng)用系統(tǒng)并發(fā)執(zhí)行效率,Informix 11 提供已落實(shí)讀取隔離的并行性增強(qiáng)功能,通過(guò)為 SET ISOLATION TO COMMITTED READ 語(yǔ)句引入了新的 LAST COMMITTED 關(guān)鍵字選項(xiàng),可減少嘗試讀取表時(shí)發(fā)生鎖定沖突的風(fēng)險(xiǎn)。采用該語(yǔ)句,當(dāng)用戶讀取正在被其他用戶修改的數(shù)據(jù)時(shí)不在處于鎖等待狀態(tài),而是可以讀取修改前最近落實(shí)版本的數(shù)據(jù)值。 這樣,由于不會(huì)產(chǎn)生鎖等待,應(yīng)用程序效率會(huì)顯著提高,而且,由于是讀取修改前最近落實(shí)版本的數(shù)據(jù)值,也不會(huì)產(chǎn)生讀取幻象數(shù)據(jù)(phantom data)的問(wèn)題,同時(shí),也會(huì)大大減少產(chǎn)生死鎖的現(xiàn)象。
如下面例子,當(dāng)采用 committed read last committed 隔離級(jí)別后,用戶將讀取修改前最近落實(shí)版本的數(shù)據(jù)值,不會(huì)產(chǎn)生鎖等待現(xiàn)象。
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我們可以通過(guò)以下幾種方法來(lái)提高使用“已落實(shí)讀”、“臟讀”、“讀已落實(shí)”或“讀未落實(shí)”隔離級(jí)別的會(huì)話中的并行性能:
使用 Set Isolation to Committed Read Last Committed 語(yǔ)句 通過(guò)設(shè)置新的 USELASTCOMMITTED 配置參數(shù)擴(kuò)展到臟讀(Dirty Read)、未落實(shí)讀取(Read Uncommitted)和已落實(shí)讀。≧ead Committed)隔離級(jí)別。 USELASTCOMMITTED 選項(xiàng)可具有以下四個(gè)值中的任意一個(gè):
如果值為“ COMMITTED READ ”,那么當(dāng)數(shù)據(jù)庫(kù)服務(wù)器嘗試讀取處于“已落實(shí)讀”或“讀已落實(shí)”隔離級(jí)別的行而遇到互斥鎖時(shí),它將讀取最近落實(shí)的數(shù)據(jù)版本。
如果值為“ DIRTY READ ”,那么當(dāng)數(shù)據(jù)庫(kù)服務(wù)器嘗試讀取處于“臟讀”或“讀已落實(shí)”隔離級(jí)別的行而遇到互斥鎖時(shí),它將讀取最近落實(shí)的數(shù)據(jù)版本。
如果值為“ ALL ”,那么當(dāng)數(shù)據(jù)庫(kù)服務(wù)器嘗試讀取處于“已落實(shí)讀”、“臟讀”、“讀已落實(shí)”或“讀未落實(shí)”隔離級(jí)別的行而遇到互斥鎖時(shí),它將讀取最近落實(shí)的數(shù)據(jù)版本。
如果值為“ NONE ”,那么此值將禁用可訪問(wèn)已鎖定行中上次落實(shí)的數(shù)據(jù)版本的 USELASTCOMMITTED 功能。在此設(shè)置下,如果會(huì)話在嘗試讀取處于“已落實(shí)讀”、“臟讀”、“讀已落實(shí)”或“讀未落實(shí)”隔離級(jí)別的行時(shí)遇到互斥鎖,那么在落實(shí)或回滾持有互斥鎖的并發(fā)事務(wù)之前,事務(wù)不能讀取該行。
SET ENVIRONMENT USELASTCOMMITTED 語(yǔ)句 SET ENVIRONMENT 語(yǔ)句可以在運(yùn)行時(shí)指定影響相同例程中隨后提交的查詢的選項(xiàng)。 SET ENVIRONMENT USELASTCOMMITTED 可指定遇到由其他會(huì)話持有的互斥鎖的查詢和其他操作在更改數(shù)據(jù)值時(shí)是否應(yīng)使用最近落實(shí)的數(shù)據(jù)版本,而不是等待鎖被釋放。
此語(yǔ)句在執(zhí)行當(dāng)前會(huì)話期間可覆蓋 USELASTCOMMITTED 配置參數(shù)設(shè)置。您可以使用 SET ISOLATION 語(yǔ)句來(lái)覆蓋 USELASTCOMMITTED 會(huì)話環(huán)境設(shè)置。
例如,以下語(yǔ)句指定“已落實(shí)讀”隔離方式,并將系統(tǒng)缺省 USELASTCOMMITTED 配置參數(shù)設(shè)置替換為讀取最近落實(shí)的數(shù)據(jù)版本(數(shù)據(jù)位于并發(fā)閱讀器持有互斥鎖的行中)的設(shè)置。
SET ISOLATION COMMITTED READ;
SET ENVIRONMENT USELASTCOMMITTED 'ALL';任何 SPL 例程都可使用這些語(yǔ)句在會(huì)話期間指定“已落實(shí)讀上次已落實(shí)”事務(wù)隔離級(jí)別。這些語(yǔ)句啟用讀取數(shù)據(jù)的 SQL 操作,從而在執(zhí)行讀取行的操作期間遇到互斥鎖時(shí)使用上次落實(shí)的版本。當(dāng)另一個(gè)會(huì)話嘗試修改同一行時(shí),這樣可避免死鎖情況或其他鎖定錯(cuò)誤。
例如,PUBLIC.sysdbopen 或 user.sysdbopen 過(guò)程中的以下語(yǔ)句在連接時(shí)指定“已落實(shí)讀”隔離方式,并將顯式或缺省 USELASTCOMMITTED 配置參數(shù)設(shè)置替換為讀取表(其中并發(fā)閱讀器持有互斥鎖)中最近落實(shí)的數(shù)據(jù)版本的設(shè)置:
create procedure PUBLIC.sysdbopen()
SET ISOLATION COMMITTED READ;
SET ENVIRONMENT USELASTCOMMITTED 'ALL';
end procedure;除 sysdbopen( ) 之外,任何 SPL 例程都可使用這些語(yǔ)句在會(huì)話期間指定“已落實(shí)讀上次已落實(shí)”事務(wù)隔離級(jí)別。這些語(yǔ)句啟用讀取數(shù)據(jù)的 SQL 操作以在執(zhí)行讀取表的操作期間遇到互斥鎖時(shí)使用上次落實(shí)的版本。當(dāng)另一個(gè)會(huì)話嘗試修改同一個(gè)行或表時(shí),這樣可避免死鎖情況或其他鎖定錯(cuò)誤。
當(dāng)啟用 LAST COMMITTED 選項(xiàng)后, onstat 命令的輸出也進(jìn)行了相應(yīng)的變化:
-k 選項(xiàng)增加了新的內(nèi)容 -x 選項(xiàng)增加了“ LC ”作為隔離級(jí)別 “ -g sql ” 選項(xiàng)增加了“ LC ”作為隔離級(jí)別 該功能支持 B 樹(shù)索引和函數(shù)型索引,但不支持 R 樹(shù)索引。它只支持“行”級(jí)別鎖定,它不支持以下這些表:正在被 DataBlade 模塊訪問(wèn)的表、列中具有集合數(shù)據(jù)類(lèi)型的表、使用虛擬表界面創(chuàng)建的表、具有頁(yè)面級(jí)別鎖定的表、具有專(zhuān)用表級(jí)別鎖定的表或無(wú)事務(wù)記錄的數(shù)據(jù)庫(kù)中的表。 它也不支持 HDR Secondary 。
在跨服務(wù)器的分布式查詢中,如果發(fā)出查詢的會(huì)話的隔離級(jí)別具有有效的 LAST COMMITTED 隔離級(jí)別,但一個(gè)或多個(gè)參與操作的數(shù)據(jù)庫(kù)不支持該 LAST COMMITTED 功能,那么整個(gè)事務(wù)符合發(fā)出該事務(wù)的會(huì)話的“已落實(shí)讀”或“臟讀”隔離級(jí)別,而不啟用 LAST COMMITTED 選項(xiàng)。
在 UNIX 上用 direct I/O 提高 cooked 文件的性能
在 Informix 11 中,隨著 direct I/O 特性的引入,可以提高用于常規(guī)數(shù)據(jù)庫(kù)空間塊的 cooked 文件的 I/O 性能。使用文件系統(tǒng)的 I/O 通常慢于使用原始設(shè)備的 I/O 。這是因?yàn)橥ㄟ^(guò)文件系統(tǒng)進(jìn)行讀寫(xiě)有附加的開(kāi)銷(xiāo)。這增加了另一層的工作。此外,可能存在一個(gè)緩沖系統(tǒng)。這種緩沖會(huì)降低性能,而 IDS 不能控制操作系統(tǒng)的這個(gè)子系統(tǒng)。 Direct I/O 可以繞過(guò)文件系統(tǒng)層,包括任何緩沖,因此讀和寫(xiě)的效率更高?梢允褂 DIRECT_IO 配置參數(shù)啟用 direct I/O 。 cooked 文件的性能可以接近用于數(shù)據(jù)庫(kù)空間塊的原始設(shè)備的性能。
DIRECT_IO 不能用于臨時(shí)數(shù)據(jù)庫(kù)空間,只能用于常規(guī)的數(shù)據(jù)庫(kù)空間塊。文件系統(tǒng)和操作系統(tǒng)必須支持給定頁(yè)大小的 direct I/O 。對(duì)于原始設(shè)備,不支持 direct I/O 。對(duì)于原始設(shè)備上的塊,更可取的 I/O 方法是 KAIO(kernel asynchronous I/O) 。
DIRECT_IO ONCONFIG 參數(shù):
DIRECT_IO 設(shè)置 描述
0 Direct I/O 被關(guān)閉
1 Direct I/O 被打開(kāi)
注意: 有些操作系統(tǒng)啟用 direct I/O,并且實(shí)現(xiàn)使用 KAIO (kernel asynchronous i/o) 。如果啟用了 direct I/O,數(shù)據(jù)庫(kù)服務(wù)器會(huì)嘗試使用 KAIO 以完成這項(xiàng)工作。如果啟用了 KAIO,可以減少 AIO 虛擬處理器的數(shù)量。這里假設(shè) KAIO 已被啟用(KAIOOFF 在環(huán)境中沒(méi)有被設(shè)置)。
Windows 不支持 DIRECT_IO ONCONFIG 參數(shù),因?yàn)樵?Windows 平臺(tái)上 direct I/O 是默認(rèn)被啟用的。
使用非日志記錄原始表(RAW TABLE)
在 Informix 數(shù)據(jù)庫(kù)中,如果采用日志模式的數(shù)據(jù)庫(kù),那么當(dāng)對(duì)表進(jìn)行大批量數(shù)據(jù)裝載時(shí),會(huì)消耗大量的日志,如果沒(méi)有合適大小的日志空間,可能造成日志用滿而掛起的問(wèn)題。從 Informix 9.2 開(kāi)始,您可在日志記錄數(shù)據(jù)庫(kù)中使用非日志記錄原始表(raw table)來(lái)加快最初的裝入和數(shù)據(jù)驗(yàn)證。數(shù)據(jù)倉(cāng)庫(kù)及其他應(yīng)用程序可能具有非常大的表,需要很長(zhǎng)的裝入時(shí)間。裝入非日志記錄表比裝入日志記錄表要快。
RAW 表是非日志記錄永久表并且類(lèi)似于非日志記錄數(shù)據(jù)庫(kù)中的表。 RAW 表使用輕附加,這會(huì)將行快速添加到每個(gè)表分段的末尾。支持但不記錄 RAW 表中的更新、插入和刪除。 RAW 表不支持引用約束、唯一約束和回滾。如果從上次物理備份后還未更新 RAW 表,那么可以從該次備份中恢復(fù)該表?焖倩謴(fù)將回滾 STANDARD 表(但非 RAW 表)上未完成的事務(wù)。無(wú)論是存儲(chǔ)在日志記錄數(shù)據(jù)庫(kù)還是非日志記錄數(shù)據(jù)庫(kù)中,RAW 表的屬性都相同。
要?jiǎng)?chuàng)建用于裝入的非日志記錄表,您可使用 CREATE RAW TABLE 語(yǔ)句或 ALTER TABLE 語(yǔ)句將表類(lèi)型從 STANDARD 更改為 RAW 。 RAW 類(lèi)型的表不允許引用約束,這樣最初的裝入就比 STANDARD 類(lèi)型的表要快。原始表的裝入完成后,您可通過(guò)將表類(lèi)型更改為 STANDARD 來(lái)將其更改為日志記錄表(在日志記錄數(shù)據(jù)庫(kù)中)。然后可使用 ALTER TABLE 語(yǔ)句將引用約束添加到表中并使用 CREATE INDEX 語(yǔ)句來(lái)添加索引。
下面例子顯示了 raw table 創(chuàng)建的方法:
create raw table xyz
( col1 INT, col2 CHAR(10)
)
in dbspace {fragment by whatever};
or
alter table xyz type raw ;下面例子顯示了 raw table 恢復(fù)為 standard table 的方法
alter table xyz type standard ;要裝入原始表,您可使用任何數(shù)據(jù)裝入實(shí)用程序,例如快速方式的 dbimport 或 HPL 。裝入數(shù)據(jù)后,請(qǐng)執(zhí)行 0 級(jí)(level-0)備份。修改原始表中的任何數(shù)據(jù)或在事務(wù)中使用它之前,請(qǐng)將表類(lèi)型更改為 STANDARD 。
如果在原始表的裝入期間發(fā)生錯(cuò)誤或故障,結(jié)果數(shù)據(jù)將是故障時(shí)留在磁盤(pán)上的任何數(shù)據(jù)。
dbexport 和 dbschema 實(shí)用程序支持 CREATE RAW TABLE 和 ALTER TABLE...TYPE(RAW)語(yǔ)句。
注意:請(qǐng)勿在事務(wù)中使用 RAW 表。在已裝入數(shù)據(jù)后,請(qǐng)首先使用 ALTER TABLE 語(yǔ)句將表更改為 STANDARD 類(lèi)型并執(zhí)行 0 級(jí)備份,然后再在事務(wù)中使用該表。
--------------------------------------------------------------------------------
回頁(yè)首
數(shù)據(jù)庫(kù)應(yīng)用開(kāi)發(fā)方面的一些實(shí)用特性
會(huì)話配置例程(Session Configuration Routines)
在 Informix 11 版本中,新增加了 sysdbopen( ) 和 sysdbclose( ) 內(nèi)置 SPL 過(guò)程,使數(shù)據(jù)庫(kù)管理員能在用戶連接到數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)斷開(kāi)連接時(shí),自動(dòng)執(zhí)行相關(guān)的 SQL 和 SPL 語(yǔ)句。通過(guò)使用這兩個(gè) SPL 過(guò)程,我們可以在連接或訪問(wèn)時(shí)更改數(shù)據(jù)庫(kù)服務(wù)器會(huì)話的屬性,而不更改會(huì)話所運(yùn)行的應(yīng)用程序。這樣,對(duì)于那些不能通過(guò)修改應(yīng)用程序的源代碼來(lái)設(shè)置環(huán)境選項(xiàng)(或環(huán)境變量)或包含與會(huì)話相關(guān)的 SQL 語(yǔ)句(例如,由于 SQL 語(yǔ)句包含從供應(yīng)商處獲得的代碼)的情況,該操作非常有用。同樣,對(duì)于自動(dòng)化應(yīng)用程序終止之后需要執(zhí)行的操作,主要是清除操作,這兩個(gè)程序也很有用。
如果 DBA 將用戶的登錄標(biāo)識(shí)指定為名稱是 sysdbopen( ) 的過(guò)程的所有者,當(dāng)指定用戶連接到數(shù)據(jù)庫(kù)或從數(shù)據(jù)庫(kù)斷開(kāi)連接時(shí),Informix Dynamic Server 會(huì)執(zhí)行該過(guò)程。如果 DBA 將 PUBLIC 指定為所有者,當(dāng)不是任何這些內(nèi)置會(huì)話配置過(guò)程所有者的用戶連接到數(shù)據(jù)庫(kù)時(shí),會(huì)自動(dòng)執(zhí)行該例程。同樣,當(dāng)已連接到數(shù)據(jù)庫(kù)的用戶執(zhí)行引用其他數(shù)據(jù)庫(kù)中對(duì)象的分布式操作(如跨數(shù)據(jù)庫(kù)或跨服務(wù)器查詢)時(shí),不會(huì)調(diào)用 sysdbopen( ) 例程。
同樣,如果沒(méi)有為該用戶在數(shù)據(jù)庫(kù)中注冊(cè) user.sysdbclose( ),當(dāng)該用戶關(guān)閉與數(shù)據(jù)庫(kù)的連接時(shí),將會(huì)自動(dòng)調(diào)用另一內(nèi)置過(guò)程 user.sysdbclose( ) 或 public.sysdbclose( ) 。
如果要更改會(huì)話的屬性,可為各種數(shù)據(jù)庫(kù)設(shè)計(jì)定制 sysdbopen( ) 和 sysdbclose( ) 過(guò)程以支持特定用戶或 PUBLIC 組的應(yīng)用程序。 sysdbopen( ) 和 sysdbclose( ) 過(guò)程可包含數(shù)據(jù)庫(kù)服務(wù)器在數(shù)據(jù)庫(kù)打開(kāi)或關(guān)閉時(shí)為用戶或 PUBLIC 組執(zhí)行的一系列 SET、SET ENVIRONMENT、SQL 或 SPL 語(yǔ)句。
例如,對(duì)于 user1,可定義包含 SET PDQPRIORITY、SET ISOLATION LEVEL、SET LOCK MODE、SET ROLE 或 SET EXPLAIN ON 語(yǔ)句的過(guò)程,無(wú)論何時(shí) user1 使用 DATABASE 或 CONNECT TO 語(yǔ)句打開(kāi)數(shù)據(jù)庫(kù)時(shí),這些過(guò)程都將執(zhí)行。
sysdbopen( ) 過(guò)程中由 SET ENVIRONMENT 語(yǔ)句指定的會(huì)話環(huán)境變量 PDQPRIORITY 和 OPTCOMPIND 的任何設(shè)置都將在整個(gè)會(huì)話期間保持。對(duì)于常規(guī)過(guò)程非持久的 SET PDQPRIORITY 和 SET ENVIRONMENT OPTCOMPIND 語(yǔ)句,在 sysdbopen( ) 過(guò)程包含它們時(shí)將保持。
當(dāng)作為過(guò)程所有者的用戶從數(shù)據(jù)庫(kù)斷開(kāi)連接時(shí),將運(yùn)行 user.sysdbclose( ) 過(guò)程(或者此時(shí)將運(yùn)行 PUBLIC.sysdbclose( ),前提是此過(guò)程存在且當(dāng)前用戶不具有任何 sysdbclose( ) 過(guò)程)。
使用 sysdbopen( ) 和 sysdbclose( ) 內(nèi)置 SPL 過(guò)程的先決條件:只有 DBA 或用戶 informix 能夠在 SQL 的 ALTER PROCEDURE、ALTER ROUTINE、CREATE PROCEDURE、CREATE PROCEDURE FROM、CREATE ROUTINE FROM、DROP PROCEDURE 或 DROP ROUTINE 語(yǔ)句中創(chuàng)建或更改 sysdbopen( ) 或 sysdbclose( ) 。
設(shè)置 sysdbopen() 和 sysdbclose() 過(guò)程以配置會(huì)話屬性的基本操作步驟:
將 IFX_NODBPROC 環(huán)境變量設(shè)置為任何值(包括 0)以使數(shù)據(jù)庫(kù)服務(wù)器繞過(guò)和防止 sysdbopen( ) 或 sysdbclose( ) 過(guò)程的執(zhí)行。
編寫(xiě) CREATE PROCEDURE 或 CREATE PROCEDURE FROM 語(yǔ)句以定義特定用戶或 PUBLIC 組的過(guò)程。
測(cè)試過(guò)程(例如,通過(guò)使用 EXECUTE PROCEDURE 語(yǔ)句中的 sysdbclose( ))。
取消設(shè)置 IFX_NODBPROC 環(huán)境變量以使數(shù)據(jù)庫(kù)服務(wù)器能夠運(yùn)行 sysdbopen( ) 或 sysdbclose( ) 過(guò)程。
下面的程序?yàn)樘囟ㄓ脩?usr1 設(shè)置角色,并將隔離級(jí)別設(shè)為 committed read 。
create procedure usr1.sysdbopen()
set role oltp;
set isolation to committed read;
end procedure;這樣,當(dāng)用戶 usr1 通過(guò) DATABASE 或 CONNECT 語(yǔ)句連接到數(shù)據(jù)庫(kù)時(shí),將設(shè)置 oltp 角色,并將隔離級(jí)別設(shè)為 committed read 。
下面的程序設(shè)置 PUBLIC 組的角色和 PDQ 優(yōu)先級(jí)。
create procedure public.sysdbopen()
set role others;
set pdqpriority 1;
end procedure;這樣,當(dāng)用戶通過(guò) DATABASE 或 CONNECT 語(yǔ)句連接到數(shù)據(jù)庫(kù)時(shí),如果沒(méi)有為該用戶創(chuàng)建自己的 sysdbopen( ) 過(guò)程,他將執(zhí)行 public.sysdbopen() 過(guò)程,設(shè)置 oltp 角色,并將 PDQ 優(yōu)先級(jí)設(shè)為 1 。
下面的程序?yàn)?PUBLIC 組創(chuàng)建 sysdbclose() 過(guò)程。
CREATE PROCEDURE public.sysdbclose() INSERT INTO logit
VALUES(USER, “ O “ ,CURRENT::DATETIME YEAR TO SECOND);
END PROCEDURE;這樣,當(dāng)用戶斷開(kāi)數(shù)據(jù)庫(kù)連接時(shí),如果沒(méi)有為該用戶創(chuàng)建自己的 sysdbclose() 過(guò)程,他將執(zhí)行 public.sysdbclose() 過(guò)程,將用戶信息、操作狀態(tài)及相應(yīng)的時(shí)間戳的信息保存到 logit 表中。
Disabling logging for temporary tables
在 Informix 數(shù)據(jù)庫(kù)中,我們經(jīng)常會(huì)創(chuàng)建一些臨時(shí)表來(lái)處理應(yīng)用中的臨時(shí)信息。系統(tǒng)可以采用如下兩種方式創(chuàng)建臨時(shí)表:
使用 SELECT INTO TEMP 語(yǔ)句隱含地創(chuàng)建臨時(shí)表 使用 CREATE TEMP TABLE 語(yǔ)句顯示地創(chuàng)建臨時(shí)表 如果數(shù)據(jù)庫(kù)采用非日志模式,DBSPACETEMP 環(huán)境變量或配置參數(shù)設(shè)置后,臨時(shí)表會(huì)自動(dòng)創(chuàng)建在由 DBSPACETEMP 環(huán)境變量或配置參數(shù)指定的數(shù)據(jù)空間上;如果數(shù)據(jù)庫(kù)采用日志模式,那么創(chuàng)建的臨時(shí)表缺省情況下是記日志的,不會(huì)被創(chuàng)建在由 DBSPACETEMP 環(huán)境變量或配置參數(shù)指定的數(shù)據(jù)空間上,那么由 SELECT ... INTO TEMP 語(yǔ)句創(chuàng)建的臨時(shí)表將被創(chuàng)建在根數(shù)據(jù)空間(Root dbspace)上,由 CREATE TEMP TABLE 語(yǔ)句創(chuàng)建的臨時(shí)表將被創(chuàng)建在數(shù)據(jù)庫(kù)所在的數(shù)據(jù)空間上。如果希望臨時(shí)表創(chuàng)建在由 DBSPACETEMP 環(huán)境變量或配置參數(shù)指定的數(shù)據(jù)空間上,我們需要使用 SELECT INTO TEMP with no log 語(yǔ)句或 CREATE TEMP TABLE with no log 語(yǔ)句來(lái)創(chuàng)建臨時(shí)表。
下邊例子顯示了在日志模式數(shù)據(jù)庫(kù)中創(chuàng)建臨時(shí)表的方法:
$ 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:臨時(shí)表按照如下優(yōu)先順序創(chuàng)建在相應(yīng)的數(shù)據(jù)空間上:
由 DBSPACETEMP 環(huán)境變量指定的數(shù)據(jù)空間 由 DBSPACETEMP 配置參數(shù)指定的數(shù)據(jù)空間 如果設(shè)置了 DBSPACETEMP 環(huán)境變量,那么臨時(shí)表會(huì)創(chuàng)建在由 DBSPACETEMP 環(huán)境變量指定的數(shù)據(jù)空間上,如果沒(méi)有設(shè)置 DBSPACETEMP 環(huán)境變量,那么臨時(shí)表會(huì)創(chuàng)建在由 DBSPACETEMPP 配置參數(shù)指定的數(shù)據(jù)空間上。
出于性能考慮,一般我們建議在多個(gè)物理磁盤(pán)上創(chuàng)建多個(gè)臨時(shí)表空間,這樣,當(dāng)創(chuàng)建臨時(shí)表時(shí),它會(huì)分片到所有臨時(shí)表空間上,提高并發(fā)處理效率。
在采用日志模式的數(shù)據(jù)庫(kù)中,對(duì)臨時(shí)表的所有 DML 操作都要記日志,而且不加 with no log 選項(xiàng),臨時(shí)表不會(huì)創(chuàng)建在由 DBSPACETEMP 環(huán)境變量或配置參數(shù)指定的臨時(shí)數(shù)據(jù)空間上,往往數(shù)據(jù)會(huì)寫(xiě)到根數(shù)據(jù)空間(Root dbspace)上,影響系統(tǒng)性能,而且用戶在創(chuàng)建臨時(shí)表時(shí),往往總是忘記 with no log 選項(xiàng)。為了解決上述問(wèn)題,Informix 11 版本開(kāi)始提供了關(guān)閉對(duì)臨時(shí)表記日志的方法,這樣,建臨時(shí)表時(shí),即使沒(méi)加 with no log 選項(xiàng),臨時(shí)表也會(huì)創(chuàng)建在由 DBSPACETEMP 環(huán)境變量或配置參數(shù)指定的臨時(shí)數(shù)據(jù)空間上。
我們可以采用下述兩種方法來(lái)關(guān)閉對(duì)臨時(shí)表記日志:
修改 onconfig 配置參數(shù) TEMPTAB_NOLOG 1通過(guò) onmode 命令動(dòng)態(tài)改變 onmode -Wf "TEMPTAB_NOLOG =1"
onmode -Wm "TEMPTAB_NOLOG =1"其中,-Wm 選項(xiàng)改變參數(shù)值后立即生效; -Wf 選項(xiàng)改變參數(shù)值后立即生效,同時(shí)將新的參數(shù)值寫(xiě)到 onconfig 配置文件中。
使用 TEMPTAB_NOLOG 參數(shù)來(lái)禁用臨時(shí)表上的日志記錄。該參數(shù)可以改進(jìn)應(yīng)用程序的性能,尤其是在有 HDR 輔助服務(wù)器、RS 輔助服務(wù)器或 SD 輔助服務(wù)器的數(shù)據(jù)復(fù)制環(huán)境中,因?yàn)槠浞乐?Informix 通過(guò)網(wǎng)絡(luò)傳輸臨時(shí)表。
--------------------------------------------------------------------------------
回頁(yè)首
數(shù)據(jù)庫(kù)高可用集群方面的一些實(shí)用特性
用戶的關(guān)鍵業(yè)務(wù)系統(tǒng),特別是 OLTP 系統(tǒng),都要求提供 24X7 不間斷的應(yīng)用服務(wù),這就要求數(shù)據(jù)庫(kù)系統(tǒng)能夠提供強(qiáng)大的高可用能力。這種能力不僅僅體現(xiàn)在主機(jī)及備機(jī)的接管方面,同時(shí)要能夠提供遠(yuǎn)程容災(zāi)能力,以及本地的負(fù)載均衡能力。針對(duì)上述對(duì)數(shù)據(jù)庫(kù)的要求,Informix 從版本 6 開(kāi)始, 就提供了 HDR 技術(shù),它是通過(guò)數(shù)據(jù)庫(kù)的事務(wù)日志的方式實(shí)現(xiàn)了主、備機(jī)互相接管的功能,當(dāng)主機(jī)工作時(shí),備機(jī)提供只讀功能,因此,備機(jī)可以提供查詢、報(bào)表等功能,實(shí)現(xiàn)負(fù)載分擔(dān)的功能,當(dāng)主機(jī)發(fā)生故障,備機(jī)會(huì)自動(dòng)接管,實(shí)現(xiàn)主機(jī)及備機(jī)的接管功能。從 Informix 7.2.2 版本開(kāi)始,Informix 數(shù)據(jù)庫(kù)提供了 ER(Enterprise Replication) 數(shù)據(jù)庫(kù)復(fù)制技術(shù),它也是通過(guò)讀取數(shù)據(jù)庫(kù)日志的方式實(shí)現(xiàn)數(shù)據(jù)同步功能,當(dāng)源數(shù)據(jù)庫(kù)數(shù)據(jù)發(fā)生變化后,Informix 數(shù)據(jù)庫(kù)通過(guò)讀取數(shù)據(jù)庫(kù)日志,將變化的數(shù)據(jù)及時(shí)同步到目標(biāo)數(shù)據(jù)庫(kù),采用 ER 的方式,和 HDR 不同,HDR 數(shù)據(jù)庫(kù)的接管是基于數(shù)據(jù)庫(kù)服務(wù)器的,也就是它的作用范圍是基于整個(gè)實(shí)例的,而 ER 的作用范圍是作用于一個(gè)表,你可以靈活定義需要復(fù)制哪些數(shù)據(jù)列及數(shù)據(jù)行,而且可以靈活定義數(shù)據(jù)復(fù)制的方式,是采用主從方式、匯總方式還是雙向復(fù)制方式。從 Informix 11 開(kāi)始,Informix 數(shù)據(jù)庫(kù)提供了 SDS(Shared Disk Secondary)、RSS(Remote Standalone Secondary)、CLR(Continuous Log Restore) 等高可用集群技術(shù),提供了更加強(qiáng)大的高可用能力。從 Informix 11.5 開(kāi)始,HDR、SDS、RSS 備機(jī)都支持讀寫(xiě)能力,提供了更強(qiáng)大的負(fù)載均衡能力。同時(shí),從 Informix 11.5 開(kāi)始,Informix 還提供了 Connection Manager 功能部件,它可以提供 SLA(Service Level Agreement) 功能,更好地實(shí)現(xiàn)負(fù)載均衡的能力,同時(shí)提供了 FOC(Fail Over Connection) 功能,實(shí)現(xiàn)透明故障接管能力,而且,所有這些對(duì)客戶端應(yīng)用來(lái)說(shuō)是透明的。