Oracle平臺應用數據庫系統的設計與開發
2024-08-29 13:46:42
供稿:網友
Oracle是目前應用最廣泛的數據庫系統。一個完整的數據庫系統包括系統硬件、操作系統、網絡層、DBMS(數據庫治理系統)、應用程序與數據,各部分之間是互相依靠的,對每個部分都必須進行合理的配置、設計和優化才能實現高性能的數據庫系統。 本文討論筆者使用Oracle開發局域網中、小型數據庫應用中,系統硬件的選擇與使用、應用數據庫系統設計與開發方面的一些心得和建議。應用數據庫系統包含應用數據庫和應用兩方面的內容,應用數據庫就是生產數據庫,與系統數據庫相對。系統硬件的選擇與使用與數據庫系統密切相關的硬件主要有CPU、內存、集群、存儲設備等,這里不對集群進行討論。1、CPU CPU的數目和速度直接影響數據庫操作的速度,Oracle數據庫提供并行查詢選項,答應SQL操作以協同方式在多個CPU上執行,可以很大程度的發揮多CPU的性能。為系統添加CPU前,首先要對應用程序的SQL代碼做優化,提高應用程序的效率,質量低劣的應用可能會引起CPU資源的無謂的消耗;其次,要了解操作系統對CPU數目的限制及系統的可擴展性。在系統CPU資源已定的情況下,要對各類應用進行分析,在保證要害應用正常運行的前提下,盡可能將大量占用CPU資源的應用放在系統相對空閑的時候進行。良好的工作調度可以有效減少對CPU的競爭使用,加快系統的響應時間。2、內存數據庫系統中,應保證有足夠大的內存。在UNIX系統中,假如系統的物理內存小于1GB,可將交換區的大小設為內存的4倍,否則,可設為內存的2倍,交換區要放在磁盤速度最快的硬盤上。Oracle 的SGA區大小直接關系到數據庫操作的性能,一般來說,SGA區的大小可設為系統可用內存的55%到57%,SGA區過多占用系統內存反而會降低性能。在應用系統運行中,應定期監測系統的內存使用情況,對要害應用進行分析,根據應用適時調整SGA區各部分的大小。Oracle9i可在不重新啟動數據庫的情況下修改SGA區的參數,實時改變SGA區的大小。3、存儲設備在網絡時代,信息資源的積累和廣泛應用對數據存儲技術的發展提出了更大的挑戰,數據存儲模式從傳統的總線連接模式進入了網絡存儲模式。但存儲設備依然是硬盤、磁帶(帶庫)、磁盤陣列,在中、小型數據庫應用中傳統存儲模式仍占主導地位。磁盤I/O是數據庫操作的瓶頸之一,磁盤的合理選擇和使用在數據庫系統中顯得尤為重要。在最初做數據庫系統規劃時,應充分考慮到系統的容量和預期的增長,盡可能為以后的擴展留足空間。在硬盤和磁盤陣列的選擇與使用中,應注重以下幾點: ·選擇支持熱插拔功能的硬盤,這樣在出現硬盤Oracle 平臺應用數據庫系統的設計與開發失敗時,可以在系統正常運行的情況下更換硬盤; ·不要選擇太大的硬盤,切記對Oracle 應用程序,1~4GB大小的硬盤是比較合適的,最好購買大量的中小型硬盤,這樣在配置RAID時可提供更大的靈活性; ·假如選用了磁盤陣列,對于Oracle數據庫應用,假如經費能夠支持,RAID 0+1是最佳的配置方法。在RAID 5中,讀操作性能得到了一定的改善,但寫性能損失很大,假如某個硬盤失敗,硬盤重建的工作量非常大,RAID 5 適用于DSS(決策支持系統)應用,對OLTP(聯機事物處理)應用不太合適; ·在實現RAID時,要正確地選擇分條的大小,決定分條大小的三個主要因素是:應用程序的特性(DSS、OLTP、批處理)、操作系統與數據庫的數據塊大小、磁盤陣列中的硬盤數目。數據庫的數據塊大小應是操作系統數據塊大小的整數倍,同樣分條大小也必須是操作系統數據塊大小的整數倍。假如使用裸設備,分條大小應是操作系統物理數據塊的大小。分條可按照水平方向進行,也可按照垂直方向進行。水平分條跨越每個硬盤控制器進行,垂直分條跨越整個硬盤集合進行,分條集合中的成員數應不大于硬盤控制器數。OLTP應用程序,數據訪問的數據量不大,一般可選擇32KB 或64KB 的分條大小,而DSS應用程序訪問的數據量大,可考慮使用64KB、128KB或256KB的分條大小。應用數據庫的設計與開發Oracle數據庫軟件安裝和配置完成后,就進入了應用數據庫的設計階段,應用數據庫設計包括邏輯設計與物理設計。合理的邏輯設計會大大提高數據庫的性能,增強數據庫的可維護性。在設計中根據應用,抽象出實體關系模型,將實體關系圖映射為標準化(數據完整、與應用無關、存儲優化)的關系模型(數據庫對象),當前有一些輔助工具(Oracle Designer等)來實現實體關系圖到SQL代碼的映射;數據庫的物理設計就是數據庫對象的存儲設計,即如何為數據庫對象分配存儲空間。在進行數據庫對象的設計前,數據庫的治理和開發人員對應用和應用的數據及其應用關系要有一個詳盡的理解,根據應用進行數據庫對象的規劃和設計,大概包含以下幾個方面: ·確定需建立的數據庫用戶,明確用戶的系統權限和表空間限額,為用戶設計資源限制PRofile; ·確定應用數據應分多少個表進行設計,各表分別屬于的用戶,各用戶對各個表的操作權限; ·明確各表的結構,確定表的主鍵及約束;·明確哪些表是應用運行的要害表,哪些是事務表; ·分析哪些表是主表,哪些表是從表,確定表和表之間的外鍵約束,選擇合適的表作為表連接的驅動表;
·根據應用,確定在哪些表上對哪些列建立合適的索引;·根據表和索引的設計,確定要創建的表空間和回滾段,為表空間和回滾段選擇合適的磁盤,盡可能創建本地治理的表空間,減少數據庫空間治理方面的工作; ·明確需要編寫的觸發器及過程; ·為數據庫對象選擇備份和恢復策略。在數據庫設計階段,有時未必能完全確定合適的數據庫對象的特征,應用設計和開發中還可能發現不合適的地方,需要回過頭來進行調整和修改。但設計階段的工作越細致,出現問題的可能性就越小,工作的效率就越高。創建數據庫對象時,要根據數據庫對象的特點,結合存儲設備的大小、數量及速度等,對數據庫對象分類進行存儲,最大限度地消除或減少資源競爭。在數據庫對象創建時主要應遵循以下原則: ·應用數據應放在單獨的表空間,不要將應用數據放在系統表空間,為防止無意的使用系統表空間,將應用用戶的系統表空間限額設為0?!に饕捅響旁谖挥诓煌脖P上的不同的表空間,這樣會提高數據庫操作的速度。·需要同時被訪問的表要分開存放,利于并發訪問的實施?!ぜ偃绱疟P數量有限,可把不常聯合訪問的表放在相同的磁盤上。·預分配的原則。創建數據庫對象(表空間、回滾段、表、索引等)時,根據對象的情況設置合適的storage參數非常重要。創建對象設計時,對對象的容量和預期的增長有一個估計,這樣才能確定存儲參數的大小。一般來說,應預先給表和索引等數據庫對象分配足夠的空間,數據庫段不要太多地做動態擴展,因為會影響數據庫性能。一個段(segment)由一個區(extent)構成是最理想的,initial 參數可以稍大一點,假如可能,可設為最大容量的大小,initial必須是db_block_size的整數倍;next參數的設置比較靈活,根據應用進行相應的設置,但也必須是db_block_size的整數倍;為了減少數據庫碎片的產生,pctincrease參數應該盡量設為0;更新操作比較少的段,pctfree要設置得小一點,更新操作很多的段要設置得大一些;inittrans和freelists的值要相等,大小與并發事務數相關?!し侄沃脑瓌t。大的數據庫表和索引可考慮進行分區存放,不同的分區可位于不同的磁盤上,更好地均衡I/O。Oracle可以只對表的某些分區進行查詢,這樣會提高查詢的速度;可對分區進行數據的刪除、裝載,還可以移動分區,對表的治理和控制具有更大的靈活性;可以有更多的策略選擇,更好地執行備份和恢復操作。注重,對某些分區進行操作后,在Oracle8i下必須重建全局索引?!ご笮『驮鲩L趨勢類似的表最好放在相同的表空間,可以有效控制硬盤碎片的產生,提高空閑塊的可重用性。·相同備份和恢復策略的表最好放在同一個表空間,這樣有助于備份和恢復工作的完成。·對響應時間要求苛刻的應用所訪問的對象放在速度快的磁盤上。 數據庫應用系統的設計與開發 1、應用設計不論使用何種工具或語言來開發應用程序,都需要進行應用的全面設計。應用設計包括: 首先,分析應用要完成的功能,確定應用類型,是OLTP(聯機事務處理)系統、DSS(決策支持)系統還是批處理系統;其次,了解應用在何時由誰使用、應用訪問的數據、應用程序用到的組件、應用被要求的響應時間等,在設計前,必須對這些問題盡量進行解答,這對應用設計非凡是大規模的應用設計非常重要;第三,根據上面的資料,確定應用的體系結構,是采用client/server兩層架構的方式,還是采用browser/server多層架構的方式實現一個開放的分布式應用系統,如何對應用服務器進行選擇與配置;第四,將應用按功能劃分為一個或多個應用程序,明確應用程序的具體功能、類型、組成,使用時間及高峰時間、事務的流量、用戶組成、訪問的數據庫對象等,確定應用程序間的關聯和互操作特性,對各個應用程序的執行時間合理地進行安排; 第五,對應用程序進行模塊化設計,選擇實現應用的數據庫組件和開發語言及工具。2、應用開發在應用開發階段,根據應用的不同,實現的方法和步驟會有很大的差異。這里只討論以下在應用開發中需要重點注重的幾個問題。1) 在開發會話要害型應用程序時,盡可能使用Pro*C/C++或OCI。在編寫后備實例和數據庫失敗恢復等需要進行數據庫重新連接的代碼時,用Pro*C/C++ 或OCI比用PL/SQL要輕易實現,在Oracle8/8i中,OCI可以實現透明應用程序失敗恢復(TAF)。編寫數據庫操作繁重的應用程序,使用OCI,OCI程序對數據庫的訪問是通過調用OCI庫函數實現的,能夠直接到達系統內核,比Pro*C/C++速度更快。2) 在開發會話要害型應用程序時,盡量實現失敗檢查和恢復能力,如指定后備數據庫或實例、終止出錯客戶進程等。3) 編寫代碼時,要考慮應用程序的可維護性,盡量將應用程序獨立于數據庫的變化??墒褂靡晥D、相對變量類型定義(%TYPE)、記錄型變量定義(%ROWTYPE),采用表驅動的應用程序設計模式。4) 進行充分的單元測試和模塊測試,為應用集成打下堅實的基礎。5) 對要害表操作的應用程序實現要非凡當心,必要的話,在應用中對要害表先做備份,應用成功執行后再刪除備份表。6) 編碼結束后,應對代碼進行優化。前面提到過,代碼優化在數據庫應用中非常重要,很高比例的性能問題與編碼拙劣的應用程序有關。7) 定期對應用操作的數據庫對象增長的情況進行監控,避免因空間不足引起的應用程序的失敗。8) 對應用的數據定時進行整理。有些應用中,存放在數據庫表中的數據只要求保存一段時間,就需要定時對數據進行刪除。假如手工進行刪除操作,工作量很大,可以用Oracle提供的作業來完成, unix系統下可用cron進程來實現。筆者在工作中經常使用cron來做數據的定時刪除,根據應用要求,編制Pro*C/C++程序,編寫Shell腳本調用應用程序,將Shell腳本提交給cron進程。
注重:在Shell腳本中必須設置相應的Oracle環境變量,如ORACLE_BASE、ORACLE_HOME、NLS_LANG、LD_LIBRARY_PATH、PATH等,用戶環境文件中的定義是無效的。9)對于大量刪除操作的應用程序,假如表是分區存放的,可對數據分區執行截斷(truncate)操作,截斷操作執行速度快并且不會產生碎片,但截斷后可能需要進行重建索引的工作。對大量的數據做刪除(delete)操作,會引起數據庫回滾段的急劇增長,建議根據刪除數據量為這類應用創建非凡的專用回滾段,為專用回滾段指定合適的storage參數。平常,專用回滾段可以是離線的(offline),在事物開始前,使專用回滾段在線(online),指定事物使用專用回滾段,事物結束后再使專用回滾段離線,筆者使用的部分代碼 (Pro*C/C++) 如下所示。 .. EXEC SQL WHENEVER SQLERROR goto Error; EXEC SQL CONNECT :uid; .. EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC ONLINE; EXEC SQL SET TRANSACTION USE ROLLBACK SEGMENT RBS_SPEC; .. EXEC SQL DELETE FROM .. WHERE ..; EXEC SQL ALTER ROLLBACK SEGMENT RBS_SPEC OFFLINE; ..結束語Oracle數據庫是一個功能強大的數據庫系統,適用于各種各樣的應用系統,系統規??纱罂尚。瑧迷O計或簡單或復雜,因此在使用過程中要根據各自不同的應用進行設置與調整,以上是筆者在使用Oracle進行應用開發過程中一點心得和體會,寫出來與大家共勉,謝謝。