【豆知識】pg_basebackupコマンド実行時のエラーを解決したい
PostgreSQLインサイド
実現方法
運用中のデータベースサーバーとは別のサーバーからpg_basebackupコマンドを実行したときに、エラーメッセージ「ディレクトリを作成できませんでした: ファイルが存在します」が出力されることがあります。これは、データベースクラスタのディレクトリー配下にテーブル空間(テーブルスペース)が作成されていることが原因となっている可能性があります。
このような場合、データベースクラスタのディレクトリー配下に作成したテーブル空間を別の場所へ変更後、pg_basebackupコマンドを実行してください。
実行例
運用中のデータベースサーバーにおいて、テーブル空間の場所を変更します。
変更前のテーブル空間名を「table_space」、変更後のテーブル空間名を「new_table_space」とします。なお、「table_space」をデフォルトのテーブル空間として、データベース、インデックス、およびテーブルを作成済であることを前提とします。
-
データベースクラスタのディレクトリーとは異なる場所(例:/disk2/pgdata)に、新しいテーブル空間を作成
CREATE TABLESPACE new_table_space LOCATION '/disk2/pgdata';
-
データベース(例:mydb)のデフォルトのテーブル空間をnew_table_spaceに変更
ALTER DATABASE mydb SET TABLESPACE new_table_space;
-
備考データベースのデフォルトのテーブル空間に作成されていたインデックスとテーブルの物理ファイルは、ALTER DATABASEによって一括して新しいテーブル空間に移動されます。デフォルトのテーブル空間以外に作成されていたインデックスとテーブルは、以下のように個々にテーブル空間を変更することで物理ファイルを移動させる必要があります。
ALTER INDEX product_no_idx SET TABLESPACE new_table_space2;
ALTER TABLE products SET TABLESPACE new_table_space2;
-
変更前のテーブル空間を削除
DROP TABLESPACE table_space;
別のサーバーからpg_basebackupを実行します。
-
pg_basebackupコマンドの出力先(例:/data/inst1)を削除
$ rm -rf /data/inst1/*
-
pg_basebackupコマンドを実行
$ pg_basebackup -D /data/inst1 -P -v -h dbhost -p 5432 -U user01
ポイント
テーブル空間はデータベースクラスタとは別の領域にデータを格納するための機能ですので、データベースクラスタのディレクトリー配下にテーブル空間を作成しないでください。
例えば以下のような場合に、データベースクラスタのディレクトリー(/usr/local/pgsql/data)配下にテーブル空間が作成されます。
CREATE TABLESPACE table_space LOCATION '/usr/local/pgsql/data/tblspc';
このような場合、別のサーバーからpg_basebackupコマンドでベースバックアップを実施しようとすると以下のようなエラーが出力されます。
- エラーメッセージの例
pg_basebackup: ディレクトリ "/usr/local/pgsql/data/tblspc" を作成できませんでした: ファイルが存在します
また、テーブル空間を利用している場合に、pg_basebackupコマンドを実行するときは、以下にも留意してください。
同じサーバーでpg_basebackupを実行する場合
pg_basebackupコマンドは、テーブル空間を絶対パスで参照/作成します。このため、同じサーバーでpg_basebackupコマンドを実行すると、バックアップ元とバックアップ先のテーブル空間のディレクトリーが同一になり、以下のようなエラーが出力されます。
- エラーメッセージの例
pg_basebackup: ディレクトリ "/usr/local/pgsql/data/" は存在しますが空ではありません
この場合、-Fオプションまたは--formatオプションにtar形式(tまたはtar)を指定するか、あるいは、-Tオプションまたは--tablespace-mappingオプションの利用を検討してください。
tar形式以外の圧縮形式でベースバックアップを保存する場合
tar形式以外の圧縮形式でベースバックアップを保存したい場合は、-Dオプションまたは--pgdataオプションに「-(ダッシュ)」、かつ、-Fオプションまたは--formatオプションにtar形式(tまたはtar)を指定することで、標準出力に出力する方法を利用できます。例えば以下のように他の形式の圧縮ファイルを生成することができます。
- オプションの指定例
$ pg_basebackup -D - -F tar -x fetch | bzip2 > backup.tar.bz2
しかし、テーブル空間を作成している場合は以下のようなエラーとなりますので注意してください。
- エラーメッセージの例
pg_basebackup: 標準出力に書き出せるテーブル空間は1つだけですが、データベースには2個あります
参考
PostgreSQL 12.1 文書
-
Documentation(PostgreSQLオフィシャル)
- VI. Reference
- II. PostgreSQL Client Applications
- pg_basebackup
- II. PostgreSQL Client Applications
- VI. Reference
-
PostgreSQL日本語ドキュメント(日本PostgreSQLユーザ会)
- VI. リファレンス
- II. PostgreSQLクライアントアプリケーション
- pg_basebackup
- II. PostgreSQLクライアントアプリケーション
- VI. リファレンス
PostgreSQLインサイド
2020年12月11日公開
富士通のソフトウェア公式チャンネル(YouTube)
-
- 富士通のミドルウェア製品のご紹介や各種イベント・セミナーの講演内容、デモンストレーションなどの動画をご覧いただけます。
- 富士通のミドルウェア製品のご紹介や各種イベント・セミナーの講演内容、デモンストレーションなどの動画をご覧いただけます。
PostgreSQLについてより深く知る
PostgreSQLに興味をお持ちのお客様はこちらのコンテンツもお勧めです。ぜひご覧ください。
本コンテンツに関するお問い合わせ
お電話でのお問い合わせ
-
富士通コンタクトライン(総合窓口)
0120-933-200受付時間:9時~12時および13時~17時30分(土曜日・日曜日・祝日・当社指定の休業日を除く)