QNAP NASでMySQL(MariaDB)のデータを定期バックアップする

QNAP NASのDBを定期バックアップする方法

QNAP NASをWEB+DBサーバとして使用していて、DBのデータを定期的に外部にバックアップする方法。

  1. 外部ストレージの作成
  2. バックアップシェルの作成
  3. シェル定期実行の設定(cron)
  4. cron設定を有効化

構成

今回は、以下の構成を例に実施する。

  • TS-231P(バックアップ元)
    • MariaDB(ほぼMySQL)
    • QTS 4.3.3(LinuxベースのQNAP独自OS)
  • 同一LAN内の共有ストレージ(バックアップ先)

外部共有ストレージの作成

まず、保存先の外部共有ストレージを準備する。
これは、QNAP NASと同一LAN内で共有されていれば何でも良い。

\\IPアドレス\共有フォルダ名でアクセスできること。

ここでは例として、以下の共有フォルダを作成する。

\\192.168.1.XXX\test

バックアップシェルの作成

ここからはQNAP NAS側の設定。

  1. まず、Tera Termなどで、NASにSSH接続する。
    NASへSSH接続する

  2. 以下のコマンドでシェルスクリプトの作成を開始する。

    # mkdir -p /mnt/HDA_ROOT/backup/sqldata :作業用ディレクトリ作成
    # vi /mnt/HDA_ROOT/backup/backupsql.sh :シェルスクリプト作成開始

    ※ 注意!!!
    上記の作業場所は任意の場所で構わないが、QNAP NASのデフォルト仕様では、再起動で初期化されるディレクトリがあるので注意!(というか、ほとんどの場所が初期化される)

  3. シェルスクリプトの内容は以下の通り。

    umask 077
    
    dirpath='/mnt/HDA_ROOT/backup/sqldata'
    
    filename=`backup +%y%m%d`
    
    mount -t cifs -o username=[USER_NAME],password=[PASSWORD] //192.168.1.XXX/test $dirpath
    
    /mnt/ext/opt/mariadb/bin/mysqldump --opt --all-databases --events --default-character-set=binary -u [DB_USER] --password=[DB_PASS] | gzip > $dirpath/$filename.sql.gz
    
    find $dirpath/*.gz -mtime +60 | xargs rm -f
    
    umount $dirpath

    シェルスクリプトの解説:

    umask 077
    作成ファイルを所有者のみアクセス可能とする
    dirpath='/mnt/HDA_ROOT/backup/sqldata'
    SQLデータの保存先ディレクトリ
    filename=`backup +%y%m%d`
    SQLデータの保存ファイル名生成
    mount -t cifs -o username=[USER_NAME],password=[PASSWORD] //192.168.1.XXX/test $dirpath
    保存元に保存先をマウント
    [USER_NAME]、[PASSWORD]は保存先の認証を設定
    /mnt/ext/opt/mariadb/bin/mysqldump --opt --all-databases --events --default-character-set=binary -u [DB_USER] --password=[DB_PASS] | gzip > $dirpath/$filename.sql.gz
    SQLデータをファイルに出力し圧縮する
    [DB_USER]、[DB_PASS]はDBの認証を設定
    find $dirpath/*.gz -mtime +60 | xargs rm -f
    60日以前のバックアップデータを削除
    umount $dirpath
    保存先をアンマウント

シェル定期実行の設定(cron)

さいごに、作成したシェルを定期実行させる設定を行う。

Linuxにはcronと呼ばれる自動実行用デーモンプロセスがあるので、それを利用する。

通常はcrontab -eコマンドで設定を編集できるが、QNAP NASの場合、上記の初期化問題で、このコマンドは使えない。

代わりに以下のコマンドで編集を開始する。

vi /etc/config/crontab

編集モードになったら、以下の一文を追加する。

0 0 * * 6 /mnt/HDA_ROOT/backup/backupsql.sh

コードの解説:

cronの設定(書き方)は、数字、左から「分」「時」「日」「月」「曜日」を意味している。
指定なしの場合は*(アスタリスク)を記入する。

項目
0-59
0-23
1-31
1-12
曜日 0-7
(0:日、1:月、2:火、3:水、4:木、5:金、6:土、7:日)

よって、上記コードの場合は、毎週土曜日の0時に実行となる。

cron設定を有効化

バックアップを定期実行するため、以下の方法でcron設定を有効化する。

  • NASを再起動
  • cronを再起動

NASを再起動

NASを再起動すれば、/etc/config/crontabの内容がデーモンプロセスに反映されるので、再起動後にスケジュール通り定期実行されるようになる。

cronを再起動

何らかの理由でNASを再起動したくない場合は、以下のコマンドを実行し、cronのデーモンプロセスを再起動する。

# cp -p /etc/config/crontab /tmp/cron/crontabs/admin
# /etc/init.d/crond.sh restart

コマンドの解説:

# cp -p /etc/config/crontab /tmp/cron/crontabs/admin
保存用設定ファイルを実行用設定ファイルにコピー
# /etc/init.d/crond.sh restart
cronを再起動(設定が反映される)

まとめ

QNAP NASのOSはLinuxベースとは言え、動作が独特なので、注意したい。

投稿者: Output48

中学生の時に初めてHTMLに触れてからホームページ制作を独学で始める。 ベンチャー企業の営業、大手企業のPG・SEを経て、独立。 現在はとある企業のCTOと、変な名前の会社の社長をしてる。

「QNAP NASでMySQL(MariaDB)のデータを定期バックアップする」への3件のフィードバック

  1. 以下の行が正常に動作していないのか古いファイルが消えてくれません。
    find $dirpath -mtime +60 | xargs rm -f
    うーん、何がおかしいのか・・・
    find $dirpath -mtime +60だけ実行しても何も出力されません。
    タイムスタンプもおかしくないし原因が分かりません。

      1. >acrolith 様
        コメント有難うございます。

        findの$dirpathに「/*.gz」を付けたしたら動作しました

        大変失礼しました!!
        記事を修正しておきます。

acrolith へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください