Postmaster pid где находится windows

Обновлено: 04.07.2024

PostgreSQL (произносится «Пост-Грэс-Кью-Эл») — свободная объектно-реляционная система управления базами данных (СУБД).

Установка

После установки

После установки проверьте версию установленного PostgreSQL

postgres (PostgreSQL) 9.2.24

Расположение файлов с настройками, например, postgresql.conf можно получить выполнив

Password: config_file ------------------------------------- /var/lib/pgsql/data/postgresql.conf (1 row)

В этом примере директория, которая содержит настройки это

Полезно изучить её содержание

total 48 drwx------. 7 postgres postgres 67 Jun 9 22:54 base drwx------. 2 postgres postgres 4096 Jun 9 23:19 global drwx------. 2 postgres postgres 18 Jun 9 13:54 pg_clog -rw-------. 1 postgres postgres 4371 Jun 10 01:23 pg_hba.conf -rw-------. 1 postgres postgres 1636 Jun 9 13:54 pg_ident.conf drwx------. 2 postgres postgres 58 Jun 10 00:00 pg_log drwx------. 4 postgres postgres 36 Jun 9 13:54 pg_multixact drwx------. 2 postgres postgres 18 Jun 9 14:14 pg_notify drwx------. 2 postgres postgres 6 Jun 9 13:54 pg_serial drwx------. 2 postgres postgres 6 Jun 9 13:54 pg_snapshots drwx------. 2 postgres postgres 25 Jun 10 02:06 pg_stat_tmp drwx------. 2 postgres postgres 18 Jun 9 13:54 pg_subtrans drwx------. 2 postgres postgres 6 Jun 9 13:54 pg_tblspc drwx------. 2 postgres postgres 6 Jun 9 13:54 pg_twophase -rw-------. 1 postgres postgres 4 Jun 9 13:54 PG_VERSION drwx------. 3 postgres postgres 60 Jun 9 13:54 pg_xlog -rw-------. 1 postgres postgres 19889 Jun 10 01:43 postgresql.conf -rw-------. 1 postgres postgres 45 Jun 9 14:14 postmaster.opts -rw-------. 1 postgres postgres 92 Jun 9 14:14 postmaster.pid

Подключение к БД

Чтобы получить доступ к базам данных можно воспользоваться стандартной консолью psql.

Если Вы хотите подключиться из bash в Windows не забудьте добавить местоположение psql.exe (у меня это C:\Program Files\PostgreSQL\12\bin) в PATH

Как это делается описано в статье PATH

psql.exe -h localhost -p 5433 -U postgres

sudo su - postgres
psql

psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1)) Type "help" for help.

Если БД на локальном хосте

psql -h 127.0.0.1 -d DATABASENAME -U DATABASEUSERNAME

Получить данные о подключении

You are connected to database "postgres" as user "postgres" via socket in "/var/run/postgresql" at port "5432".

Список существующих БД

Список уже существующих на сервере баз данных можно получить командой

Обратите внимание на столбцы Encoding, Collate и Ctype. Знание кодировок может Вам пригодиться в будущем.

Создать базу данных

Создадим базу данных heihei_ru_db с кодировкой utf8

Создадим базу данных heihei с кодировкой utf8 и укажем значения для Collate, Ctype и Template

Проверим, что получилось

Если я в bash сделаю

То получу сразу четыре доступные кодировки

C
C.UTF-8
en_US.utf8
POSIX

Но создать БД, например, с en_US.utf8 у меня не получается

Приводит к ошибке

ERROR: invalid locale name: "en_US.UTF-8"

Если Вы знаете как решить эту проблему - отпишитесь в комментариях к статье.

UPD: Выполнил такую же команду в Ubuntu и база успешно создана

Удалить базу данных

Чтобы удалить базу данных воспользуйтесь командой

DROP DATABASE db_name;

Проверить кодировки

Проверить кодировку сервера можно командой

server_encoding ----------------- UTF8 (1 row)

Проверить кодировку клиента

client_encoding ----------------- WIN1252 (1 row)

Когда вы находитесь в интерактивном режиме PostgreSQL в консоле появляется префикс

Где db это название текущей базы данных

Показать адрес текущей директории

Вернуться в PostgreSQL можно выполнив

Зайти в БД

Чтобы начать работу с базой данных нужно знать её имя, например пусть Вам нужна база даныых, которую назвали просто HeiHei_ru_DB

