Postgresql где лежат базы
В данном разделе описывается формат хранения на уровне файлов и каталогов.
Файлы конфигурации и файлы данных, используемые кластером базы данных, традиционно хранятся вместе в каталоге данных кластера, который обычно называют PGDATA (по имени переменной среды, которую можно использовать для его определения). Обычно PGDATA находится в /var/lib/pgsql/data . На одной и той же машине может находиться множество кластеров, управляемых различными экземплярами сервера.
В каталоге PGDATA содержится несколько подкаталогов и управляющих файлов, как показано в Таблице 65.1. В дополнение к этим обязательным элементам конфигурационные файлы кластера postgresql.conf , pg_hba.conf и pg_ident.conf традиционно хранятся в PGDATA , хотя их можно разместить и в другом месте.
Таблица 65.1. Содержание PGDATA
| Элемент | Описание |
|---|---|
| PG_VERSION | Файл, содержащий номер основной версии PostgreSQL |
| base | Подкаталог, содержащий подкаталоги для каждой базы данных |
| global | Подкаталог, содержащий общие таблицы кластера, такие как pg_database |
| pg_commit_ts | Подкаталог, содержащий данные о времени фиксации транзакций |
| pg_clog | Подкаталог, содержащий данные о состоянии транзакции |
| pg_dynshmem | Подкаталог, содержащий файлы, используемые подсистемой динамически разделяемой памяти |
| pg_logical | Подкаталог, содержащий данные о состоянии для логического декодирования |
| pg_multixact | Подкаталог, содержащий данные о состоянии мультитранзакций (используемые для разделяемой блокировки строк) |
| pg_notify | Подкаталог, содержащий данные состояния прослушивания и нотификации (LISTEN/NOTIFY) |
| pg_replslot | Подкаталог, содержащий данные слота репликации |
| pg_serial | Подкаталог, содержащий информацию о выполненных сериализуемых транзакциях. |
| pg_snapshots | Подкаталог, содержащий экспортированные снимки (snapshots) |
| pg_stat | Подкаталог, содержащий постоянные файлы для подсистемы статистики. |
| pg_stat_tmp | Подкаталог, содержащий временные файлы для подсистемы статистики |
| pg_subtrans | Подкаталог, содержащий данные о состоянии подтранзакций |
| pg_tblspc | Подкаталог, содержащий символические ссылки на табличные пространства |
| pg_twophase | Подкаталог, содержащий файлы состояний для подготовленных транзакций |
| pg_xlog | Подкаталог, содержащий файлы WAL (журнал предзаписи) |
| postgresql.auto.conf | Файл, используемый для хранения параметров конфигурации, которые устанавливаются при помощи ALTER SYSTEM |
| postmaster.opts | Файл, содержащий параметры командной строки, с которыми сервер был запущен в последний раз |
| postmaster.pid | Файл блокировки, содержащий идентификатор (ID) текущего управляющего процесса (PID), путь к каталогу данных кластера, время запуска управляющего процесса, номер порта, путь к каталогу Unix-сокета (пустой для Windows), первый корректный адрес прослушивания (listen_address) (IP-адрес или * , либо пустое значение в случае отсутствия прослушивания по TCP), и ID сегмента разделяемой памяти (этот файл отсутствует после остановки сервера). |
Для каждой базы данных в кластере существует подкаталог внутри PGDATA /base , названный по OID базы данных в pg_database . Этот подкаталог по умолчанию является местом хранения файлов базы данных; в частности, там хранятся её системные каталоги.
Каждая таблица и индекс хранятся в отдельном файле. Для обычных отношений, эти файлы получают имя по номеру файлового узла таблицы или индекса, который содержится в pg_class . relfilenode . Но для временных отношений, имя файла имеет форму t BBB _ FFF , где BBB — идентификатор серверного процесса сервера, который создал данный файл, а FFF — номер файлового узла. В обоих случаях, помимо главного файла (также называемого основным слоем), у каждой таблицы и индекса есть карта свободного пространства (см. Раздел 65.3), в которой хранится информация о свободном пространстве в данном отношении. Имя файла карты свободного пространства образуется из номера файлового узла с суффиксом _fsm . Также таблицы имеют карту видимости, хранящуюся в слое с суффиксом _vm , для отслеживания страниц, не содержащих мёртвых записей. Карта видимости подробнее описана в Разделе 65.4. Нежурналируемые таблицы и индексы имеют третий слой, так называемый слой инициализации, имя которого содержит суффикс _init (см. Раздел 65.5).
Внимание
Заметьте, что хотя номер файла таблицы часто совпадает с её OID, так бывает не всегда; некоторые операции, например, TRUNCATE , REINDEX , CLUSTER и некоторые формы команды ALTER TABLE могут изменить номер файла, но при этом сохранят OID. Не следует рассчитывать, что номер файлового узла и OID таблицы совпадают. Кроме того, для некоторых системных каталогов, включая и pg_class , в pg_class . relfilenode содержится ноль. Фактический номер файлового узла для них хранится в низкоуровневой структуре данных, и его можно получить при помощи функции pg_relation_filenode() .
Когда объём таблицы или индекса превышает 1 GB, они делятся на сегменты размером в один гигабайт. Файл первого сегмента называется по номеру файлового узла (filenode); последующие сегменты получают имена filenode.1, filenode.2 и т. д. При такой организации хранения не возникает проблем на платформах, имеющих ограничения по размеру файлов. (На самом деле, 1 ГБ — лишь размер по умолчанию. Размер сегмента можно изменить при сборке PostgreSQL , используя параметр конфигурации —with-segsize .) В принципе, карты свободного пространства и карты видимости также могут занимать нескольких сегментов, хотя на практике это маловероятно.
У таблицы, столбцы которой могут содержать данные большого объёма, будет иметься собственная таблица TOAST, предназначенная для отдельного хранения значений, которые слишком велики для хранения в строках самой таблицы. Основная таблица связывается с её таблицей TOAST (если таковая имеется) через pg_class . reltoastrelid . За подробной информацией обратитесь к Разделу 65.2.
Содержание таблиц и индексов рассматривается ниже (см. Раздел 65.6).
Табличное пространство делает сценарий более сложным. Каждое пользовательское табличное пространство имеет символическую ссылку внутри каталога PGDATA /pg_tblspc , указывающую на физический каталог табличного пространства (т. е., положение, указанное в команде табличного пространства CREATE TABLESPACE ). Эта символическая ссылка получает имя по OID табличного пространства. Внутри физического каталога табличного пространства имеется подкаталог, имя которого зависит от версии сервера PostgreSQL , как например PG_9.0_201008051 . (Этот подкаталог используется для того, чтобы последующие версии базы данных могли свободно использовать одно и то же местоположение, заданное в CREATE TABLESPACE .) Внутри каталога конкретной версии находится подкаталог для каждой базы данных, которая имеет элементы в табличном пространстве, названный по OID базы данных. Таблицы и индексы хранятся внутри этого каталога, используя схему именования файловых узлов. Табличное пространство pg_default недоступно через pg_tblspc , но соответствует PGDATA /base . Подобным же образом, табличное пространство pg_global недоступно через pg_tblspc , но соответствует PGDATA /global .
Функция pg_relation_filepath() показывает полный путь (относительно PGDATA ) для любого отношения. Часто это избавляет от необходимости запоминать многие из приведённых выше правил. Но следует помнить, что эта функция выдаёт лишь имя первого сегмента основного слоя отношения, т. е. возможно, понадобится добавить номер сегмента и/или _fsm , _vm или _init , чтобы найти все файлы, связанные с отношением.
Временные файлы (для таких операций, как сортировка объёма данных большего, чем может уместиться в памяти) создаются внутри PGDATA /base/pgsql_tmp или внутри подкаталога pgsql_tmp каталога табличного пространства, если для них определено табличное пространство, отличное от pg_default . Имя временного файла имеет форму pgsql_tmp PPP . NNN , где PPP — PID серверного процесса, а NNN служит для разделения различных временных файлов этого серверного процесса.
| Пред. | Наверх | След. |
| Глава 65. Физическое хранение базы данных | Начало | 65.2. TOAST |
Где хранится бд которая создана в psql-треминале?
Где, в свою очередь, хранит данные сам PostgreSQL можно посмотреть командой:
show data_directory;
Вот эта вся директория (так же известная как PGDATA ) — и есть данные СУБД, включая все созданные базы в этом кластере. Обязательно включая абсолютно всё содержимое по всем симлинкам внутри этой директории! Отдельное представление созданной create datebase вы найти можете внутри каталога PGDATA , но вы обязаны понимать, что без всей целиком директории PGDATA отдельные её части — лишь куча бесполезного бинарного мусора. Для каких-то осмысленных манипуляций с данными PostgreSQL обязательно необходим весь PGDATA со всем содержимым по всем симлинкам.
Отслеживать
ответ дан 30 ноя 2018 в 18:03
21.5k 3 3 золотых знака 27 27 серебряных знаков 53 53 бронзовых знака
В PGDATA лежат простые файлы. Это и есть бд? Я думал у них будет какое-то расширение.
1 дек 2018 в 4:54
Эта директория и есть все данные этого экземпляра postgresql. Расширения файлов? А зачем они нужны? В PGDATA за исключением recovery.conf (либо пара signal файлов начиная с PG12 вместо него, «спасибо» мне), либо, в некоторых инсталляциях, pg_hba.conf и postgresql.conf — вообще руками лезть не надо. Ну и зачем усложнять именования бесполезными надуманными расширениями?
1 дек 2018 в 14:41
data_directory может быть пустая?
3 дек 2018 в 23:24
@Hellseher смотря откуда смотреть. По пути из show data_directory; — не может. В конфигах такая настройка может отсутствовать.
3 дек 2018 в 23:53
В терминологии PostgreSQL это называется — кластером, другими словами директория, где будут хранится ВСЕ создаваемые базы данных, это может быть отдельный диск, NFS, DAS, SAN и т.д.
Все возможные конфигурации хранятся в postgresql.conf файле:
postgres:~$ grep data_directory /etc/postgresql/*/main/postgresql.conf data_directory = '/var/lib/postgresql/9.6/main' # use data in another directory postgres@:~$ ls -la /var/lib/postgresql/*/main total 92 drwx------ 19 postgres postgres 4096 Dec 3 01:40 . drwxr-xr-x 3 postgres postgres 4096 Nov 29 22:43 .. drwx------ 6 postgres postgres 4096 Nov 29 22:43 base drwx------ 2 postgres postgres 4096 Dec 1 00:12 global drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_clog drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_commit_ts drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_dynshmem drwx------ 4 postgres postgres 4096 Nov 29 22:43 pg_logical drwx------ 4 postgres postgres 4096 Nov 29 22:43 pg_multixact drwx------ 2 postgres postgres 4096 Dec 1 00:12 pg_notify drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_replslot drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_serial drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_snapshots drwx------ 2 postgres postgres 4096 Dec 1 00:12 pg_stat drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_stat_tmp drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_subtrans drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_tblspc drwx------ 2 postgres postgres 4096 Nov 29 22:43 pg_twophase -rw------- 1 postgres postgres 4 Nov 29 22:43 PG_VERSION drwx------ 3 postgres postgres 4096 Nov 29 22:43 pg_xlog -rw------- 1 postgres postgres 88 Nov 29 22:43 postgresql.auto.conf -rw------- 1 postgres postgres 133 Dec 1 00:12 postmaster.opts -rw------- 1 postgres postgres 91 Dec 1 00:12 postmaster.pid
Ссылки
Postgresql где лежат базы

