<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Базы данных on Sysadminium</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/</link><description>Recent content in Базы данных on Sysadminium</description><generator>Hugo</generator><language>ru-ru</language><lastBuildDate>Mon, 21 Jun 2021 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.sysadminium.ru/docs/linux/linux_servers/databases/index.xml" rel="self" type="application/rss+xml"/><item><title>Репликация в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/replikaciya_postgresql/</link><pubDate>Mon, 21 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/replikaciya_postgresql/</guid><description>&lt;h2 id="задачи-и-виды-репликации"&gt;Задачи и виды репликации&lt;/h2&gt;
&lt;p&gt;Репликация PostgreSQL решает две задачи:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;отказоустойчивость&lt;/strong&gt; — если сломается один из серверов, клиенты могут продолжить работать на резервном;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;масштабируемость&lt;/strong&gt; — резервный сервер принимает запросы на чтение, так что некоторую нагрузку можно возложить на него.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Репликация на серверах PostgreSQL бывает двух видов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Физическая&lt;/strong&gt; — основной сервер передает поток wal записей на сервер репликации. Требования следующие:
&lt;ul&gt;
&lt;li&gt;одинаковые версии PostgreSQL;&lt;/li&gt;
&lt;li&gt;одинаковые ОС;&lt;/li&gt;
&lt;li&gt;возможна репликация только всего кластера.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Логическая&lt;/strong&gt; — поставщик публикует свои изменения, а подписчик получает и применяет эти изменения у себя. Особенности следующие:
&lt;ul&gt;
&lt;li&gt;оба сервера могут быть и поставщиком и подписчиком, но на разные объекты. Например на в одном кластере опубликована одна табличка, а на другом — другая, и эти кластера подписаны друг на друга (на эти таблички). Это позволяет использовать двухсторонний обмен;&lt;/li&gt;
&lt;li&gt;репликация возможна между разными ОС;&lt;/li&gt;
&lt;li&gt;возможна выборочная репликация отдельных объектов кластера.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="физическая-репликация-postgresql"&gt;Физическая репликация PostgreSQL&lt;/h2&gt;
&lt;p&gt;Алгоритм создания такой репликации следующий:&lt;/p&gt;</description></item><item><title>Резервирование PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/rezervirovanie_postgresql/</link><pubDate>Fri, 18 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/rezervirovanie_postgresql/</guid><description>&lt;h2 id="введение"&gt;Введение&lt;/h2&gt;
&lt;p&gt;Существует &lt;strong&gt;логическое&lt;/strong&gt; и &lt;strong&gt;физическое&lt;/strong&gt; резервирование PostgreSQL. Первый тип сохраняет SQL команды выполнив которые можно восстановить объекты, например создать базу данных, наполнить её таблицами, заполнить таблицы данными и тому подобное. А второй тип резервирует сами данные, то есть сохраняет каталог PGDATA.&lt;/p&gt;
&lt;h2 id="логическое-резервирование-postgresql"&gt;Логическое резервирование PostgreSQL&lt;/h2&gt;
&lt;p&gt;Недостаток логического копирования — невысокая скорость. При этом логическую копию можно загрузить в более новую версию сервера postgres. Или выгрузить базу с сервера на Windows и загрузить её на Linux. Также логическое резервное копирование позволяет сохранять не только базы, но и отдельно таблички или весь кластер.&lt;/p&gt;</description></item><item><title>Методы аутентификации в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/metody_autentifikacii_postgresql/</link><pubDate>Thu, 17 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/metody_autentifikacii_postgresql/</guid><description>&lt;h2 id="процесс-подключения"&gt;Процесс подключения&lt;/h2&gt;
&lt;p&gt;Процесс подключение можно разделить на три этапа:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Идентификация&lt;/strong&gt; — определение имени роли базы данных.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Аутентификация&lt;/strong&gt; — проверка того, что пользователь тот за кого себя выдаёт. Есть много разных методов аутентификации, например проверка пароля.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Авторизация&lt;/strong&gt; — проверка прав этого пользователя. Например может ли этот пользователь подключаться к этой базе данных или нет.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Настройки по умолчанию используется метод аутентификации &lt;strong&gt;trast&lt;/strong&gt;, который позволяет подключаться без аутентификации любым локальным пользователям.&lt;/p&gt;
&lt;p&gt;&lt;img src="Pasted_image_20260512165309.png" alt="Метод аутентификации trast"&gt;&lt;/p&gt;</description></item><item><title>Политики защиты строк (RLS) в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/politiki_zashchity_strok_rls_postgresql/</link><pubDate>Thu, 10 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/politiki_zashchity_strok_rls_postgresql/</guid><description>&lt;h2 id="что-такое-политики-защиты-строк"&gt;Что такое политики защиты строк&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://blog.sysadminium.ru/docs/databases/postgresql/privilegii_postgresql/"
 
 target="_blank" rel="noopener noreferrer"&gt;
 Привилегии
