DBA:Linux
面向 DBA 的 Linux Shell 腳本簡介
作者:Casimir Saternos
學(xué)習(xí)一些在 Linux 上安裝、運(yùn)行和維護(hù) Oracle 數(shù)據(jù)庫所需的基本 bash shell 腳本。
本文相關(guān)下載:
示例腳本Oracle 數(shù)據(jù)庫 10g2005 年 11 月發(fā)表
大約 7 年前,Oracle 發(fā)布了 Linux 上的第一個商業(yè)數(shù)據(jù)庫。從那時起,Oracle、Red Hat 和 Novell/SUSE 就不斷地合作更改 Linux 內(nèi)核,從而提高數(shù)據(jù)庫和應(yīng)用程序的性能。正因為這樣,用于 Linux 的 Oracle 數(shù)據(jù)庫 10g 才包含了與操作系統(tǒng)緊密相關(guān)的許多增強(qiáng)功能。DBA 比以往任何時候更需要了解和使用此平臺來在其監(jiān)視下對系統(tǒng)進(jìn)行最佳管理。
以往,系統(tǒng)管理員與 DBA 之間在職責(zé)方面存在差別。但實際上,這種差別通常并不明顯。許多 IT 部門雇傭一些可解決數(shù)據(jù)庫級以及操作系統(tǒng)級問題的員工。當(dāng)然,Oracle 數(shù)據(jù)庫本身使用操作系統(tǒng)資源,并能與其環(huán)境緊密交互。
此外,許多系統(tǒng)管理員和 DBA 發(fā)現(xiàn)將其工作相關(guān)的任務(wù)自動化很有必要或比較方便。軟件安裝、系統(tǒng)資源監(jiān)視以及系統(tǒng)管理涉及一些重復(fù)和容易出錯的任務(wù),而自動過程可以比手動過程更好地完成這些任務(wù)。
將這些任務(wù)自動化的方法之一是 shell 腳本。Shell 腳本自 Linux 系統(tǒng)安裝之初就起著重要作用。啟動和關(guān)閉系統(tǒng)時就會調(diào)用各種腳本。Oracle 和其他第三方供應(yīng)商的實用程序也是通過 shell 腳本可調(diào)用的。由于這些腳本可以快速開發(fā),因此歷來就用它們構(gòu)建應(yīng)用程序原型。系統(tǒng)管理員已利用通過 shell 腳本實現(xiàn)的功能提供針對其監(jiān)視的系統(tǒng)的特定要求和特征定制的解決方案了。
在本文中,我將介紹“bash”shell 腳本可以實現(xiàn)的、與在 Linux 平臺上安裝、運(yùn)行和維護(hù) Oracle 數(shù)據(jù)庫相關(guān)的功能。注意,本文適用于 Linux 腳本初學(xué)者或?qū)?Linux 相對陌生的 DBA;對大多數(shù)經(jīng)驗豐富的 Linux 系統(tǒng)管理員則不適用。
Shell 腳本是什么?
shell 腳本是一個包含命令序列的文本文件。當(dāng)運(yùn)行文件(或腳本)時,將執(zhí)行該文件中包含的命令。術(shù)語 shell 僅指與 Linux 內(nèi)核通信所使用的特定命令行用戶界面。目前有多個不同的 shell,其中包括 C shell (csh)、Korn shell (ksh)、Bourne shell (sh) 和 Bourne-Again shell (bash)。shell 本身就是一個從文件或終端讀取命令、解釋這些命令并通常執(zhí)行其他命令的命令。Bourne-Again shell 合并了上述其他 shell 的特性,本文就使用該腳本進(jìn)行演示。
腳本文件中的第一行可用于指定使用哪個 shell 來運(yùn)行該腳本。以下是所有腳本示例中包含的第一行的含義:
#!/bin/bash為什么使用 Shell 腳本?
由于 shell 腳本與 DBA 的工作相關(guān),因此您可能不會馬上看到 shell 腳本的價值,這跟您的工作經(jīng)歷有關(guān)。如果您以前從未使用過 UNIX 或類似 UNIX 的系統(tǒng),那么可能會對大量含義晦澀的命令感到一愁莫展。此外,除了作為關(guān)系數(shù)據(jù)庫外,Oracle 10g 還提供了一個用于處理數(shù)據(jù)庫數(shù)據(jù)的強(qiáng)健平臺以及幾個用于在數(shù)據(jù)庫外部與操作系統(tǒng)交互的方法。
但您會發(fā)現(xiàn)幾個探究 shell 腳本領(lǐng)域的原因,其中包括:
必須支持已經(jīng)存在的腳本。
需要在安裝 Oracle 軟件前自動設(shè)置系統(tǒng)。例如,您可以編寫一個腳本來檢查 OS 的初始狀態(tài)并報告安裝軟件前必須滿足的任何前提條件。該腳本還可以創(chuàng)建相關(guān)的 OS 用戶和組并為用戶設(shè)置環(huán)境變量。
可以使用正在運(yùn)行的 Oracle 數(shù)據(jù)庫來執(zhí)行手動或計劃的任務(wù)。但在數(shù)據(jù)庫未 運(yùn)行時需要運(yùn)行某些任務(wù)。可以使用腳本停止或啟動數(shù)據(jù)庫(以及偵聽器或相關(guān)的數(shù)據(jù)庫進(jìn)程)。無法從數(shù)據(jù)庫內(nèi)部啟動此類動作。
您需要一種監(jiān)視數(shù)據(jù)庫狀態(tài)(例如,是否正在運(yùn)行并可進(jìn)行進(jìn)程查詢)的機(jī)制。這樣的腳本還可以監(jiān)視非特定于 Oracle 的其他進(jìn)程和資源,從而提供系統(tǒng)當(dāng)前運(yùn)行情況的更詳細(xì)信息。
需要將備份自動化。Oracle Recovery Manager (RMAN) 是一個用于開發(fā)可以在任何平臺上運(yùn)行的備份腳本的實用程序??梢詮?shell 腳本中調(diào)用 Oracle Recovery Manager 并使用它執(zhí)行各種備份和恢復(fù)活動。
您可能有一個并非特定于某個數(shù)據(jù)庫的要求。您可能在一臺計算機(jī)上安裝了多個數(shù)據(jù)庫。建議您不要使用單個數(shù)據(jù)庫滿足此要求,因為那樣會引發(fā)潛在的安全性問題。在這些情況下,shell 腳本提供了一種既可以滿足此要求又不會將進(jìn)程與單個數(shù)據(jù)庫關(guān)聯(lián)的方法。
什么情況下不 使用 Shell 腳本
Oracle 數(shù)據(jù)庫包含了超出 RDBMS 傳統(tǒng)定義的功能。與軟件的任何其他部分一樣,它使用操作系統(tǒng)提供的資源,但它所“看到”并“更改”其環(huán)境的程度遠(yuǎn)遠(yuǎn)超過了其他軟件。SQL 和 Oracle 的固定視圖從數(shù)據(jù)庫內(nèi)部提供了系統(tǒng)視圖,而 shell 腳本從數(shù)據(jù)庫外部提供了系統(tǒng)視圖。Shell 腳本并不是適用于所有問題的解決方案。
必須意識到,操作系統(tǒng)的許多方面可以從數(shù)據(jù)庫內(nèi)部進(jìn)行監(jiān)視和修改??梢允褂?Oracle 的固定視圖(帶 v$ 前綴的視圖)確定計算機(jī)的主機(jī)名 (v$instance) 或數(shù)據(jù)庫正在其中運(yùn)行的平臺的名稱 (v$database)。還可以通過這種方式確定與數(shù)據(jù)庫相關(guān)的文件的位置和其他屬性??梢灾苯訌臄?shù)據(jù)庫中查詢數(shù)據(jù)文件(v$datafile、dba_data_files)、臨時文件(v$tempfile、dba_temp_files)、重做日志 (v$logfile)、存檔日志 (v$archived_log) 和控制文件 (v$controlfile) 的位置和其他屬性??梢酝ㄟ^該視圖以及通過查看某些 init.ora 參數(shù)(db_recovery_file_dest、db_recovery_file_dest_size)確定有關(guān)閃回恢復(fù)區(qū) ($recovery_file_dest) 的信息。還可以查詢進(jìn)程 (v$process) 和內(nèi)存(v$sga、v$sgastat 等)的狀態(tài)。有各種內(nèi)置的 PL/SQL 程序包,并能夠創(chuàng)建允許對底層 OS 進(jìn)行其他訪問的 Java 和 C 數(shù)據(jù)庫對象。
如果您正在考慮為一個需要大量數(shù)據(jù)庫訪問的任務(wù)編寫腳本,則腳本可能并不是最佳選擇。本文的稍后部分將介紹如何使用 SQL*Plus 訪問數(shù)據(jù)庫,但在很多情況下,使用其他語言可以更好地解決此問題。
下表歸納了可以從數(shù)據(jù)庫中訪問的信息:
服務(wù)器/操作系統(tǒng)信息
服務(wù)器標(biāo)識
典型查詢
附注
實例運(yùn)行在的主機(jī)的名稱
select host_name
from v$instance;
也可以通過從 bash 運(yùn)行以下命令來獲得該信息:
hostname
或
uname –n
操作系統(tǒng)平臺
select platform_name from v$database –-(10g)
如果運(yùn)行 uname –s,則將返回類似信息
文件信息
Oracle 文件位置
典型查詢
附注
控制文件
select name
from v$controlfile;
數(shù)據(jù)庫控制文件的位置。init.ora 的參數(shù) control_files 也包含該信息。
數(shù)據(jù)文件
select file_name
from Dba_data_files;
數(shù)據(jù)庫數(shù)據(jù)文件的位置
臨時文件
select file_name
from Dba_temp_files;
數(shù)據(jù)庫臨時文件的位置
日志文件
select member
from v$logfile;
重做日志的位置
歸檔日志
select name
from v$archived_log
歸檔重做日志的位置。init.ora 的參數(shù) log_archive_dest_n 也包含該信息。如果數(shù)據(jù)庫不在 Archivelog 模式下,則該查詢將不返回結(jié)果。
閃回恢復(fù)區(qū)
select name
from v$recovery_file_dest
Oracle 10g 安裝用作閃回恢復(fù)區(qū)的目錄。init.ora 參數(shù) db_recovery_file_dest 也包含該信息。
由參數(shù)指示的文件系統(tǒng)上的其他訪問點(diǎn)
select *
from v$parameter
where value like ‘%/%‘
或
value like ‘%/%‘;
根據(jù) Oracle 數(shù)據(jù)庫安裝和版本的不同,該查詢的結(jié)果可能迥然不同。可能返回的參數(shù)有:
spfile
standby_archive_dest
utl_file_dir
background_dump_dest user_dump_dest
core_dump_dest
audit_file_dest
dg_broker_config_file1
dg_broker_config_file2
用編程的方式訪問文件系統(tǒng)
select directory_path from dba_directories
可以使用 Oracle UTL_FILE_DIR 參數(shù)和 DIRECTORY 數(shù)據(jù)庫對象訪問標(biāo)準(zhǔn)數(shù)據(jù)庫功能以外的文件。
進(jìn)程信息
處理器/進(jìn)程
典型查詢
附注
會話進(jìn)程
select p.spid, s.username, s.program
from v$process p, v$session s
where p.addr=s.paddr order by 2, 3, 1
可以將 spid 與 ps –ef 結(jié)果相關(guān)聯(lián),以將數(shù)據(jù)庫中的可用信息與給定進(jìn)程的操作系統(tǒng)信息進(jìn)行比較。
與并行相關(guān)的進(jìn)程
select slave_name, status
from v$PQ_SLAVE
Oracle 數(shù)據(jù)庫的很多方面(如加載、查詢、對象創(chuàng)建、恢復(fù)和復(fù)制)都可以利用并行來加快可以分割的活動。參數(shù) parallel_threads_per_cpu 設(shè)置實例的默認(rèn)并行度。
內(nèi)存信息
內(nèi)存
典型查詢
附注
程序全局區(qū)
select * from V$PGASTAT
參數(shù) pga_aggregate_target 用于為所有專用服務(wù)器連接配置內(nèi)存。
可以使用 vmstat 和 top 等 Linux 實用程序監(jiān)視內(nèi)存使用情況。
系統(tǒng)全局區(qū)
select * from v$sga
SGA_MAX_SIZE 和 SGA_TARGET 參數(shù)用于配置 Oracle 數(shù)據(jù)庫 10g 的動態(tài)內(nèi)存分配特性。還可以使用其他參數(shù)為特殊用途手動分配內(nèi)存。
同時,還有各種 Linux 實用程序可用于監(jiān)視內(nèi)存分配。
BASH 腳本
腳本要么作為自動進(jìn)程的一部分被調(diào)用(無需人為干預(yù)),要么以交互方式運(yùn)行(用戶根據(jù)提示執(zhí)行操作)。只要您擁有文件的執(zhí)行權(quán)限,便可以從命令行鍵入該文件的名稱來運(yùn)行它。如果您沒有文件的執(zhí)行權(quán)限,但擁有其讀取權(quán)限,則可以通過在腳本的前面加上 sh 來運(yùn)行該腳本。
如果腳本設(shè)計為在無用戶輸入的情況下運(yùn)行,則可以使用多種可選方法調(diào)用它??梢栽诤笈_運(yùn)行腳本,即使在斷開連接的情況下,您仍可以通過輸入以下形式的命令來運(yùn)行:
nohup /path_to_dir/myscript_here.sh &這對于需要很長時間才能完成的腳本很有用。at 命令可用于在將來執(zhí)行腳本,而 cron 可用于計劃要重復(fù)執(zhí)行的腳本。
以下示例介紹了提供視圖輸出(使用 echo)、循環(huán)、條件邏輯以及變量賦值等重要方面。
print_args.sh。參數(shù)是位于命令名右側(cè)并傳遞到腳本中的詞。要訪問第一個參數(shù),使用 $1 變量。$0 變量包含腳本本身的名稱。$# 變量包含腳本中的參數(shù)個數(shù)。一種迭代所傳遞的所有參數(shù)的便捷方法是使用 while 循環(huán)和 shift 命令。該命令使您可以迭代參數(shù)列表中的所有參數(shù)(而非保持無限循環(huán))。
while [ $# -ne 0 ]doecho $1shiftdone如果腳本將文件名作為參數(shù)(或提示用戶輸入文件名)并在后面讀取該文件,則建議您檢查其訪問性和可讀性。例如,涉及選擇備份控制文件的恢復(fù)腳本可能提示用戶選擇將在腳本后面部分中用于恢復(fù)文件的備份控制文件。if [ !-r $1 ]; then # not exists and is readableecho "File $1 does not exist or is not readable."exit;fi字符序列if [ !-r $1 ];是實際執(zhí)行測試的部分。如果方括號之間的內(nèi)容結(jié)果為 true,則將執(zhí)行位于 if 和 fi 之間的命令。實際測試顯示在方括號之間。驚嘆號用于對所執(zhí)行的測試取反。-r 選項檢查文件是否可讀。在這個特定示例中所要測試的是傳遞給腳本的第一個參數(shù)。通過使用另一測試 (-d ),可以檢查給定條目是否是目錄(參見 is_a_directory.sh)。
do_continue.sh。該示例是一個可用于讀取各種目的的用戶輸入的簡單、典型的命令序列。在運(yùn)行可能在某些無法從腳本內(nèi)部確定的條件下導(dǎo)致數(shù)據(jù)丟失或其他不好結(jié)果的進(jìn)程前,建議您增加一個提示,詢問用戶是否確實希望腳本執(zhí)行接下來的命令。以下示例詢問用戶是否要繼續(xù),從命令行讀取一個名為 doContinue 的變量并對求解用戶的輸入。如果用戶輸入的不是“y”,則告知該用戶腳本“將退出”且不執(zhí)行 if 代碼塊 (fi) 后的其他腳本。
doContinue=necho -n "Do you really want to continue?(y/n) "read doContinueif [ "$doContinue" != "y" ]; thenecho "Quitting..."exitfi只有擁有相應(yīng)權(quán)限和環(huán)境的用戶才能運(yùn)行給定腳本。在腳本中檢查試圖運(yùn)行腳本的用戶很有用。如果將命令括在單引號 (‘) 字符中,則將該命令的結(jié)果返回給腳本。以下示例在腳本中使用 whoami 檢索當(dāng)前登錄的用戶,并稍后使用 date 命令顯示日期。echo "You are logged in as ‘whoami‘";if [ ‘whoami‘ != "oracle" ]; thenecho "Must be logged on as oracle to run this script."exitfiecho "Running script at ‘date‘"為與 Oracle 數(shù)據(jù)庫交互而編寫的腳本有時需要輸入數(shù)據(jù)庫口令等機(jī)密信息。stty –echo 命令關(guān)閉屏幕響應(yīng),這樣為隨后的讀取命令輸入的信息就不會顯示在屏幕上了。在讀取機(jī)密信息并將其存儲在變量(以下示例中的 pw)中后可以使用 stty echo 重新打開顯示。stty -echoecho -n "Enter the database system password: "read pwstty echoOracle 腳本
某些文件位于給定 Oracle 安裝的固定位置??梢酝ㄟ^查看 /etc/oraInst.loc 文件獲得 Oracle 清單。/etc/oratab 文件標(biāo)識服務(wù)器上安裝的數(shù)據(jù)庫(和其他 Oracle 程序)。
get_inv_location.sh。該腳本不如前面的示例直觀。通過將該腳本劃分為幾組命令,您將更好的理解該腳本的構(gòu)成。
要確定清單位置,您將把 cat 命令(顯示文件的內(nèi)容)的結(jié)果輸送到 grep(一個打印匹配給定模式的行的實用程序)。您將搜索包含文字 inventory_loc 的行。
cat /etc/oraInst.loc | grep inventory_loc如果因有多個安裝而導(dǎo)致存在多個清單位置,則需要排除用 # 注釋掉的行。–v 選項排除 包含給定模式的行。cat /etc/oraInst.loc |grep -v "#"|grep inventory_loc
該命令的結(jié)果將如下所示:
inventory_loc=/u01/oraInventory可以使用 > 重定向命令將標(biāo)準(zhǔn)輸出重定向到一個文件。如果該文件不存在,則創(chuàng)建該文件。如果該文件已存在,則將其覆蓋。
cat /etc/oraInst.loc|grep -v "#"|grep inventory_loc > tmp一旦獲得表明信息庫位置的記錄后,您就要刪除該記錄等號前的部分。這次,您將 cat 命令的結(jié)果輸送到 awk(一種通常用于拆分可變長度字段的模式掃描和處理語言),這實際上是將字符串標(biāo)記化。–F 選項指示 awk 將等號用作分隔符。然后,打印該字符串的第二個標(biāo)記 ($2),它代表等號右側(cè)的所有內(nèi)容。其結(jié)果是我們要找的清單位置 (/u01/oraInventory)。cat tmp | awk -F= ‘{print $2}‘由于沒有必要保留臨時文件 (tmp),因此可以將它刪除。
rm tmplist_oracle_homes.sh。如果要確定給定數(shù)據(jù)庫的 ORACLE_HOME,則有多個可選方法。可以數(shù)據(jù)庫用戶的身份登錄,并對 $ORACLE_HOME 變量執(zhí)行 echo。還可以搜索 /etc/oratab 文件并選擇與給定實例關(guān)聯(lián)的名稱。該文件中的數(shù)據(jù)庫條目的形式如下$ORACLE_SID:$ORACLE_HOME:<N|Y>:以下單行代碼輸出條目(ORACLE_SID 為 TESTDB)的 ORACLE_HOME:cat /etc/oratab | awk -F:‘{if ($1=="TESTDB") print $2 }‘
但如果如果您需要對 /etc/orainst 文件中列出的每個 ORACLE_HOME 執(zhí)行操作該怎么辦?可以使用以下代碼段迭代這樣的列表。
dblist=‘cat /etc/oratab | grep -v "#" | awk -F:‘{print $2 }‘‘for ohome in $dblist ; doecho $ohomedonedblist 變量被用作數(shù)組。所有 ORACLE_HOME 路徑均由該變量保存。for 循環(huán)用于迭代該列表,并將每個條目賦給變量 ohome,然后將其發(fā)送到標(biāo)準(zhǔn)輸出。
search_log.sh。Oracle 產(chǎn)品生成各種日志,您可能要監(jiān)視它們。數(shù)據(jù)庫警報日志包含對數(shù)據(jù)庫操作至關(guān)重要的消息。當(dāng)安裝或卸載產(chǎn)品以及在應(yīng)用補(bǔ)丁時也會生成日志文件。以下腳本迭代以參數(shù)形式傳遞給它的文件。如果發(fā)現(xiàn)任何包含 ORA- 的行,則向指定的接收者發(fā)送電子郵件。
cat $1 | grep ORA- > alert.errif [ ‘cat alert.err|wc -l‘ -gt 0 ]thenmail -s "$0 $1 Errors" administrator@yourcompany.com < alert.errfi執(zhí)行的具體測試是統(tǒng)計文件 alert.err(在您重定向到 alert.err 時寫入)中存在的單詞數(shù)。如果單詞數(shù) (wc) 大于 (-gt) 零,則執(zhí)行 if 代碼塊。這該示例中,您使用 mail(也可以使用 send mail)發(fā)送郵件。郵件標(biāo)題包含所執(zhí)行的腳本 ($0)、搜索的日志名稱 ($1),郵件正文是與初始搜索 (ORA-) 匹配的行。
可以使用 ORACLE_HOME、ORACLE_BASE 和 ORACLE_SID 等環(huán)境變量找到不在 Linux 環(huán)境中固定位置的資源。如果管理 Oracle 電子商務(wù)套件 11i 應(yīng)用程序?qū)嵗?,則可以使用許多其他環(huán)境變量來定位資源。這些變量包括 APPL_TOP、TWO_TASK、CONTEXT_NAME 以及 CONTEXT_FILE 等。要查看您環(huán)境中的完整列表,執(zhí)行以下命令并查看生成的文件 (myenv.txt):
env > myenv.txt可以將這些環(huán)境變量的各種組合用作所搜索文件的位置。例如,可以將警報日志位置指定為$ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_$ORACLE_SID.log
根據(jù)該腳本中引入的原則,可以編寫一個更大的腳本并計劃定期執(zhí)行,該腳本將搜索警報日志(或其他所關(guān)注的文件)的內(nèi)容并在發(fā)生任何錯誤時發(fā)送電子郵件。然后,可以將日志內(nèi)容移動到其他文件,這樣就只將最新的錯誤消息通過電子郵件發(fā)送。
Oracle Recovery Manager 腳本。Oracle Recovery Manager (RMAN) 是一個可用于管理數(shù)據(jù)庫備份和恢復(fù)的實用程序。由于編寫的所有備份腳本都可以由 RMAN 運(yùn)行,即減少了平臺特定的代碼數(shù)量,因此它明顯簡化了多個平臺的管理。RMAN 可由底層操作系統(tǒng)調(diào)用并接受傳遞來的腳本。例如,冷 (cold.sh) 備份可能由以下腳本組成:
#!/bin/bashrman target / <<EOFshutdown immediate;startup mount;backup spfile;backup database;alter database open;delete noprompt obsolete;quit;EOF第 1 行表明您將使用 bash shell。第 2 行調(diào)用 Oracle Recovery Manager 并指定 OS 用戶登錄目標(biāo)數(shù)據(jù)庫(在環(huán)境變量 $ORACLE_SID 中指定)。該行后面的 <<EOF 表示將把隨后的命令傳遞到 RMAN 中去處理。最后一行上的 EOF 表示您已經(jīng)到了要傳遞到 RMAN 中的命令序列的結(jié)尾。然后,使用 RMAN 關(guān)閉數(shù)據(jù)庫、啟動并安裝數(shù)據(jù)庫并繼續(xù)備份服務(wù)器參數(shù)文件和數(shù)據(jù)庫的內(nèi)容。然后打開數(shù)據(jù)庫。隨后刪除比保留策略中指定的備份舊的任何備份。參見 RMAN 文檔,構(gòu)建與您的情況相關(guān)的備份。
晚間備份通常按計劃自動運(yùn)行??梢允褂靡韵旅钫{(diào)用以上腳本并將標(biāo)準(zhǔn)輸出的內(nèi)容發(fā)送到電子郵件地址:
sh cold.sh | mail -s"Backup `date`" administrator@yourcompany.com
同樣,可以從 shell 腳本內(nèi)部運(yùn)行其他 Oracle 實用程序。可以使用 tnsping 實用程序查看給定 Oracle 連接標(biāo)識符能否連接監(jiān)聽器。可以運(yùn)行該實用程序來檢查連接問題:
tnsping ptch04 |grep TNS-數(shù)據(jù)庫導(dǎo)出和導(dǎo)入(傳統(tǒng)的和數(shù)據(jù)泵)比較適合于編寫重復(fù)進(jìn)程腳本。
數(shù)據(jù)庫安裝。數(shù)據(jù)庫設(shè)置中涉及的許多步驟都可以實現(xiàn)自動化。在 Linux 上安裝 Oracle 10g 之前,需要運(yùn)行各種測試來驗證所需的最小程序包版本以及內(nèi)核參數(shù)的設(shè)置??梢允褂脦?–q 選項的 rpm 命令查詢程序包的版本。
rpm -q compat-libstdc++
可以通過查看 /proc“虛擬”或“偽”文件系統(tǒng)確定系統(tǒng)的各個方面。但它不包含實際的文件,而是包含可以查看的運(yùn)行時系統(tǒng)信息(就好像位于文件中一樣)。例如,/proc/meminfo 包含系統(tǒng)的內(nèi)存信息,而 grep MemTotal /proc/meminfo 顯示系統(tǒng)的內(nèi)存總量。通過使用 awk(與前面的操作相同),可以分割內(nèi)存數(shù) (KB),具體方法如下:
grep MemTotal /proc/meminfo | awk ‘{print $2}‘可以在進(jìn)行相應(yīng)的比較和響應(yīng)(甚至更新系統(tǒng)本身)的腳本上下文中使用這樣的命令。示例腳本 10gchecks_kernel.sh 和 10gchecks.sh 只顯示基于 Oracle 文檔的當(dāng)前和建議的版本和設(shè)置。
數(shù)據(jù)庫監(jiān)視。可以使用 ps 命令報告進(jìn)程狀態(tài)并檢查數(shù)據(jù)庫、監(jiān)聽器、腳本或任何其他相關(guān)進(jìn)程是否正在運(yùn)行。如果要列出服務(wù)器上當(dāng)前運(yùn)行的所有數(shù)據(jù)庫,可以運(yùn)行以下命令:
echo "‘ps -ef | grep smon|grep -v grep|awk ‘{print $8}‘| awk -F \"_\"‘{print$3}‘`"盡管該命令可以正常運(yùn)行,但一下子理解起來有點(diǎn)困難。第一個命令 ps(使用 -ef 選項獲得所有進(jìn)程的完整列表)查找在服務(wù)器上運(yùn)行的所有進(jìn)程。第二個命令 grep 搜索 SMON(Oracle System Monitor 后臺進(jìn)程),它顯示數(shù)據(jù)庫正在運(yùn)行。您要刪除引用正在運(yùn)行的 grep 命令的條目。然后,使用 awk 找到列表中的第八列,其中包含 ora_smon_<oracle_sid> 形式的系統(tǒng)監(jiān)視器進(jìn)程名稱。然后,awk 的最后一個實例使用下劃線字符作為分隔符來搜索并打印擁有此 SMON 進(jìn)程的數(shù)據(jù)庫名稱。下劃線字符需要括在引號中,并在每個引號之前使用一個反斜杠將這些引號轉(zhuǎn)義(因為整個字符串顯示在一組雙引號中)。
exec_sql.sh。正如前面指出的,如果用戶擁有 sqlplus 的訪問權(quán)限,便可以從 shell 腳本中查詢數(shù)據(jù)庫。以下示例返回當(dāng)前在數(shù)據(jù)庫中保持會話狀態(tài)的計算機(jī)列表(由空格分隔):
#!/bin/bashoutput=‘sqlplus -s "/ as sysdba" <<EOFset heading off feedback off verify offselect distinct machine from v\\$session;exitEOF‘echo $output因為您將命令輸入到其他程序中,所以該腳本類似于前一個 RMAN 腳本。以 sysdba 的身份與數(shù)據(jù)庫建立一個經(jīng)驗證的本地 OS 連接。為防止返回不必要的消息,該腳本關(guān)閉 SQL*Plus 的 heading、feedback 和 verify 選項。執(zhí)行查詢并退出 SQL*Plus。
注意視圖名稱中 $ 之前的雙反斜杠。它們是字符串中所需的轉(zhuǎn)義序列:第一個反斜杠轉(zhuǎn)義第二個反斜杠,后者轉(zhuǎn)義 $。盡管并不好看,但卻很實用。
正如前面指出的,如果要編寫需要廣泛數(shù)據(jù)庫訪問權(quán)限的代碼,那么 shell 腳本并不是最佳選擇。用 PL/SQL、Perl(使用類似于 shell 腳本中使用的語法)、Python、Java 或隨便其他什么語言重寫腳本可能會更好。
結(jié)論
Shell 腳本是快速自動化重復(fù)和易出錯管理任務(wù)的有效工具。本文提供的示例介紹了可能會出現(xiàn)的可能性,但還遠(yuǎn)遠(yuǎn)算不上全面。每個系統(tǒng)都有不同的特征和缺陷以及獨(dú)特的配置。管理員將開發(fā)獨(dú)特的解決方案來滿足特定系統(tǒng)的需要。
Casimir Saternos 是 Oracle 認(rèn)證 DBA、IBM 認(rèn)證企業(yè)開發(fā)人員和 Sun 認(rèn)證 Java 程序員,現(xiàn)住賓夕法尼亞州阿倫敦。
將您的意見發(fā)送給我們