目錄
1.背景
已知生產環境有一套兩節點Oracle 12cR2 RAC,長期運行後監聽日誌文件過多,佔用大量磁盤,需要配置定時任務,自動截斷、備份、清理監聽日誌。
1.1Oracle 12cR2 RAC監聽有哪些
在兩個節點上,查看監聽進程:ps -ef | grep tnslsnr| grep -v grep。
可以看到兩個節點上都有"LISTENER"本地監聽、"ASMNET1LSNR_ASM"監聽(Cluster ASM listener),節點1上還有"LISTENER_SCAN1"(SCAN監聽),節點2上還有"MGMTLSNR"(管理資料庫監聽)。
[grid@ora12cnode1 ~]$ ps -ef | grep tnslsnr| grep -v grep
grid 21591 1 0 2018 ? 1-03:15:00 /u01/app/12.2.0/grid/bin/tnslsnr LISTENER_SCAN1 -no_crs_notify -inherit
grid 50594 1 0 2018 ? 05:51:15 /u01/app/12.2.0/grid/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit
grid 50732 1 0 2018 ? 2-00:02:26 /u01/app/12.2.0/grid/bin/tnslsnr LISTENER -no_crs_notify -inherit
[grid@ora12cnode2 ~]$ ps -ef | grep tnslsnr| grep -v grep
grid 41881 1 0 2018 ? 05:48:36 /u01/app/12.2.0/grid/bin/tnslsnr ASMNET1LSNR_ASM -no_crs_notify -inherit
grid 42662 1 0 2018 ? 17:12:22 /u01/app/12.2.0/grid/bin/tnslsnr LISTENER -no_crs_notify -inherit
grid 42689 1 0 2018 ? 00:25:35 /u01/app/12.2.0/grid/bin/tnslsnr MGMTLSNR -no_crs_notify -inherit
1.2Oracle 12cR2 RAC監聽日誌文件有哪些
- 監聽alert日誌文件:$ORACLE_BASE/diag/tnslsnr/$HOSTNAME/listener_name/alert目錄下的*.xml文件
- 監聽trace日誌文件:$ORACLE_BASE/diag/tnslsnr/$HOSTNAME/listener_name/trace目錄下的listener_name.log
本文重點是對監聽trace文件listener_name.log進行截斷、備份、清理。關於監聽alert日誌文件.xml,請參考:Linux定時清理Oracle alert、trace、audit等日誌文件。
2.腳本文件
/home/grid/adminShellScripts/purge_listener_logs.sh
#!/bin/bash
# Author: longfeiwlf
# Description: purge Oracle 12c RAC running listeners' trace log file
# Date: 2020-5-21
# Version: 1.1
#source user grid's environment
source /home/grid/.bash_profile
today=$(date +%Y%-m-%d-%H:%M:%S)
echo "========================================$today========================================="
#查找所有正在運行的監聽
listeners=$(ps -ef| grep tnslsnr | grep -v grep | awk '{print $9}')
echo "Listeners running on this host: $listeners"
#set log_status to "OFF" or "ON"
#"lsnrctl<<-EOF"連起來寫,中間沒有任何空格。開始的EOF前加上減號"-",就可以在結束的EOF前使用tab(注意不是空格)來縮進
function set_log_status(){
echo ""
echo "--------------------------set $1 log_status $2-----------------"
lsnrctl<<-EOF
set current_listener $1
show log_status
set log_status $2
show log_status
EOF
echo ""
}
#backup listener trace log and purge log files 180 days ago
function purge_log(){
echo "--------------------------purge $1-----------------------------"
time_now=$(date +%Y%m%d%H%M%S)
lsnr_trace_dir=$ORACLE_BASE/diag/tnslsnr/$HOSTNAME/${1,,}/trace
cd ${lsnr_trace_dir}
cp ${1,,}.log ${1,,}.log.${time_now}
cat /dev/null > ${1,,}.log
ls -lrth
find ${lsnr_trace_dir} -type f -mtime +180 -name "*.log.*"| xargs -t -I {} rm -f {}
}
#purge all running listener's logs
for lsnr in $listeners
do
echo "Purge listener $lsnr trace log now..."
set_log_status $lsnr "off"
purge_log $lsnr
set_log_status $lsnr "on"
done
echo "Purge listener trace logs done."
3.添加crontab任務計劃
在Oracle RAC節點1、節點2的grid用戶下,添加crontab任務計劃,每月1日02:00執行。
00 02 1 * * /home/grid/adminShellScripts/purge_listener_logs.sh >>/home/grid/adminShellScripts/purge_listener_logs.log 2>&1 &