&lt;/a&gt;
 для ролей определяют доступ к целым табличкам, или к столбцам. Идея защиты строк состоит в том, чтобы разграничивать доступы к разным строчкам. В документации про этот механизм можете почитать &lt;a href="https://postgrespro.ru/docs/postgresql/13/ddl-rowsecurity"
 
 target="_blank" rel="noopener noreferrer"&gt;
 тут
&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Пишется специальное логическое выражение и вычисляется для каждой строки. Если такое выражение истинно, то мы видим строку, а в противном случае не видим. Такое выражение называют &lt;strong&gt;предикатом&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Один предикат&lt;/strong&gt; применяется для существующих строк и используется командами:&lt;/p&gt;</description></item><item><title>Привилегии в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/privilegii_postgresql/</link><pubDate>Thu, 10 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/privilegii_postgresql/</guid><description>&lt;h2 id="привилегий-для-разных-объектов"&gt;Привилегий для разных объектов&lt;/h2&gt;
&lt;p&gt;Каждый вид объектов имеет разный набор привилегий, таблицы например имеют самый большой набор:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SELECT&lt;/strong&gt; — чтение данных;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INSERT&lt;/strong&gt; — вставка данных;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; — изменение строк;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REFERENCES&lt;/strong&gt; — внешний ключ (право ссылаться на таблицу);&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DELETE&lt;/strong&gt; — удаление строк;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TRUNCATE&lt;/strong&gt; — очистка таблицы;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TRIGGER&lt;/strong&gt; — создание триггеров.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Представления имеют всего две привилегии:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SELECT&lt;/strong&gt; — право читать представление;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TRIGGER&lt;/strong&gt; — право создавать триггеры.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Последовательности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SELECT&lt;/strong&gt; — право читать последовательность;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; — право изменять последовательность;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;USAGE&lt;/strong&gt; — право использовать последовательность.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Табличные пространства:&lt;/p&gt;</description></item><item><title>Роли и атрибуты в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/roli_postgresql/</link><pubDate>Thu, 03 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/roli_postgresql/</guid><description>&lt;h2 id="теория"&gt;Теория&lt;/h2&gt;
&lt;p&gt;Псевдороль &lt;strong&gt;public&lt;/strong&gt; неявно включает в себя все остальные роли. Её нельзя найти в списке ролей, но она существует.&lt;/p&gt;
&lt;p&gt;У ролей есть несколько атрибутов. Эти атрибуты указываются при создании роли:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;LOGIN&lt;/strong&gt; / &lt;strong&gt;NOLOGIN&lt;/strong&gt; — возможность подключения;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SUPERUSER&lt;/strong&gt; / &lt;strong&gt;NOSUPERUSER&lt;/strong&gt; — суперпользователь;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CREATEDB&lt;/strong&gt; / &lt;strong&gt;NOCREATEDB&lt;/strong&gt; — возможность создавать базы данных;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CREATEROLE&lt;/strong&gt; / &lt;strong&gt;NOCREATEROLE&lt;/strong&gt; — возможность создавать роли;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;REPLICATION&lt;/strong&gt; / &lt;strong&gt;NOREPLICATION&lt;/strong&gt;— использование протокола репликации;&lt;/li&gt;
&lt;li&gt;и другие.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Создают роль следующим способом:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;CREATE ROLE &amp;lt;роль&amp;gt; [WITH] &amp;lt;атрибуты через запятую&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Если при создании роли не указать атрибуты, то роль получит запрещающие атрибуты (&lt;strong&gt;NOLOGIN&lt;/strong&gt;, &lt;strong&gt;NOSUPERUSER&lt;/strong&gt;) автоматом.&lt;/p&gt;</description></item><item><title>Мониторинг индексов в PostgreSQL и их перестроение</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/monitoring_indeksov_postgresql/</link><pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/monitoring_indeksov_postgresql/</guid><description>&lt;h2 id="поиск-неиспользуемых-индексов"&gt;Поиск неиспользуемых индексов&lt;/h2&gt;
&lt;p&gt;Иногда случается, что в базе данных некоторые индексы не нужны. То есть при создании базы сделали лишние или пересекающиеся индексы, а они на самом деле не используются. Лишние индексы занимают место, а также добавляют накладные расходы. Как только вы меняете таблицу, вам нужно обновить все индексы в ней. Поэтому мониторинг индексов необходим в PostgreSQL.&lt;/p&gt;
&lt;p&gt;В представлении &lt;a href="https://postgrespro.ru/docs/postgresql/13/monitoring-stats#MONITORING-PG-STAT-ALL-INDEXES-VIEW"
 
 target="_blank" rel="noopener noreferrer"&gt;
 pg_stat_all_indexes
