PostgreSQL でバックアップする場合、通常は pg_dump コマンドを使います。今回は敢えて強引(?)にデータファイルごと根こそぎバックアップする方法をやってみます。
そもそもデータベースはデータファイルにのみ全情報があるのですから、Oracle だろうが SQL Server だろうが、データファイルさえ残っていれば何とかなるわけですから。
この記事の対象は、データベースの構造を良く知っている上級者向けと思ってください。初中級者の方にはあくまでも、それぞれ用意されているバックアップコマンドを使うことを推奨します。
さて本題の手順です
1.データベースファイルを格納するディレクトリを確認
psql に管理者権限でログインして SHOW data_directory を実行します。
$ psql -U postgres
postgres=# SHOW data_directory;
data_directory
------------------------------
/var/lib/pgsql/9.6/data
(1 row)
postgres=#
こんな感じで表示されます。上記の例では
/var/lib/pgsql/9.6/data
がデータフォルダです。勿論、環境によってディレクトリは異なります。
2.データベースを停止する
ディレクトリごとコピーする場合、必ずデータベース(RDBMS)を停止する必要があります。データベースを動かしながらコピーしたらぶっ壊れます。
$ sudo systemctl stop postgresql
3.ディレクトリごとコピー(バックアップ)する
普通にコピーコマンドでディレクトリごとバックアップします。
$ sudo cp -R /var/lib/pgsql/9.6/data ~/backup_db
4.データベースを再起動する
バックアップ(コピー)を終えたらデータベースを再起動します。これですべて完了。
$ sudo systemctl start postgresql
このように至ってシンプル。なのに完璧なバックアップ。
但しRDBMSのバージョンが異なると動作しない場合があります。データベース構造まで熟知している上級者のあなたには理由はわかりますよね。
リストアする場合
逆にこのバックアップのリストア方法ですが、コピーしたディレクトリごと上書きすれば良いです。コピー作業前にデータベースを停止するのは当然ですね。
ちなみにバックアップ(コピー)先ディレクトリでそのまま動作させる事も可能です。
postgresql.conf の data_directory でデータディレクトリを指定してください。
$ sudo vi /var/lib/pgsql/9.6/data/postgresql.conf
data_directory = '/home/backup_db/data' ←お好みのディレクトリ
この方法、実は PostgreSQL だけでなく、ほぼどんな RDBMS でもこんな感じで出来ちゃうので、一応知識として持っていると便利だったりします。