You are now connected to database "HeiHei_ru_DB" as user "postgres".

Если вы работаете в Linux и база данных находится на том же хосте можно выполнить

psql -h 127.0.0.1 -d DATABASENAME -U DATABASEUSERNAME

Чтобы посмотреть список таблиц введите

List of relations
Schema | Name | Type | Owner
--------+--------+-------+----------
public | person | table | postgres
(1 row)

Чтобы посмотреть всю таблицу person уже можно использовать стандартный

SELECT * FROM person;

Запуск скрипта из файла

Сперва проверим, что с переменными окружения всё впорядке.

Для этого введём в консоль psql.exe нажмём Enter и проверим что bash не жалуется на неизвестную команду.

Если жалуется - прочитайте мои советы в статье Системная переменная PATH

Пишем скрипт script.sql

CREATE TABLE person ( id int, first_name VARCHAR(50), last_name VARCHAR(50), gender VARCHAR(5), date_of_birth DATE )

Применим этот скрипт к базе данных HeiHei_ru_DB

У меня postgres запущен локально на порту 5433. У Вас может быть на 5432 - проверьте.

cat script.sql | psql.exe -h localhost -p5433 -U postgres HeiHei_ru_DB

Password for user postgres:
CREATE TABLE

Саме время сделать что-то более близкое к реальному скрипту

На поля таблицы нужно ввести некоторые ограничения и добавить им свойств.

CREATE TABLE booking_sites ( id BIGSERIAL NOT NULL PRIMARY KEY, company_name VARCHAR(50) NOT NULL, origin_country VARCHAR(50) NOT NULL, age VARCHAR(3) NOT NULL, date_of_birth DATE NOT NULL, website_url VARCHAR(50) );

Теперь запустим этот скрпит уже не в тестовую а в рабочую базу данных heihei (которая совпадает с названием сайта HeiHei.ru, но если написать .ru будет синтаксическая ошибка ERROR: syntax error at or near ".")

cat booking_sites.sql | psql.exe -h localhost -p5433 -U postgres heihei

Password for user postgres:
CREATE TABLE

Содержание базы данных

В предыдущем параграфе мы создали в базе данных heihei таблицу booking_sites

Убедимся в том, что скрипт отработал удачно

Перейдём в базу данных heihei и проверим создалась ли таблица

You are now connected to database "heihei" as user "postgres".

List of relations Schema | Name | Type | Owner --------+---------------+-------+---------- public | booking_sites | table | postgres (1 row)

Описание таблицы

Если таблица создана какое-то время назад. Вы могли уже забыть, какие конкретно столбцы она содержит.

Пользователи

Получить список пользователей

List of roles Role name | Attributes | Member of -----------+------------------------------------------------+----------- postgres | Superuser, Create role, Create DB, Replication | <>

Изменение таблицы

Когда нужно обновить название столбца таблицы используем команду ALTER

Предположим полю website_url не хватает 50 символов. Увеличим длину до 60.

ALTER TABLE booking_sites ALTER column website_url TYPE VARCHAR(60);

Изначально хочу сказать что у меня нет опыта эксплуатации PostgreSQL на линуксе, так что рекомендации (какой он хороший, быстрый, надежный и эта СУБД под него заточена) а так же любые другие ответы по линуксу мне пока не помогут. В ближайшем будущем я конечно планирую пробовать Ubuntu/Centos+PostgreSQL, но пока только Windows. Я откладываю перенос продакшина на линукс из-за того что абсолютно нет никакого опыта траблшутинга на этой ОС.

Работаю с этой связкой (PostgreSQL+Windows) чуть более 3 лет.
Есть сервера Win Server 2008 / Win Server 2012 и :
- 1С 8.2 и PostgreSQL 9.1.2-1.1C
- 1С 8.3.10 и PostgreSQL 9.4.2-1.1C
- 1С 8.3.12 и PostgreSQL 9.6.6-1.1С
- 1С 8.3.12 и PostgreSQL 9.6.7-1.1C
у разных клиентов, разные размеры баз, от 10ГБ до 100ГБ суть не в этом, по быстродействию пока нет проблем, все устраивает.

Хочу поделиться опытом и возможно получить помощи при решениях нескольких задач от более опытных ребят:)

! Аварийное выключение сервера, почти всегда приводит к тому что не запускается служба СУБД (ЭТО ПРОБЛЕМА. Которую я решал почти каждый раз по разному)

