wiki/docs/postgresql/Разное.md
ilyamak04 6d8287780e
All checks were successful
Build MkDocs / build-and-deploy (push) Successful in 13s
про пг
2025-02-05 22:09:15 +03:00

13 KiB
Raw Blame History

Разное полезное

Cheat sheet

Команды

  • sudo -u postgres psql postgres - подключиться к базе данных postgres от имени пользователя Linux postgres !!! tip "" Если не указано имя базы данных, psql попытается подключиться к базе данных с именем, совпадающим с именем пользователя. В данном случае это будет база данных postgres

  • sudo -u postgres psql -d имя_базы_данных -f путь_к_скрипту.sql - выполнить SQL-скрипт на базе

  • sudo -u postgres psql -d имя_базы_данных -c "SQL-запрос" - выполнить SQL-скрипт на базе

  • \l - просмотр списка БД

  • \du - посмотреть какие роли назначены пользователю

  • \q - выход из psql

  • \c <database_name> <user_name> - подключение к БД или из bash psql -U username -d <database_name>

  • \dt - просмотр списка таблиц

  • \d <table_name> - показывает столбцы, типы данных и индексы

  • \dn - список схем

  • \dt <schema_name> - список таблиц в схеме

  • psql -U postgres -d my_database -f /etc/script.sql - выполнить скрипт


  • CREATE TABLE имя_таблицы (id SERIAL PRIMARY KEY, колонка1 тип, колонка2 тип, ...); - создание таблицы

  • CREATE USER имя_пользователя WITH PASSWORD 'пароль';

  • CREATE ROLE имя_роли; ??? info "В чём разница USER и ROLE?" Пользователь (USER) — это роль, которая по умолчанию ИМЕЕТ право на подключение к базе данных Роль (ROLE) — это более общее понятие. Она может быть как пользователем, так и группой. Роль по умолчанию НЕ ИМЕЕТ права на подключение к базе данных (если не указан атрибут LOGIN)

    Роли (и пользователи) могут иметь дополнительные атрибуты, которые определяют их поведение. Вот основные атрибуты:

    • LOGIN - Позволяет роли подключаться к базе данных (по умолчанию для USER)
    • SUPERUSER - Дает роли права суперпользователя
    • CREATEDB - Позволяет роли создавать базы данных
    • CREATEROLE - Позволяет роли создавать другие роли
    • INHERIT - Позволяет роли наследовать права от других ролей (по умолчанию TRUE)
    • REPLICATION- Позволяет роли использоваться для репликации
    • PASSWORD - Устанавливает пароль для роли
    CREATE ROLE admin WITH LOGIN PASSWORD 'password' CREATEDB CREATEROLE
    

    PostgreSQL пользователя (USER) можно добавить в роль (ROLE). Когда пользователь добавляется в роль, он автоматически наследует все права, связанные с этой ролью.

    -- Создаем роль
    CREATE ROLE read_only;
    -- Создаем пользователя
    CREATE USER myuser WITH PASSWORD 'password';
    -- Добавляем пользователя в роль
    GRANT read_only TO myuser;
    
    # удалить пользователя из роли
    REVOKE имя_роли FROM имя_пользователя;
    
  • GRANT ALL PRIVILEGES ON DATABASE имя_базы TO имя_пользователя;

  • DROP USER имя_пользователя;

  • DROP ROLE имя_роли;

  • ALTER TABLE — это команда в SQL, которая используется для изменения структуры уже существующей таблицы в базе данных.

ALTER TABLE имяаблицы ADD имя_столбца типанных;
ALTER TABLE имяаблицы DROP COLUMN имя_столбца;
ALTER TABLE имяаблицы ALTER COLUMN имя_столбца SET DATA TYPE новый_тип;
ALTER TABLE имяаблицы ADD CONSTRAINT имя_ограничения тип_ограничения (столбец);
ALTER TABLE employees ADD CONSTRAINT age_check CHECK (age >= 18);
ALTER DATABASE "<old_name>" RENAME TO "<new_name>";
-- какие роли назначены пользователю
SELECT rolname, memberof 
FROM pg_roles 
WHERE rolname = 'myuser';

-- отключить все подключения к бд
SELECT pg_terminate_backend( pid ) FROM pg_stat_activity WHERE pid <> pg_backend_pid( ) AND datname = '<database_name>'; 
-- убить процесс по pid
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = <process_id>;

Статистика

  • SELECT * FROM pg_stat_activity; - просмотр текущий подключений
  • SELECT * FROM pg_locks; - просмотр блокировок
-- просмотр текущих подключений подробно
SELECT 
    pid,                                       -- Идентификатор процесса
    state,                                     -- Состояние процесса
    now() - query_start AS query_runtime,      -- Время выполнения текущего запроса
    now() - xact_start AS transaction_runtime, -- Время выполнения транзакции
    application_name,
    query,                                     -- Текущий запрос
    usename,                                   -- Пользователь
    datname,                                   -- База данных
    xact_start                                 -- Время начала транзакции
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction') and datname = current_database()         
ORDER BY transaction_runtime DESC;   
-- смотрим базы и их размер
SELECT pg_database.datname,
       pg_size_pretty(pg_database_size(pg_database.datname)) AS size
FROM pg_database
ORDER BY pg_database_size(pg_database.datname) DESC;
-- общий размер конкретной БД
select pg_size_pretty(pg_database_size('название базы'));
-- общий размер индекса в БД
SELECT
    pg_size_pretty(SUM(pg_relation_size(indexrelid))) AS total_index_size
