Postgresql: запрос на местонахождение глобального табличного пространства?

dba.stackexchange https://dba.stackexchange.com/questions/9603

  •  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 Наверное, тоже.

Если бы у меня было время, я прочитал исходный код. Анкет Это удалило бы все сомнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top