【豆知識】pg_basebackupコマンド実行時のエラーを解決したい
PostgreSQLインサイド

実現方法

運用中のデータベースサーバーとは別のサーバーからpg_basebackupコマンドを実行したときに、エラーメッセージ「ディレクトリを作成できませんでした: ファイルが存在します」が出力されることがあります。これは、データベースクラスタのディレクトリー配下にテーブル空間(テーブルスペース)が作成されていることが原因となっている可能性があります。
このような場合、データベースクラスタのディレクトリー配下に作成したテーブル空間を別の場所へ変更後、pg_basebackupコマンドを実行してください。

実行例

運用中のデータベースサーバーにおいて、テーブル空間の場所を変更します。
変更前のテーブル空間名を「table_space」、変更後のテーブル空間名を「new_table_space」とします。なお、「table_space」をデフォルトのテーブル空間として、データベース、インデックス、およびテーブルを作成済であることを前提とします。

  1. データベースクラスタのディレクトリーとは異なる場所(例:/disk2/pgdata)に、新しいテーブル空間を作成
CREATE TABLESPACE new_table_space LOCATION '/disk2/pgdata';
  1. データベース(例: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;
  1. 変更前のテーブル空間を削除
DROP TABLESPACE table_space;

別のサーバーからpg_basebackupを実行します。

  1. pg_basebackupコマンドの出力先(例:/data/inst1)を削除
$ rm -rf /data/inst1/*
  1. 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 文書

PostgreSQLインサイド

2020年12月11日公開

富士通のソフトウェア公式チャンネル(YouTube)

本コンテンツに関するお問い合わせ

お電話でのお問い合わせ

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。

ページの先頭へ