На связке 1С 8.3.10 и PostgreSQL 9.4.2-1.1C - никак службу не мог запустить, пока не запустил установщик СУБД той же версии и не переустановил, тем самым восстановив его файлики, список баз и настройки при этом сохранились, тогда просто повезло ( более детального описания нет, но факт остается фактом)

На этой же связке при похожем случае - помог сброс х-лога с помощью штатной утилиты pg_resetxlog
P.S. В 10 версии, убрали ее, взамен на pg_resetwal - пока не пользовался )

Далее про связку - 1С 8.3.12 и PostgreSQL 9.6.6-1.1С

У клиента, потух свет, УПС не выдержал из-за мертвой батарейки, аптайм сервера на тот момент был чуть больше 9 месяцев. После рестарта сервера служба СУБД не запускалась, ниже событья.
Записи в логах ОС (раздела приложения)
(событье) - Waiting for server startup.
(событье) - < 2019-01-22 09:08:38.011 MSK >LOG: redirecting log output to logging collector process
(событье) - < 2019-01-22 09:08:38.011 MSK >HINT: Future log output will appear in directory "pg_log".

Записи в логах СУБД (папка pg_log)
2019-01-22 09:08:38 EET LOG: database system was interrupted; last known up at 2019-01-22 09:06:00 EET
2019-01-22 09:08:38 EET FATAL: the database system is starting up
2019-01-22 09:08:38 EET LOG: could not receive data from client: An established connection was aborted by the software in your host machine.

2019-01-22 09:08:39 EET FATAL: the database system is starting up
2019-01-22 09:08:40 EET FATAL: the database system is starting up
2019-01-22 09:08:41 EET FATAL: the database system is starting up
.
И тд - много записей
потом
2019-01-22 09:10:17 EET FATAL: the database system is starting up
2019-01-22 09:10:20 EET LOG: database system was not properly shut down; automatic recovery in progress
2019-01-22 09:10:20 EET LOG: redo starts at 1E8/BF7FB740
2019-01-22 09:10:21 EET LOG: invalid record length at 1E8/BFA563C8: wanted 24, got 0
2019-01-22 09:10:21 EET LOG: redo done at 1E8/BFA563A0
2019-01-22 09:10:21 EET LOG: last completed transaction was at log time 2019-01-22 09:07:39.420616+02
2019-01-22 09:10:21 EET FATAL: the database system is starting up
2019-01-22 09:10:22 EET LOG: MultiXact member wraparound protections are now enabled
2019-01-22 09:10:22 EET LOG: database system is ready to accept connections
2019-01-22 09:10:22 EET LOG: autovacuum launcher started
2019-01-22 09:11:39 EET LOG: could not open file "postmaster.pid": No such file or directory
2019-01-22 09:11:39 EET LOG: performing immediate shutdown because data directory lock file is invalid
2019-01-22 09:11:39 EET LOG: received immediate shutdown request
2019-01-22 09:11:39 EET WARNING: terminating connection because of crash of another server process
2019-01-22 09:11:39 EET DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.

Мои действия
- Отключил службу СУБД
- Перезагрузил сервер с отключенной службой
- Удалил файлы "postmaster.pid" и "postmaster.opts" из папки Data
- Перезагрузил сервер, включил и запустил службу СУБД - и все заработало. (возможно мог поступить иначе, но мне - эти действия уже несколько раз помогли)
- После этого конечно выполнил обслуживание баз на уровне СУБД (вакуум / реиндекс) а так же протестировал базы из конфигуратора 1С, а потом выгрузил *.dt - и так делал каждый раз. Эти действия по моему мнению достаточны для того что сделать вывод - что базы не пострадали.

Но что меня до сих пор смущает, так это ситуация одного клиента.
У него Win Server 2008 + 1С 8.3.10 и PostgreSQL 9.6.7-1.1C. На сервере беда с материнской платой - и за последний месяц у него сервер уходил с синим экраном в аварийную перезагрузку более 30 раз, отваливаются диски, то системный, то диск с базами и тд (для наглядности привожу срин). При этом ни разу служба СУБД не падала, каждый раз восстанавливалась и работала как ни в чем не бывало, и у него настроены бэкапы средствами СУБД и средствами 1С, и все прекрасно выполняются, на днях без проблем развернул *.dt- шник на другом тестовом сервере. Я поражен и не могу понять с чем это связанно. Сейчас готовлю перенос на новый сервер и за одно хотел поделиться опытом.

У меня следующие вопросы. Личный опыт и конкретные рекомендации будут для меня очень полезными.
1) Ситуация такая: Cлужбу я так и не могу запустить и если на руках есть только папка DATA - могу ли я ее перенести и развернуть на другом сервере, подсунуть ее другой СУБД той же версии, а если версии отличаются ? Как правильно это сделать и достучатся до рабочих баз ?
2) Как правильно обновлять версии СУБД ? Пользовались pg_upgrade ?
3) Достаточны ли ежедневные регламентные задания Vacuum/Analize и Reindex - ? Или есть еще рекомендации ?
4) При аварийных выключения линукс сервера - там тоже служба СУБД PosgreSQL не поднимается самостоятельно ?

Инцидент: в ситуации, когда сервер был выключен аварийно, через кнопку выключения или при отсутствии электропитания, то после его включения служба PostgreSQL в некоторых случаях не запускается.

Для версий PostgreSQL:

1. Запустите сеанс командной строки от Администратора.


2. Выполните последовательно следующие команды и внимательно следите за их работой.

3. Определить домашний каталог PostgreSQL.


4. Проверьте реальный статус экземпляра службы PostgreSQL.


5. Выполните команду для полной остановки процесса PostgreSQL.

Следующими командами выполняется корректный выход из рабочего состояния сервера СУБД и его запуск.


6. Запустите приложение СУБД.


7. После этого заново остановите процесс. Повтор данного шага вызван тем, что таким образом запуска приложение сервера СУБД корректно завершит недостающие транзакции.


8. После выполненных шагов по перезапуску и правильной остановке экземпляра СУБД запустите службу PostgreSQL.


В некоторых случаях после аварийной перезагрузки или в результате срабатывания антивирусных программ при запуске ОС Windows несколько файлов, которые необходимы для работы СУБД PostgreSQL могут отсутствовать. Это может объясняться критическим сбоем ОС.

1. Запустите скрипт, с помощью которого, проверьте, что для данной версии СУБД присутствуют все компоненты и файлы, которые входят в состав.

2. Скачайте и разместите файл скрипт в папку с PostgreSQL: :/Папка_PostgreSQL/bin/.

3. Запустите файл скрипта. В результате выполнения будет сформирован файл отчета report.txt.


4. Откройте файл отчета и проверьте, что все компоненты присутствуют.

Обязательно должны присутствовать такие библиотеки и исполняемые файлы, а также все библиотеки DLL.

  • libintl-9.dll
  • pg_ctl.exe
  • postgres.exe
  • psql.exe


5. Если какие-либо файлы отсутствуют. Тогда загрузите архив для соответствующей версии PostgreSQL и скопируйте недостающие файлы в папку СУБД :/Папка_PostgreSQL/bin/.

Когда я пытаюсь запустить программу, которая должна использовать сервер базы данных, я получаю эту ошибку:

«При попытке войти в систему или создать производственную базу данных возникла проблема. Детали: Не удалось подключиться к серверу; Не удалось подключиться к удаленному сокету. Теперь приложение должно закрыться»

Я также столкнулся с этой ошибкой один раз при открытии той же программы:

«При попытке войти в систему или создать производственную базу данных возникла проблема. Детали: FATAL: не удалось загрузить pg_hba.conf Приложение теперь должно закрыться».

Я попытался запустить службу, вошедшую в систему как локальная системная учетная запись, а также как моя собственная учетная запись (в свойствах службы postgres), но безрезультатно. Я также попытался перезагрузить компьютер. После долгих поисков неисправностей в Интернете я узнал, что хорошо проверить файл pg_log. Вот содержимое последней записи pg_log:

Кажется, возникают проблемы с файлом pg_hba.conf, который выглядит следующим образом:

Согласно многим предложениям в Интернете, я попытался отредактировать верхнюю строку для ряда различных альтернатив (разместить все все доверие / разместить все 127.0.0.1/32 доверие / разместить все 192.168.0.100/24 доверия и т. Д.). Это имело смысл для меня, так как файл журнала говорил, что локальные соединения не поддерживаются postgres, и также указывал на эту строку. Однако ни одно из моих изменений не оказало никакого влияния. Я пытался перезагрузить компьютер после каждого изменения, но ничего не изменилось.

Когда я искал примеры того, как обычно выглядит файл pg_hba.conf, примеры немного отличались от моего файла. Я заметил, что в программном файле PostgreSQL, помимо pg_hba.conf, был также файл «20130529-150444-old-pg_hba.conf», который больше напоминал примеры, которые я находил в Интернете. Этот файл имеет несколько строк комментариев перед этими последними строками:

Уже несколько дней я занимаюсь поиском и устранением неисправностей в сети, но ничего, что я нашел, не сработало. Извините за такой длинный вопрос, но я хотел быть внимательным и включить всю необходимую информацию. Буду признателен, если кто-нибудь сможет пролить свет на эту проблему или предложить предложения.

четверг, 31 декабря 2009 г.

Не запускается служба PostgreSql. Что делать?

Хорошие пользователи нашей системы знают, где находится кнопка пуск и знают, что в системе не двое часиков “одни с цифрами, а другие песочные”. Поэтому единственное, что удалось сделать по телефону, так это попытаться руками запустить службу СУБД, результат – служба таки не запускается. Пришлось пробрасывать на тот компьютер интернет (на компьютерах, где установлена наша система интернета быть не должно) для возможности удаленного подключения.

Проблема в том, что на тот момент это была единственная доступная информация… Логи PostgreSql пусты, записей в них никаких, в системных логах – тоже пустота.

Отладка служб – процесс не простой, поэтому многие разработчики предусматривают механизмы запуска приложения-службы, как обыкновенного консольного приложения с помощью ключей командной строки. И PostgreSql в этом плане – не исключение; для запуска нужно использовать следующую команду (Hint: эту команду можно запустить только из под неадминистративного пользователя системы, правда, если вы об этом забудете, то PostgreSql очень быстро вам об этом напомнит):

postgres -D "

Безусловно, мне повезло, проблема оказалась поправимой. Почему-то указанный файл оказался пустым, и мне понадобилось скопировать его содержимое из рабочего экземпляра СУБД, что не составило особого труда.

1 ответ 1

Может поможет кому. В Windows при установке PostgreSQL создаётся пользователь postgres. При возникновении подобной ошибки добавьте пользователя postgres во вкладку "Безопасность" папки C:Program Files (x86)PostgreSQL и дайте ему все права. После этого служба запускается нормально.

Если вы читали руководство, вы, должно быть, слышали о концепции кластера postgresql. Когда вы впервые услышите эту концепцию, вы можете немного запутаться. Кластер генерируется инструментом initdb при установке базы данных.Папку pgdata, созданную после initdb, можно понимать как физическую структуру хранения кластера. Когда база данных запускается и останавливается, папка, указанная параметром pg_ctl -D, является папкой кластера, поэтому PG-сервер может работать на PG-кластере.

Определение понятия объектов базы данных в СУБД:

any defined object in a database that is used to store or reference data

Объекты базы данных в PG включают, например: таблицы кучи, индексы, последовательности, функции и т. Д.


На рисунке ниже показано, что в кластере можно создать несколько баз данных, и каждая база данных содержит таблицы и другие объекты базы данных. В GP схема представляет собой логически изолированную концепцию. В реальном хранилище только имя схемы используется для различения имени таблицы.

Примечание. Все объекты базы данных будут однозначно соответствовать определенной базе данных. Эта изоляция логична, поэтому загрузка одной базы данных определенно повлияет на другие базы данных. Подробнее см. Введение в структуру процесса позже.

2 Физическая структура организации

2.1 Файловая структура

Теперь, чтобы инициализировать кластер, используйте спецификацию initdb, чтобы указать путь генерации.

После указания tree наблюдает за структурой каталогов файлов PGDATA

Корневой каталог вышеупомянутой файловой структуры - это папка PGDATA, созданная initdb, которая соответствует физической структуре хранения кластера (внутреннюю часть папки BASE см. В следующем разделе)

