いわりょのBlog

IT関連で学んだことを書いていきます。

EC2で構築したPostgreSQLデータベースを定期的にバックアップ。ローカルにもバックアップファイルをコピーする

今回やることを図で理解する

f:id:Ryo10Leo:20200207005205p:plain

図のようなバックアップ作業を定期的に自動で行われるようにします。

自動バックアップの設定

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


これで設定が完了しました!