バックアップ・リストア

バックアップにもいろんなやり方、考え方があるが、とりあえず基本的なことだけを紹介する。

1.データベースのバックアップ

データベースのバックアップにはpg_dumpコマンドを使う。データベース毎に取ったり丸ごと取ったりいろいろオプションが指定できるが、とりあえず何も考えず丸ごとバックアップを取る方法を紹介する。

  1. Linuxサーバにpostgresでログイン
  2. バックアップを取る(pg_dump)

    # pg_dumpall -o > ファイル名

※指定したファイル名で、バックアップファイルが作成される

バックアップファイルが巨大になる場合は、圧縮してバックアップを取ってくれる機能を利用すると、ディスク容量を節約できる。

# pg_dump -Fc データベース名 -f ファイル名

※圧縮してバックアップする場合、データベース名を指定しなければならない

2.リストア

1で丸ごと取ったバックアップファイルを元にリストアする方法を紹介する。

  1. サーバを再インストールし、PostgreSQLをインストールする。
  2. Linuxサーバにpostgresでログイン
  3. initdbを実行
  4. バックアップファイルからリストアを行う

    # psql -e template1 < ファイル名

※すべてのデータベースおよびユーザが再現される

圧縮してバックアップを取った場合は、次のようにリストアしなければならない。

  1. サーバを再インストールし、PostgreSQLをインストールする。
  2. Linuxサーバにpostgresでログイン
  3. initdbを実行
  4. リストアするデータベースを作成する

    # createdb データベース名

  5. リストアするデータベースに存在したユーザをすべて作成する

    # createuser ユーザ名

  6. バックアップファイルからリストアを行う

    # pg_restore -d データベース名 ファイル名

3.テーブルデータをCSV形式のファイルで扱う

PostgreSQLには、テーブルのデータをファイルに書き出したり、ファイルのデータをテーブルに追加したりする機能がある。これを利用して、CSV形式のファイルに出力したり、CSV形式のデータをテーブルに読み込む方法を紹介する。

3-1 テーブルの内容をCSVファイルに書き出す

psqlでデータベースに接続し、次のコマンドを実行する。

TestDB=> \copy テーブル名 to ファイル名 with csv

指定したテーブルの内容が、CSV形式で指定したファイルに書き出される。

3-2 CSVファイルの内容を既存のテーブルに追加する

psqlでデータベースに接続し、次のコマンドを実行する。

TestDB=> \copy テーブル名 from ファイル名 with csv

指定したファイルの内容が、指定したテーブルに追加される。あくまでも「追加」であり、テーブルに元々入っていたデータは消えない。

4.自動的にバックアップを取るには?

バックアップは定期的にとりたいので、cronにやらせたい。スクリプトは次のようになる。

#!/bin/sh
#
# Database Backup Script
#

# Backup
su - postgres -c "/usr/local/pgsql/bin/pg_dump -Fc データベース名 -f /home/postgres/out.admp"
# Vacuum
su - postgres -c "/usr/local/pgsql/bin/vacuumdb データベース名"
su - postgres -c "/usr/local/pgsql/bin/vacuumdb --analyze データベース名"

※cronはroot権限で実行されるため、postgresユーザでコマンドを実行している。

例えば上記スクリプトを/etc/cron.dairyにpgsql_bk.cronというファイル名で作成し、実行件を付けておけば、一日一回コマンドを実行してくれる。


[ TOP ]