[Linux]メモ:Oracleトレースログのパッケージ【findコマンド】
サポートにエラー解析を依頼するとOracle のトレースログを取得するよう依頼されることがあります。
Oracleトレースログは特に障害中などは大量に出力されているので全量取得しようとするとそれだけですごい時間がかかります。
そのためエラーが含まれた近辺以降のログのみに絞って送ったほうが効率的です。
当日更新されたログをパッケージングするスクリプトです。
#!/bin/bash
# 変数未定義の場合異常終了
set -u
# 環境設定
DB_NAME=sparking
ORACLE_SID=sparking2
ADR_DIR=/u01/app/oracle
TRACE_DIR=${ADR_DIR}/diag/rdbms/${DB_NAME}/${ORACLE_SID}/trace
INCIDENT_DIR=${ADR_DIR}/diag/rdbms/${DB_NAME}/${ORACLE_SID}/incident
LOG_BASE=/work/logarc
LOG_DIR=${LOG_BASE}/`date +"%Y%m%d%H%m%S"`
# ディレクトリ作成
mkdir ${LOG_DIR}
if [ ! -d ${LOG_DIR} ] || [ ! -w ${LOG_DIR} ]; then
exit 1
fi
# サブディレクトリ作成
mkdir ${LOG_DIR}/trace
mkdir ${LOG_DIR}/incident
# コピー:アラート・ログ
cp -p ${TRACE_DIR}/alert_${ORACLE_SID}.log ${LOG_DIR}/trace/.
# コピー:トレース・ファイル
find ${TRACE_DIR} -type f -daystart -mtime -1 -exec cp -p {} ${LOG_DIR}/trace/ \;
# コピー:コア・ファイル
find ${TRACE_DIR} -maxdepth 1 -mindepth 1 -type d -name "cdmp*" -daystart -mtime -1 -exec cp -rp {} ${LOG_DIR}/trace/ \;
# コピー:インシデント・ファイル
find ${INCIDENT_DIR} -maxdepth 1 -mindepth 1 -type d -name "incdir*" -daystart -mtime -1 -exec cp -rp {} ${LOG_DIR}/incident/ \;
# アーカイブ
tar -zcf ${LOG_DIR}.gz -C ${LOG_BASE} ${LOG_DIR##*/}
echo "file: ${LOG_DIR}.gz"
# アーカイブ済みログディレクトリ削除
rm -rf ${LOG_DIR}
exit 0
最終更新日時のフィルタオプション
-mtime n :ファイルの最終更新日時が n 日前ならば、真を返す。
ファイルの最終アクセス日時が n 日前ならば、真を返す。
ファイルの最終更新日時が何日前かを計算する際、現在時刻との時間差を 24 で割った余りは切り捨てられる。+n : n を越える数であることを意味する。
-n : n 未満であることを意味する。
n : ぴったり n であることを意味する。
例:
-mtime -1 : 現在 ~ 24時間前(24時間前含まない) -mtime 1 : 24時間前(24時間前含む) ~ 48時間前(48時間前含まない) -mtime +1 : 48時間 以上前(48時間前含む)
-daystart :デフォルトでは時間を計算するときの基準を 今現在に置くが、 -daystart を指定すると、時間計算の基準が今日の 24:00 になる。
例:
-daystart -mtime -1 : 現在 ~ 本日0時(0時含む) -daystart -mtime 1 : 本日0時(0時含む) ~ 昨日0時間(0時含まない) -daystart -mtime +1 : 昨日0時間より前(0時含まない)
なんかdaystertオプションをつけると境目があいまいになった。
[oracle@rac-x2 work]$ ls -ltr
合計 0
-rw-r--r--. 1 oracle oinstall 0 8月 23 00:00 test08230000
-rw-r--r--. 1 oracle oinstall 0 8月 23 23:59 test08232359
-rw-r--r--. 1 oracle oinstall 0 8月 24 00:00 test08240000
-rw-r--r--. 1 oracle oinstall 0 8月 24 00:01 test08240001
-rw-r--r--. 1 oracle oinstall 0 8月 24 23:59 test08242359
-rw-r--r--. 1 oracle oinstall 0 8月 25 00:00 test08250000
[oracle@rac-x2 work]$
[oracle@rac-x2 work]$ date;find ./ -type f -daystart -mtime -1 -exec ls -l {} \;
2020年 8月 25日 火曜日 22:10:51 JST
-rw-r--r--. 1 oracle oinstall 0 8月 25 00:00 ./test08250000
[oracle@rac-x2 work]$ date;find ./ -type f -daystart -mtime 1 -exec ls -l {} \;
2020年 8月 25日 火曜日 22:10:56 JST
-rw-r--r--. 1 oracle oinstall 0 8月 25 00:00 ./test08250000
-rw-r--r--. 1 oracle oinstall 0 8月 24 23:59 ./test08242359
-rw-r--r--. 1 oracle oinstall 0 8月 24 00:01 ./test08240001
[oracle@rac-x2 work]$ date;find ./ -type f -daystart -mtime +1 -exec ls -l {} \;
2020年 8月 25日 火曜日 22:11:00 JST
-rw-r--r--. 1 oracle oinstall 0 8月 23 00:00 ./test08230000
-rw-r--r--. 1 oracle oinstall 0 8月 23 23:59 ./test08232359
[oracle@rac-x2 work]$
シンボリックリンク
オプション -P :シンボリックリンクをまったくたどらない。これがデフォルトの動作である。
シンボリックリンクをたどるようにするには -L オプションをつける。この場合-Lは最初のパス指定の前に置かなければならない。( find -L … というように最初に持ってくればよい)
-exec command ;
コマンドラインで指定されたこれ以降の引き数は; という引き数が現れるまで、 すべてコマンドに対する引き数と見なされる。文字列{} は、 それがコマンドの引き数中に現れるすべての場所で、現在処理中のファイル名に 置き換えられる。 find の一部の版とは違い、{}は引き数中の一ヶ所でしか使えないわけではない。 こうした構文の要素 (訳注: すなわち、{}’ と ;’) は、シェルによって 展開されないように、どちらも\’ でエスケープするなり引用符で囲むなりする必要があるかもしれない。
⇒ ;はエスケープ必要。{}はシェルで展開されないためエスケープは不要。
-maxdepth 1 -mindepth 1
-maxdepth levels:コマンドライン引き数として指定したパスから最大 levels 段階下の ディレクトリまで探索する
-mindepth levels:コマンドライン引き数として指定したパスから少なくとも levels 段階 ディレクトリを下降するまで、どんな判別式やアクションも行わない
⇒ -maxdepth 1 -mindepth 1と指定することで直下のディレクトリ(ファイル)のみ検索対象にしています。
maxdepthはディレクトリ内にバックアップ用のサブディレクトリを作っている場合を想定して。
mindepthを指定しないと指定したパス自体も検索対象になってしまうので。
どちらもなくてもいいんですが念のため。
引用はmanより