&lt;/a&gt;
 в поле &lt;code&gt;idx.scan&lt;/code&gt; вы можете увидеть количество обращений к индексу. Если там ноль, значит индекс не используется и возможно его следует удалить. Но следует точно понимать что вы делаете, и перепроверить все перед удалением таких индексов.&lt;/p&gt;</description></item><item><title>Процедура очистки VACUUM в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/vacuum_postgresql/</link><pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/vacuum_postgresql/</guid><description>&lt;h2 id="варианты-запуска-очистки"&gt;Варианты запуска очистки&lt;/h2&gt;
&lt;p&gt;Процесс &lt;strong&gt;VACUUM&lt;/strong&gt; чистит таблицы, обновляет статистику и обновляет карты видимости и свободного пространства. А также борется с переполнением счетчика транзакций.&lt;/p&gt;
&lt;p&gt;Очищать таблицы или базы данных от ненужных версий строк можно с помощью следующих команд:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;VACUUM таблица;&lt;/code&gt; — очищает таблицу;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VACUUM;&lt;/code&gt; — базу данных;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ vacuumdb&lt;/code&gt; — обёртка для использования в ОС.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Процедура &lt;code&gt;VACUUM&lt;/code&gt; выполняется параллельно с другими транзакциями. При этом частый запуск нагружает систему, редкий запуск приводит к росту размера файлов. Подробнее почитать про очистку PostgreSQL можно &lt;a href="https://postgrespro.ru/docs/postgresql/13/routine-vacuuming"
 
 target="_blank" rel="noopener noreferrer"&gt;
 тут
&lt;/a&gt;
. Мы уже встречались с понятием &lt;strong&gt;VACUUM&lt;/strong&gt; в статье &lt;a href="https://blog.sysadminium.ru/docs/databases/postgresql/izolyaciya_i_mnogoversionnost_v_postgresql/"
 
 target="_blank" rel="noopener noreferrer"&gt;
 Изоляция и многоверсионность в Postgresql
&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Разрастание таблиц и индексов в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/razrastanie_tablic_i_indeksov_postgresql/</link><pubDate>Wed, 02 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/razrastanie_tablic_i_indeksov_postgresql/</guid><description>&lt;h2 id="подключаем-расширение-pgstattuple"&gt;Подключаем расширение pgstattuple&lt;/h2&gt;
&lt;p&gt;В начале скомпилируем расширение &lt;a href="https://postgrespro.ru/docs/postgresql/13/pgstattuple"
 
 target="_blank" rel="noopener noreferrer"&gt;
 pgstattuple
