2024-12-09 21:57:44 +03:00

8.1 KiB
Raw Blame History

Cheat sheet

Общие команды

  • sudo -u postgres psql postgres

  • CREATE DATABASE имя_базы_данных;

  • DROP DATABASE mydatabase;

  • psql -U postgres

  • \l - просмотр списка бд

  • \q - выход


Работа внутри конкретной бд

  • \c имя_базы_данных [имя_пользователя] - подключение к бд или из bash psql -U username -d database_name

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

  • \d [имя таблицы] - показывает столбцы, типы данных и индексы

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

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


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

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

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

  • GRANT ALL PRIVILEGES ON DATABASE имя_базы TO имя_пользователя;

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

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


  • SELECT * FROM pg_stat_activity; - просмотр текущий подключений
  • SELECT * FROM pg_locks; - просмотр блокировок

  • psql -U postgres -d my_database -f ./script.sql - запуск скрипта

  • /usr/pgsql-12/bin/pg_dump -U u_ensi -t address_several_juridical_entity -h 127.0.0.1 db_ensi | gzip > <dir>/address_several_juridical_entity.sql.gz - снятие дампов

  • /zcat /tmp/SvJul_4_07.sql.gz | /usr/pgsql-12/bin/psql -h 127.0.0.1 -U u_ensi -d db_ensi -t SvJul_4_07 >> ensi.log - восстановление таблицы


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);

SELECT pid, usename, datname, client_addr, client_port, application_name, state FROM pg_stat_activity;

SELECT usename, client_addr, client_port, state FROM pg_stat_activity;

psql -U postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;"

psql -U postgres -d postgres -c "SELECT datname FROM pg_database WHERE datistemplate = false;" -t -A


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


ALTER DATABASE "downloader8097" RENAME TO "downloader_vo_8097"; - переименовать БД


Анализ БД

SELECT pid, usename, datname, client_addr, client_port, application_name, state
FROM pg_stat_activity
WHERE datname = current_database();
SELECT pid,
	   now() - query_start AS runtime_query,
       state,
       query,
       usename,
       datname
FROM pg_stat_activity
WHERE state = 'active' and datname = current_database()
ORDER BY runtime_query DESC;
SELECT pid,
	   now() - xact_start  AS transaction_time,
       state,
       query,
       usename,
       datname
FROM pg_stat_activity
WHERE state IN ('active', 'idle in transaction') and datname = current_database()
ORDER BY transaction_time DESC;
SELECT 
    pid,                                       -- Идентификатор процесса
    state,                                     -- Состояние процесса
    now() - query_start AS query_runtime,      -- Время выполнения текущего запроса
    now() - xact_start AS transaction_runtime, -- Время выполнения транзакции
    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 *
FROM 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 — Общее время записи блоков на диск (в миллисекундах).
# системная инфа
SELECT *
FROM pg_stat_bgwriter;
# Блокировки
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;
EXPLAIN ANALYZE
SELECT <ваш_запрос>;
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = <process_id>;