пункт описание
PG_VERSION Файл, содержащий основной номер версии PostgreSQL.
base Содержит подкаталоги, соответствующие каждой базе данных
current_logfiles Запишите файл журнала, который в настоящее время записывается сборщиком журналов
global Подкаталог, содержащий таблицу с областью кластера, например pg_database
pg_commit_ts Подкаталог, содержащий данные отметки времени фиксации транзакции
pg_dynshmem Подкаталог, содержащий файлы, используемые подсистемой динамической общей памяти.
pg_logical Подкаталог, содержащий данные о состоянии для логической репликации
pg_multixact Подкаталог, содержащий данные о состоянии нескольких транзакций (для общих блокировок строк)
pg_notify Подкаталог с данными статуса LISTEN / NOTIFY
pg_replslot Подкаталог, содержащий данные слота репликации
pg_serial Подкаталог, содержащий информацию об отправленных сериализуемых транзакциях.
pg_snapshots Подкаталог, содержащий экспортированные снимки
pg_stat Подкаталог, содержащий постоянные файлы для подсистемы статистики.
pg_stat_tmp Подкаталог, содержащий временные файлы, используемые для подсистемы статистической информации
pg_subtrans Поддиректория, содержащая данные о статусе суб-транзакций
pg_tblspc Подкаталог, содержащий символические ссылки на табличные пространства
pg_twophase Содержит подкаталоги для подготовки файлов состояния транзакции
pg_wal Подкаталог, содержащий файлы WAL (журнал упреждающей записи)
pg_xact Подкаталог, содержащий данные о статусе фиксации транзакции.
postgresql.auto.conf Один для хранения ALTER SYSTEM Установите файл параметров конфигурации
postmaster.opts Файл, в котором записаны параметры командной строки, использованные при последнем запуске сервера.
postmaster.pid Файл блокировки, который записывает текущий идентификатор процесса postmaster (PID), путь к каталогу данных кластера, метку времени запуска postmaster, номер порта, путь к каталогу сокета домена Unix (пустой в Windows) и первый доступный listen_address ( IP-адрес или * , Или пустой означает, что TCP не прослушивается) и идентификатор сегмента общей памяти (файл не существует после закрытия сервера)

2.2 Организационная структура обычного табличного файла

Для каждой базы данных есть соответствующий подкаталог в PGDATA / base, а имя подкаталога - это OID базы данных в pg_database.

Давайте создадим таблицу ниже. Файл таблицы можно найти двумя способами:

Выполните запрос pg_class.relfilenode, чтобы получить relfilenode = 16384 таблицы tbl1. Для обычных файлов таблиц укажите номер файлового узла таблицы или индекса.

Таблица создается в библиотеке postgres, мы можем войти в каталог base / 13158, чтобы увидеть файл таблицы:

При определенных операциях с базой данных файлы таблиц перераспределяются, например truncate (Это также причина, по которой усечение выполняется быстрее, чем удаление).

2.3 Организационная структура файла системной таблицы

После инициализации системы таблицы не создаются, но многие файлы таблиц были созданы в base / 13158 /. Эти файлы являются текущими системными таблицами базы данных, такими как pg_class. Обратите внимание, что relfilenode системной таблицы равен 0. Для поиска таблицы можно использовать функцию oid скрытого столбца или pg_relation_filepath. файл.

Существует два типа системных таблиц: один - это уникальные системные таблицы в каждой базе данных, а другой - системные таблицы, общие для всех баз данных. Почему существуют общие таблицы? Например, pg_database записывает информацию обо всех базах данных в кластере, и нет необходимости хранить отдельную копию для каждой базы данных. Общие системные таблицы хранятся в $PGDATA/global/ Под содержимым.

Можно увидеть в каталоге данных *_fsm с участием *_vm Соответствуют два типа файлов, два типа файлов и файлы таблиц, которые будут представлены в следующих главах.

2.4 Табличное пространство

Табличное пространство можно понимать как каталог для хранения файлов таблиц. Табличное пространство обеспечивает гибкий метод управления хранением таблиц:
Например, когда текущий диск почти заполнен, вы можете создать табличное пространство в любой вновь смонтированной файловой системе и сохранить таблицу в новом каталоге; часто используемую таблицу можно поместить в IO. На дисках с более высокой производительностью, например SSD. Таблицы данных, которые используются редко, можно хранить на более дешевой и медленной дисковой системе.

Есть два способа использовать табличное пространство:

  1. Укажите табличное пространство при создании таблицы
  2. Укажите табличное пространство при создании базы данных


Создать табличное пространство

После создания табличного пространства вы можете $PGDATA/pg_tblspc Найдите символьную ссылку табличного пространства и обратите внимание, что путь к табличному пространству должен быть согласованным после резервного копирования и восстановления.

