wgetとtarをワンライナーで行う

wgetで~.tar.gzといったファイルをダウンロードしてきて、その次のコマンドで解凍・展開を行ってから、それをyum localinstallとかという手順を踏むことが多いと思います。
ダウンロードから解凍・展開までをワンライナーでやってしまうことができるので、書いておきます。

# wget -O - http://~.tar.gz | tar xvfz -

ダウンロードしてきたファイルが残らないというメリットがあります。シェルスクリプトでは、より便利かもしれません。

ファイルを一括で削除

ログファイルや一時利用ファイルなどを一括で削除するコマンド。 条件としては、次のようなものとします。

特定のディレクトリに存在するファイル タイムスタンプ(更新日)が7日前より古いファイル

実際のコマンドは、こんな感じになります。

find /data/files -maxdepth 1 -mtime +7 -print0 | xargs -0 rm -f

ファイル名、パス名にスペースが入る可能性を考えて、find に print0オプション、xargs に 0オプションを付ける。

mysqldumpリストア手順

mysqldumpファイルを/restore/tmp/mysqldumpファイル.sqlとしたとき、次のコマンドでリストアするというのが一般的に知られた方法です。

# mysql -u root < /restore/tmp/mysqldumpファイル.sql

果たして、実用上配慮すべきことも含めて、どうするのがベターなのかということを考えてみました。 実用上はmysqlをバイナリログを出力する設定で稼動させると思いますので、ある問題が発生します。 mysqldumpファイルのリストア処理で実行されるSQL文は相当の数になり、データベースに対する更新が大量に発生します。その実行結果として、バイナリログにメッセージが大量に吐き出され、バイナリログファイルが肥大化します。多くのケースでは歓迎されないことです。

という点に配慮すると、次のようにmysqlコマンドプロンプトに入り、そのセッションだけバイナリログを出力しない設定を行った上で、mysqldumpファイルをリストアするという方法がベター。

# mysql -u root -p -s ←オプション s を付ける Enter password: ←パスワードを入力 mysql> set sql_bin_log=OFF; ←このセッションでは、バイナリログ出力を行わない設定に変更 mysql> source /restore/tmp/mysqldumpファイル.sql mysql> quit

ちなみに、mysqlコマンドの sオプションは、mysqlプロンプトでの実行結果を表示しないようにするためのものです。これを指定しないと、”Query OK, 0 rows affected (0.00 sec)”などのメッセージが大量に画面に表示されることになります。

rsyncでバックアップ

ログファイルや設定ファイルなどをバックアップする際に、rsyncを使うと便利です。実際に、ローカルサーバ内でのコピーにもrsyncを使用して、さらにリモートのバックアップサーバにもrsyncで同期をとっています。 ここでは、そのバックアップのシェルスクリプトを紹介します。

なお、rsyncコマンドのエラーハンドリングは記述していません。ログ監視でいいのであれば、ここで紹介する例のままでいいかと思います。

またここでは、リモート側でもここで紹介するローカルバックアップを実行していることを前提としています。

1.ローカルバックアップのシェルスクリプト rsync_backup_local.sh

このシェルスクリプトでは、rsyncのオプションinclude-fromとexclude-fromに指定しているファイルが重要な役割を担っています。これら2つのファイルの内容を1つのファイルにまとめて記述して、それをinclude-fromあるいはexclude-fromオプションで指定しても、同じ動作をします。

rsync_backup_local.sh

#!/bin/sh rc_NG=1 backupfrom=/ backupto=/backup/local/ includelist=$(dirname $0)/../conf/rsync_include.list excludelist=$(dirname $0)/../conf/rsync_exclude.list ownname=$(basename $0) logfile=$(dirname $0)/../log/${ownname%.*}.log echo `date +’%Y/%m/%d %H:%M:%S.%3N’` “Start of rsync backup [” $ownname “]” >>$logfile if [ ! -e $includelist ]; then echo “[ERROR] includeリストファイル” $includelist “が見つかりません。” >>$logfile echo `date +’%Y/%m/%d %H:%M:%S.%3N’` “End of rsync backup [” 続きを読む »

2日前の日付を取得する

dateコマンドを使って、次のように簡単に。

# date -d “2 day ago” ‘+%Y-%m-%d’