PostgreSQL:グローバルテーブルスペースの場所のクエリ?
-
16-10-2019 - |
質問
私は、データベースクライアントに、使用しているデータベースが存在しているパーティションを記入しないことを積極的に積極的にしようとしています。
すべてのクライアントはデータベースマネージャーと同じホストにいるため、ユーザーが作成したテーブルスペースには簡単であるはずです。クライアントは、テーブルスペースのファイルシステムパス(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が作成します pg_default
と pg_global
おそらく使用してクラスターを作成するとき initdb
直接。 initdb
ユーティリティはデータディレクトリを設定する引数を取得できますが、どこに置くべきかについての引数はありません pg_default
と pg_global tablespaces
.
私はそれらが常にデータディレクトリで作成されていると結論付けます。私はそれについて簡単に間違っている可能性があります。私はそれらを感動させることができるとは思わない。私もそれについて間違っているかもしれません。
しかし、もし私がこの時点までであれば、あなたは彼らの物理的な位置をによって導き出すことができます
show data_directory;
pg_global tablespace
ほぼ間違いなく「グローバル」サブディレクトリです。 pg_default
おそらくそうです。
時間があれば読んだことがあります ソースコード. 。それはすべての疑いを取り除くでしょう。