ヘテムルで複数の MySQL をまとめて自動バックアップをする方法

取り方が分からないという人のためにシェルスクリプトをうまい具合に使って一元バックアップ管理する方法を紹介させて頂きます。バックアップのシェルスクリプト自体は既に作っている人がいて大変助かりました。

データベースのバックアップをする方法

先ほど紹介させて頂きましたサイトにシェルスクリプトが公開されていたと思いますが、これを持ってきて以下のようにバックアップ元のデータベースとバックアップ先のディレクトリ・ファイルをしっかり設定してあげれば後は example.sh といったファイル名で保存すれば良いです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/sh
 
# ---------- 設定 ----------
# バックアップ元のデータベース
db_host=mysql00.heteml.jp
db_name=_dbname
db_user=_dbname
db_pass=password
 
# バックアップ先のディレクトリ・ファイル
bk_dir=/home/sites/heteml/users/e/x/s/example/backup/mysql/example/
bk_file=$db_name
 
# 保存する日数
bk_days=30
 
# ---------- ファイル名を設定 ----------
# タイムスタンプを取得
ts_now=`date +%Y%m%d`
ts_old=`date "-d$bk_days days ago" +%Y%m%d`
 
# ファイル名を設定
file_temp=$bk_file.sql
file_backup=$bk_file.$ts_now.tar.gz
file_remove=$bk_file.$ts_old.tar.gz
 
# ---------- バックアップ処理 ----------
# バックアップ先のディレクトリに移動
cd $bk_dir
if [ $? != 0 ]; then
echo "Backup directory does not exist."
exit 1
fi
 
# データベースをダンプ
mysqldump -h$db_host $db_name -u$db_name -p$db_pass --opt > $file_temp
if [ $? != 0 -o ! -e $file_temp ]; then
echo "Cannot dump database."
exit 1
fi
 
# アーカイブを作成
tar cfz $file_backup $file_temp
if [ $? != 0 -o ! -e $file_backup ]; then
echo "Cannot archive files."
exit 1
fi
 
# テンポラリファイルを削除
rm -f $file_temp
 
# ローテーション処理
if [ -e $file_remove ]; then
rm -f $file_remove
fi
 
# ---------- 最適化処理 ----------
mysqlcheck -o -h$db_host -u$db_user -p$db_pass $db_name
 
exit 0

以上のファイルで指定したデータベースのバックアップができます。ヘテムルでは mysqldump が cron 実行時でしか動作しないため、直接スクリプトを起動しても失敗しますので注意が必要です。

データベースのバックアップをまとめて行う

これをひとつずつ作って、ひとつずつ cron を設定しても良いのですが、それでは貴重な cron の設定数が無駄になりますし、いちいちデータベース作るたびに設定するのがとても面倒ですよね。そのため、ひとつのファイルから複数のバックアップファイルを起動して一元管理しましょう。

まず、以下のようなディレクトリ構成をおすすめします。~/sh ディレクトリを作成して、そこにシェルスクリプトを今後入れていくことにします。今回は MySQL のバックアップを取るスクリプトを置くため、mysqlbackup というディレクトリを作成しました。

1
2
3
4
5
6
└── sh
    └── mysqlbackup
        ├── backup.sh
        ├── example.sh
        ├── example2.sh
        └── example3.sh

仕組みとしては backup.sh が複数のバックアップスクリプトを起動します。backup.sh の内容は以下のような感じですのでパスなどを変更して使ってください。

1
2
3
4
5
#!/bin/bash
 
sh /home/sites/heteml/users/e/x/s/example/sh/mysqlbackup/example.sh
sh /home/sites/heteml/users/e/x/s/example/sh/mysqlbackup/example2.sh
sh /home/sites/heteml/users/e/x/s/example/sh/mysqlbackup/example3.sh

ちなみにバックアップファイルの保存場所を以下のようにすると綺麗です。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
└── backup
    └── mysql
        ├── _example
        │   ├── _example.20110301.tar.gz
        │   ├── _example.20110302.tar.gz
        │   ├── _example.20110303.tar.gz
        │   └── _example.sql
        ├── _example2
        │   ├── _example2.20110301.tar.gz
        │   ├── _example2.20110302.tar.gz
        │   ├── _example2.20110303.tar.gz
        │   └── _example2.sql
        └── _example3
            ├── _example3.20110301.tar.gz
            ├── _example3.20110302.tar.gz
            ├── _example3.20110303.tar.gz
            └── _example3.sql

コメント

  1. PONYさんのコメント

    参考にさせていただきました、ありがとうございます!

    ただ現在のヘテムルの仕様だとcronでrmは実行出来ないようです。
    ですので古いファイルの削除を自動化できないため手動で行わなければいけなさそうですね。

    http://heteml.jp/support/faq/2085.html

    同様にmysqlcheckも使用出来ませんでした。