Оглавление
Расположение файловой структуры БД
Расположение файловой структуры БД
Автор: Cerebro Support
Обновлено больше недели назад
Оглавление
База данных PostgreSQL представляет собой директорию на дисковом массиве содержащую в себе файловую структуру определённого вида. В частности, в корне этой директории располагаются конфигурационные файлы, с помощью которых можно управлять различными параметрами работы PostgreSQL.
Для того, чтобы определить положение директории БД в случае уже установленной службы PostgreSQL, нужно узнать параметры командной строки, с которыми она запускается.
Windows
Откройте оснастку Службы. Щёлкните службу PostgreSQL в списке правой кнопкой мыши, а затем выберите Свойства из контекстного меню.

В открывшемся окне в поле Исполняемый файл можно увидеть (выделить и скопировать) команду запуска службы со всеми параметрами.
Linux
В момент, когда служба PostgreSQL запущена выполните в консоли следующую команду:
ps afx | grep postgres
В результатах команды нужно найти строку вида:
/usr/lib/postgresql/9.0/bin/postgres -D /var/lib/postgresql/9.0/main -c unix_socket_directory=/var/run/postgresql -c config_file=/etc/postgresql/9.0/main/postgresql.conf
После того, как вы определили командную строку запуска службы PostgreSQL, следующие ключи в ней указывают расположение файлов БД:
ключ-D — директория файловой структуры БД;
ключ-с с параметром config_file — расположение главного конфигурационного файла, обычно именуемого postgresql.conf;
ключ-с с параметром hba_file — расположение конфигурационного файла с параметрами аутентификации, обычно именуемого pg_hba.conf.
Если для конфигурационных файлов не задано персональное расположение, то они находятся в корне директории БД.
Перемещение базы данных postgresql в Ubuntu 18.04 LTS