Адрес, возвращаемый pg_relation_filepath pg_tblspc/46803/PG_10_201707211/13158/46807 , PG использует ссылку в каталоге pg_tblspc для поиска соответствующего табличного пространства. Настоящий каталог файла таблицы:

Где PG_10_201707211 определяется в соответствии с номером версии:

Примечание: PostgreSQL использует символические ссылки для упрощения реализации табличных пространств, что означает, что табличные пространства могут использоваться только в системах, поддерживающих символические ссылки.

3 Организационная структура табличного файла


Табличный файл по умолчанию состоит из блока размером 8 КБ, а 8 КБ является базовой единицей чтения и записи базы данных. «Анализ ядра базы данных PostgreSQL» описывается так:

Каждая страница состоит из пяти частей.

пункт описание
PageHeaderData Длина 24 байта. Содержит общую информацию о странице, включая указатели свободного места.
ItemIdData Массив пар записей (смещение, длина), указывающих на фактический элемент. Каждый элемент занимает 4 байта.
Free space Нераспределенное пространство (свободное место). Указатели новых элементов выделяются с начала этой области, а новые элементы - с конца.
Items Сам предмет.
Special space Индексируйте данные, относящиеся к шаблонам доступа. В разных методах доступа к индексу хранятся разные данные. В обычной таблице пусто.

Первые 24 байта страницы образуют PageHeaderData. После заголовка страницы идет 4-байтовый ItemIdData, который является LinpX в пути, его можно понять как указатель на фактическое место хранения кортежа (TupleX на рисунке). Обратите внимание, что порядок хранения linp и кортежа следующий. И наоборот, linp растет сверху вниз, а кортеж - снизу вверх.

Информация о текущей странице определяется в PageHeaderData:

площадь Виды длина описание
pd_lsn PageXLogRecPtr 8 bytes LSN: первый байт после последнего байта записи WAL, которая последней изменила эту страницу.
pd_checksum uint16 2 bytes Код проверки страницы
pd_flags uint16 2 bytes Флаговый бит
pd_lower LocationIndex 2 bytes Смещение к началу свободного места
pd_upper LocationIndex 2 bytes Смещение до конца свободного места
pd_special LocationIndex 2 bytes Смещение к началу особого пространства
pd_pagesize_version uint16 2 bytes Информация о размере страницы и номере версии макета
pd_prune_xid TransactionId 4 bytes Самый старый восстановленный XMAX на странице или 0, если его нет

После заголовка ItemIdData из кода видно, что это 4-байтовая структура, используемая для побитовой разборки. Он записывает смещение, биты атрибутов и длину кортежа.

Кортеж обычно состоит из нескольких частей:

The overall structure of a heap tuple looks like:

Кортежи хранятся в прямом направлении от конца нераспределенного пространства. Фактическая структура зависит от содержимого таблицы. Все строки таблицы построены одинаково, и будет заголовок фиксированной длины HeapTupleHeaderData:

Информация, хранящаяся в HeapTupleHeaderData, является основой для реализации механизма MVCC.

площадь Виды длина описание
t_xmin TransactionId 4 bytes Вставить логотип XID
t_xmax TransactionId 4 bytes Удалить логотип XID
t_cid CommandId 4 bytes Вставить и / или удалить флаги CID (перезаписать t_xvac)
t_xvac TransactionId 4 bytes Операция VACUUM перемещает XID версии строки
t_ctid ItemPointerData 6 bytes TID текущей версии или указать на обновленную версию строки
t_infomask2 uint16 2 bytes Некоторые атрибуты плюс несколько флагов
t_infomask uint16 2 bytes Несколько флагов
t_hoff uint8 1 byte Смещение к пользовательским данным

Когда кортеж получается путем сканирования таблицы или индекса, кажется, что он просто получил искаженные символы. Имеет смысл разделить данные с информацией о структуре таблицы. Информация о структуре таблицы хранится в системной таблице pg_attribute. Ключевые значения для определения позиции домена - attlen и attalign.

4 Считанные данные таблицы


Индексное сканирование
Блок индекса btree сначала будет загружен в память, он найдет определенную страницу данных и смещение в индексе, затем загрузит указанную страницу в память и прочитает данные в соответствии с смещением. Видно, что операции ввода-вывода значительно сокращаются, и нет необходимости сканировать несколько страниц (стоимость - это сканирование индексных блоков и страниц).

Читайте также: