====== Настройка базы данных PostgreSQL ====== ===== Версия PostgreSQL ===== Поддерживаются версии PostgreSQL начиная с 13 (рекомендуется не ниже 14) версии с поддержкой ICU. Для однообразной сортировки в PostgreSQL на Windows и Linux, и для сортировки как в SQL Server, используется провайдер icu, который использует внешнюю библиотеку ICU. Локали ICU можно использовать, только если поддержка ICU была включена в конфигурации сборки PostgreSQL. Для установки PostgreSQL требуется сборка PostgreSQL начиная с 13 версии с поддержкой ICU. ===== Ограничения PostgreSQL ===== Основные ограничения PostgreSQL, которые отличаются от SQL Server (https://postgrespro.ru/docs/postgresql/14/limits): - Максимальная длина идентификатора 63 байта (имена таблиц, ключей, индексов и других объектов базы данных (https://postgrespro.ru/docs/postgresql/14/sql-syntax-lexical#SQL-SYNTAX-IDENTIFIERS)). - Максимальное кол-во столбцов в индексе 32. - По умолчанию поиск по строке (https://postgrespro.ru/docs/postgresql/14/datatype-character) чувствителен к регистру. Одно из решений использовать тип citext (https://postgrespro.ru/docs/postgresql/14/citext). ===== Настройка PostgreSQL ===== Надо настроить PostgreSQL, по умолчанию PostgreSQL использует 256 МБ памяти. Для генерации настроек по конфигурации сервера надо зайти на https://www.pgconfig.org/ и заполнить параметры. Далее на вкладке "Export config" выберете формат ALTER SYSTEM commands для изменения параметров PostgreSQL, запустите полученный скрипт на сервере PostgreSQL и перезапустите сервис PostgreSQL после выполнения скрипта. После запуска скриптов надо перезапустить сервис PostgreSQL: sudo service postgresql restart === Пример для PostgreSQL 13: === \\ # OS Type: GNU/Linux based \\ # Architecrure: 64 Bits # Storage type: ssd \\ # Application profile: ERP or long transaction applications\\ # CPUs num: 16 \\ # Total Memory: 40 GB \\ # Connections num: 1000 \\ # Data Storage: ssd \\ # DB Version: 13 \\ sql -- Memory Configuration ALTER SYSTEM SET shared_buffers TO '10GB'; ALTER SYSTEM SET effective_cache_size TO '30GB'; ALTER SYSTEM SET work_mem TO '14MB'; ALTER SYSTEM SET maintenance_work_mem TO '2GB'; -- Checkpoint Related Configuration ALTER SYSTEM SET min_wal_size TO '2GB'; ALTER SYSTEM SET max_wal_size TO '3GB'; ALTER SYSTEM SET checkpoint_completion_target TO '0.9'; ALTER SYSTEM SET wal_buffers TO '-1'; -- Network Related Configuration ALTER SYSTEM SET listen_addresses TO '*'; ALTER SYSTEM SET max_connections TO '1000'; -- Storage Configuration ALTER SYSTEM SET random_page_cost TO '1.1'; ALTER SYSTEM SET effective_io_concurrency TO '200'; -- Worker Processes Configuration ALTER SYSTEM SET max_worker_processes TO '8'; ALTER SYSTEM SET max_parallel_workers_per_gather TO '2'; ALTER SYSTEM SET max_parallel_workers TO '2'; -- Logging configuration for pgbadger ALTER SYSTEM SET logging_collector TO 'on'; ALTER SYSTEM SET log_checkpoints TO 'on'; ALTER SYSTEM SET log_connections TO 'on'; ALTER SYSTEM SET log_disconnections TO 'on'; ALTER SYSTEM SET log_lock_waits TO 'on'; ALTER SYSTEM SET log_temp_files TO '0'; ALTER SYSTEM SET lc_messages TO 'C'; -- Adjust the minimum time to collect the data ALTER SYSTEM SET log_min_duration_statement TO '10s'; ALTER SYSTEM SET log_autovacuum_min_duration TO '0'; -- CSV Configuration ALTER SYSTEM SET log_destination TO 'csvlog'; После запуска скрипта с установкой настроек нужно перезапустить сервис PostgreSQL: sudo service postgresql restart ===== Настройка приложения ===== Статьи по настройкам быстродействию PostgreSQL через строку подключения: https://www.roji.org/prepared-statements-in-npgsql-3-2 https://www.npgsql.org/doc/prepare.html В файле client.config: В разделе '''' заменить \\ на В разделе '''' заменить на В разделе заменить на ===== Настройка приложения для использования PostgreSQL с PgBouncer ===== При использовании PgBouncer надо добавить в строку подключения параметр (https://www.npgsql.org/doc/compatibility.html?q=pgbouncer): No Reset On Close=true или отключить пул соединений в приложении в строке подключения: Pooling=false Если используем PgBouncer в режиме //transaction pooling//, надо отключать prepared statements в приложение в строке подключения (надо убрать параметры "Max Auto Prepare" и "Auto Prepare Min Usages" или выставить "Max Auto Prepare=0" в строке подключения): https://www.pgbouncer.org/faq.html#:~:text=to%20DEALLOCATE%20ALL%3B-,How%20to%20use%20prepared%20statements%20with%20transaction%20pooling%3F,prepared%20statements%20in%20the%20client ===== Установка в Ubuntu ===== ==== Установка локали ==== https://www.postgresql.org/download/linux/ubuntu/ https://wiki.postgresql.org/wiki/Apt Установка локали https://askubuntu.com/questions/76013/how-do-i-add-locale-to-ubuntu-server В Linux в терминале выполнить: locale -a Проверить, что в списке есть ru_RU.UTF-8, если есть — запустить (если нет - надо устанавливать русскую локаль): sudo locale-gen ru_RU sudo locale-gen ru_RU.UTF-8 sudo update-locale Если не сработало (зависит от дистрибутива Linux) sudo locale-gen ru_RU то запустить sudo dpkg-reconfigure locales и выбрать нужные локали. На базе postgres выполнить: SELECT pg_import_system_collations('pg_catalog'); Перезапустить сервис PostgreSQL: sudo service postgresql restart ==== Настройка PostgreSQL ==== 1. Пересоздание кластера PostgreSQL с другой локалью: http://breys.ru/4379.html sudo pg_dropcluster --stop 13 main sudo pg_createcluster --locale ru_RU.utf8 --start 13 main sudo pg_ctlcluster 13 main start 2. Как отредакnировать файл от имени админа https://vitux.com/how-to-open-and-edit-files-and-folders-in-ubuntu-desktop-as-an-administrator/ 3. Доступ извне (только для разработки, не использовать на продакшене) https://blog.rvalitov.ru/development/yii2/postgresql-v-virtualbox/ Добавить строчку в самый низ в файл /etc/postgresql//main/pg_hba.conf host all all 0.0.0.0/0 trust В файле /etc/postgresql//main/postgresql.conf добавляем или меняем строчку ''listen_addresses = '*' '' (убедитесь, что она раскомментирована) Перезагружаем сервис sudo service postgresql restart 4. Настройка VirtualBox для доступа к PostgreSQL с хоста https://serverfault.com/questions/225155/virtualbox-how-to-set-up-networking-so-both-host-and-guest-can-access-internet 5. Запуск psql https://www.digitalocean.com/community/tutorials/how-to-install-and-use-postgresql-on-ubuntu-18-04-ru sudo -u postgres psql ===== Установка и развертывание на Astra Linux Special Edition x.7 ===== === Что нужно знать === Установка незащищенной версии выполняется с подключенным компонентом astra-ce расширенного (extended) репозитория, установка защищенной версии выполняется без подключения этого компонента. На момент написания данной статьи в составе Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) доступны следующие версии СУБД PostgreSQL: * версия 11.10-astra.se5 - защищенная версия в основном репозитории (на установочном диске); * версия 11.10-astra.se13 - защищенная версия в основном репозитории (оперативное обновление №1); * версия 11.12-astra.ce5 - незащищенная версия в компоненте astra-ce расширенного репозитория до оперативного обновления 1.7.2; * версия 14+240astra4 - - незащищенная версия в компоненте astra-ce расширенного репозитория начиная с оперативного обновления 1.7.2. При установке СУБД PostgreSQL из компонента astra-ce расширенного репозитория защищенная версия СУБД, доработанная для взаимодействия с КСЗ Astra Linux Special Edition будет заменена на стандартную версию СУБД. Подробнее про структуру и использование репозиториев см. [[https://wiki.astralinux.ru/pages/viewpage.action?pageId=149062354|Репозитории Astra Linux Special Edition x.7: структура, особенности подключения и использования.]] При установке незащищенной СУБД PostgreSQL версии 14 из компонента astra-ce расширенного репозитория 1.7.2 при наличии ранее установленной СУБД PostgreSQL версии 11 необходимо перед запуском нового кластера вручную удалить ранее установленные кластеры версии 11: pg_dropcluster 13 <имя_старого_кластера> ==== Установка пакетов ==== 1. Подключить репозитории: * основной репозиторий и актуальное оперативное обновление основного репозитория; * только для установки незащищенной версии PostgreSQL - актуальное оперативное обновление расширенного репозитория, включая компонент astra-ce. Для установки защищенной версии подключение компонента astra-ce расширенного репозитория недопустимо. 2. Обновить список пакетов: sudo apt update 3. Опционально: установить актуальные обновления: sudo apt dist-upgrade 4. Проверить доступные версии: apt policy postgresql-13 5. Установить пакет postgresql-13 старшей доступной версии: sudo apt install postgresql-13 или установить пакет postgresql-13 указанной версии: sudo apt install postgresql-13=<номер_версии> 6. Убедиться, что служба postgresql запустилась: systemctl status postgresql ● postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2021-09-10 12:48:20 MSK; 1min 26s ago Main PID: 4338 (code=exited, status=0/SUCCESS) Tasks: 0 (limit: 4637) Memory: 0B CGroup: /system.slice/postgresql.service ==== Первичная настройка СУБД PostgreSQL ==== 1. Выполнить вход в сессию служебного пользователя postgres: sudo su - postgres Работая в сессии служебного пользователя postgres: * Установить пароль администратора СУБД: psql -c "alter user postgres with password '<указать_пароль>'" * Вместо текста <пароль> указать устанавливаемый пароль; * Пароль заключается в одинарные кавычки; * Вся команда заключается в двойные кавычки. * Завершить работу в сессии служебного пользователя postgres: exit 2. Наcтроить удаленный доступ к СУБД, для чего в конфигурационном файле /etc/postgresql/13/main/postgresql.conf проверить и установить параметр listen_addresses: * Значение по умолчанию — служба postgresql подключена ко всем сетевым интерфейсам: listen_addresses = '*' === Допустимые значения: === * Служба postgresql подключена ко всем сетевым интерфейсам IPv4: listen_addresses = '0.0.0.0' * Служба postgresql подключена ко всем сетевым интерфейсам IPv6: listen_addresses = '::' * Разделенный запятыми список IP-адресов сетевых интерфейсов, к которым будет подключена служба: listen_addresses = '192.168.1.2,10.0.0.2' Допускается использовать пустой список, тогда подключение будет возможно только через сокеты UNIX (подробнее см. документацию СУБД). 3. Если в конфигурацию были внесены изменения, то для того, чтобы сделанные изменения вступили в силу перезапустить службу postgresql: sudo systemctl restart postgresql 4. Проверить, к каким сетевым портам и интерфейсам подключена служба postgresql, можно командой: ss -tunelp | grep uid:`id -u postgres` tcp LISTEN 0 1024 0.0.0.0:5432 0.0.0.0:* uid:107 ino:32947 sk:5 <-> tcp LISTEN 0 1024 [::]:5432 [::]:* uid:107 ino:32948 sk:9 v6only:1 <-> Приведен вывод команды для службы, настроенной по умолчанию (параметр listen_addresses = '*', служба работает с портом 5432 на всех доступных сетевых интерфейсах IPv4 и IPv6); 5. Настроить активные сетевые экраны, разрешив доступ к сетевому порту postgresql (по умолчанию - порт 5432): * Для сетевого экрана ufw: sudo ufw allow 5432/tcp * Для сетевого экрана firewalld: sudo firewall-cmd --add-service=postgresql --zone=internal --permanent ==== Первичное тестирование работоспособности СУБД ==== 1. Выполнить вход в сессию служебного пользователя postgres: sudo su - postgres Работая в сессии служебного пользователя postgres: * Добавить тестового пользователя СУБД test_user1: createuser test_user1 * Добавить тестовую базу данных test_db, указав в качестве её владельца тестового пользователя: createdb test_db -O test_user1 * Установить пароль тестового пользователя: psql -c "alter user test_user1 with password '<указать_пароль>'" * Подключиться к созданной тестовой базе данных и войти в сессию СУБД: psql test_db psql (11.12 (Debian 11.12-astra.ce5)) Введите "help", чтобы получить справку. test_db=# Дальнейшие команды выполняются в сессии СУБД: * Создать таблицу и добавить в нее данные: create table test_table ( id int,first_name text, last_name text ); CREATE TABLE * Добавить в таблицу данные: insert into test_table (id,first_name,last_name) values (2,'Иван','Иванов'); INSERT 0 1 * Вывести табличные данные: select * from test_table; id | first_name | last_name ----+------------+----------- 1 | Иван | Иванов (1 строка) * Выйти из сессии СУБД: exit * Удалить тестовую базу данных: dropdb test_db * Завершить работу в сессии служебного пользователя postgres: exit ===== Бэкап и восстановление базы ===== https://postgrespro.ru/docs/postgresql/14/backup Бэкап базы делается утилитой '' pg_dump '', нужно использовать '' pg_dump '' той же версии, которая установлена на сервере PostgreSQL: pg_dump.exe --file "D:\\DbBackups\\a2nta_db.bak" --host "a2nta_db" --port "5432" --username "postgres" --password --verbose --format=c --blobs "a2nta_db" Для восстановления базы надо создать пустую базу скриптом: sql CREATE DATABASE "a2nta_db" WITH OWNER = postgres ENCODING = 'UTF8' LC_COLLATE = 'ru_RU.utf8' -- для Linux LC_CTYPE = 'ru_RU.utf8' -- для Linux --LC_COLLATE = 'Russian_Russia.1251' -- для Windows --LC_CTYPE = 'Russian_Russia.1251' -- для Windows --TEMPLATE template0 -- нужно раскомметировать, если COLLATION в базе postgres (SHOW lc_collate;) отличается от значения в LC_COLLATE TABLESPACE = pg_default CONNECTION LIMIT = -1; ALTER DATABASE "a2nta_db" SET search_path TO "$user", public, dbo; CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; И запустить утилиту '' pg_restore '' , в созданную пустую базу: pg_restore.exe --host "localhost" --port "5432" --username "postgres" --password --dbname "a2nta_db" --verbose "D:\\DbBackups\\a2nta_db.bak" Можно установить search_path на системном уровне, чтобы при каждом восстановление базы не надо было это настраивать отдельно: sql ALTER SYSTEM SET search_path TO "$user", public, dbo; SELECT pg_reload_conf(); Нужно выдать права пользователю на базу (https://postgrespro.ru/docs/postgresql/14/sql-grant): sql ALTER DATABASE OWNER TO ; GRANT postgres TO ; ===== Полезные ссылки по PostgreSQL ===== - Документация по PostgreSQL: https://www.postgresql.org/docs/ - Документация по PostgreSQL на русском: https://postgrespro.ru/docs/ - Онлайн утилита генерации настроек для конфигурации сервера PostgreSQL: https://www.pgconfig.org/ - PgBouncer FAQ: https://www.pgbouncer.org/faq.html ===== Решение проблем с PostgreSQL ===== ==== Блокировки транзакций ==== Если возникают проблемы с операциями в БД PostgreSQL по причине конфликта блокировок транзакций, рекомендуется увеличить значение параметра ''max_locks_per_transaction'' в конфигурационном файле Сервера БД ''postgresql.conf'', например, до 100. #... #-------------------------------------------------------- # LOCK MANAGEMENT #-------------------------------------------------------- # deadlock_timeout = 1s max_locks_per_transaction = 100 # min 10 # (change requires restart) #max_pred_locks_per_transaction = 64 # min 10 # (change requires restart) #...