postgresqlでバックアップ。pg_dumpallとpg_dumpはどう違う?

postgresqlを使っているシステムはいっぱいあると思います。

おっさん上司
おっさん上司

おーい。バックアップちゃんととっとくんやで。

という指示だったり、設計だったりでバックアップをシェル化して仕込んだりするんですけど、ググると出てくるのは、pg_dumpallだー、pg_dumpだーって。

りょーへー
りょーへー

どっちでもバックアップ取れるやんけ!

とか思いながら適当に使っていませんか?
今日はそんな2つのバックアップの違いについて簡単に説明です。

まず簡単にデータベースってどんな感じで存在しているか

postgresqlの構造ってこんな感じ

postgresqlがどのような構造になっているかを簡単に説明すると、

こんな感じ。

りょーへー
りょーへー

で、データベースクラスタってなんや。

データベースクラスタはデータベースやロールなどデータベースを利用するための基盤のようなもの

簡単に言うと、定食頼んだ時のトレイみたいなものですね。で、データベースがご飯だったり、ロールが置かずだったり、というイメージです。(あくまでもイメージですよ!)

まずデータベースクラスタが無いと何も始まりません。postgresql使う時の一番最初にinitdbしようね!ってあったと思うんですけど、これによって作成されます。

pg_dumpallの範囲

ここからが本題。pg_dumpallの範囲ってどーこだ。

そう、pg_dumpallはデータベースクラスタ全体をバックアップするコマンドです。クラスタ全体なので、テンプレートを含む全てのデータベース、ロールをバックアップします
–roles-onlyオプションなどによってその範囲を局所化したりはできるのですが、基本的にはこの範囲のバックアップを取るコマンドです。

pg_dumpall > backup_20200603.sql

とかでバックアップを取ってください。拡張子は特に決まっていないのでお好きな感じで。

pg_dumpの範囲

じゃあpg_dumpの範囲はどうなるか。

pg_dumpは指定された任意のデータベースをバックアップします。
指定されていないデータベースはバックアップしませんし、ロールなどもバックアップしません。

pg_dump DB1 > db1_backup_20200603.dmp

みたいな感じです。例によって拡張子はなんでもいいです。

で、どっちでバックアップした方がいいの?

りょーへー
りょーへー

じゃあ全部バックアップできるpg_dumpallたたいときゃええんちゃうの?

いやいや、そういうわけでもないんです。やはりそこは目的などによって使い分ける必要があります。

手間がかかってもいいから全部バックアップ取っときたい!ってことならpg_dumpallしとけばいいですが、 データベースクラスタ全体をバックアップすると、特定のデータベースをリストアするときなどに苦労します。
また、任意のデータベースだけバックアップしていると、ロールがおかしくなったりしたときに対応できなくなります。

なので、そのバックアップをどのような目的で利用するのかを明確にしたうえでpg_dumpallなのかpg_dumpなのかを決定して利用する必要があります。

他にもpg_dumpは圧縮出来たりなど、オプションなどによっていろいろなバックアップができるので一度確認してみてもいいと思います。

結論!

pg_dumpallかpg_dumpを使う時は

りょーへー
りょーへー

その用途によって使い分けるとええんやで!

ということだと思います。

IT
りょーへーをフォローする

りょーへーぶろぐ