Postgresqlのbackup実装
- 2. postgresql 9.4 のバックアップ計画
▸ バックアップ 【 backup 】
コンピュータの記憶装置に保存されたデータを別の装置や記憶媒体へ複製
して別に保管するもので、機器の故障や破損、人為ミス、不正行為などに
よってデータの消失や改変などが起こった場合に、複製した時点のデータ
に復旧させることができる。
▸ リストア 【 restore 】
ハードディスクなどの記憶装置が破損するなどしてデータが失われた際に、
以前に取っておいたデータの複製を書き戻すなどして復元することをリスト
アという。
引用:IT用語辞典 e-Words
http://e-words.jp/
- 3. postgresql 9.4 のバックアップ計画
Backup手法の検討
▸ コールドバックアップ
データベースを一旦止めて物理的または論理的なバックアップを取得する
→サービス停止があるので今回は❌
▸ ホットバックアップ
データベースの停止をせずにバックアップの取得が可能→⭕️こちらを採用
⚠ バックアップ取得ポイントのみへのリカバリー
⚠ バックアップ手順が複雑→tool(pg_rman)で楽チン
+α ポイント・イン・タイム・リカバリ(PITR)
バックアップポイント後の更新をリアルタイムでアーカイブしていき、サービス停
止直前 までのリカバリを実現する。→ ⭕basebackupと組み合わせて採用
- 5. basebackup + PITRによるbackup
setup
・make a replication user
#attributes
default['postgresql']['custom']['replication']['username'] = 'postgres_backup'
default['postgresql']['custom']['replication']['password'] = 'backup_passwd'
#recipes
echo “CREATE ROLE #{repl_user} WITH REPLICATION LOGIN ENCRYPTED PASSWORD ‘ ¥
#{repl_pass}’;”" | psql -p #{node[‘postgresql’][‘config’][‘port']}
・enable archive mode
# attributes
# postgresql configure
default['postgresql']['config']['archive_mode'] = ‘on
default['postgresql']['config']['archive_command'] = 'if [ ! -d #{wal_dir} ]; th
en mkdir #{wal_dir}; fi; test ! -f #{wal_dir}/%f && gzip < %p > #{wal_dir}/%f’
- 6. basebackup + PITRによるbackup
backup & restore
・basebackup
postgres $ pg_basebackup
・restore
・stop postgresql service
root # service postgresql stop
・put backup data & recovery.conf
postgres # cd $pg_data
postgres # tar xfvz yyyymmdd_basebackup.tar.gz
# postgresdata_dir/recovery.conf
gzip < <%= node['postgresql']['custom']['archive_directory'] %>%f >%p
・start postgresql service
root # service postgresql start
- 8. pg_rmanによるbackup
setup
・github sourceからmake
https://github.com/ossc-db/pg_rman
・setup path
# .bash_profile/profile.pg_rman
export PATH=$PATH:#{node['pg_rman']['bin_path']}
export BACKUP_PATH=#{node[‘pg_rman']['backup']}
・pg_rman init
postgres $ pg_rman init -B #{node[‘pg_rman']['backup']} -A #{node['pg_rman']['arclog']} ¥
-D #{node[‘postgresql']['config']['data_directory']}
・edit pg_rman.ini
# templates->pg_rmandir/pg_rman.ini
ARCLOG_PATH=<%= node['pg_rman']['arclog'] %>
SRVLOG_PATH=<%= node['pg_rman']['backup'] %>/pg_log
PGDATA=<%= node['postgresql']['config']['data_directory'] %>
COMPRESS_DATA = <%= node['pg_rman']['config']['compress'] %>
KEEP_ARCLOG_FILES = <%= node['pg_rman']['config']['keep_arclog_files'] %>
KEEP_ARCLOG_DAYS = <%= node['pg_rman']['config']['keep_arclog_days'] %>
KEEP_DATA_GENERATIONS = <%= node['pg_rman']['config']['keep_data_generations'] %>
KEEP_DATA_DAYS = <%= node['pg_rman']['config']['keep_data_days'] %>
KEEP_SRVLOG_FILES = <%= node['pg_rman']['config']['keep_srvlog_files'] %>
KEEP_SRVLOG_DAYS = <%= node['pg_rman']['config']['keep_srvlog_days'] %>
- 9. pg_rmanによるbackup
full backup & integral backup & restore
・full backup
postgres $ pg_rman backup -b full
・incremental backup
postgres $ pg_rman backup -b incremental
・restore database
postgres $ pg_rman restore
# When you’ll set a target time
# pg_rman restore --recovery-target-time '2016-01-06 15:12:00'