EC2で構築したPostgreSQLデータベースを定期的にバックアップ。ローカルにもバックアップファイルをコピーする
今回やること
実際にEC2内で作成した構築環境↓
タイトルの通り定期的にバックアップファイルを作成して、ローカルにも同じ物をコピーしていきます。
今回やることを図で理解する
図のようなバックアップ作業を定期的に自動で行われるようにします。
自動バックアップの設定
1. EC2側の設定
EC2にログインして作業します。
バックアップファイルの保存用ディレクトリ作成
$ sudo mkdir -p /var/backup/ $ sudo chmod 777 /var/backup/
バックアップ用のディレクトリが作成されました。
バックアップ用シェルスクリプトの作成
PostgreSQLのDBをバックアップする「シェルスクリプト」を作成します。
#シェルスクリプトを保存するディレクトリの作成 $ sudo mkdir -p /var/backup_sh #実行する命令などを各種設定 $ sudo vi /var/backup_sh/pg_backup.sh #!/bin/bash # バックアップファイルを残しておく日数 PERIOD='+10' # 日付 DATE=`date '+%Y%m%d-%H%M%S'` # バックアップ先ディレクトリ SAVEPATH='/var/backup/' # 先頭文字 PREFIX='任意の文字' 例 'sample_app_backup' # 拡張子 EXT='.custom' # データーベース名 DBNAME='任意のDB名' 例 'sample_db' # バックアップ実行 pg_dump -Fc $DBNAME -f $SAVEPATH$PREFIX$DATE$EXT # 保存期間が過ぎたファイルの削除 find $SAVEPATH -type f -daystart -mtime $PERIOD -exec rm {} \;
シェルスクリプトのテスト
#権限付与 $ sudo chmod 755 /var/backup_sh/pg_backup.sh #シェルスクリプト実行 $ /var/backup_sh/pg_backup.sh
バックアップファイルが作成されているか確認。
$ ls /var/backup/ postgres-20200206-173203.custom
シェルスクリプトにより、バックアップが作成されました。
cronで定期的にバックアップをおこなう
「cron」コマンドを使うことで、指定した日時に任意の処理を実行できます。
cronを登録するには「crontab -e」コマンドを使います。「-u」オプションで実行するユーザーを指定します。
sudo crontab -e -u ユーザー名
一分おきにバックアップファイルが作成されているか、実行テストをしておきます。↓
*/1 * * * * /var/backup_sh/pg_backup.sh > /dev/null 2>&1
実行確認ができたら、「毎日4時11分にバックアップファイルが作成」されるように設定。↓
$ sudo crontab -e -u ユーザー名 11 4 * * * /var/backup_sh/pg_backup.sh > /dev/null 2>&1
2.ローカル側の設定
scpコマンドの説明
「scp」コマンドを使ってEC2のバックアップファイルをコピーします。
$ scp コピー元 コピー先
~/.ssh/configにSSH接続の設定をしている場合↓
~/.ssh/config Host sample_key_rsa Hostname xx.xxx.xx.xx Port 22 User hoge IdentityFile ~/.ssh/sample_key_rsa
この場合のscpコマンドの使い方は以下の通り↓
$ scp sample_key_rsa:~/test.txt ~/desktop
上記のコマンドの例でいうと、「EC2のtext.txtファイルをローカルのデスクトップへコピー」しています。
バックアップをローカルに定期的にコピーする設定
バックアップが取得できるかテスト
local #バックアップを保存するディレクトリ作成 $mkdir -p ~/myapp_backup/myapp_db #EC2のバックアップファイルのコピー $ scp sample_key_rsa:/var/backup/postgres-20200206-173203.custom ~/myapp_backup/myapp_db #確認 $ls ~/myapp_backup/myapp_db
ローカルでバックアップファイルを取得するシェルスクリプトの作成。
$ mkdir -p ~/myapp_backup/myapp_backup_sh/ $sudo vi ~/myapp_backup/myapp_backup_sh/backup.sh #!/bin/bash # バックアップファイルを残しておく日数 PERIOD='+10' # バックアップ先ディレクトリ SAVEPATH='/Users/user_name/myapp_backup/myapp_db/' # 保存期間が過ぎたローカルファイルの削除 find $SAVEPATH -type f -mtime $PERIOD -exec rm {} \; #最新のバックファイルの位置を取得 #EC2のバックアップファイル作成日時から、2時間以内のファイルを取得します。 LATESTFILE=`ssh sample_key_rsa find /var/backup/ -type f -mmin -120` #EC2の最新のバックアップファイルをローカルにコピー scp sample_key_rsa:$LATESTFILE $SAVEPATH
作成したら、実行権限をつけます。
$ sudo chomod 755 ~/myapp_backup/myapp_backup_sh/backup.sh
定期実行する設定
$ sudo crontab -e -u ユーザー名
EC2でバックアップファイルが作成された1時間後に、ローカルへコピーするようにします↓
11 5 * * * Users/user_name/myapp_backup/myapp_backup_sh/backup.sh > /dev/null 2>&1
これで設定が完了しました!