大約7 年前, Oracle 發布了 Linux 上的第一個商業數據庫。從那時起, Oracle 、 Red Hat 和 Novell/SUSE 就不斷地合作更改 Linux 內核,從而提高數據庫和應用程序的性能。正因為這樣,用於 Linux 的 Oracle 數據庫 10 g 才包含了與操作系統緊密相關的許多增強功能。 DBA 比以往任何時候更需要了解和使用此平台來在其監視下對系統進行最佳管理。
以往,系統管理員與 DBA 之間在職責方面存在差別。但實際上,這種差別通常並不明顯。許多 IT 部門雇傭一些可解決數據庫級以及操作系統級問題的員工。當然, Oracle 數據庫本身使用操作系統資源,並能與其環境緊密交互。
此外,許多系統管理員和 DBA 發現將其工作相關的任務自動化很有必要或比較方便。軟件安裝、系統資源監視以及系統管理涉及一些重復和容易出錯的任務,而自動過程可以比手動過程更好地完成這些任務。
將這些任務自動化的方法之一是 shell 腳本。 Shell 腳本自 Linux 系統安裝之初就起著重要作用。啟動和關閉系統時就會調用各種腳本。 Oracle 和其他第三方供應商的實用程序也是通過 shell 腳本可調用的。由於這些腳本可以快速開發,因此歷來就用它們構建應用程序原型。系統管理員已利用通過 shell 腳本實現的功能提供針對其監視的系統的特定要求和特征定制的解決方案了。
在本文中,我將介紹 “bash”shell 腳本可以實現的、與在 Linux 平台上安裝、運行和維護 Oracle 數據庫相關的功能。注意,本文適用於 Linux 腳本初學者或對 Linux 相對陌生的 DBA ;對大多數經驗豐富的 Linux 系統管理員則不適用。
Shell 腳本是什麼?
shell 腳本是一個包含命令序列的文本文件。當運行文件(或腳本)時,將執行該文件中包含的命令。術語 shell 僅指與 Linux 內核通信所使用的特定命令行用戶界面。目前有多個不同的 shell ,其中包括 C shell (csh) 、 Korn shell (ksh) 、 Bourne shell (sh) 和 Bourne-Again shell (bash) 。 shell 本身就是一個從文件或終端讀取命令、解釋這些命令並通常執行其他命令的命令。 Bourne-Again shell 合並了上述其他 shell 的特性,本文就使用該腳本進行演示。
腳本文件中的第一行可用於指定使用哪個 shell 來運行該腳本。以下是所有腳本示例中包含的第一行的含義:
#!/bin/bash 為什麼使用 Shell 腳本?
由於 shell 腳本與 DBA 的工作相關,因此您可能不會馬上看到 shell 腳本的價值,這跟您的工作經歷有關。如果您以前從未使用過 UNIX 或類似 UNIX 的系統,那麼可能會對大量含義晦澀的命令感到一愁莫展。此外,除了作為關系數據庫外, Oracle 10 g 還提供了一個用於處理數據庫數據的強健平台以及幾個用於在數據庫外部與操作系統交互的方法。
但您會發現幾個探究 shell 腳本領域的原因,其中包括:
? 必須支持已經存在的腳本。
? 需要在安裝 Oracle 軟件前自動設置系統。例如,您可以編寫一個腳本來檢查 OS 的初始狀態並報告安裝軟件前必須滿足的任何前提條件。該腳本還可以創建相關的 OS 用戶和組並為用戶設置環境變量。
? 可以使用正在運行的 Oracle 數據庫來執行手動或計劃的任務。但在數據庫 未 運行時需要運行某些任務。可以使用腳本停止或啟動數據庫(以及偵聽器或相關的數據庫進程)。無法從數據庫內部啟動此類動作。
? 您需要一種監視數據庫狀態(例如,是否正在運行並可進行進程查詢)的機制。這樣的腳本還可以監視非特定於 Oracle 的其他進程和資源,從而提供系統當前運行情況的更詳細信息。
? 需要將備份自動化。 Oracle Recovery Manager (RMAN) 是一個用於開發可以在任何平台上運行的備份腳本的實用程序。可以從 shell 腳本中調用 Oracle Recovery Manager 並使用它執行各種備份和恢復活動。
? 您可能有一個並非特定於某個數據庫的要求。您可能在一台計算機上安裝了多個數據庫。建議您不要使用單個數據庫滿足此要求,因為那樣會引發潛在的安全性問題。在這些情況下, shell 腳本提供了一種既可以滿足此要求又不會將進程與單個數據庫關聯的方法。
什麼情況下不使用 Shell 腳本?
Oracle 數據庫包含了超出 RDBMS 傳統定義的功能。與軟件的任何其他部分一樣,它使用操作系統提供的資源,但它所 “ 看到 ” 並 “ 更改 ” 其環境的程度遠遠超過了其他軟件。 SQL 和 Oracle 的固定視圖從數據庫內部提供了系統視圖,而 shell 腳本從數據庫外部提供了系統視圖。 Shell 腳本並不是適用於所有問題的解決方案。
必須意識到,操作系統的許多方面可以從數據庫內部進行監視和修改。可以使用 Oracle 的固定視圖(帶 v$ 前綴的視圖)確定計算機的主機名 (v$instance) 或數據庫正在其中運行的平台的名稱 (v$database) 。還可以通過這種方式確定與數據庫相關的文件的位置和其他屬性。可以直接從數據庫中查詢數據文件( v$datafile 、 dba_data_files )、臨時文件( v$tempfile 、 dba_temp_files )、重做日志 (v$logfile) 、存檔日志 (v$archived_log) 和控制文件 (v$controlfile) 的位置和其他屬性。可以通過該視圖以及通過查看某些 init.ora 參數( db_recovery_file_dest 、 db_recovery_file_dest_size )確定有關閃回恢復區 ($recovery_file_dest) 的信息。還可以查詢進程 (v$process) 和內存( v$sga 、 v$sgastat 等)的狀態。有各種內置的 PL/SQL 程序包,並能夠創建允許對底層 OS 進行其他訪問的 Java 和 C 數據庫對象。
如果您正在考慮為一個需要大量數據庫訪問的任務編寫腳本,則腳本可能並不是最佳選擇。本文的稍後部分將介紹如何使用 SQL*Plus 訪問數據庫,但在很多情況下,使用其他語言可以更好地解決此問題。