&lt;/a&gt;
, которое поможет понять сколько в базе данных полезной информации, а сколько служебной или неактуальной. Для этого перейдем в каталог с исходниками и выполним:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;postgres@s-pg13:~$ exit
выход

root@s-pg13:~# cd ~/pg/postgresql-13.3/contrib/pgstattuple/
root@s-pg13:~/pg/postgresql-13.3/contrib/pgstattuple# make
root@s-pg13:~/pg/postgresql-13.3/contrib/pgstattuple# make install
root@s-pg13:~/pg/postgresql-13.3/contrib/pgstattuple# su - postgres
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Затем подключим расширение в самой базе данных с помощью команды &lt;code&gt;CREATE EXTENSION&lt;/code&gt;:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;postgres@s-pg13:~$ psql
Timing is on.
psql (13.3)
Type &amp;#34;help&amp;#34; for help.

postgres@postgres=# CREATE EXTENSION pgstattuple;
CREATE EXTENSION
Time: 45,688 ms
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="проводим-тестирование"&gt;Проводим тестирование&lt;/h2&gt;
&lt;p&gt;Создадим табличку &lt;code&gt;bloat&lt;/code&gt; и наполним её данными. После чего сделаем для этой таблицы индекс:&lt;/p&gt;</description></item><item><title>Журнал PostgreSQL. Настройка и анализ</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/log_postgresql/</link><pubDate>Mon, 31 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/log_postgresql/</guid><description>&lt;h2 id="введение"&gt;Введение&lt;/h2&gt;
&lt;p&gt;При запуске &lt;strong&gt;PostgreSQL&lt;/strong&gt;, мы можем указать файл журнала: &lt;code&gt;pg_ctl start -l /home/postgres/logfile&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;В этот журнал PostgreSQL записывает некоторые из своих действий. Настраивая журналирование мы можем задать:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;какие действия заносить в журнал;&lt;/li&gt;
&lt;li&gt;насколько подробно описывать эти действия;&lt;/li&gt;
&lt;li&gt;сколько будут хранится файлы журнала и как переключаться на другие файлы.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Если сейчас заглянуть в журнал и посмотреть последние строчки в которых есть слово FATAL, то можно увидеть следующее:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;postgres@s-pg13:~$ grep FATAL /home/postgres/logfile | tail
2021-06-28 16:49:47.333 MSK [15360] FATAL: terminating connection due to administrator command
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;FATAL: terminating connection due to administrator command&lt;/strong&gt; — это завершение процесса с помощью функции &lt;code&gt;pg_terminate_backend(pid)&lt;/code&gt;. Это мы проделывали на &lt;a href="https://blog.sysadminium.ru/docs/databases/postgresql/tekushchie_aktivnosti_v_postgresql/"
 
 target="_blank" rel="noopener noreferrer"&gt;
 прошлом уроке
&lt;/a&gt;
.&lt;/p&gt;</description></item><item><title>Текущие активности в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/tekushchie_aktivnosti_v_postgresql/</link><pubDate>Sun, 30 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/tekushchie_aktivnosti_v_postgresql/</guid><description>&lt;h2 id="введение"&gt;Введение&lt;/h2&gt;
&lt;p&gt;Что в этой статье будет рассмотрено:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Вы можете посмотреть на текущие активности сервера PostgreSQL с помощью представления &lt;a href="https://postgrespro.ru/docs/postgrespro/13/monitoring-stats#MONITORING-PG-STAT-ACTIVITY-VIEW"
 
 target="_blank" rel="noopener noreferrer"&gt;
 pg_stat_activity
&lt;/a&gt;
.&lt;/li&gt;
&lt;li&gt;Чтобы завершить один из обслуживающих процессов нужно использовать функцию &lt;code&gt;pg_terminate_backend(&amp;lt;pid&amp;gt;)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Вы можете, с помощью функции &lt;code&gt;pg_blocking_pids(&amp;lt;pid&amp;gt;)&lt;/code&gt;, посмотреть кого ожидает процесс с этим &lt;strong&gt;pid&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Все эти действия можно выполнить с помощью инструментов командной строки операционной системы:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;посмотреть процессы с помощью команды &lt;code&gt;ps&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;завершить процесс с помощью команды &lt;code&gt;kill -9 &amp;lt;pid&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Но операционная система не сможет определить чем занят процесс &lt;strong&gt;postgress&lt;/strong&gt;, поэтому &lt;code&gt;ps&lt;/code&gt; не будет столь-же информативен, как представление &lt;code&gt;pg_stat_activity&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Статистика работы PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/statistika_raboty_postgresql/</link><pubDate>Tue, 25 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/statistika_raboty_postgresql/</guid><description>&lt;h2 id="теория"&gt;Теория&lt;/h2&gt;
&lt;p&gt;В этой статье разберем системные представления, с помощью которых можно смотреть на эту статистику.&lt;/p&gt;
&lt;p&gt;Статистика PostgreSQL включается конфигурационными параметрами в файле &lt;strong&gt;postgresql.conf&lt;/strong&gt;, например:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;track_counts&lt;/strong&gt; — обращения к таблицам и индексам. Этот параметр включен по умолчанию.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;track_io_timing&lt;/strong&gt; — статистика операций ввода/вывода. Этот параметр выключен по умолчанию, в результате нужно включать. Но следует учитывать что включение этого параметра может замедлить сервер;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;track_functions&lt;/strong&gt; — статистика вызовов функций и времени их выполнения. Этот параметр, тоже выключен по умолчанию. Если мы захотим включить его, то можем указать следующие значения:
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pl&lt;/strong&gt; — включает отслеживание функций только на процедурном языке,&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;all&lt;/strong&gt; — включает отслеживание функций на всех языках, например SQL и C.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Каждый &lt;strong&gt;backend&lt;/strong&gt; процесс собирает статистику в процессе своей работы. Затем эта статистика отправляется процессу &lt;strong&gt;stats collector&lt;/strong&gt;, который собирает статистику со всех &lt;strong&gt;backend&lt;/strong&gt; процессов. Раз в полсекунды, статистика сбрасывается в каталог &lt;strong&gt;$PGDATA/pg_stat_tmp&lt;/strong&gt;, этот период (500мс) можно изменить только при компиляции. В результате эту статистику можно посмотреть с помощью представлений и функций.&lt;/p&gt;</description></item><item><title>Слои данных и TOAST таблицы в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/sloi_dannyh_i_toast_tablicy_postgresql/</link><pubDate>Mon, 24 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/sloi_dannyh_i_toast_tablicy_postgresql/</guid><description>&lt;h2 id="слои"&gt;Слои&lt;/h2&gt;
&lt;p&gt;Подробнее про физическое хранение базы данных можете почитать &lt;a href="https://postgrespro.ru/docs/postgresql/13/storage"
 
 target="_blank" rel="noopener noreferrer"&gt;
 тут
&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;Каждый файл занимает &lt;strong&gt;не больше 1 GB&lt;/strong&gt; и &lt;strong&gt;кратен 8 KB&lt;/strong&gt;. Поэтому если таблица больше 1 GB, то она хранится в нескольких файлах. &lt;strong&gt;Файлы состоят из 8 KB страниц&lt;/strong&gt;, которые в случае необходимости &lt;strong&gt;помещаются в буферный кэш&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Существуют следующие слои:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Основной слой&lt;/strong&gt; &lt;strong&gt;(main)&lt;/strong&gt; — сами данные. Этот слой существует у всех объектов;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Слой инициализации (init)&lt;/strong&gt; — существует только для нежурналируемых таблиц. Содержит пустую копию таблицы. В случае сбоя PostgreSQL не пытается восстановить нежурналируемую таблицу, а перезаписывает её пустой таблицей из этого слоя. Поэтому после сбоя нежурналируемые таблицы окажутся пустыми.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Карта свободного пространства (fsm)&lt;/strong&gt; — хранит информацию о том, где внутри файлов есть свободное пространство.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Карта видимости (vm)&lt;/strong&gt; — отмечает страницы, в которых все версии строк видны. Другими словами VACUUM уже их почистил от неактуальных версий строк. Такой слой существует только для таблиц. Он нужен для оптимизации, чтобы VACUUM знал, какие страницы чистить уже не нужно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="работа-с-большими-строками-toast"&gt;Работа с большими строками (TOAST)&lt;/h2&gt;
&lt;p&gt;В PostgreSQL &lt;strong&gt;одна строка&lt;/strong&gt; &lt;strong&gt;должна&lt;/strong&gt; помещаться в одну страницу, то есть &lt;strong&gt;не быть больше 8 КБ&lt;/strong&gt;. Чтобы поместить большую строку у PostgreSQL есть следующие стратегии:&lt;/p&gt;</description></item><item><title>Табличные пространства в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/tablichnye_prostranstva_postgresql/</link><pubDate>Fri, 21 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/tablichnye_prostranstva_postgresql/</guid><description>&lt;h2 id="теория"&gt;Теория&lt;/h2&gt;
&lt;p&gt;Вы можете почитать про табличные пространства в &lt;a href="https://postgrespro.ru/docs/postgresql/13/manage-ag-tablespaces"
 
 target="_blank" rel="noopener noreferrer"&gt;
 документации
