今回の記事では、mysqldumpで複数のデータベースからデータをバックアップし、ついでに世代管理まで行うbashシェルスクリプトをシェアします。
このシェルスクリプトは以下に対応しています。
- 複数のデータベースのバックアップ
- 世代管理
- cronを使った自動バックアップ
mysqldumpとは
mysqldumpとは、MySQLに標準で付属しているバックアップユーティリティーのことです。現在のデータベースの構成・内容を完全にバックアップし、復元を可能にします。
以下、公式サイトから引用して和訳します。
mysqldump クライアントユーティリティは論理バックアップを実行し、オリジナルのデータベースオブジェクト定義とテーブルデータを再現するために実行できる SQL 文のセットを作成します。バックアップや別の SQL サーバへの転送のために、1 つ以上の MySQL データベースをダンプします。mysqldump コマンドは、CSV やその他の区切りテキスト、XML フォーマットの出力を生成することもできます。
https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html
mysqldumpするシェルスクリプト
cronでシェルスクリプトを自動実行させてバックアップしようとすると、データベースに接続するためのIDとパスワードをどこかに保存しておいてやる必要があるわけですが、シェルスクリプト本体にパスワードを書いてしまうと「コマンドラインにパスワードを書くな安全性に欠けるぞ」てな感じで以下のように怒られます。
[Warning] Using a password on the command line interface can be insecure.
そこで、データベースに接続するためのIDとパスワードを外部ファイルに保存してやり、シェルスクリプトと同じディレクトリに保存してやります。このファイルのファイル名は「dbaccess.cnf」としました。
[client]
user=user
password='passowrd'
次に本題のシェルスクリプトです。特に変わったことはやっていません。※30行目のパーミッションの変更は、私の運用の場合、バックアップファイルを別の場所に移す際のことを考えて行っているだけで必須ではありません。
#!/usr/local/bin/bash
# MySQL のバックアップ
# MySQL serverのホスト名
mysql_host=mysql.hogehoge.ne.jp
# バックアップの保存期間
period=2
# DBアカウント情報を保存した外部ファイルを指定
extra_file=/home/hoge/www/backup/script/dbaccess.cnf
# バックアップを保存するディレクトリ
dirpath='/home/hoge/www/backup'
# 取得対象のDBを配列で定義(スペース区切り)
array=(db_1 db_2 db_3)
for i in "${array[@]}"
do
# ファイル名
prefix="${i}_"
filename="${prefix}`date +%Y%m%d`.sql.gz"
# mysqldumpした後にgzipで圧縮する
/usr/local/bin/mysqldump --defaults-extra-file=$extra_file --no-tablespaces -h $mysql_host $i | gzip > $dirpath/$filename
# パーミッションの変更
chmod 0640 $dirpath/$filename
# 古いバックアップファイルを削除
oldfile="${prefix}`date -v-$(($period + 1))d +%Y%m%d`.sql.gz"
rm -f $dirpath/$oldfile
echo $filename
done
おわりに
今回はmysqldumpするシェルスクリプトを紹介しました。最後までお読みいただきありがとうございました。
コメント