Postgresql: запрос на местонахождение глобального табличного пространства?
-
16-10-2019 - |
Вопрос
Я пытался сделать наших клиентов базы данных активными в том, чтобы не заполнить раздел, в котором находится база данных, которую они используют.
Поскольку все наши клиенты находятся на одном хосте, что и менеджер базы данных, он должен быть достаточно прост для созданных пользователя столовых пространств; Клиент может найти путь файловой системы для табличного пространства (в Spclocation) и использовать вызовы ОС, чтобы проверить, сколько доступно пространство доступно:
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
Наверное, тоже.
Если бы у меня было время, я прочитал исходный код. Анкет Это удалило бы все сомнения.