&lt;/a&gt;
.&lt;/p&gt;
&lt;p&gt;При инициализации кластера создаются 2 табличных пространства:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pg_default&lt;/code&gt; — табличное пространство по умолчанию, находится в каталоге &lt;code&gt;$PGDATA/base&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pg_global&lt;/code&gt; — пространство для общих объектов системного каталога, &lt;code&gt;$PGDATA/global&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PostgreSQL позволяет создать свои табличные пространства и использовать их для каких-либо объектов. Например для баз данных, таблиц и других объектов.&lt;/p&gt;
&lt;p&gt;Каталог &lt;code&gt;$PGDATA/base&lt;/code&gt; разбит на подкаталоги по идентификаторам баз данных.&lt;/p&gt;
&lt;p&gt;Когда мы создаём своё табличное пространство, мы сами указываем нужный каталог. При этом PostgreSQL создает символическую ссылку &lt;code&gt;$PGDATA/pg_tblspc/&amp;lt;TS_OID&amp;gt;&lt;/code&gt; на указанный каталог (&lt;code&gt;/путь/ver/dboid&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Системный каталог в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/sistemnyj_katalog_postgresql/</link><pubDate>Tue, 18 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/sistemnyj_katalog_postgresql/</guid><description>&lt;h2 id="системный-каталог-postgresql"&gt;Системный каталог PostgreSQL&lt;/h2&gt;
&lt;p&gt;В системном каталоге хранится информация об объектах в кластере баз данных. По стандарту SQL всегда должен присутствовать системный каталог, но в стандарте он называется &lt;strong&gt;информационной схемой&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;В системном каталоге есть информация о базах данных, таблицах, индексах, представлениях, функциях и других объектах.&lt;/p&gt;
&lt;p&gt;То есть, если мы создадим новую базу данных, то её описание можно будет получить из системного каталога. Если мы в базе данных создадим таблицу, то её описание будет в системном каталоге.&lt;/p&gt;</description></item><item><title>Схемы и шаблоны в СУБД PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/shemy_i_shablony_postgresql/</link><pubDate>Mon, 17 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/shemy_i_shablony_postgresql/</guid><description>&lt;h2 id="базы-данных-и-шаблоны"&gt;Базы данных и шаблоны&lt;/h2&gt;
&lt;p&gt;Когда мы создаём новые кластер командой &lt;code&gt;initdb&lt;/code&gt; у нас создается 3 одинаковые базы данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;postgres&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;template1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;postgres@s-pg13:~$ psql
Timing is on.
psql (13.3)
Type &amp;#34;help&amp;#34; for help.

postgres@postgres=# \l
 List of databases
 Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+-------------+-------------+-----------------------
 postgres | postgres | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 |
 template0 | postgres | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres +
 | | | | | postgres=CTc/postgres
 template1 | postgres | UTF8 | ru_RU.UTF-8 | ru_RU.UTF-8 | =c/postgres +
 | | | | | postgres=CTc/postgres
(3 rows)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;База &lt;code&gt;postgres&lt;/code&gt; используется, чтобы по умолчанию к ней подключаться. Принципиально она не нужна, но есть приложения которым она может понадобится, поэтому лучше её не удалять.&lt;/p&gt;</description></item><item><title>Буферный кэш и журнал WAL в PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/bufernyj_kesh_i_zhurnal_wal_v_postgresql/</link><pubDate>Wed, 05 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/bufernyj_kesh_i_zhurnal_wal_v_postgresql/</guid><description>&lt;h2 id="устройство-буферного-кэша"&gt;Устройство буферного кэша&lt;/h2&gt;
&lt;p&gt;Кэш нужен чтобы читать востребованные данные ни с диска а с более быстрой оперативной памяти. Предварительно данные приходится загружать с диска в буферных кэш оперативной памяти.&lt;/p&gt;
&lt;p&gt;В общей памяти отводится определённый кусок памяти под массив буферов. В каждом буфере хранится одна страница памяти. Страница памяти это &lt;strong&gt;8 КБ&lt;/strong&gt;. Когда мы собираем PostgreSQL из исходных кодов мы можем изменить размер этой страницы. А после сборки это изменить уже не получится.&lt;/p&gt;</description></item><item><title>Изоляция и многоверсионность в Postgresql</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/izolyaciya_i_mnogoversionnost_v_postgresql/</link><pubDate>Tue, 04 May 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/izolyaciya_i_mnogoversionnost_v_postgresql/</guid><description>&lt;h2 id="многоверсионность"&gt;Многоверсионность&lt;/h2&gt;
&lt;p&gt;Представим следующие ситуации на сервере баз данных:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;два процесса читают одну строчку одновременно;&lt;/li&gt;
&lt;li&gt;два процесса одновременно хотят изменить одну и туже строчку;&lt;/li&gt;
&lt;li&gt;один процесс читает строчку, а другой, в тоже время, её изменяет.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В первом случае проблем не возникает. Несколько процессов могут одновременно читать одну и туже строчку без всяких сложностей.&lt;/p&gt;
&lt;p&gt;Для решения второй проблемы придумали &lt;strong&gt;блокировки&lt;/strong&gt;. Процесс который начнет изменение строки ставит на ней блокировку. При этом второй процесс будет ждать пока первый не внесет свои изменения и не разблокирует эту строку.&lt;/p&gt;</description></item><item><title>Общее устройство PostgreSQL</title><link>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/obshchee_ustrojstvo_postgresql/</link><pubDate>Fri, 23 Apr 2021 00:00:00 +0000</pubDate><guid>https://blog.sysadminium.ru/docs/linux/linux_servers/databases/obshchee_ustrojstvo_postgresql/</guid><description>&lt;h2 id="клиент-серверная-работа-postgresql"&gt;Клиент серверная работа PostgreSQL&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt; эта сервер который обслуживает базы данных &lt;strong&gt;SQl&lt;/strong&gt;. К нему подключаются клиенты и с помощью &lt;strong&gt;SQL запросов&lt;/strong&gt; работают с этими базами. Клиентские приложения могут быть расположены на сервере приложений или прямо на компьютере пользователя.&lt;/p&gt;
&lt;p&gt;&lt;img src="Pasted_image_20260503145206.png" alt=""&gt;&lt;/p&gt;
&lt;p&gt;Клиент — это какое-то приложение, например &lt;strong&gt;psql&lt;/strong&gt;. Клиент с сервером общается по определённому протоколу. Протокол у &lt;strong&gt;PostgreSQL&lt;/strong&gt; открытый, но для каждого приложения его не нужно реализовывать. Обычно используют стандартные библиотеки и драйверы. Основная библиотека это &lt;strong&gt;libpq&lt;/strong&gt;, её использует &lt;strong&gt;psql&lt;/strong&gt; и все штатные утилиты &lt;strong&gt;PostgreSQL&lt;/strong&gt;. Для многих языков программирования есть свои библиотеки, которые основаны на &lt;strong&gt;libpq&lt;/strong&gt;.&lt;/p&gt;</description></item></channel></rss>