Yukiです。
今回はバックアップとリストアについて勉強しました。
いよいよデータベースの運用らしくなってきました。
pg_dump/pg_dumpall/pg_restoreコマンド
論理バックアップとリストアするためのコマンドです。
Oracleのエクスポート&インポートのイメージです。
データベース単位とデータベースクラスタ単位
pg_dumpとpg_dumpallの違いは、pg_dumpがデータベース単位、pg_dumpallがデータベースクラスタ全体のバックアップであることです。
なお、データベースユーザなど、データベースクラスタ全体で共通の情報をバックアップするには、pg_dumpallの方で行います。通常、スーパーユーザで実行します。
バックアップ形式
pg_dumpは、テキスト(平文)とバイナリ(カスタム形式)の両方でバックアップできます。
一方、pg_dumpallは、テキスト(平文)のみでバックアップできます。
テキスト(平文)でバックアップした場合は、通常のSQLのテキストファイルが出力されるので、psqlでリストアします。
一方、バイナリ(カスタム形式)のバックアップは、pg_restoreコマンドでリストアします。
はじめ、このあたりの使うツールの組み合わせがなかなか理解できませんでした。結局、テキストならpsql、バイナリならpg_restoreでリストアと、形式だけ意識しておけば良いかと思います。
ディレクトリコピーによるバックアップとリストア
PostgreSQLが停止していれば、データベースクラスタのディレクトリ(PG_DATA)以下を丸ごとコピーするだけでバックアップできてしまいます。お手軽ですね。
Oracleも停止中のファイルコピーでバックアップできますが、格納先のディレクトリが別々になっていたらここまで手軽にはできません。
もちろんテーブルスペースなどシンボリックリンクを使っていたりしたら、その先のバックアップも必要になります。
余談ですが、テーブルスペースはPostgreSQLとOracleで結構違います。Oracleから来た人は要注意です。PostgreSQLのテーブルスペース(テーブル空間)の実体はシンボリックリンクです。なお、シンボリックリンク先のディレクトリ以下をまるごとディスクパーティションとして切れば、Oracleと似たような使い方をすることも可能です。
PITR
いよいよPITR(Point In Time Recovery)です。
これができてこそのDBって気がするのですが、みなさんどうでしょうか?
これまでのpg_dump/pg_dumpallやディレクトリコピーは、DBが壊れた場合に、バックアップ時点のデータまでにしか戻せません。
それがPITRなら、バックアップを取ってからDBが壊れる直前までの好きな時間に戻せるわけです。
ワクワクしませんか?
とりあえず、自分の環境※のDBを壊して、PITRで元に戻してみました。
一度試してみると、理解が深まっていいかと思います。
それに仮想環境なら、スナップショットも取っておけば、失敗しても戻せます。
※絶対に自分の練習用の環境以外ではやらないでください。(念のため)
COPY文と\copyコマンド
テーブル単位で、CSVなどのテキストファイルに書き出したり、読み込んだりする機能です。
似たような機能が2つありますが、COPY文の方はサーバ上で、\copyコマンドの方はクライアント上で動作します。なお、クライアント上で動作する\copyコマンドはネットワーク負荷の考慮が必要です。
COPY文は、ファイル名を指定する場合はスーパーユーザで実行する必要があります。標準入出力を使う場合はスーパーユーザでなくてもできるので注意です。
\copyコマンドの方は、テーブルを読み書きできる権限があれば、スーパーユーザである必要はありません。
OracleのSQL*Loaderみたいですね。SQL*Loaderはデータを読み込むだけですが、PostgreSQLのCOPY文&\copyコマンドは書き出すのもできて便利です。また、使い方も簡単ですね。SQL*Loaderは細かい制御ができる分、設定が結構複雑です。
まとめ
今日は、バックアップとリストアについて勉強しました。
DBが壊れても直せるようになってこそ、一人前のデータベース管理者ですね。
後、バックアップを取っただけで安心せずに、戻せるかどうか確かめておくことも大切です。(自戒を込めて)
Photo by Harshil Gudka on Unsplash
コメント