PostgreSQL のテーブルスペースのパスの情報について調べてみた

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は業務にて機会があったため PostgreSQL のテーブルスペースについて少し調べてみました。(※以下の内容は PostgreSQL 10.1 にて検証/調査しています。)

(https://www.postgresql.org/docs/10/static/manage-ag-tablespaces.html)

■はじめに

PostgreSQL では “テーブルスペース” という機能を使って特定のテーブルのファイル等をデフォルトとは異なるディレクトリに格納することが可能です。

この “OS 上のディレクトリ (パス)” の情報をどのように管理 (保持) しているのか?を調査してみました。

■検証

実際にテーブルスペースを作成してみると、pg_tablespace というシステムカタログにテーブルスペースの情報が格納されますが、この pg_tablespace に OS 上のディレクトリの情報は含まれていませんでした。

このシステムカタログ pg_tablespace にて OS 上のパスの情報を保持しているのかと想像していましたが、どうやら違うようです。

テーブルスペースの OS 上のディレクトリの情報は以下の様に psql のメタコマンド “\db” の “Location” にて確認することができます。この “\db” がどこから情報を取得しているのかを探ってみました。

log_statement を利用して “\db” が内部で実行している SQL をログから確認したところ pg_tablespace_location() という関数で “Location” の値を取得しているようです。

実際に、先ほど作成したテーブルスペース “hoge” の OID (16438) を引数にして pg_tablespace_location() を実行すると、OS 上のパスが出力されました。ということで、この pg_tablespace_location() がどこから情報を取得しているのかを探る必要がありそうです。

この pg_tablespace_location() のソースコードを覗いてみると、以下のようなコードになっていました。

コード内のコメントにも記載されていますが、”pg_tblspc/” というシンボリックリンクから情報を取得しているようです。

実際に OS 側からこのディレクトリ ($PGDATA/pg_tblspc) を確認してみると、作成したテーブルスペース “hoge” の OID “16438” という名前でシンボリックリンクが作成されており、そのリンク先がテーブルスペース作成時に指定したパス “/tmp/test_dir” になっていました。

■最後に

ということで、「”OS 上のディレクトリ (パス)” の情報をどの様に管理 (保持) しているのか?」という問いに対しては、「$PGDATA/pg_tblspc 配下のシンボリックリンクで管理している」というのが答えになりそうです。

PostgreSQL は pg_class 等のシステムカタログにて内部の情報を保持していることが多いので、テーブルスペースにおける “OS 上のパス” の情報もシステムカタログに格納されているのかと思っていましたが、パスの情報は直接システムカタログに登録されている訳ではなく、OS (ファイルシステム) 上のシンボリックリンクで管理されているようです。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*