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