LinuxユーザーがイジるはじめてのAzure

LinuxユーザーがAzureを使いこなせるように応援するブログです

Azure DB for PostgreSQL の バックアップ・リストアを試す

タイトルにあることを考えると、大抵以下のサイトに行きつくと思う。

https://docs.microsoft.com/ja-jp/azure/postgresql/concepts-backup

 

が、なんだかよく読んでいると???になってくることもw

 

フルバックアップは毎週で差分バックアップは1日に2回行ってて、でもリストアする時は日時だけじゃなく時分秒まで設定を入れてポイントインタイムリストアできると。。はてww 復元されたデータのタイミングはどこの静止点になるんだ?と。

 

オンプレでは主にpg_dumpやpg_dumpallをcronに登録しておいて、決まった日時や曜日、1日に1回、などなどデータベースのダンプバックアップファイルを別のNASへ配置しておき、何か想定外のことが起きればNASにあるdumpファイルから空のPostgreSQLの環境へスキーマ毎復元、みたいなことをやると思います。

 

が、Azure DB for PostgreSQLでは、「決めらている静止点」での復元になるのか、「選択可能な静止点」での復元なのかが、モヤっとしますね。

 

ということで試しましょ。

 

 まずはDB for PostgreSQLをデプロイ。

f:id:akazure:20200323151202j:plain

※USリージョン使っているのに特に意味はないです。

 

つづいてバックアップ設定。

f:id:akazure:20200323151405j:plain

※デフォではバックアップの保有期間が7日になっていたので、14日に変更。

※今回は同一リージョン内での復元をするのでローカル冗長。

 

接続元は特定のVMからにしたいのでDB for PostgreSQLに付いているファイアウォール機能を使い、SSL接続は無効に。(手っ取り早く疎通取りたかっただけ)

f:id:akazure:20200323151600j:plain

 

で、とりあえずDB側の設定は終わりで、続いてクライアント側からは定期的にデータをぶち込むスクリプトを用意。

※パスワードは環境変数でPGPASSWORDに入れてある。

デバッグ用のechoは無視してOK)

 

#!/bin/sh

COUNT=1
while :
do
        DATENOW=`date`
        WORD="insert into test values (${COUNT}, '${DATENOW}');"
        psql --host=postgresqltest001.postgres.database.azure.com --port=5432 --username=azure01@postgresqltest001 --dbname=postgres -c "${WORD}"
        echo "${COUNT} , ${DATENOW}"
        echo "${WORD}"
        COUNT=`expr ${COUNT} + 1`
sleep 300
done

 

ちなみに事前にpostgreSQL 11はインストールしてあるのでpsqlのパスは通ってる前提。

yum -y install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

 

yum -y install postgresql11-server postgresql11-contrib

 

で、DB for PostgreSQLへ接続して放置してあったデータの一覧を見るとこんな感じで見える。

f:id:akazure:20200323152409j:plain

※最初の1,2,1,2,3は何度かリランした残骸なので無視してw

 

こんな感じのデータが約8日間、ずっと5分毎にinsertされまくってる状態。

ということで、2020年3月20日の15:00の時点で復元を試みてみよう。

 

リストアは簡単。postgreSQLのOverviewにある上段の「復元」タブを押して日付と復元した後の新しいpostgresサーバー名を入力するだけ。

f:id:akazure:20200323154229j:plain

 

復元が終わるとこんな感じでDB for PostgreSQLのリソース2つ目ができます。

f:id:akazure:20200323155132j:plain

 

おしおし、ってことで早速DBに登録されている最新レコードが何時何分のものなのか見たくなるのですが、復元した直後の状態はファイアウォール設定がコピーされない状態で復元されるので、再度設定してあげます。

不便じゃーって思う人も多いかもしれませんが、仮にSQLインジェクションが発見されて落ちてしまったDB for PostgreSQLを復元させると、復元と共にまた脆弱性をつつかれる、みたいなことにならないようネットワークレイヤの設定とDB設定は別にされているのかもしれませんね。

 

f:id:akazure:20200323161136j:plain

 

おおう、すばらしい。直前まで書き込んでいたデータがちゃんと反映されてますね。あ、ちなみにpostgres側のユーザーやパスワードはリセットされませんので、そのまま今までのものが引き継がれます。

 

いや、でもたまたま15:00にバックアップ取られていただけでタイミングよかったからじゃね?という小悪魔な自分が囁き始めたので、今度は3月18日の16:50での復元を試してみました。結果は以下。

f:id:akazure:20200323170735j:plain

 

すんばらしい、よくできている。

てことで、バックアップは設定した直後からバックアップはされますが、保持期間の間であれば任意な時間で復元が可能ということがわかります。