web-dev-qa-db-ja.com

PostgreSQL:グローバルテーブルスペースの場所を問い合わせますか?

私は、データベースクライアントが使用しているデータベースが存在するパーティションがいっぱいにならないように、データベースクライアントをプロアクティブにするよう努めています。

すべてのクライアントがデータベースマネージャーと同じホスト上にあるため、ユーザーが作成したテーブルスペースに対して十分に簡単です。クライアントは、(spclocation内の)テーブルスペースのファイルシステムパスを検索し、OS呼び出しを使用して、使用可能な空き容量を確認できます。

adb=> select * from pg_tablespace;

  spcname   | spcowner |    spclocation    |       spcacl        
------------+----------+-------------------+---------------------
 pg_default |       10 |                   | 
 pg_global  |       10 |                   | 
 adb        |  2033793 | /database/adb     | {adb=C/adb}

クライアントから、グローバルテーブルスペースが格納されている場所へのパスを取得する方法がわかりません。上記のクエリでは、空の文字列が返されます。

残念ながら、フィールドには、グローバルテーブルスペースで作成された特定のデータベースを使用する多くのレガシーシステムがあり、それをユーザー作成のテーブルスペースに移動するのは非常に大変なことです。

うまくいけば、私は本当に単純なものを見逃しているだけです。

8
Peter

pg_defaultおよびpg_globalの場所は「ハードコード」されています。

pg_default 住む:

select setting||'/base' from pg_settings where name='data_directory';

およびpg_global 住む:

select setting||'/global' from pg_settings where name='data_directory';

src/backend/commands/tablespace.cはそう言っています:

 * There are two tablespaces created at initdb time: pg_global (for shared
 * tables) and pg_default (for everything else).  For backwards compatibility
 * and to remain functional on platforms without symlinks, these tablespaces
 * are accessed specially: they are respectively
 *          $PGDATA/global/relfilenode
 *          $PGDATA/base/dboid/relfilenode

また、データディレクトリの場所を公開することは、セキュリティホールです-それほどひどいわけではありませんが。

app01@postgres=> show data_directory;
ERROR:  must be superuser to examine "data_directory"
13
filiprem

PostgreSQLは、おそらくinitdbを直接使用してクラスターを作成すると、pg_defaultpg_globalを作成します。 initdbユーティリティは、データディレクトリを設定する引数を取ることができますが、pg_defaultおよびpg_global tablespacesを配置する場所に関する引数は取りません。

これらは常にデータディレクトリに作成されると思います。私はそれについて簡単に間違っているかもしれません。動かせるとは思いません。私もそれについて間違っているかもしれません。

しかし、私が今のところ正しい場合、あなたは彼らの物理的な場所を

show data_directory;

pg_global tablespaceはほぼ確実に「グローバル」サブディレクトリです。 pg_defaultもそうです。

時間があれば、 ソースコード と読みます。それはすべての疑いを取り除くでしょう。