Содержание

Postgres

Install

# apt install postgresql postgresql-contrib
# -u postgres psql -c "SELECT version();" 

Роли PostgreSQL и методы аутентификации

PostgreSQL поддерживает несколько методов аутентификации . Наиболее часто используемые методы:

Аутентификация клиента PostgreSQL определяется в файле конфигурации с именем pg_hba.conf.
Пользователь «postgres» создается автоматически, в системе!!! и является суперпользователем для СУБД.

$ sudo su - postgres
$ psql 
 
  # PG Activity
su postgres
bash-4.4$ pg_activity
$ sudo su - postgres -c "createuser kylo" 
$ sudo su - postgres -c "createdb kylodb"
psql$ GRANT ALL PRIVILEGES ON DATABASE kylodb TO kylo;

По умолчанию сервер PostgreSQL слушает только локальный интерфейс 127.0.0.1.

$ sudo nano /etc/postgresql/11/main/postgresql.conf
listen_addresses = '*'     # what IP address(es) to listen on; 
$ sudo nano /etc/postgresql/11/main/pg_hba.conf
# TYPE  DATABASE        USER            ADDRESS                 METHOD
# The user jane will be able to access all databases from all locations using an md5 password
host    all             jane            0.0.0.0/0                md5
host    all             jane            192.168.1.134            trust
CREATE DATABASE test_db;
CREATE USER test_user WITH encrypted password 'dbpassword';
GRANT ALL privileges ON DATABASE test_db TO test_user;
CREATE ROLE admin WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD 'Passw0rd';
  # List TABLES
\dt || SELECT * FROM pg_catalog.pg_tables;
  # Список пользователей
\du
  # Права пользователя
SELECT * FROM information_schema.table_privileges WHERE grantee = 'limit_view';
  # Сменить пароль пользователю
\password <username>
:!: Еще примеры
# Создаем нового пользователя, с разрешением логинится
CREATE USER <логин> WITH login password '<пароль>';
 
# Настройку привилегий удобнее вынести в группу (роль), создаем роль с мин правами
CREATE ROLE <роль> nosuperuser nocreatedb nocreaterole noreplication inherit;
 
# Добавляем созданного пользователя в нее
GRANT <роль> TO <логин>;
 
# Далее настраиваем доступ (только SELECT) для группы, переходим в нужную базу
\c <имя-базы>
GRANT USAGE ON SCHEMA <имя-схемы> TO <роль>;
GRANT SELECT ON ALL TABLES IN SCHEMA <имя-схемы> TO <роль>;
 
# Удаление прав
REVOKE usage ON schema <имя-схемы> FROM <роль>;
REVOKE ALL ON ALL TABLES IN schema <имя-схемы> FROM <роль>;
</sql>
</details>
 
 
==== USER Managment ====
:!: Роли базы данных концептуально полностью отделены от пользователей операционной системы. На практике может быть удобно поддерживать переписку, но это не обязательно. Роли базы данных являются глобальными для всей установки кластера базы данных (а не для отдельной базы данных).\\
 
<code sql>
CREATE ROLE name;
DROP ROLE name;
 
createuser name
dropuser name
 
SELECT rolname FROM pg_roles;

Role Attributes

Роль базы данных может иметь ряд атрибутов, которые определяют ее привилегии и взаимодействуют с системой аутентификации клиента

:!: CREATE USER эквивалентен CREATE ROLE, за исключением того, что CREATE USER предполагает LOGIN по умолчанию, а CREATE ROLE — нет.

:!: Атрибуты роли можно изменить после создания с помощью ALTER ROLE

ALTER ROLE myname SET enable_indexscan TO off; 
GRANT UPDATE ON accounts TO joe;
REVOKE ALL ON accounts FROM PUBLIC;
ALTER ROLE super WITH PASSWORD 'secret123';
\l - список баз
\c <dbname> выбор базы

OverAll

Форматирование вывода

  # Извлекаем таблицу (-l), убираем пробелы (-A) и седом меняем разделители на табы
sudo -u postgres psql -lA | sed -e "s/|/\t/g"
sudo -i -u postgres psql -d zabbix -c "select * from functions ;"
  # Узнать размер базы
sudo -u postgres psql -c "SELECT pg_size_pretty( pg_database_size( 'DBName' ) );"
 
  # Активные подключения к базе
SELECT * from pg_stat_activity where datname = 'mgat_R1789_0-11-g33f30064_20221209_110115_1820';
 
  # Предотвращаем возможность новых подключений
UPDATE pg_database SET datallowconn = 'false' WHERE datname = 'database_name';
 
  # Закрываем текущие сессии
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'database_name' AND pid <> pg_backend_pid();
 
  # Удалить
DROP DATABASE database_name;
 
  # Переименовать базу
alter database test rename to test1;
:!: Еще примеры

Еще настройка

echo export PATH=/usr/pgsql-15/bin:$PATH > /var/lib/pgsql/.pgsql_profile
export PGPORT=27953

Экспорт/Импорт
описание

su - postgres -c "pg_dump -p 27953 -Fc postgres > /tmp/postgres_db.dump"
  # Базу нужно создать перед восстановлением
su - postgres -c "pg_restore --dbname=test_postgres /tmp/postgres_db.dump"
 
  # Полный бекап
pg_dumpall -h localhost -p 27953 -U backuper --schema-only --file /tmp/db_dump.sql
  # Восстановление
psql -U postgres -p 27953 -f /tmp/db_dump.sql
:!: Работа с кластером
pg_lsclusters
 
pg_ctlcluster
 
pg_ctlcluster 9.4 secondary reload/start/stop