ORAchk是Oracle官方出品的Oracle產品健康檢查工具,可以從MOS(My Oracle Support)網站上下載,免費使用。這個工具可以檢查Oracle數據庫,GoldenGate,Oracle Enterprise Manager 12c、13c等Oracle產品,具體支持的產品和相關資料可以參考MOS文檔:ORAchk - Health Checks for the Oracle Stack (Doc ID 1268927.2)。
ORAchk支持所有主流平台,當然,對有些平台的支持並不是很完美,比如,對windows平台的支持是限定版本,而且需要安裝Cygwin這樣的軟件。最新版本的ORAchk對Oracle數據庫的版本支持是:10gR2,11gR1,11gR2,12cR1,12cR2。
ORAchk是一個命令行工具,運行後收集系統配置信息,同時按照預定義的規則,評估配置是否符合Oracle的最佳實踐,評估結果輸出為一份html格式的健康檢查報告,報告中會有所有檢查項的細節數據,以及根據規則給被檢查系統的一個綜合評分。雖然這個評分規則比較“簡單粗暴”,(所有檢查項的分值都一樣),但這個分數還是有一定意義的,起碼給領導或甲方看的時候,可以給出一個量化指標了,而且可以在不同的系統之間,或不同時間的同一個系統之間進行比較。
(ORAchk目前最新的版本是12.2.0.1.1,後續的例子裡都是這個版本)
ORAchk的執行比較簡單,下載軟件包(鏈接在上面提到的MOS文檔中),上傳到服務器,解壓縮,然後直接以root身份執行orachk,也可以用oracle軟件安裝用戶執行,在運行時會提問root口令,也可以選擇使用sudo或者略過需要使用root身份的檢查。
以檢查一套linux平台上的oracle 11.2.0.4 RAC為例:
ORAchk會自動識別CRS HOME,請用戶確認(當然,檢查單實例就沒有這個問題了),還會提問是檢查集群中的哪個數據庫。因為RAC的所有實例的主機都會執行檢查,如果以前沒有配置過root用戶的用戶等效性,還會自動幫你配置,也都比較簡單,跟著提示做就可以。檢查完成後,會生成一個打包文件,裡面包含最終的html格式的報告,以及相關的細節數據,報告的例子:
以上面的檢查為例,報告分5部分。Database Server章節主要是OS,ASM和數據據的檢查項,我們只要關注fail和warning的檢查項就可以了:
可以點擊“view”,查看檢查項的具體細節:
Patch Recommendation 是補丁建議:
Cluster Wide的檢查主要是檢查RAC節點之間的配置是否一致,比如時間、目錄屬主之類的
MAA 記分卡主要是檢查系統是否符合Oracle推薦的最大可用性架構:(什麼是最大可用性架構,不是本文的重點)
另外最耗時的10個檢查什麼的,我覺得沒什麼意義。
ORAchk可以配置成以後台進程模式,按照用戶定義的時間間隔,自動運行,同時把結果通過email的方式發送給用戶。
1. 配置orachk
使用orachk設置自動運行參數,有兩個參數是必須設置的:AUTORUN_SCHEDULE 和NOTIFICATION_EMAIL,設置的例子:
# ./orachk –set “AUTORUN_SCHEDULE=3 * * 0 ;[email protected]”
其中AUTORUN_SCHEDULE是運行的時間,含義是:AUTORUN_SCHEDULE=hour day month day_of_week
用*代表所有值,比如上面例子中“3 * * 0” 代表每個星期天的3點執行(0代表星期天,6代表星期六)
NOTIFICATION_EMAIL參數的值就是接受報告的郵箱地址。
2. 啟動後台進程
# ./orachk –d start
這種模式需要工具expect來處理root口令,避免多次交互輸入口令,這個工具的下載地址:http://expect.sourceforge.net/
Expect 安裝是源碼安裝,在linux平台上,需要tcl-devel 這個rpm包,安裝expect和tcl-devel 包的過程略。
ORAchk支持使用mailx和sendmail兩種方式發送郵件,為了外部郵箱能夠收到郵件,我使用了mailx的方式,在我的測試機上,安裝的是Oracle Linux 6.5,系統自帶mailx 12.4,為了保證能夠讓ORAchk使用mailx,需要保證系統上安裝了uuencode,sharutils rpm包裡面有這個工具。
另外,在/etc/mail.rc,增加下列配置行,主要是目前大部分外部smtp服務器都是需要認證才能發郵件,所以要給出認證信息:
如果一切正常,在orachk目錄下的orachk_daemon.log會有類似的字樣:
第一次的郵件報告就是一份html格式的報告,後續的報告會包含上一次的報告和本次報告,以及兩份報告的不同之處。
ORAchk的軟件包裡面還提供了一個web應用,用於管理健康檢查的結果,應用的名字叫Collection Manager(CM),在這個應用中,一次檢查被稱為一個Collection。
CM是一個Oracle APEX應用,Oracle APEX顯然不是這篇文章討論的問題,關於APEX的介紹及安裝部署會在其他文章介紹。
CM在導入APEX後,運行應用,登錄的界面是這個樣子的:
在系統中應用包含兩個樣例Collection,是在一個sample系統上運行的2次檢查。可以很直觀地看到最新一次的檢查,FAIL的檢查項31%,WARNING的檢查項31%,PASS的檢查項38%。
我們把我們實際的Collection上傳兩個:
直接上傳zip包,系統會自動在後台解壓縮並處理,需要花幾分鐘時間。
查看我們上傳的兩個不同系統的Collection:
點擊圖表,可以轉到具體信息頁面,比如我們點擊4%的紅色區域,會轉向這個頁面,除了能查看具體的檢查項信息外,還可以針對問題創建Ticket:
CM應用中應該算是自帶了一個事件管理系統,可以將檢查後發現的配置缺陷,當作一個事件,通過CM中的事件管理功能,進行追蹤管理:
另外這個應用還可以進行不同Collection的比較,也很方便。
從這個應用的內容看,官方希望的系統健康檢查流程應該是這樣的:
1. 客戶自助或服務商現場工程師運行orachk,生成Collection
2. 上傳Collection到CM應用,CM是部署在雲(公有或私有)上的
3. 客戶登錄系統查看、管理自己系統的檢查報告,不再需要服務人員提供檢查結果
4. 檢查出的問題可以使用CM應用來進行跟蹤管理
其實要真能這樣也不錯,但是個人覺得目前可能實現起來還有一些障礙:
1. Orachk和CM系統都沒有中文版,估計還得有服務商翻譯,可能最後還是要轉變成傳統的交付物。
2. Orachk目前檢查的內容還不能算全面,比如性能方面的數據
ORAchk支持自定義檢查項,用戶只要按照一定的規則,創建對應的XML配置文件,就可以讓ORAchk進行自定義檢查。
ORAchk的軟件包裡面提供了一個sample_user_defined_checks.xml,給出了幾個例子,而且有詳細的注釋,只要按照這個規則,生成user_defined_checks.xml,放在orachk所在的目錄,就可以讓orachk進行自定義檢查了。自定義檢查項目前支持兩種類型:OS 命令和SQL語句。下面我看一個SQL語句的自定義檢查:
這個檢查返回空閒空間比例小於10%的表空間的個數,為0是檢查通過,不為0是FAIL。
<?xml version="1.0" encoding="UTF-8"?>
<UserDefinedChecks
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="user_defined_checks.xsd"> <!-- Main Tag (root element)-->
<CHECK AUDIT_CHECK_NAME="Tablespace Utilization">
<!-- This check should run on all supported platforms and versions given the platform and version specs below -->
<ORACLE_VERSION>*</ORACLE_VERSION>
<PLATFORMS>
<PLATFORM TYPE="*">
<FLAVOR>*</FLAVOR>
</PLATFORM>
</PLATFORMS>
<PARAM_PATH>tbs_ut</PARAM_PATH> <!—注意這裡參數值需要和SQL_COMMAND中的返回字符串匹配-->
<SQL_COMMAND> <!—這個SQL返回空閒空間比例小於10的表空間的個數-->
<![CDATA[ select 'tbs_ut = '||count(*) from (select a.tablespace_name,
trunc(sum(a.tots) / 1024 / 1024, 2) Tot_Size_mb,
round(sum(a.sumb) / 1024 / 1024, 2) Tot_Free_mb,
round(sum(a.sumb) * 100 / sum(a.tots), 2) Pct_Free,
round(sum(a.largest) / 1024 / 1024, 2) Max_Free_mb,
sum(a.chunks) Chunks_Free
from (select tablespace_name,
0 tots,
sum(bytes) sumb,
max(bytes) largest,
count(*) chunks
from dba_free_space a
group by tablespace_name
union
select tablespace_name, sum(bytes) tots, 0, 0, 0
from dba_data_files
group by tablespace_name) a
group by a.tablespace_name)
where PCT_FREE < 10;]]> <!—注意大於號,小於號,等號都需要替換為XML能夠處理的字符-->
</SQL_COMMAND>
<SQL_COMMAND_REPORT>
<![CDATA[select 'Free PCT less 10% TBS = '||count(*) from (select a.tablespace_name,
trunc(sum(a.tots) / 1024 / 1024, 2) Tot_Size_mb,
round(sum(a.sumb) / 1024 / 1024, 2) Tot_Free_mb,
round(sum(a.sumb) * 100 / sum(a.tots), 2) Pct_Free,
round(sum(a.largest) / 1024 / 1024, 2) Max_Free_mb,
sum(a.chunks) Chunks_Free
from (select tablespace_name,
0 tots,
sum(bytes) sumb,
max(bytes) largest,
count(*) chunks
from dba_free_space a
group by tablespace_name
union
select tablespace_name, sum(bytes) tots, 0, 0, 0
from dba_data_files
group by tablespace_name) a
group by a.tablespace_name)
where PCT_FREE < 10;]]>
</SQL_COMMAND_REPORT>
<OPERATOR>=</OPERATOR>
<COMPARE_VALUE>0</COMPARE_VALUE> <!—操作符是等號,比較值是0,也就是說SQL返回0,代表pass,否則fail-->
<CANDIDATE_SYSTEMS>*</CANDIDATE_SYSTEMS>
<COMPONENT_DEPENDENCY>RDBMS</COMPONENT_DEPENDENCY>
<DATABASE_MODE>3</DATABASE_MODE> <!— 3代表open,2代表mount,1代表nomount-->
<DATABASE_TYPE>CDB:PDB:NORMAL</DATABASE_TYPE>
<DATABASE_ROLE>PRIMARY</DATABASE_ROLE>
<ALERT_LEVEL>FAIL</ALERT_LEVEL>
<PASS_MSG>The number of Tablespaces which free PCT less 10% is zero</PASS_MSG>
<FAIL_MSG>The number of Tablespaces which free PCT less 10% is not zero</FAIL_MSG>
<BENEFIT_IMPACT>
<![CDATA[ tablespace free pct should be more than 10% ]]>
</BENEFIT_IMPACT>
<RISK>
<![CDATA[ leak of space ]]>
</RISK>
<ACTION_REPAIR>
<![CDATA[ add datafile or resize datafile ]]>
</ACTION_REPAIR>
<LINKS>
<LINK></LINK>
</LINKS>
</CHECK>
<!-- END USER DEFINED CHECKS -->
</UserDefinedChecks>
自定義檢查項,可以和其他檢查項一起執行,也可以單獨執行,單獨執行自定義檢查項的語法是:
# ./orachk –profile user_defined_checks
下面是自定義檢查項報告樣例:
如果你覺得這樣寫XML麻煩,還可以使用CM應用來生成自定義檢查項的XML文件,菜單路徑:Administration -> “+ Add New User Defined Checks”
定義好後,可以生成XML文件並下載:
不過這個功能並不完善,缺乏必要得有效性檢查,如果想不出錯,還是要把XML得規則搞清楚,我個人還是比較喜歡手工寫XML。