【ITニュース解説】PostgreSQL Backup the quick Way
2025年10月05日に「Dev.to」が公開したITニュース「PostgreSQL Backup the quick Way」について初心者にもわかりやすく解説しています。
ITニュース概要
PostgreSQLのバックアップは、`pg_dumpall`コマンドを使えば簡単だ。データベース、ユーザー、権限を含む移植性の高い「論理バックアップ」を、`.sql`ファイルとして作成する。サーバーで生成し、ローカルに安全に転送、必要なら圧縮、そして復元できる。日々の自動化も可能だ。
ITニュース解説
PostgreSQLは、オープンソースのデータベースの中でも特に高い信頼性を持つと評価されている。しかし、データベースのバックアップは、システムの安定稼働を維持するために非常に重要な作業でありながら、時には複雑で手間がかかるものと思われがちだ。ファイルシステムのスナップショット取得やレプリケーション構成の管理、手動でのアーカイブ作業など、様々な方法が存在し、それぞれに専門的な知識を要することが多い。だが、もしあなたが、すべてのデータベースの内容を網羅した、クリーンで持ち運びやすく、一貫性のあるバックアップを求めているなら、PostgreSQLにはそのためのシンプルで強力なツールがすでに用意されている。それは pg_dumpall と呼ばれるツールで、これを使えば、PostgreSQLサーバー全体のフルバックアップをたった一行のコマンドで作成し、安全にローカルマシンへ転送することができるのだ。
PostgreSQLのバックアップには、大きく分けて二つの種類がある。一つは「物理バックアップ」、もう一つは「論理バックアップ」だ。物理バックアップは、ディスク上に保存されているデータファイルを物理的にすべてコピーする方法を指す。これは、特定の時点への正確な復旧(ポイントインタイムリカバリ)を可能にする点で優れているが、バックアップファイルの容量が大きくなりがちで、異なるOSやPostgreSQLのバージョン間での移植性が低いという特徴がある。対して論理バックアップは、データベースの構造(テーブルの定義やインデックスなど)や、そこに格納されているすべてのデータをSQLコマンドの形式でダンプ(出力)する方法だ。これは、物理バックアップに比べて容量がはるかに軽量で、生成されるのはSQLコマンドが記述されたプレーンテキストファイルであるため、システム環境に依存せず、非常に高い移植性を持っている。日常的なスナップショットの取得や、異なるサーバーへのデータベース移行といった用途には、論理バックアップが最も適していると言える。データベース内のすべてのデータベース、ユーザーアカウント、そしてそれらに付与された権限を含んだ、いつでも復元可能なSQLファイルを手に入れたいのであれば、この論理バックアップこそが適切な選択肢となるだろう。
この論理バックアップを作成する最初のステップは、PostgreSQLが稼働しているサーバー上で直接コマンドを実行することだ。具体的には、sudo -u postgres pg_dumpall > /tmp/october_4_2025_backup.sql というコマンドを使用する。このコマンドの sudo -u postgres の部分は、postgres というスーパーユーザー(管理者権限を持つユーザー)としてコマンドを実行することを意味している。データベースのすべての情報を取得するためには、この postgres ユーザーのような高い権限が必要となるため、このように指定する。pg_dumpall は、PostgreSQLが提供するユーティリティの一つで、文字通り「すべての」PostgreSQLデータベース、さらにデータベースユーザー(ロール)や、それらのユーザーに付与されている権限(グラント)といったサーバー全体の情報をSQL形式でダンプしてくれる。そして、> /tmp/october_4_2025_backup.sql の部分は、pg_dumpall の出力結果を /tmp/october_4_2025_backup.sql という名前のファイルに書き込むことを指示している。このファイル名は任意で、例えば october_4_2025_backup.sql のように日付を含めることで、どの時点のバックアップであるかを一目で判別できるようにしておくと便利だ。このコマンド一つで、PostgreSQLサーバー全体の情報を含む、復元可能なプレーンテキスト形式のSQLファイルが生成される。
バックアップファイルを作成したら、次にそのファイルが正しく存在し、適切なサイズであるかを確認することが重要だ。この検証を行うには、ls -lh /tmp/october_4_2025_backup.sql というコマンドを使う。ls -lh は、指定したファイルの情報を、人間が読みやすい形式(例えば、ファイルサイズをキロバイトやメガバイトで表示)で一覧表示するコマンドだ。これにより、ファイルが存在すること、そしてそのサイズがデータベースの規模に見合っているかを確認できる。もしファイルサイズが極端に小さい場合などは、バックアップが正常に完了していない可能性も考えられるため注意が必要だ。さらに、head /tmp/october_4_2025_backup.sql というコマンドで、バックアップファイルの最初の数行を確認することもできる。これにより、ファイルの中身が実際にSQLコマンドの形式でデータがダンプされていることを視覚的に確認できる。これは必須ではないが、より確実にバックアップの健全性を確認する上で役立つだろう。
サーバー上に作成されたバックアップファイルを、ローカルマシンに安全に転送するには、scp(secure copy)コマンドを使用する。scp user@your_server_ip:/tmp/october_4_2025_backup.sql ~/Downloads/。ここで user はあなたのSSH接続時のユーザー名、your_server_ip はPostgreSQLサーバーのIPアドレスに置き換える必要がある。scp はSSH(Secure Shell)プロトコルを利用して暗号化された安全な通信路を通じてファイルをコピーするため、重要なバックアップデータをネットワーク経由で安全に転送できる。このコマンドは、サーバー上の指定されたファイルを、ローカルマシンのホームディレクトリ内の Downloads フォルダにコピーする。これにより、サーバーに何か問題が発生した場合でも、バックアップデータはローカルに保存されているため安心だ。
もしデータベースの規模が大きく、バックアップファイルの容量が膨大になる場合は、ファイルを圧縮することを推奨する。gzip /tmp/october_4_2025_backup.sql コマンドを実行することで、バックアップファイルを gzip 形式で圧縮できる。これにより、ファイルサイズが元の70%から90%程度にまで削減されることが多く、転送時間やストレージ容量の節約に繋がる。圧縮が完了すると、元のファイルは .gz 拡張子が付いたファイルに置き換えられ、例えば /tmp/october_4_2025_backup.sql.gz となる。圧縮後のファイルをローカルに転送する際は、再度 scp コマンドを使って scp user@your_server_ip:/tmp/october_4_2025_backup.sql.gz ~/Downloads/ のように指定する。
バックアップは、いざという時にデータベースを復元するために取得する。新しいPostgreSQLインスタンスにすべてのデータをリストアするには、psql -U postgres -f october_4_2025_backup.sql というコマンドを使用する。-U postgres は postgres ユーザーとしてデータベースに接続することを意味し、-f は指定したファイルからSQLコマンドを読み込み、順次実行することを指示する。これにより、バックアップ時のすべてのデータベース、ユーザー、そしてデータが新しいPostgreSQLインスタンス上に再現される。もしバックアップファイルが gzip で圧縮されている場合は、事前にファイルを展開してからリストアすることもできるが、より効率的な方法として gunzip -c october_4_2025_backup.sql.gz | psql -U postgres のようにコマンドをパイプで繋いで実行する方法がある。gunzip -c は圧縮ファイルを展開してその内容を標準出力に流し、その標準出力を psql コマンドの入力として直接利用することで、ファイルを一時的に展開することなく、展開と同時にリストアを行うことが可能だ。
手動でのバックアップは手間がかかるため、毎日や毎週などの定期的なバックアップは自動化することが望ましい。Linuxシステムでは cron というスケジューラー機能を利用できる。sudo crontab -u postgres -e コマンドを実行すると、postgres ユーザーの cron ジョブ設定ファイル(crontab)を編集できる。このファイルに 0 2 * * * /usr/bin/pg_dumpall > /var/backups/pg_backup_$(date +\%F).sql という一行を追加すると、毎日午前2時0分に自動的にバックアップが実行される。0 2 * * * は『毎日午前2時0分』という実行時刻を表す cron の書式であり、/usr/bin/pg_dumpall は pg_dumpall コマンドのフルパス、> /var/backups/pg_backup_$(date +\%F).sql は /var/backups/ ディレクトリに、バックアップ実行時の日付(例: pg_backup_2025-10-04.sql)をファイル名に含めて保存するための指定だ。これにより、手間なく常に最新のバックアップを保持できるようになるため、設定しておくことを強く推奨する。