シェルスクリプト

概要 [#x05328ba]

apacheのmod_log_sqlを使用して、MySQLサーバーでログを管理している場合に、テーブルを一週間に一度リネームするシェルスクリプトです。

また、6ヶ月前のテーブルを削除します。

DATE03と04の-6monthの箇所を変更することで、期間を変更できます。

スクリプト実行日がその月の第何週かをcaseで取得してます。

mysqlのクエリ発行については特にエラー処理してませんが、存在しないテーブルであれば存在しないので削除しないで次のクエリへつながっていくので、特に問題ありません。

対象のデータベースはfor文でまわしているので、DB01にスペース区切りで羅列することで複数データベースを対象とすることもできます。

今回はaccess_logがテーブル名ですが、リネームしてもあとから自動的に作成されるような仕組みのテーブルであればこのスクリプトが使用可能です。

※mod_log_sqlの場合、テーブルが存在しないと、アクセスした際に自動的に作成してくれる。

内容 [#h44c82ce]

下記をcrontabへ登録。時間は変更しても問題無し。またシェルスクリプトの場所は任意の場所で。

 10 0 3,8,15,22,29 * * /root/delapachelog.sh
 #!/bin/bash
 
 ##### Weekly var
 DATE00=`date +%d`
 #DATE00=8
 
 case ${DATE00} in
         [0][1-7]|[1-7] )
         DATE01=_01
         ;;
         [0][8-9]|[8]|[9]|[1][0-4] )
         DATE01=_02
         ;;
         [1][5-9]|[2][0-1] )
         DATE01=_03
         ;;
         [2][2-8] )
         DATE01=_04
         ;;
         [2][9]|[3][0-1] )
         DATE01=_05
         ;;
 esac
 
 ###### Date Var
 DATE02=`date +%Y%m | cut -c3-`${DATE01}
 DATE03=`date +%Y%m --date '-6 month' | cut -c3-`${DATE01}
 DATE04=`date +%Y%m --date '-6 month' | cut -c3-`
 
 ##### DataBase Var
 #DB01="test01 test02 test03"
 DB01="データベース01 データベース02 データベース03"
 
 SQL01="rename table access_log to access_log_${DATE02};"
 SQL02="drop table access_log_${DATE03};"
 SQL03="drop table access_log_${DATE04};"
 
 ######  Rename table & drop table 6 month ago
 for ARG01 in ${DB01}
 do
 	mysql -u root -pパスワード ${ARG01} -e "${SQL01}"
 	mysql -u root -pパスワード ${ARG01} -e "${SQL02}"
 	mysql -u root -pパスワード ${ARG01} -e "${SQL03}"
 done