私は、データベースクライアントが使用しているデータベースが存在するパーティションがいっぱいにならないように、データベースクライアントをプロアクティブにするよう努めています。
すべてのクライアントがデータベースマネージャーと同じホスト上にあるため、ユーザーが作成したテーブルスペースに対して十分に簡単です。クライアントは、(spclocation内の)テーブルスペースのファイルシステムパスを検索し、OS呼び出しを使用して、使用可能な空き容量を確認できます。
adb=> select * from pg_tablespace;
spcname | spcowner | spclocation | spcacl
------------+----------+-------------------+---------------------
pg_default | 10 | |
pg_global | 10 | |
adb | 2033793 | /database/adb | {adb=C/adb}
クライアントから、グローバルテーブルスペースが格納されている場所へのパスを取得する方法がわかりません。上記のクエリでは、空の文字列が返されます。
残念ながら、フィールドには、グローバルテーブルスペースで作成された特定のデータベースを使用する多くのレガシーシステムがあり、それをユーザー作成のテーブルスペースに移動するのは非常に大変なことです。
うまくいけば、私は本当に単純なものを見逃しているだけです。
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"
PostgreSQLは、おそらくinitdb
を直接使用してクラスターを作成すると、pg_default
とpg_global
を作成します。 initdb
ユーティリティは、データディレクトリを設定する引数を取ることができますが、pg_default
およびpg_global tablespaces
を配置する場所に関する引数は取りません。
これらは常にデータディレクトリに作成されると思います。私はそれについて簡単に間違っているかもしれません。動かせるとは思いません。私もそれについて間違っているかもしれません。
しかし、私が今のところ正しい場合、あなたは彼らの物理的な場所を
show data_directory;
pg_global tablespace
はほぼ確実に「グローバル」サブディレクトリです。 pg_default
もそうです。
時間があれば、 ソースコード と読みます。それはすべての疑いを取り除くでしょう。