作為對(duì)象關(guān)系型數(shù)據(jù)庫的杰出代表,Oracle無疑是最具實(shí)力的。無論是在數(shù)據(jù)庫的規(guī)模,多媒體數(shù)據(jù)類型的支持,SQL操作復(fù)制的并行性還是在安全服務(wù)方面,Oracle均比SYBASE、Informix強(qiáng)許多,加上其最新版本Oracle8.0.4更是增強(qiáng)了這方面的特性,而且還引入了一些新的特性,比如:數(shù)據(jù)分區(qū)(Data Partitioning)、對(duì)象關(guān)系技術(shù)(Object Relational Technology)、唯索引表(Index only tables)、連接管理器(Connection Manager)[NET8特性]、高級(jí)隊(duì)列(Advanced Quening)等,所以有一種說法:Oracle8是適用于如Peoplesoft,SAP和Baan等封裝式應(yīng)用系統(tǒng)最好的數(shù)據(jù)庫引擎。
---- 雖然Oracle8有許多的優(yōu)點(diǎn),但正如微軟的WINDOWS系統(tǒng)也會(huì)死機(jī)一樣,任何再好的軟件也有他的缺陷,一個(gè)優(yōu)秀的軟件不可能就是十全十美,他只是避免了大多數(shù)常見的或者可能被考慮到的問題,而一些不容易被發(fā)現(xiàn)卻非常致命的問題往往會(huì)被疏忽掉。Oracle8也同樣存在著不安全的因素,許多正在想盡快升級(jí)到Oracle8的Oracle7.1、Oracle7.2、Oracle7.3用戶不能不考慮到這個(gè)因素。當(dāng)然,這個(gè)不安全因素并不是一下子就發(fā)現(xiàn)的,而是我們?cè)趯?duì)一個(gè)非常龐大的表進(jìn)行管理時(shí)發(fā)現(xiàn)的,這種隱患在使用Oracle創(chuàng)建的小型或者中型數(shù)據(jù)庫中可能不會(huì)出現(xiàn)或根本無法發(fā)現(xiàn),因?yàn)镺racle8獨(dú)有的特性已經(jīng)將這種隱患降低到最低的程度,你大可放心你的數(shù)據(jù)庫系統(tǒng)的安全。
---- 我們安裝的Oracle8數(shù)據(jù)庫是工作于主機(jī)-終端方式下的,系統(tǒng)主機(jī)采用的是四臺(tái)HP-9000小型機(jī)、1.5G的內(nèi)存。建庫初期時(shí)設(shè)定的最大事務(wù)數(shù)是按Oracle8的默認(rèn)取值[這也是Oracle7的默認(rèn)取值]取的:塊值為2K,事務(wù)數(shù)為32(對(duì)于一個(gè)要處理非常龐大的數(shù)據(jù)庫時(shí),一般我們?cè)O(shè)定的塊值要大于2K,至少應(yīng)為4K或者16K,當(dāng)然這還與主機(jī)的CPU能力和I/0能力值有關(guān)),并在建庫時(shí)沒有進(jìn)行分區(qū)建表,這也許就為以后數(shù)據(jù)庫出問題留下了隱患。由于日訪問數(shù)據(jù)庫的用戶非常多,而且對(duì)同一表操作的用戶數(shù)量太大,致使那個(gè)表經(jīng)常被鎖住,不斷有用戶抱怨他們進(jìn)不了系統(tǒng),主機(jī)發(fā)送的數(shù)據(jù)包太慢,經(jīng)常報(bào)ORA-600的錯(cuò)誤。起初我們以為是系統(tǒng)網(wǎng)絡(luò)問題,但這種可能性比較小,因?yàn)槲覀儼l(fā)現(xiàn)系統(tǒng)CPU峰值經(jīng)常在90%多,空閑很小,數(shù)據(jù)庫資源太忙,同時(shí)有十多個(gè)人鎖住一個(gè)大表進(jìn)行操作,自然一部分用戶就無法進(jìn)入系統(tǒng),對(duì)此我們寫了如下的SQL語句對(duì)鎖表用戶進(jìn)行監(jiān)控:
SELECT OBJECT_ID,SESSION_ID,SERIAL#,
ORACLE_USENAME,OS_USER_NAME,S_PROCESS
FROM V$LOCKED_OBJECT 1,
V$SESSION S WHERE 1.SESSION_ID=S.SID;
---- 也許有的人會(huì)問為什么不用如下的SQL語句進(jìn)行查詢:
SELECT a.username,a.sid,a.serial#,b.id1,
c.sql_text from v$session a,
V$lock b,v$sqltext c where a.lockwait=b.kaddr and
a. sql_address=c.address and a.sql_hash_value=c.hash_value;
---- 以上兩個(gè)SQL語句都會(huì)查詢返回當(dāng)前被鎖住的用戶列表,但第二個(gè)SQL語句由于加入了sql_text從而使這個(gè)查詢變得非常的慢長,特別是在有許多用戶同時(shí)對(duì)數(shù)據(jù)庫進(jìn)行操作時(shí),建議不用,第一個(gè)SQL 語句會(huì)在很短的時(shí)間內(nèi)查詢出是誰在鎖表,從而有利于對(duì)數(shù)據(jù)庫的管理,一但有用戶進(jìn)入不了,我們就馬上殺死其鎖進(jìn)程[SID,SERIAL#],SQL語句如下:ALTER SYSTEM KILL SESSION ‘SID,SERIAL#’,但這并不是解決問題的根本方法,只能暫時(shí)緩解一下;另外我們還發(fā)現(xiàn)回滾段時(shí)常有“online”與“offline”的現(xiàn)象,于是我們又考慮是否是回滾段引起的問題:因?yàn)槲覀円坏珜?duì)大的回滾段進(jìn)行操作,馬上就會(huì)有用戶反映無法進(jìn)入。我們知道回退段的大小直接依賴于數(shù)據(jù)庫的活動(dòng)狀態(tài),而每一個(gè)EXTENTS都應(yīng)具有相同的值(Oracle的推薦)[INITIAL EXTENTS的值可以從2K(32)、4K(69)、8K(142)、16K、32K等列表中選擇],這將保證你刪掉一個(gè)區(qū)的時(shí)候,你可以重新使用它的空間而不會(huì)造成浪費(fèi),另外MINEXTENTS應(yīng)設(shè)為20,這將不會(huì)使回退段擴(kuò)展另一個(gè)EXTENT時(shí)用到正在被活動(dòng)的事務(wù)所使用的空間,因而我們就可以據(jù)此來確定回退段大小,查出數(shù)據(jù)庫正常運(yùn)行時(shí)所需回滾段的尺寸,為此我們重新設(shè)置了回退段的OPTIMAL參數(shù)[事實(shí)是OPTIMAL的值并不足引起數(shù)據(jù)庫出錯(cuò)],增大了OPTIMAL的值,使用命令SET TRANSACTION USE ROLLBACK SEGMENT為系統(tǒng)指定了一個(gè)大的回退段[注意OPTIMAL參數(shù)要足夠大以使ORACLE不需經(jīng)?;乜s和重新分配EXTENTS,如果設(shè)得小于最小覆蓋值,性能將由于額外的段重設(shè)置而下降,對(duì)于一個(gè)要執(zhí)行長查詢的系統(tǒng),OPTIMAL應(yīng)設(shè)成足夠大以避免ORA-1555,“Smapshot too old”的錯(cuò)誤,而對(duì)于運(yùn)行小的事務(wù),OPTIMAL應(yīng)設(shè)得小一些,使回退段足夠小以便放于內(nèi)存中,這將提高系統(tǒng)性能。],但我們發(fā)現(xiàn)這樣做后,ORA-600的錯(cuò)誤依然出現(xiàn),而且鎖表越來越嚴(yán)重;我們又考慮暫時(shí)鎖住這個(gè)表,不讓用戶進(jìn)入,先把用戶的鎖進(jìn)程全部殺完再看,由于一開始就采用了主機(jī)-終端的工作方式,因而根本就無法清除得完,除非斷掉外部的所有網(wǎng)絡(luò)連接,但那樣無疑是重啟數(shù)據(jù)庫,最終我們選擇了重啟數(shù)據(jù)庫。
---- 重啟數(shù)據(jù)庫后系統(tǒng)資源一下子得以釋放,用戶明顯感覺速度上來了,能夠保證正常使用,就在我們認(rèn)為系統(tǒng)可能是因?yàn)殚L期沒有DOWN機(jī),用戶登錄數(shù)過多造成數(shù)據(jù)庫死鎖的時(shí)候,一個(gè)非常嚴(yán)重的問題出現(xiàn)了,那個(gè)表中的一個(gè)數(shù)據(jù)無法進(jìn)行UPDATE,一UPDATE就報(bào)ORACLE內(nèi)部代碼錯(cuò)誤,當(dāng)時(shí)我們并沒在意,但是不久,我們又發(fā)現(xiàn)另一表中編號(hào)有重復(fù)的現(xiàn)象,根據(jù)ORACLE8的數(shù)據(jù)唯索引表性,這種現(xiàn)象應(yīng)該根本不會(huì)存在,因?yàn)槲覀冊(cè)谶@個(gè)表中只建立了唯一索引,于是我們電話詢問ORACLE公司的技術(shù)工程師,也許ORACLE的技術(shù)工程師們也是第一次遇到這種問題,他們的回答是數(shù)據(jù)字典太老,數(shù)據(jù)索引壞掉,建議重建索引,并把問題向亞太反映。在ORACLE公司的技術(shù)工程師的指導(dǎo)下,我們重建了該表,并重新建立了索引,在重建索引過程中,開始幾次都不成功,而且無法DROP掉先前的表,經(jīng)過仔細(xì)的查找,我們發(fā)現(xiàn)ORACLE8中的確有索引重復(fù)的現(xiàn)象,一個(gè)表中有兩條重復(fù)的索引,直接導(dǎo)致數(shù)據(jù)庫HANG,不能訪問,但查看系統(tǒng)狀態(tài)、進(jìn)程、LISTENER卻都正常,從日志文件來看,文件過小(7MB),CHECK POINT頻繁,影響到了系統(tǒng)的性能,通過以上調(diào)整后,數(shù)據(jù)庫問題暫時(shí)緩解了,可以做UPDATE,但是ORACLE的內(nèi)部代碼錯(cuò)誤卻依然存在,只是暫時(shí)還不會(huì)影響到我們對(duì)數(shù)據(jù)庫的使用,而回滾段開始出現(xiàn)“online rollback segment”的問題,更加令人不解的是數(shù)據(jù)庫居然出現(xiàn)了自動(dòng)DOWN機(jī)的現(xiàn)象,于是我們?cè)俅卧儐朞RACLE公司的技術(shù)工程師,他們的答復(fù)是ORACLE已經(jīng)注意到了ORACLE8.0.4版本的一些問題,他們將會(huì)給數(shù)據(jù)庫打PATCH,希望能夠解決到這些問題,但是考慮到給數(shù)據(jù)庫打一個(gè)PATCH,將會(huì)把所有的數(shù)據(jù)都要EXPORT出來,這將是一個(gè)非常危險(xiǎn)的操作,而且所有主機(jī)上的程序都要重新編譯一到,沒有一個(gè)星期的時(shí)間是無法做好的,而那是根本不可能的事情,因而我們現(xiàn)在還在等待ORACLE公司一個(gè)更好的解決辦法。
更多信息請(qǐng)查看IT技術(shù)專欄