バックアップにもいろんなやり方、考え方があるが、とりあえず基本的なことだけを紹介する。
データベースのバックアップにはpg_dumpコマンドを使う。データベース毎に取ったり丸ごと取ったりいろいろオプションが指定できるが、とりあえず何も考えず丸ごとバックアップを取る方法を紹介する。
- Linuxサーバにpostgresでログイン
- バックアップを取る(pg_dump)
# pg_dumpall -o > ファイル名
※指定したファイル名で、バックアップファイルが作成される
バックアップファイルが巨大になる場合は、圧縮してバックアップを取ってくれる機能を利用すると、ディスク容量を節約できる。
# pg_dump -Fc データベース名 -f ファイル名
※圧縮してバックアップする場合、データベース名を指定しなければならない
1で丸ごと取ったバックアップファイルを元にリストアする方法を紹介する。
- サーバを再インストールし、PostgreSQLをインストールする。
- Linuxサーバにpostgresでログイン
- initdbを実行
- バックアップファイルからリストアを行う
# psql -e template1 < ファイル名
※すべてのデータベースおよびユーザが再現される
圧縮してバックアップを取った場合は、次のようにリストアしなければならない。
- サーバを再インストールし、PostgreSQLをインストールする。
- Linuxサーバにpostgresでログイン
- initdbを実行
- リストアするデータベースを作成する
# createdb データベース名
リストアするデータベースに存在したユーザをすべて作成する
# createuser ユーザ名
- バックアップファイルからリストアを行う
# pg_restore -d データベース名 ファイル名
PostgreSQLには、テーブルのデータをファイルに書き出したり、ファイルのデータをテーブルに追加したりする機能がある。これを利用して、CSV形式のファイルに出力したり、CSV形式のデータをテーブルに読み込む方法を紹介する。
3-1 テーブルの内容をCSVファイルに書き出す
psqlでデータベースに接続し、次のコマンドを実行する。
TestDB=> \copy テーブル名 to ファイル名 with csv
指定したテーブルの内容が、CSV形式で指定したファイルに書き出される。
3-2 CSVファイルの内容を既存のテーブルに追加する
psqlでデータベースに接続し、次のコマンドを実行する。
TestDB=> \copy テーブル名 from ファイル名 with csv
指定したファイルの内容が、指定したテーブルに追加される。あくまでも「追加」であり、テーブルに元々入っていたデータは消えない。
バックアップは定期的にとりたいので、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というファイル名で作成し、実行件を付けておけば、一日一回コマンドを実行してくれる。