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