針對數據庫升級版本信息采集腳本編寫
【環境介紹】
系統環境:Linux + 11G+ 集群/單機
【背景描述】
需求:每個季度都會有數據庫漏洞掃描修復的事情,了解該掃描方式是根據數據庫版本來進行判斷是否當前數據庫版本是否修復相應漏洞。而已一般漏洞信息分DBMS/OJVM/GRID類型漏洞。如果是當前維護的數據庫,自己取數據庫版本信息比較容易,但是大多時候接到協助升級的時候收集信息比較麻煩。需要較快的采取數據庫版本信息和系統信息來進行寫方案或者判斷當前數據庫是否需要升級及風險判斷。
【監控優化過程及思路】
對於上面描述的問題:
1, 主機信息數據采集。 ----直接使用主機命令采集
主機名(方案),系統版本(方案及補丁集下載),IP信息(判斷主機IP信息),系統空間(是否滿足備份及升級空間)
2, 數據信息數據采集。 ----使用Oracle查詢信息
Opatch版本信息,數據庫lsinventory信息,數據庫one-of-patch信息,審計路徑(備份軟件排除審計日誌文件)
3, 數據結構分類。 ----單機、集群
【測試結果及腳本】
通過測試腳本。結果如下:
1, 主機數據信息:截圖如下:
2, 數據庫信息:截圖如下:
【采集數據腳本信息】
主要實現功能的腳本如下:
1, 使用shell進行數據處理,具體腳本解釋如下:
cat >oracle_message.sh
######################################################################
# oracle_message.sh
# This script is update check data
# Author CZT
######################################################################
#!/bin/bash
ORACLE_USER=`ps -ef |grep "ora_pmon_" |grep -v grep |head -1 |awk ‘{print $1}‘`
GRID_USER=`ps -ef |grep "asm_pmon_" |grep -v grep |head -1 |awk ‘{print $1}‘`
process_names=`ps -ef |grep "ora_pmon_" |grep -v grep |awk ‘{print $NF}‘`
process_asms=`ps -ef |grep "asm_pmon_" |grep -v grep |awk ‘{print $NF}‘`
instance_names=`echo ${process_names} |sed ‘s/ora_pmon_//g‘`
instance_names=`echo ${process_names} |sed ‘s/ora_pmon_//g‘`
instance_asm=`echo ${process_asms} |sed ‘s/asm_pmon_//g‘`
v_date=`date ‘+%Y-%m-%d %H:%M:%S‘ ` 》》》設置Oracle及grid的環境變量
function get_value_of_parameter{
parameter_name=${2}
typeset CONNECT_CMD=‘connect / as sysdba‘
typeset SQL_EXIT_OPT="whenever sqlerror exit sql.sqlcode"
typeset SQL_OPT="set echo off feedback off heading off underline off"
typeset SQL_CMD_CLUSTER=‘select value from v\$system_parameter where name=‘"‘${parameter_name}‘"
database_cluster=`su - ${ORACLE_USER} -c "export ORACLE_SID=${1};sqlplus -s /nolog <<!
${CONNECT_CMD}
${SQL_EXIT_OPT}
${SQL_OPT}
${SQL_CMD_CLUSTER};
!"`
echo $database_cluster} 》》》判斷數據庫是否為集群函數
function get_dba_registry_history{
typeset CONNECT_CMD=‘connect / as sysdba‘
typeset SQL_EXIT_OPT="whenever sqlerror exit sql.sqlcode"
typeset SQL_OPT="set linesize 200 pagesize 20 echo off feedback off"
typeset SQL_CMD_REGISTRY=‘select * from dba_registry_history‘
typeset SQL_CMD_VERSION=‘select * from v\$version‘
typeset SQL_CMD_AUDIT=‘show parameter audit_file_dest‘
su - ${ORACLE_USER} -c "export ORACLE_SID=${1};sqlplus -s /nolog <<!
col action format a20
col namespace format a10
col version format a28
col comments format a40
col action_time format a30
col bundle_series format a15
${CONNECT_CMD}
${SQL_EXIT_OPT}
${SQL_OPT}
${SQL_CMD_REGISTRY};
${SQL_CMD_VERSION};
${SQL_CMD_AUDIT};
!"} 》》》查詢數據庫字典信息函數
function get_asm_registry_history{
typeset CONNECT_CMD=‘connect / as sysasm‘
typeset SQL_EXIT_OPT="whenever sqlerror exit sql.sqlcode"
typeset SQL_OPT="set linesize 200 pagesize 20 echo off feedback off"
typeset SQL_CMD_AUDIT=‘show parameter audit_file_dest‘
su - ${GRID_USER} -c "export ORACLE_SID=${1};sqlplus -s /nolog <<!
col action format a20
col namespace format a10
col version format a28
col comments format a40
col action_time format a30
col bundle_series format a15
${CONNECT_CMD}
${SQL_EXIT_OPT}
${SQL_OPT}
${SQL_CMD_AUDIT};
!"} 》》》查詢+ASM實例審計路徑信息函數
function get_value_of_system{
echo -e ‘
==========================
Hostname
==========================
‘
hostname;
echo -e ‘
==========================
Systemrelease
==========================
‘
cat /etc/*release*;
echo -e ‘
==========================
System space
==========================
‘
df -h;
echo -e ‘(4)SYSTEM HOSTS‘
echo -e ‘
==========================
System hosts
==========================
‘
cat /etc/hosts;} 》》》采集主機信息數據函數
function get_value_of_database{
ORACLE_BASE=`cat /home/oracle/.bash_profile|grep -wi ‘export ORACLE_BASE‘|awk -F "[=:]" ‘{print $NF}‘`
ORACLE_HOME=`cat /home/oracle/.bash_profile|grep -wi ‘export ORACLE_HOME‘|awk -F "[=:]" ‘{print $NF}‘`
echo -e ‘
==========================
Opatch version
==========================
‘
su - ${ORACLE_USER} -c "${ORACLE_HOME}/OPatch/opatch version"
echo -e ‘
==========================
Opatch lsinventory
==========================
‘
su - ${ORACLE_USER} -c "${ORACLE_HOME}/OPatch/opatch lsinv"
echo -e ‘
==========================
Opatch lspatches
==========================
‘
su - ${ORACLE_USER} -c "${ORACLE_HOME}/OPatch/opatch lspatches"
}
###judge the current user if root,need to root run the script
if [ `whoami` = "root" ];then 》》》判斷使用root用戶執行該腳本
echo -e ‘ *** Start of LogFile *** ‘
echo -e ‘ Oracle Database Upgrade Statistics Geting ‘ $v_date
###check system state
echo -e ‘---------------------------------------------SYSTEM STATE-------------------------------------‘
###get system state
get_value_of_system
###judge the system have many instance
for instance in ${instance_names}
do
###judge the database cluster
v_database_cluster=`get_value_of_parameter ${instance} "cluster_database"`
if [ "${v_database_cluster}" == "TRUE" ];then
echo -e ‘
==========================
The Database Is RAC
==========================
‘
###check database state
echo -e ‘--------------------------------------DATABASE STATE------------------------------------‘
echo -e ‘
=============================================================================
The Database Is RAC 》》》判斷為集群架構
=============================================================================
‘
###get database opatch state
get_value_of_database 》》》調用采集數據庫信息函數
echo -e ‘
==========================
Dba Registry History
==========================
‘
get_dba_registry_history ${instance} 》》》調用采集數據庫信息函數
get_asm_registry_history ${instance_asm} 》》》調用采集ASM實例審計路徑函數
else
###check database state
echo -e ‘--------------------------------------------DATABASE STATE------------------------------------‘
echo -e ‘
=============================================================================
The Database Is Standlone 》》》判斷為單機架構
=============================================================================
‘
###get database opatch state
get_value_of_database
echo -e ‘
==========================
Dba Registry History
==========================
‘
get_dba_registry_history ${instance}
fi
done
echo -e ‘ ‘
echo -e ‘ *** End of LogFile *** ‘
else
echo "Please use root run the script"
fi
【問題思考】
1, 存在系統版本限制,該腳本適用於linux Solaris系統采集數據;
2, 存在數據庫版本限制,適用於11G版本數據庫采集數據;
3, 存在環境變量限制,Oracle用戶及grid用戶的profile需要采用標準的寫法設置變量。
【總結】:
1, 在對外部協助數據庫漏洞核查時,使用該腳本更加快捷的采集信息,對編寫方案及更快的對數據庫環境的大致了解對數據庫升級操作提供安全保障。
2, 本次腳本涉及使用root用戶執行腳本調用Oracle及grid用戶的變量,對用戶的變量設置標準有較大的要求。
針對數據庫升級版本信息采集腳本編寫