Сервер PostgreSQL
Описание программного обеспечения
На рисунке показана архитектура PostgreSQL:

В таблице описаны основные процессы:
| Основной процесс | Название | Описание |
|---|---|---|
Основной процесс |
|
Процесс |
Резидентный процесс |
|
Этот процесс управляет внутренними резидентными процессами и также называется |
Подпроцесс |
|
Подпроцесс определяет, следует ли разрешить подключение в соответствии с политикой безопасности, определенной в файле pg_hba.conf. В соответствии с политикой безопасности подпроцесс отклоняет определенные IP-адреса и сети, разрешает подключение к базам данных только определенным пользователям или разрешает подключение только к определенным базам данных. + Postgres получает запрос от внешнего интерфейса, выполняет поиск в базе данных и возвращает результаты. Иногда он также обновляет базу данных. Обновленные данные протоколируются в журналах транзакций (журналы WAL для PostgreSQL). Этот метод используется, когда система отключена, сервер вышел из строя или перезагружается. Кроме того, журналы также можно использовать для восстановления данных в других сценариях. В PostgreSQL 9.0 или более поздней версии журналы WAL можно передавать в другие системы PostgreSQL для репликации базы данных в режиме реального времени. |
Вспомогательные процессы |
SysLogger (системный журнал) |
Основной процесс запускает вспомогательный процесс Syslogger только тогда, когда параметру |
BgWriter (запись в фоновом режиме) |
Этот процесс записывает "грязные" страницы из общей памяти на диск. Это необходимо для повышения производительности при вставке, обновлении и удалении данных. |
|
WALWriter (журнал с упреждающей записью) |
Этот процесс записывает операции изменения на диски до того, как данные будут изменены, поэтому данные не нужно сохранять в файлах при последующих обновлениях данных в режиме реального времени. |
|
PgArch (архив) |
Журналы с упреждающей записью (WAL) удаляются. Процесс PgArch создает резервные копии журналов WAL перед их архивацией. После резервного копирования всей базы данных для архивации журналов WAL можно использовать технологию восстановления на определенный момент времени (PITR). Базу данных можно восстановить в любой момент после полного резервного копирования, используя данные полного резервного копирования и последующие заархивированные журналы WAL. |
|
AutoVacuum (автоматическая очистка) |
В базе данных PostgreSQL после выполнения операции |
|
PgStat (сбор статистики) |
Этот процесс собирает статистику данных. Он используется для оценки затрат во время оптимизации запросов, включая количество операций вставки, обновления и удаления, выполняемых в таблице или индексе, количество операций чтения и записи блоков диска и количество операций чтения строк. Информация, собранная процессом PgStat, хранится в |
|
CheckPoint (контрольная точка) |
Контрольная точка — это точка последовательности транзакций, заданная системой. Она используется для обеспечения того, чтобы информация в журнале перед контрольной точкой записывалась на диски. |
Настройка среды
|
Следующая конфигурация среды представлена исключительно для справки. Настройте среду в соответствии со своими требованиями. |
Отключение брандмауэра и автоматического запуска
|
Рекомендуется отключить брандмауэр в тестовой среде, чтобы исключить нарушение работы сети. Настройте брандмауэр в соответствии с фактическими требованиями. |
-
Остановите службу брандмауэра от имени пользователя
root.systemctl stop firewalld -
Отключите службу брандмауэра от имени пользователя
root.systemctl disable firewalldАвтоматический запуск будет автоматически отключен, поскольку отключен брандмауэр.
Отключение SELinux
Измените файл конфигурации от имени пользователя root.
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
Создание группы пользователей и пользователя
|
В серверной среде в целях безопасности каждому процессу назначаются отдельные пользователи для реализации изоляции разрешений. Группа пользователей и пользователь создаются для ОС, а не для базы данных. |
-
Создайте пользователя или группу пользователей PostgreSQL от имени пользователя
root.-
Создание группы:
groupadd postgres -
Добавление пользователя в группу:
useradd -g postgres postgres
-
-
Задайте пароль для пользователя postgres от имени пользователя
root. (Введите пароль дважды для подтверждения.)passwd postgres
Создание дисков данных
При тестировании максимальной производительности рекомендуется установить твердотельные накопители NVMe с более высокой производительностью ввода-вывода для создания тестовых экземпляров PostgreSQL, чтобы избежать влияния скорости ввода-вывода диска на результаты теста производительности. В этом разделе в качестве примера используются твердотельные накопители NVMe. Подробнее см. в шагах 1–4.
В тесте, отличном от теста производительности, выполните команду от имени пользователя root, чтобы создать каталог данных.
Затем пропустите этот раздел:
mkdir /data
-
Создайте файловую систему (в качестве примера используется XFS от имени пользователя
root; создайте файловую систему в соответствии со своими требованиями). Если для диска была создана файловая система, при выполнении этой команды отобразится сообщение об ошибке. Можно использовать параметр-fдля принудительного создания файловой системы.mkfs.xfs /dev/nvme0и1 -
Создайте каталог данных.
mkdir /data -
Подключите диски.
mount -o noatime,nobarrier /dev/nvme0n1 /data
Установка, запуск и удаление PostgreSQL
Установка PostgreSQL
-
Настройте локальный источник YUM. Подробнее см. в разделе Настройка сервера репозитория.
-
Очистите кеш:
dnf clean all -
Создайте кеш:
dnf makecache -
Установите сервер PostgreSQL от имени пользователя
root.dnf install postgresql-server -
Проверьте установленный пакет RPM.
rpm -qa | grep postgresql
Запуск PostgreSQL
Инициализация базы данных
Выполните этот шаг от имени пользователя postgres.
|
-
Переключитесь на созданного пользователя
postgres.su - postgres -
Инициализируйте базу данных. Параметр
/usr/binв команде — это каталог, в котором находится командаinitdb:/usr/bin/initdb -D /data/
Запуск базы данных
-
Включите базу данных PostgreSQL:
/usr/bin/pg_ctl -D /data/ -l /data/logfile start -
Проверьте, правильно ли запущен процесс базы данных PostgreSQL:
ps -ef | grep postgresЕсли отображается следующая информация, процессы PostgreSQL запущены:
root 11232 2230 0 10:09 pts/0 00:00:00 su - postgres postgres 11233 11232 0 10:09 pts/0 00:00:00 -bash postgres 12319 1 0 11:22 pts/0 00:00:00 /usr/bin/postgres -D /data postgres 12321 12319 0 11:22 ? 00:00:00 postgres: checkpointer process postgres 12322 12319 0 11:22 ? 00:00:00 postgres: writer process postgres 12323 12319 0 11:22 ? 00:00:00 postgres: wal writer process postgres 12324 12319 0 11:22 ? 00:00:00 postgres: autovacuum launcher process postgres 12325 12319 0 11:22 ? 00:00:00 postgres: stats collector process postgres 12326 12319 0 11:22 ? 00:00:00 postgres: bgworker: logical replication launcher root 12348 7094 0 11:29 pts/1 00:00:00 grep postgres
Вход в базу данных
Войдите в базу данных:
/usr/bin/psql -U postgres
При успешном входе выводятся сообщения следующего вида:
psql (10.5)
Type "help" for help.
postgres=#
| При первом входе в базу данных пароль вводить не нужно. |
Управление ролями базы данных
Создание роли
Для создания роли можно использовать инструкцию CREATE ROLE или команду createuser.
Команда createuser инкапсулирует инструкцию CREATE ROLE и должна выполняться в графическом интерфейсе оболочки, а не в графическом интерфейсе базы данных.
CREATE ROLE rolename [ [ WITH ] option [ ... ] ];
createuser rolename
В представленных выше данных:
-
rolename— имя роли. -
Параметры для
option:-
SUPERUSER | NOSUPERUSER: определяет, назначаются ли новой роли права суперпользователя. Если этот параметр не задан, используется значение по умолчаниюNOSUPERUSER, указывающее, что роли не предоставляются права суперпользователя. -
CREATEDB | NOCREATEDB: указывает, может ли роль создавать базу данных. Если этот параметр не задан, используется значение по умолчаниюNOCREATEDB, указывающее, что роль не может создавать базу данных. -
CREATEROLE | NOCREATEROLE: определяет, может ли роль создавать роли. Если этот параметр не задан, используется значение по умолчаниюNOCREATEROLE, указывающее, что роль не может создавать роли. -
INHERIT | NOINHERIT: определяет, наследует ли роль разрешения других ролей в группе, в которую эта роль входит. Роль с атрибутом INHERIT может автоматически использовать любые разрешения, назначенные ее прямой или косвенной группе. Если этот параметр не указан, используется значение по умолчаниюINHERIT. -
LOGIN | NOLOGIN: определяет, может ли роль войти в систему. Роль с атрибутомLOGINможно рассматривать как пользователя. Роль без этого атрибута может использоваться для управления разрешениями базы данных, но не является пользователем. Если этот атрибут не указан, используется значение по умолчаниюNOLOGIN. Однако если для создания роли вместоCREATE ROLEиспользуется инструкцияCREATE USER, атрибутLOGINиспользуется по умолчанию. -
[ENCRYPTED | UNENCRYPTED] PASSWORD 'password': пароль роли.Пароль действителен только для ролей с атрибутом
LOGIN.ENCRYPTED | UNENCRYPTEDопределяет, следует ли шифровать пароль. Если этот параметр не указан, используется значениеENCRYPTED, то есть пароль зашифрован. -
VALID UNTIL’timestamp': указывает метку времени окончания срока действия пароля роли. Если этот параметр не указан, пароль бессрочный. -
IN ROLE rolename1: перечисляет одну или несколько существующих ролей. Будет добавлена новая рольrolename, которая станет членомrolename1. -
ROLE rolename2: перечисляет одну или несколько существующих ролей. Эти роли будут автоматически добавлены в качестве членов новой ролиrolename. То есть новая роль — это группа пользователей.
-
Для выполнения этой команды требуется разрешение CREATEROLE или права суперпользователя базы данных.
Пример
-
Создание роли
roleexample1, которая может входить в систему:CREATE ROLE roleexample1 LOGIN; -
Создание роли
roleexample2с паролем123456:CREATE ROLE roleexample2 WITH LOGIN PASSWORD '123456'; -
Создание роли с именем
roleexample3(команду следует выполнять в оболочке командной строки, а не в интерпретатореpsql):createuser roleexample3
Просмотр ролей
Чтобы просмотреть роль, можно выполнить инструкцию SELECT или метакоманду PostgreSQL \du.
SELECT rolename FROM pg_roles;
\du
В предыдущей команде параметр rolename — это имя роли.
Изменение роли
Изменение имени пользователя
Чтобы переименовать существующую роль, используйте инструкцию ALTER ROLE:
ALTER ROLE oldrolername RENAME TO newrolename;
В представленных выше данных:
-
oldrolername— исходное имя роли; -
newrolename— новое имя роли.
Пример изменения пользователя
-
Переименование роли
roleexample1наroleexapme2:ALTER ROLE roleexample1 RENAME TO roleexample2;
Удаление роли
Для удаления роли можно использовать инструкцию DROP ROLE или команду dropuser.
Команда dropuser инкапсулирует инструкцию DROP ROLE и должна выполняться в графическом интерфейсе оболочки, а не в графическом интерфейсе базы данных.
DROP ROLE rolename;
dropuser rolename
В предыдущей команде параметр rolename — это имя роли.
Разрешения роли
Для предоставления разрешений роли можно использовать инструкцию GRANT.
-
Предоставление роли разрешения на выполнение операций с таблицей.
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] -
Предоставление роли разрешения на выполнение операций с последовательностью:
GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] -
Предоставление роли разрешения на выполнение операций с базой данных:
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] -
Предоставление роли разрешения на выполнение операций с функцией:
GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] -
Предоставление роли разрешения на выполнение операций процедурного языка:
GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] -
Предоставление роли разрешения на выполнение операций со схемой:
GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] -
Предоставление роли разрешения на выполнение операций с табличным пространством:
GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ] -
Назначение отношений членства в роли
rolename1для ролиrolename2:GRANT rolename1 [, ...] TO rolename2 [, ...] [ WITH ADMIN OPTION ]
В представленных выше данных:
-
SELECT,INSERT,UPDATE,DELETE,REFERENCES,TRIGGER,USAGE,CREATE,CONNECT,TEMPORARY,TEMP,EXECUTEиALL [ <PRIVILEGES> ]: указывают разрешения пользователя на выполнение операций.ALL [ <PRIVILEGES>]: указывает все разрешения, ключевое словоPRIVILEGESявляется необязательным в PostgreSQL, но требуется в строгих инструкциях SQL. -
Предложение
ON: указывает объект, в отношении которого предоставляется разрешение. -
tablename: имя таблицы. -
Предложение
TO: указывает роль, которой предоставляется разрешение. -
rolename,rolename1иrolename2: имена ролей. -
groupname: имя группы ролей. -
PUBLIC: указывает, что разрешение предоставляется всем ролям, включая пользователей, которые могут быть созданы позже. -
WITH GRANT OPTION: указывает, что получатель разрешения может предоставлять разрешение другим. Этот параметр невозможно назначить дляPUBLIC. -
sequencename: имя последовательности. -
databasename: имя базы данных. -
funcname ([[argmode] [argname] argtype [, ...]]): имя функции и ее параметры. -
langname: название процедурного языка. -
schemaname: имя схемы. -
tablespacename: имя табличного пространства. -
WITH ADMIN OPTION: участник может назначать отношения членства в роли другим ролям и отменять отношения членства в других ролях.
Удаление разрешений пользователя
Чтобы отозвать разрешения, предоставленные ранее одной или нескольким ролям, можно использовать инструкцию REVOKE.
-
Отзыв у роли разрешения на выполнение операций с таблицей.
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] -
Отзыв у роли разрешения на выполнение операций с последовательностью.
REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] -
Отзыв у роли разрешения на выполнение операций с базой данных.
REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] -
Отзыв у роли разрешения на выполнение операций с функцией:
REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] -
Отзыв у роли разрешения на выполнение операций процедурного языка:
REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] -
Отзыв у роли разрешения на выполнение операций со схемой:
REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] -
Отзыв у роли разрешения на выполнение операций с табличным пространством:
REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ] -
Отзыв у роли
rolename2отношений членства в ролиrolename1:REVOKE [ ADMIN OPTION FOR ] rolename1 [, ...] FROM rolename2 [, ...] [ CASCADE | RESTRICT ]
В представленных выше данных:
-
GRANT OPTION FOR: разрешение невозможно предоставить другим, однако само разрешение не отзывается. -
SELECT,INSERT,UPDATE,DELETE,REFERENCES,TRIGGER,USAGE,CREATE,CONNECT,TEMPORARY,TEMP,EXECUTEиALL [ <PRIVILEGES> ]: указывают разрешения пользователя на выполнение операций.ALL [ <PRIVILEGES> ]: указывает все разрешения, ключевое словоPRIVILEGESявляется необязательным в PostgreSQL, но требуется в строгих инструкциях SQL. -
Предложение
ON: указывает объект, в отношении которого отзывается разрешение. -
tablename— имя таблицы. -
Предложение
FROM: указывает роль, разрешение которой отзывается. -
rolename,rolename1иrolename2— имена ролей. -
groupname— имя группы ролей. -
PUBLIC: отзывает неявно определенные группы со всеми ролями. Однако это не означает, что все роли теряют разрешения. Разрешения, полученные напрямую, и разрешения, полученные через группу, остаются в силе. -
sequencename— имя последовательности. -
CASCADE: отзыв всех зависимых разрешений. -
RESTRICT: все зависимые разрешения не отзываются. -
databasename— имя базы данных. -
funcname (`[[argmode] [argname] argtype [, ...]]): имя функции и ее параметры. -
langname— название процедурного языка. -
schemaname— имя схемы. -
tablespacename— имя табличного пространства. -
ADMIN OPTION FOR: переданная авторизация не отзывается автоматически.
Управление базами данных
Создание базы данных
Для создания базы данных можно использовать инструкцию CREATE DATABASE или команду createdb.
Команда createdb инкапсулирует инструкцию CREATE DATABASE и должна выполняться в графическом интерфейсе оболочки, а не в графическом интерфейсе базы данных.
CREATE DATABASE databasename;
createdb databasename
В предыдущей команде параметр databasename — это имя базы данных.
Для использования этой команды требуется разрешение CREATEDB.
Выбор базы данных
Используйте инструкцию \c для выбора базы данных:
\c databasename;
В предыдущей команде параметр databasename — это имя базы данных.
Удаление базы данных
Чтобы удалить базу данных, можно выполнить инструкцию DROP DATABASE или команду dropdb.
Команда dropdb инкапсулирует инструкцию DROP DATABASE и должна выполняться в графическом интерфейсе оболочки, а не в графическом интерфейсе базы данных.
Будьте осторожны при удалении базы данных. После удаления базы данных все таблицы и данные в базе данных будут утеряны.
DROP DATABASE databasename;
dropdb databasename
В предыдущей команде параметр databasename — это имя базы данных.
Инструкция DROP DATABASE удаляет элементы системного каталога базы данных и файловые каталоги, содержащие данные.
Инструкцию DROP DATABASE может выполнить только суперадминистратор или владелец базы данных.
Резервное копирование базы данных
Выполните команду pg_dump, чтобы создать резервную копию базы данных и записать ее дамп в файл сценария или другой файл архива.
pg_dump [option]... [databasename] > outfile
В представленных выше данных:
-
databasename— имя базы данных. Если этот параметр не указан, используется переменная средыPGDATABASE. Если эта переменная среды не задана, используйте имя пользователя, которое инициирует подключение. -
outfile— файл резервной копии базы данных. -
option— параметр командыpg_dump. Можно ввести несколько параметров через пробел. Общие параметры командыpg_dump:-
-f,--file: указанный выходной файл. Если этот параметр пропущен, используется стандартный вывод. -
-d,--dbname: база данных для записи дампа. -
-h,--host: имя хоста. -
-p,--port: номер порта. -
-U,--username: имя пользователя подключения. -
-W,--password: принудительный запрос PostgreSQL пароля перед подключением к базе данных.
-
Восстановление базы данных
Чтобы восстановить базу данных, выполните команду psql:
psql [option]... [databasename [username]] < infile
В представленных выше данных:
-
databasename— имя базы данных. Если этот параметр не указан, используется переменная средыPGDATABASE. Если эта переменная среды не задана, используйте имя пользователя, которое инициирует подключение. -
username— имя пользователя. -
infile— параметрoutfileв командеpg_dump. -
option— параметр командыpsql. Можно ввести несколько параметров через пробел. Общие параметры командыpsql:-
-f,--file: указанный выходной файл. Если этот параметр пропущен, используется стандартный вывод. -
-d,--dbname: база данных для записи дампа. -
-h,--host: имя хоста. -
-p,--port: номер порта. -
-U,--username: имя пользователя подключения. -
-W,--password: принудительный запрос PostgreSQL пароля перед подключением к базе данных.
-
Команду psql нельзя использовать для автоматического создания базы данных databasename.
Поэтому базу данных databasename необходимо создать перед выполнением команды psql для восстановления базы данных.