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を使う時は
その用途によって使い分けるとええんやで!
ということだと思います。