【豆知識】権限エラーでテーブル空間が作成できない問題を解決したい
PostgreSQLインサイド

実現方法

PostgreSQLのスーパーユーザー(通常はinitdbコマンドでデータベースクラスタを初期化したユーザー)でCREATE TABLESPACE文を実行しても、エラーメッセージ「ディレクトリに権限を設定できませんでした」が出力されることがあります。これは、CREATE TABLESPACE文を実行したユーザーに、テーブル空間(テーブルスペース)作成先のディレクトリーに対する必要なオペレーションシステム上の権限が付与されていないことが原因である可能性があります。
このような場合、テーブル空間作成先のディレクトリーに対し、読み込み権限、書き込み権限、および所有者権限を付与してください。

実行例

テーブル空間を作成するディレクトリーに対し、読み込み権限、書き込み権限、および所有者権限を付与します。
テーブル空間作成先のディレクトリーを「/disk2/pgdata」、作成するテーブル空間名を「new_tablespace」、PostgreSQLのスーパーユーザーであるアカウントを「postgres」(「postgres」が属するグループも「postgres」)とします。テーブル空間作成先のディレクトリー配下は空にしておいてください。

  1. オペレーティングシステムのスーパーユーザー(root)へ切り替え
$ su -
  1. テーブル空間作成先のディレクトリーの所有者をPostgreSQLのスーパーユーザーのアカウントおよびグループに変更
# chown postgres:postgres /disk2/pgdata
  1. さらに、所有者だけに権限(rwx)を付与
# chmod 700 /disk2/pgdata
  • 備考
    ここではデータベースクラスタを作成する際の一般例に合わせて700(所有者だけに読み込み権限、書き込み権限、実行権限を付与)を設定しています。これは、権限上の安全を考慮した設定です。
  1. PostgreSQLのスーパーユーザーへ切り替え
# su - postgres
  1. データベース(例:postgres)に接続し、CREATE TABLESPACE文を実行
$ psql postgres
postgres=# CREATE TABLESPACE new_tablespace LOCATION '/disk2/pgdata';

ポイント

  • CREATE TABLESPACE文のLOCATION句には、既存のディレクトリーを指定する必要があります。このディレクトリーに対し、テーブル空間を作成するPostgreSQLのスーパーユーザーのアカウントが、読み込み権限、書き込み権限、および所有者権限を持たない場合は、以下のようなエラーが出力されます。

    エラーメッセージの例

    ERROR:  ディレクトリ"/disk2/pgdata"に権限を設定できませんでした
  • CREATE TABLESPACE文のLOCATION句に指定するテーブル空間作成先のディレクトリーは、絶対パス名で記述する必要があります。
  • テーブル空間の所有者は、デフォルトではCREATE TABLESPACE文を実行するPostgreSQLのスーパーユーザーとなります。しかし、OWNER句にユーザー名を指定することにより、PostgreSQLのスーパーユーザー以外のユーザーをテーブル空間の所有者とすることができます。

    指定例

    テーブル空間の所有者にunyou01を指定

    CREATE TABLESPACE new_tablespace OWNER unyou01 LOCATION '/disk2/pgdata';

参考

PostgreSQL 12.1 文書

2021年5月28日公開

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

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

お電話でのお問い合わせ

Webでのお問い合わせ

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

ページの先頭へ