【摘要】Oracle數(shù)據(jù)庫(kù)作為目前適用性較好的關(guān)系數(shù)據(jù)庫(kù)引擎之一,能夠支持各種業(yè)務(wù)形式、處理各種復(fù)雜事務(wù),得到極為廣泛的應(yīng)用。但在Oracle數(shù)據(jù)庫(kù)應(yīng)用中還存在著很多問(wèn)題,如何解決Oracle數(shù)據(jù)庫(kù)應(yīng)用中出現(xiàn)的問(wèn)題是Oracle數(shù)據(jù)庫(kù)應(yīng)用關(guān)注的焦點(diǎn)。因此,研究Oracle數(shù)據(jù)庫(kù)應(yīng)用中出現(xiàn)的問(wèn)題及其對(duì)策具有十分重要的現(xiàn)實(shí)意義。本文在分析Oracle數(shù)據(jù)庫(kù)應(yīng)用中出現(xiàn)的問(wèn)題的基礎(chǔ)上,探討了解決Oracle數(shù)據(jù)庫(kù)應(yīng)用問(wèn)題的對(duì)策,以期為Ora-cle數(shù)據(jù)庫(kù)的應(yīng)用提供參考。
【關(guān)鍵詞】Oracle數(shù)據(jù)庫(kù) 數(shù)據(jù)庫(kù)應(yīng)用 問(wèn)題及其對(duì)策 數(shù)據(jù)庫(kù)的維護(hù)
一、Oracle數(shù)據(jù)庫(kù)應(yīng)用中出現(xiàn)的問(wèn)題
1.刪除表空間數(shù)據(jù)文件帶來(lái)的故障。在數(shù)據(jù)庫(kù)中,表空間與表空間相關(guān)的數(shù)據(jù)文件是一對(duì)一或一對(duì)多的關(guān)系。刪除表空間數(shù)據(jù)文件帶來(lái)的故障,是指如果要永久地刪除一個(gè)表空間,表空間必須首先設(shè)置為脫機(jī),然后從數(shù)據(jù)庫(kù)中的數(shù)據(jù)字典中刪除項(xiàng)目信息,最后從操作系統(tǒng)目錄結(jié)構(gòu)中刪除數(shù)據(jù)文件。一旦先刪除了表空間的數(shù)據(jù)文件,本末倒置,該表空間無(wú)法找到存儲(chǔ)媒體,這就意味著將無(wú)法正常關(guān)閉和啟動(dòng)數(shù)據(jù)庫(kù)了。
2.英文字符集和中文字符集的轉(zhuǎn)換。英文字符集和中文字符集的轉(zhuǎn)換,也是Oracle數(shù)據(jù)庫(kù)應(yīng)用中出現(xiàn)的常見(jiàn)問(wèn)題。舉例說(shuō)來(lái),如在Oracle數(shù)據(jù)庫(kù)應(yīng)用中,一開(kāi)始要求用英文字符集(US7ASCⅡ),故在安裝Oracle數(shù)據(jù)庫(kù)時(shí),選擇了該種字符集。在使用一段時(shí)間后,又要上其它的一些項(xiàng)目,這些項(xiàng)目要求使用中文字符集(zHSl6CGB231280)。如不改動(dòng)數(shù)據(jù)庫(kù)的字符集,這些運(yùn)用項(xiàng)目的漢字部分將顯示為3個(gè)“?”。因此,在不影響的正常使用情況下,如何將英文字符集改成為中文字符集是迫切需要解決的問(wèn)題。
3.回滾段狀態(tài)及其聯(lián)機(jī)帶來(lái)的問(wèn)題?;貪L段狀態(tài)及其聯(lián)機(jī)帶來(lái)的問(wèn)題,也在一定程度上困擾著Oracle數(shù)據(jù)庫(kù)的應(yīng)用。許多人在應(yīng)用項(xiàng)目的安裝過(guò)程中,參照安裝說(shuō)明書,只創(chuàng)建了回滾段,并使其聯(lián)機(jī),但并沒(méi)有加入到數(shù)據(jù)庫(kù)的初始化文件中,所以,一旦重新關(guān)閉、啟動(dòng)數(shù)據(jù)庫(kù),其回滾段就會(huì)脫機(jī)。因此,回滾段狀態(tài)及其聯(lián)機(jī)帶來(lái)的問(wèn)題,也使得Oracle數(shù)據(jù)庫(kù)應(yīng)用陷入困境。
二、解決Oracle數(shù)據(jù)庫(kù)應(yīng)用問(wèn)題的對(duì)策
1.表的分區(qū)和并行技術(shù)。表的分區(qū)和并行技術(shù),在一定程度上可以緩解刪除表空間數(shù)據(jù)文件帶來(lái)的故障。在使用分區(qū)方面,分區(qū)技術(shù)有兩個(gè)潛在的好處:提高查詢性能和提高數(shù)據(jù)庫(kù)可用性。數(shù)據(jù)庫(kù)查詢時(shí),優(yōu)化器知道那些分區(qū)包含查詢所要的數(shù)據(jù)。而其它分區(qū)數(shù)據(jù)將不會(huì)被讀取,從而查詢?nèi)蝿?wù)將更快完成。如果必須要在數(shù)據(jù)庫(kù)運(yùn)行特別耗時(shí)的操作。應(yīng)盡量地把這樣的操作分解,嚴(yán)格限制操作所涉及的記錄數(shù),并設(shè)法使操作并行,充分地提高執(zhí)行效率。例如可以選擇只刪除一個(gè)表分區(qū)中的數(shù)據(jù)??蓪?duì)表分區(qū)進(jìn)行再分割,把一個(gè)表分區(qū)遷移到不同的表空間上。在使用并行技術(shù)方面,Oracle數(shù)據(jù)庫(kù)中幾乎所有的操作都支持并行特性,包括查詢、插入、和數(shù)據(jù)加載。并行選項(xiàng)可以使多個(gè)處理器同時(shí)處理一條命令,在創(chuàng)建庫(kù)數(shù)據(jù)庫(kù)對(duì)象時(shí)可以設(shè)定并行參數(shù),也可在查詢語(yǔ)句中重新設(shè)。
2.改動(dòng)數(shù)據(jù)庫(kù)的字符集。改動(dòng)數(shù)據(jù)庫(kù)的字符集,是解決英文字符集和中文字符集的轉(zhuǎn)換的有效途徑。在Oracle應(yīng)用程序中,客戶端的字符集要求設(shè)置為與服務(wù)器一致,才能正確顯示數(shù)據(jù)庫(kù)的非ASC字符,否則對(duì)應(yīng)的字符就可能顯示為亂碼或者是符號(hào)“?”,導(dǎo)出(exp)整個(gè)數(shù)據(jù)庫(kù)數(shù)據(jù),重新創(chuàng)建數(shù)據(jù)庫(kù)并重新把數(shù)據(jù)導(dǎo)入(imp)是最基本、最安全的方法,也是Oracle建議的方法。一般來(lái)說(shuō),通過(guò)exp/imp來(lái)轉(zhuǎn)換數(shù)據(jù)庫(kù)字符集,則對(duì)數(shù)據(jù)進(jìn)行了相應(yīng)的編碼轉(zhuǎn)換,所以exp/imp可支持在不兼容的字符集之間進(jìn)行轉(zhuǎn)換操作。ALTER DATABASE CHARACTER SET僅僅支持在兼容字符集之間進(jìn)行轉(zhuǎn)換,進(jìn)行這個(gè)轉(zhuǎn)換操作之前一定需要使用CSSCAN工具進(jìn)行數(shù)據(jù)掃描,仔細(xì)復(fù)核scan.err文件中的相應(yīng)信息,才能成功做到不丟失信息的轉(zhuǎn)換。直接修改props$來(lái)更改數(shù)據(jù)庫(kù)字符集定義是一個(gè)可能帶來(lái)嚴(yán)重錯(cuò)誤的操作,應(yīng)該避免使用。在Oralce應(yīng)用程序中,客戶端的字符集要求設(shè)置為與服務(wù)器一致,才能正確顯示數(shù)據(jù)庫(kù)的非ASC字符,舉例來(lái)說(shuō),服務(wù)器端字符集為UTF8,則客戶端字符集取UTF8。
3.盡量避免訪問(wèn)回滾段。為解決回滾段狀態(tài)及其聯(lián)機(jī)帶來(lái)的問(wèn)題,應(yīng)盡量避免訪問(wèn)回滾段。如果查詢數(shù)據(jù)庫(kù)時(shí),要訪問(wèn)的數(shù)據(jù)正被另外用戶修改,數(shù)據(jù)庫(kù)為了維護(hù)讀一致性,需要訪問(wèn)會(huì)滾段來(lái)讀取查詢語(yǔ)句執(zhí)行時(shí)刻的數(shù)據(jù)值。如果應(yīng)用程序需要經(jīng)常讀取正在被其它用戶修改的數(shù)據(jù),數(shù)據(jù)庫(kù)系統(tǒng)為了得到一個(gè)數(shù)據(jù),不得不多次訪問(wèn)磁盤。數(shù)據(jù)庫(kù)管理員可通過(guò)配置回滾段來(lái)減少查詢時(shí)“snapshottooold”錯(cuò)誤的發(fā)生。解決這個(gè)問(wèn)題的根本方法還是需要重新修改應(yīng)用程序設(shè)計(jì),合理對(duì)事務(wù)進(jìn)行劃分。在動(dòng)態(tài)空間管理時(shí)也要盡量避免回滾段的動(dòng)態(tài)管理?;貪L段的大小會(huì)影響到系統(tǒng)性能,應(yīng)當(dāng)使它足夠大,以便能容納下事務(wù)的回滾段。可用set transaction命令來(lái)為事務(wù)分配一個(gè)合適的回滾段,如:set transaction use rollback segment***;可采用以下三種方法來(lái)處理在動(dòng)態(tài)空間管理時(shí)所出現(xiàn)的回滾段:一是對(duì)于長(zhǎng)查詢或長(zhǎng)事務(wù)應(yīng)當(dāng)分配一個(gè)較大的回滾段,以提商性能。二是在同一個(gè)應(yīng)用中同時(shí)運(yùn)行的多個(gè)副本,不能共用同一個(gè)回滾段,以免出現(xiàn)回滾段爭(zhēng)用。三是對(duì)于頻繁更改,但更改數(shù)據(jù)量較小的并發(fā)聯(lián)機(jī)事務(wù)處理,可采用較小的回滾段以加快緩沖區(qū)中數(shù)據(jù)的存取。
三、數(shù)據(jù)庫(kù)的維護(hù)
Oracle數(shù)據(jù)庫(kù)雖然功能齊全、操作靈活,但在使用維護(hù)過(guò)程中也需要有很強(qiáng)的技巧性。這些維護(hù)工作包括:補(bǔ)丁/版本升級(jí)、初始化參數(shù)的改變、分段、索引重構(gòu)、計(jì)算段統(tǒng)計(jì)信息、錯(cuò)誤檢測(cè)及修正,以及在管理權(quán)限下的其他各種維護(hù)任務(wù),這些都是必須的。定期對(duì)Oracle數(shù)據(jù)庫(kù)的運(yùn)行狀態(tài)、日志文件、備份情況、數(shù)據(jù)庫(kù)的空間使用情況、系統(tǒng)資源的使用情況進(jìn)行檢查,發(fā)現(xiàn)并解決問(wèn)題。
1.Oracle警告日志文件監(jiān)控
Oracle在運(yùn)行過(guò)程中,會(huì)在警告日志文件(alert_SID.10g)中記錄數(shù)據(jù)庫(kù)的一些運(yùn)行情況:(1)數(shù)據(jù)庫(kù)的啟動(dòng)、關(guān)閉,啟動(dòng)時(shí)的非缺省參數(shù);(2)數(shù)據(jù)庫(kù)的重做日志切換情況,記錄每次切換的時(shí)間,及如果因?yàn)闄z查點(diǎn)(checkpoint)操作沒(méi)有執(zhí)行完成造成不能切換,會(huì)記錄不能切換的原因;(3)對(duì)數(shù)據(jù)庫(kù)進(jìn)行的某些操作,如創(chuàng)建或刪除表空間、增加數(shù)據(jù)文件;(4)數(shù)據(jù)庫(kù)發(fā)生的錯(cuò)誤,如表空間不夠、出現(xiàn)壞塊、數(shù)據(jù)庫(kù)內(nèi)部錯(cuò)誤(ORA-600)。DBA應(yīng)該定期檢查日志文件,根據(jù)日志中發(fā)現(xiàn)的問(wèn)題及時(shí)進(jìn)行處理。
2.數(shù)據(jù)庫(kù)表空間使用情況監(jiān)控
數(shù)據(jù)庫(kù)運(yùn)行了一段時(shí)間后,由于不斷的在表空間上創(chuàng)建和刪除對(duì)象,會(huì)在表空間上產(chǎn)生大量的碎片,DBA應(yīng)該及時(shí)了解表空間的碎片和可用空間情況,檢查數(shù)據(jù)庫(kù)表空間的使用率,對(duì)使用率超過(guò)85%的活動(dòng)表空間實(shí)施進(jìn)一步檢查。如果空閑率%free小于10%以上,則要注意增加數(shù)據(jù)文件來(lái)擴(kuò)展表空間而不要用數(shù)據(jù)文件的自動(dòng)擴(kuò)展功能。不要對(duì)表空間增加過(guò)多的數(shù)據(jù)文件,增加數(shù)據(jù)文件的原則是每個(gè)數(shù)據(jù)文件大小為2G或4G,自動(dòng)擴(kuò)展的最大限制在8G。
3.查看數(shù)據(jù)庫(kù)的連接情況
DBA要定時(shí)對(duì)數(shù)據(jù)庫(kù)的連接情況進(jìn)行檢查,看與數(shù)據(jù)庫(kù)建立的會(huì)話數(shù)目是不是正常,如果建立了過(guò)多的連接,會(huì)消耗數(shù)據(jù)庫(kù)的資源。同時(shí),對(duì)一些“掛死”的連接,可能會(huì)需要DBA手工進(jìn)行清理。
4.檢查數(shù)據(jù)庫(kù)文件的狀態(tài)
DBA要及時(shí)查看數(shù)據(jù)庫(kù)中數(shù)據(jù)文件的狀態(tài)(如被誤刪除),根據(jù)實(shí)際情況決定如何進(jìn)行處理,檢查數(shù)據(jù)文件的狀態(tài)的SQL如下:SQL》select name,status from dba_da-ta_files;如果數(shù)據(jù)文件的STATUS列不是AVAILABLE,那么就要采取相應(yīng)的措施,如對(duì)該數(shù)據(jù)文件進(jìn)行恢復(fù)操作,或重建該數(shù)據(jù)文件所在的表空間。
5.數(shù)據(jù)庫(kù)壞塊的處理
當(dāng)Oracle數(shù)據(jù)庫(kù)出現(xiàn)壞塊時(shí),Oracle會(huì)在警告日志文件(alert_SID.10g)中記錄壞塊的信息:
●確定發(fā)生壞塊的數(shù)據(jù)庫(kù)對(duì)象
SELECT tablespace_name,segment_type,owner,seg-ment_name FROM dba_extents WHERE file_id=AND be-tween bloclr_id AND block_id+blocks-1;
●決定修復(fù)方法:(1)如果發(fā)生壞塊的對(duì)象是一個(gè)索引,那么可以直接把索引DROP掉后,再根據(jù)表里的記錄進(jìn)行重建;(2)如果發(fā)生壞塊的表的記錄可以根據(jù)其它表的記錄生成的話,那么可以直接把這個(gè)表DROP掉后重建;(3)如果有數(shù)據(jù)庫(kù)的備份,則恢復(fù)數(shù)據(jù)庫(kù)的方法來(lái)進(jìn)行修復(fù);(4)如果表里的記錄沒(méi)有其它辦法恢復(fù),那么壞塊上的記錄就丟失了,只能把表中其它數(shù)據(jù)塊上的記錄取出來(lái),然后對(duì)這個(gè)表進(jìn)行重建。
●用Oracle提供的DBMS_REPAIR包標(biāo)記出壞塊:exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(”,”);
●使用Create table as select命令將表中其它塊上的記錄保存到另一張表上:
●用DROP TABLE命令刪除有壞塊的表
●用alter table rename命令恢復(fù)原來(lái)的表:
●如果表上存在索引,則要重建表上的索引。
四、結(jié)語(yǔ)
總之,面對(duì)Oracle數(shù)據(jù)庫(kù)應(yīng)用中出現(xiàn)的問(wèn)題,需要具有廣泛而深入的數(shù)據(jù)庫(kù)原理和系統(tǒng)實(shí)踐知識(shí),又要有扎實(shí)的應(yīng)用程序設(shè)計(jì)能力,同時(shí)要充分熟悉操作系統(tǒng)和有關(guān)的軟硬件環(huán)境,相信我們加大研究表的分區(qū)和并行技術(shù)、改動(dòng)數(shù)據(jù)庫(kù)的字符集、盡量避免訪問(wèn)回滾段,不斷探索解決Oracle數(shù)據(jù)庫(kù)應(yīng)用問(wèn)題的對(duì)策,可以做到將數(shù)據(jù)庫(kù)的性能維持在一個(gè)比較好的水平。