FROM
    pg_stat_all_indexes;
-- размер таблиц в БД
select schemaname as table_schema,
relname as table_name,
pg_size_pretty(pg_total_relation_size(relid)) as total_size,
pg_size_pretty(pg_relation_size(relid)) as data_size,
pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid))
as index_size
from pg_catalog.pg_statio_user_tables
order by pg_total_relation_size(relid) desc,
pg_relation_size(relid) desc;
-- размер индексов в БД
SELECT
    pg_size_pretty(pg_relation_size(indexrelid)) AS index_size,
    indexrelname AS index_name,
    t.relname AS table_name
FROM
    pg_stat_all_indexes
JOIN
    pg_class t ON t.oid = pg_stat_all_indexes.relid
ORDER BY
    pg_relation_size(indexrelid) DESC;
-- общий размер индексов в таблице
SELECT
    pg_size_pretty(SUM(pg_relation_size(indexrelid))) AS total_index_size
FROM
    pg_stat_all_indexes
WHERE
    relname = 'название таблицы';
-- блокировки в БД
SELECT 
 blocked_locks.pid AS blocked_pid,
 blocked_activity.usename AS blocked_user,
 blocking_locks.pid AS blocking_pid,
 blocking_activity.usename AS blocking_user,
 blocking_activity.state AS blocking_state,
 blocked_activity.query AS blocked_statement,
 blocking_activity.query AS current_statement_in_blocking_process,
 blocked_locks.locktype AS blocked_locktype, 
 blocking_locks.locktype AS blocking_locktype
FROM pg_catalog.pg_locks blocked_locks
JOIN pg_catalog.pg_stat_activity blocked_activity 
  ON blocked_activity.pid = blocked_locks.pid
JOIN pg_catalog.pg_locks blocking_locks 
  ON blocking_locks.locktype = blocked_locks.locktype
 AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE
 AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation
 AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page
 AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple
 AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid
 AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid
 AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid
 AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid
 AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid
 AND blocking_locks.pid != blocked_locks.pid 
JOIN pg_catalog.pg_stat_activity blocking_activity 
  ON blocking_activity.pid = blocking_locks.pid
WHERE NOT blocked_locks.GRANTED;
-- использование памяти и ресурсов в БД
SELECT *
FROM pg_stat_database;

??? info "Расшифровка атрибутов pg_stat_database" - datid — Идентификатор базы данных (OID). - datname — Имя базы данных. - numbackends — Количество активных соединений (клиентов) с этой базой. - xact_commit — Общее количество успешно завершённых транзакций. - xact_rollback — Общее количество откатов транзакций. - blks_read — Количество блоков, считанных с диска. - blks_hit — Количество блоков, найденных в кеше (попадания в shared_buffers). - tup_returned — Количество строк, возвращённых клиенту. - tup_fetched — Количество строк, извлечённых (например, SELECT). - tup_inserted — Количество вставленных строк (INSERT). - tup_updated — Количество обновлённых строк (UPDATE). - tup_deleted — Количество удалённых строк (DELETE). - conflicts — Количество конфликтов (например, из-за репликации). - temp_files — Количество временных файлов, созданных сервером. - temp_bytes — Количество данных, записанных во временные файлы (в байтах). - deadlocks — Количество взаимоблокировок. - blk_read_time — Общее время чтения блоков с диска (в миллисекундах). - blk_write_time — Общее время записи блоков на диск (в миллисекундах).

Бэкапирование

  • pg_dump -U <user_name> -t <table_name> -h <host_ip> -d <database_name> | gzip > <dir>/<table_name>.sql.gz - снятие дампа с таблицы
  • gunzip /tmp/<dump_name>.sql.gz | psql -h <host_ip> -U <user_name> -d <database_name> -t <table_name> >> <log_name>.log - восстановление таблицы

# TODO дополнить раздел

Разное

  • ps -ef | grep -v grep | grep postgres - определяет есть ли процесс постгрес на машине
  • which psql - есть ли в локальном окружении psql
  • sudo docker inspect <имя_контейнера> | grep postgres - есть ли постгрес в контейнере

  • psql -U postgres -c "SHOW server_version;" - версия пг или psql -V или /usr/bin/psql -V
  • psql -U postgres -c "SHOW port;" - порт на котором работает пг
  • psql -U postgres -c "SHOW wal_directory;" - каталог WAL

Где что лежит??

  1. Каталог данных
  • /var/lib/postgresql/<версия>/main/ - Debian/Ubuntu
  • /var/lib/pgsql/<версия>/data/ - CentOS/Fedora
  • psql -U postgres -c "SHOW data_directory;"
  1. Конфигурационные файлы (могут находится в каталоге данных)
  • /etc/postgresql/<версия>/main/
  • psql -U postgres -c "SHOW config_file;" - путь к конфигу
  • psql -U postgres -c "SHOW hba_file;" - путь к настройкам аутентификации
  1. Каталог логов
  • /var/log/postgresql/
  • psql -U postgres -c "SHOW log_directory;"

  • SHOW shared_preload_libraries; - список библиотек, которые были загружены при старте PostgreSQL с помощью параметра shared_preload_libraries в postgresql.conf
  • pg_config --pkglibdir - показывает путь к каталогу, где находятся библиотеки пг (shared libraries).