При установке на Ubuntu zabbix-server база данных по умолчанию пишется в папку /var/lib/postgresql. Со временем база растёт и поднимается вопрос переноса её на другой раздел диска. Перенесём базу данных в /opt/postgresql.
Требования
- ОС Ubuntu 18.04 LTS. Или Ubuntu 16.04.
- Работаем из-под root.
- Сервер PostgreSQL
- Сервер zabbix. Не обязательно.
Подготовка
Проверим где находится текущая БД postgresql.
sudo -u postgres psql psql (9.5.14) Type "help" for help. postgres=# SHOW data_directory; data_directory ------------------------------ /var/lib/postgresql/9.5/main (1 row)
БД находится в папке /var/lib/postgresql/9.5/main.
Для переноса БД нам понадобится rsync:
apt-get install rsync
Убедимся что существует директория /opt.
Остановка сервисов
service zabbix-server stop systemctl stop postgresql
Проверка статуса postgresql.
systemctl status postgresql
Ищем строку «Stopped PostgreSQL RDBMS.»
Перенос файлов базы данных
rsync -av /var/lib/postgresql /opt
После переноса переименуем старую папку, на всякий случай:
mv /var/lib/postgresql/9.5/main /var/lib/postgresql/9.5/main.bak
Настройка конфигурации postgresql
Правим файл postgresql.conf:
vim /etc/postgresql/9.5/main/postgresql.conf
Изменяем значение data_directory:
data_directory = '/opt/postgresql/9.5/main'
Запуск сервисов
systemctl start postgresql
Проверяем где находится текущая БД postgresql.
sudo -u postgres psql psql (9.5.14) Type "help" for help. postgres=# SHOW data_directory; data_directory ------------------------------ /opt/postgresql/9.5/main (1 row)
БД находится в папке /opt/postgresql/9.5/main.
service zabbix-server start
Удаление ненужных файлов
rm -Rf /var/lib/postgresql/9.5/main.bak