筆者參加了建設(shè)銀行江西省分行的全省數(shù)據(jù)集中工作,其中數(shù)據(jù)庫的使用與優(yōu)化是系統(tǒng)管理的重要工作。在系統(tǒng)上線運(yùn)行穩(wěn)定之后,將數(shù)據(jù)庫管理工作的經(jīng)驗(yàn)整理出來,爭取起到拋磚引玉的作用,為正在使用Informix的用戶提供一些幫助。
1.建立“Informix”組和用戶
建設(shè)銀行江西省分行數(shù)據(jù)集中系統(tǒng)采用的是IBM NUMA主機(jī),使用的是DYNIX4.3.1操作系統(tǒng),我們用“menu”命令(如果是SCO Unix,要用“scoadmin”命令;在HP-UX中要用“sam”命令;在IBM AIX中就用“smit”命令)建立一個(gè)名為“Informix”的組,該組號要大于100。
同樣,在DYNIX下用“menu”命令(在SCO Unix用“scoadmin”命令,對HP-UX用“sam”命令,對IBM AIX用“smit”命令)建立一個(gè)名為“Informix”的用戶,該用戶屬于“Informix”組,用戶號大于100,根目錄設(shè)為“/usr/Informix”或其他目錄,口令可設(shè)為“Informix”或其他。
2.安裝產(chǎn)品
以“root”注冊,設(shè)置安裝所需要的環(huán)境變量:
InformixDIR=/usr/Informix
Export Informix DIR
PATH=$PATH:$InformixDIR/bin
Export PATH
再將當(dāng)前目錄改變到“usr/Informix”。
(1)先安裝SQL,將SQL磁帶或光盤插入磁帶機(jī)或光驅(qū)。
使用磁帶機(jī)安裝步驟:
1)#cpio-icvdumB-I磁帶機(jī)設(shè)備名或#tar xvf磁帶機(jī)設(shè)備名
2)執(zhí)行安裝命令:#./installsql輸入序列號及KEY。
使用光驅(qū)安裝步驟:
1)首先為光驅(qū)建立一個(gè)文件系統(tǒng)/dev/cdrom:
2)將光盤插入光驅(qū);
3)#mount/dev/cdrom(注意:光驅(qū)中一定要有光盤時(shí)才可執(zhí)行mount命令);
4)#cpio-icvdumB-I</dev/cdrom/*
或#tar xvf/dev/cdrom/*;
5)執(zhí)行安裝命令:#./installsql輸入序列號及KEY;
6)#umount/dev/cdrom;
7)取出光盤(注意:要先執(zhí)行umount命令才可取出光盤)。
(2)順序安裝ESQL/C、4GL、ONLINE。將ESQL/C磁帶或光盤插入磁帶機(jī)或光驅(qū),方法同(1),由于該行不使用4GL產(chǎn)品,因此未安裝4GL。
3.Informix數(shù)據(jù)庫參數(shù)配置及初始化
(1)操作系統(tǒng)上的準(zhǔn)備工作。首先要為ONLINE存儲數(shù)據(jù)分配磁盤空間,可以選擇UNIX文件或原始磁盤空間作為ONLINE數(shù)據(jù)存儲空間:
1)用UNIX文件作為ONLINE數(shù)據(jù)存儲空間。
用這種方式的優(yōu)點(diǎn)是方便、簡單,但缺點(diǎn)是效率低、安全性不高。例如,在“/usr/Informix”目錄下命名一個(gè)文件“ONLINEdbs”,作為ONLINE的數(shù)據(jù)存儲空間,步驟如下。
以“root”注冊:
#cd/usr/Informix
#cat/dev/null>ONLINEdbs
#chgrp Informix ONLINEdbs
#chown Informix ONLINEdbs
#chmod 664 ONLINEdbs
2)用原始磁盤空間作為ONLINE數(shù)據(jù)存儲空間。
用這種方式效率高、安全性好,但要注意在安裝操作系統(tǒng)時(shí),應(yīng)預(yù)留出這部分磁盤空間,并且不能格式化,還應(yīng)該知道磁盤空間的設(shè)備名及各空間大小。例如,在“/dev/rdsk/os2”為安裝SCO Unix時(shí)預(yù)留出的原始磁盤空間,進(jìn)行如下步驟。
以“root”注冊:
#chgrp Informix/dev/rdsk/os2
#chown Informix/dev/rdsk/os2
#chmod664/dev/rdsk/os2
(2)設(shè)置環(huán)境變量。
在“/usr/Informix/.profile”文件及其他與Informix同組用戶的profile文件中設(shè)置下列環(huán)境變量:
InformixDIR=/usr/Informix
PATH=$PATH:$InformixDIR/bin
ONCONFIG=onconfig.srv (ONLINE配置參數(shù)文件,位于$InformixDIR/etc目錄下)
InformixSERVER=srv_bank(ONLINE的名字)
Export InformixDIR PATH ONCONFIG InformixSERVER
(3)設(shè)置ONCONFIG配置文件。
以“InfoITniX”注冊:
$cd/usr/Informix/etc
$cp oncongig.std onconfig.srv
用Vi編輯器修改“onconfig.srv”文件中各參數(shù)為文件“onconfig.srv”中的值即可,或用onmonitor命令配置ONLINE的參數(shù)。
(4)設(shè)置“$InformixDlR/etc/sqlhosts”文件。
以“Informix”注冊:
$cd/usr/Infonnix/etc
$vi seqhosts
編輯如下:
ONLINE Server name 網(wǎng)絡(luò)協(xié)議 主機(jī)名 Service名
Srv_bank Onipcshm srv Sty_bank
“ONLINE Server name”必須同InformixSERVER環(huán)境變量值一致;“主機(jī)名”為ONLINE所在的服務(wù)器的主機(jī)名,見“/etc/hosts”文件。
(5)啟動ONLINE并初始化磁盤空間。
$oninit-iy
注意:執(zhí)行這個(gè)命令時(shí),所有在ONLINE磁盤空間上的數(shù)據(jù)都將被破壞,該命令只能在第一次初始化ONLINE磁盤空間時(shí)使用。
4.Informix日常管理、監(jiān)控及維護(hù)
(1)Infomfix Server的不同狀態(tài)。Informix Server有六種狀態(tài):Off line、Recovery、 Quiescent、ONLINE、Shutdown、ReadOnly。
(2)常用命令。啟動ONLINE命令為:oninit(“off line”→“on line”);關(guān)閉ONLINE命令為:onmode-ky(“on line”→“quiescent”→“off line”)。
操作最好用帶有GUI界面的命令“onmonitor”。
(3)Informix日志管理。無日志模式:建議不采用該模式;緩沖日志模式:具有較高的數(shù)據(jù)處理速度,但具有一定的風(fēng)險(xiǎn)性;非緩沖日志模式:比較適合關(guān)鍵應(yīng)用程序的處理; ANSl日志模式:選擇該模式的情況比較少。
(4)建立dbspace。
$onspace-c-d dbspace name-p原始磁盤設(shè)備-o。偏移量-s尺寸
參數(shù)含義:
-c:表示建立新的dbspace;
-d:dbspace name;
-p:原始磁盤設(shè)備全路徑名;
-o:偏移量,以KB為單位;
-s:chunk的尺寸,以KB為單位。
(5)創(chuàng)建、移動和改變?nèi)罩敬笮 P薷奈锢砣罩?要求在quiescent狀態(tài)下):物理日志填充到75%時(shí)系統(tǒng)自動引發(fā)檢查點(diǎn)操作,同時(shí)物理日志不能太大,在檢查點(diǎn)期間該實(shí)例的所有活動都將終止。
創(chuàng)建邏輯日志:創(chuàng)建邏輯日志后并不能立即生效,必須在0級備份后才可以。
Onstat-C-L檢查邏輯日志。
C:表示正在用;
L:最后檢查點(diǎn)。
(6)創(chuàng)建數(shù)據(jù)庫。
方法有:Dbaccess、dbimport或直接運(yùn)行SQL語句
create database db_name[in createion_dbspace][with loglwith buffered 10g Ilog mode ansi]
(7)表和索引的創(chuàng)建。創(chuàng)建表:
create tabletable_name
(colunm_name datatype)in dbspace
創(chuàng)建索引:
create index index_name on table_name(列名)
(8)備份及恢復(fù)。備份包括三個(gè)級別:
0級——備份整個(gè)數(shù)據(jù)庫系統(tǒng);
1級——備份從0級備份以后發(fā)生變化的數(shù)據(jù);
2級——備份從1級備份以來發(fā)生變化的數(shù)據(jù)。
命令:$ontapc-s(輸入0、1、2級)。在每天日終時(shí)需要對一天的數(shù)據(jù)進(jìn)行備份。
邏輯日志文件備份:定時(shí)備份邏輯日志和連續(xù)備份邏輯日志;
定時(shí)備份邏輯日志:ontape-a;
連續(xù)備份邏輯日志:ontape-c;
系統(tǒng)恢復(fù)命令:ontape-r。
(9)Informix常用命令。
Oncheck:檢查及恢復(fù)ONLINE數(shù)據(jù)庫磁盤空間、數(shù)據(jù)庫、表、索引等的一致性與完整性。
檢查ONLINE運(yùn)行狀態(tài):onstat。
onstat-d(觀察ONLINE磁盤組織狀況);
onstat-D(觀察ONLINE磁盤讀寫情況,可以確定每個(gè)chunk訪問的均衡情況,記住一個(gè)設(shè)備上可能會有多個(gè)chunk);
onsmt-l(監(jiān)視物理或邏輯日志緩沖區(qū)的使用情況。如果pages/io除以bufsize大約為75%,則緩沖區(qū)使用率較高,小于75%,則物理日志緩沖區(qū)可能太大,如果大于90%,則緩沖區(qū)太小);
Onstat-m(監(jiān)視消息日志文件,查看可能發(fā)生的特殊情況);
Onstat-F(監(jiān)視系統(tǒng)上發(fā)生的寫操作的種類);
Onstat-P(顯示profile文件);
Onstat-u(顯示用戶線索);
Onstat-g ses session_id(顯示感興趣的會話情況)。
5.Informix性能調(diào)整
性能調(diào)整是應(yīng)用系統(tǒng)中十分復(fù)雜的任務(wù),涉及面較廣,包括硬件配置、操作系統(tǒng)配置、數(shù)據(jù)庫設(shè)置及應(yīng)用軟件處理性能等。這里只講后兩個(gè)方面。
(1)數(shù)據(jù)庫配置原則
1)選擇硬盤要傳輸速度高、定位時(shí)問短;大量的小盤比少量的大盤要好。
2)ONLINE磁盤空間要盡可能與操作系統(tǒng)分開;物理、邏輯日志分開(特別是OLTP環(huán)境下),最好不要再放其他數(shù)據(jù)。
3)最好使用數(shù)據(jù)庫臨時(shí)空間,這比系統(tǒng)空間的效率要高;最好使用多個(gè)臨時(shí)數(shù)據(jù)庫空間,這樣將可能大大地提高操作效率,如使用多個(gè)臨時(shí)dbspace,要將它們放在與其他活動頻繁的dbspace不同且彼此分開的磁盤上。
4)明智地使用數(shù)據(jù)分片;不要對小表進(jìn)行分片;不要對所有表進(jìn)行分片;要確定出數(shù)據(jù)量大且頻繁訪問的表;將表的每個(gè)分片放在單獨(dú)的磁盤上;選擇適當(dāng)?shù)姆指罘绞?目的是為了平衡總體I/O,并可以使優(yōu)化器對頻繁運(yùn)行的查詢消除對不必要分片的掃描)。
5)日志模式選用“no buflog”模式,這對銀行聯(lián)機(jī)系統(tǒng)比較重要。
6)在OLTP環(huán)境中應(yīng)當(dāng)將最活躍的表單獨(dú)放在一個(gè)dbspace中;最活躍的dbspace Chunk創(chuàng)建在離磁盤中心最近的地方,這樣可減少磁盤的移動時(shí)間。
7)注意Chunk創(chuàng)建順序?qū)/O均衡的重要性。
8)注意系統(tǒng)中檢查點(diǎn)的平均持續(xù)時(shí)間,因?yàn)樵谠摃r(shí)間內(nèi)系統(tǒng)處于停滯狀態(tài)。
(2)數(shù)據(jù)庫設(shè)計(jì)原則
1)為性能而改變常規(guī)設(shè)計(jì),為追求性能可以在某表中增加子段等。
2)設(shè)計(jì)時(shí),保證記錄長度小于1個(gè)ONLINE頁,跨越多頁的長記錄對性能無益。
3)一般情況下不要使用BLOBS。
4)建立索引要有目的性。
5)設(shè)計(jì)時(shí),最好標(biāo)出每張表的記錄數(shù)和訪問頻率等,可作為劃分磁盤的依據(jù)。
6)在設(shè)計(jì)表和表之間的關(guān)聯(lián)時(shí),在銀行的應(yīng)用系統(tǒng)中,一般將外鍵關(guān)系轉(zhuǎn)換為應(yīng)用邏輯的處理。
(3)應(yīng)用程序中對數(shù)據(jù)庫的訪問(以下原則在“批處理”模塊中特別重要)
1)對頻繁使用的語句要進(jìn)行prepare處理,prepare可節(jié)省C/S的網(wǎng)絡(luò)交換量和加快應(yīng)用處理速度。
2)對于大量使用Insert操作的情況,要盡可能使用Insert游標(biāo),尤其是數(shù)據(jù)較多時(shí)效果比較明顯。
3)對數(shù)據(jù)庫進(jìn)行操作時(shí),Where語句盡可能使用主鍵而非ROWID,在對分割的表操作時(shí)更不能用ROWID。
4)避免不必要的類型轉(zhuǎn)換;SQL語句要盡可能精練。
5)decimal類型數(shù)據(jù)的各種運(yùn)算和轉(zhuǎn)換代價(jià)是高的。
6)避免頻繁的數(shù)據(jù)庫間切換。
7)不要Fetch不需要的行、列,只更新被改變的列,這樣可減少軟件沖突,避免鎖住索引項(xiàng)。
8)在LOAD數(shù)據(jù)庫時(shí)最好先關(guān)閉日志或索引,LOAD結(jié)束后再建索引。
9)在FORK子進(jìn)程時(shí),最好在子進(jìn)程中先關(guān)閉數(shù)據(jù)庫連接,然后重新連接數(shù)據(jù)庫。
10)對大量數(shù)據(jù)做修改后,最好執(zhí)行一次UPDATE STATISTICS操作。
11)在對數(shù)據(jù)庫操作時(shí),一定要注意事務(wù)處理的完整性:BEGIN WORK,COMMIT WORK和ROLLBACK WORK。
12)在連接數(shù)據(jù)庫時(shí)一定要注意考慮將來進(jìn)程數(shù)會不會超過數(shù)據(jù)庫限制的可能性,尤其是主機(jī)直接帶終端的處理方式可能有這個(gè)危險(xiǎn)。
13)在處理與“根據(jù)戶名查賬號”類似的交易時(shí),最好在程序中建立索引后查詢,然后再刪除索引,看性能是否有所提高。
14)刪除大量數(shù)據(jù)時(shí),要考慮先刪除索引再刪除數(shù)據(jù),同時(shí)注意長時(shí)間事務(wù)發(fā)生的可能性。
一般來講,數(shù)據(jù)庫性能的調(diào)整是一個(gè)復(fù)雜的任務(wù),需要系統(tǒng)管理員的多次測試和摸索才能調(diào)整出最佳性能。本文只是對筆者接觸到的一個(gè)系統(tǒng)實(shí)例進(jìn)行了總結(jié),希望能對各位網(wǎng)絡(luò)管理員的工作起到一定的幫助作用。