FAQ PostgreSQL

Здесь собрал команды, которые часто приходится выполнять работая с PostgreSQL в виде краткой шпаркалки.
Базовые команды
Подключение к инстансу на локалхосте под пользователем postgres:
$psql -U postgres -h localhostСписок баз:
\lПодключиться к базе:
\c dbnameCписок таблиц в базе:
\dtCписок таблиц в базе, в названии которых есть mytable:
\dt *mytable*Cписок индексов:
\diВключает или выключает вывод результата списком, а не таблицей:
\xВот пример вывода таблицей и списком:
postgres=# select * from pg_user;
usename | usesysid | usecreatedb | usesuper | userepl | usebypassrls | passwd | valuntil | useconfig
-----------------+----------+-------------+----------+---------+--------------+----------+----------+-----------
postgres | 10 | t | t | t | t | ******** | |
testuser | 16321 | f | f | f | f | ******** | |
(2 rows)
postgres=# \x
Expanded display is on.
postgres=# select * from pg_user;
-[ RECORD 1 ]+----------------
usename | postgres
usesysid | 10
usecreatedb | t
usesuper | t
userepl | t
usebypassrls | t
passwd | ********
valuntil |
useconfig |
-[ RECORD 2 ]+----------------
usename | testuser
usesysid | 16321
usecreatedb | f
usesuper | f
userepl | f
usebypassrls | f
passwd | ********
valuntil |
useconfig |Работа с пользователями
Список пользователей:
\duСоздать пользователя:
CREATE USER username WITH PASSWORD 'password';Выдать права на базу:
GRANT ALL PRIVILEGES ON DATABASE dbname TO username;Изменить пароль пользователя:
ALTER USER username WITH PASSWORD 'new_password';Удалить пользователя:
DROP USER IF EXISTS username;Обслуживание
Посмотреть размер всех баз:
SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database
ORDER BY pg_database_size(datname) DESC;Размер таблиц и индексов:
SELECT
TABLE_NAME,
pg_size_pretty(table_size) AS table_size,
pg_size_pretty(indexes_size) AS indexes_size,
pg_size_pretty(total_size) AS total_size
FROM (
SELECT
TABLE_NAME,
pg_table_size(TABLE_NAME) AS table_size,
pg_indexes_size(TABLE_NAME) AS indexes_size,
pg_total_relation_size(TABLE_NAME) AS total_size
FROM (
SELECT ('"' || table_schema || '"."' || TABLE_NAME || '"') AS TABLE_NAME
FROM information_schema.tables
) AS all_tables
ORDER BY total_size DESC
) AS pretty_sizes;Список всех работающих запросов:
SELECT
pid,
age(clock_timestamp(), query_start),
usename,
query
FROM pg_stat_activity
WHERE query != '<IDLE>' AND query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start desc;Список запросов работающих дольше 5 минут:
SELECT
pid,
now() - pg_stat_activity.query_start AS duration,
query,
state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';Остановить запрос по pid:
SELECT pg_cancel_backend(pid);Принудительно остановить запрос:
SELECT pg_terminate_backend(pid);Остановить запросы работающие дольше 5 минут:
SELECT
pg_terminate_backend(pid),
now() - pg_stat_activity.query_start AS duration,
query,
state
FROM pg_stat_activity
WHERE (now() - pg_stat_activity.query_start) > interval '5 minutes';Остановить все запросы:
SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE datname = current_database()
AND pid <> pg_backend_pid();Бэкапы
Для бэкапов есть консольные утилиты pg_dump и pg_dumpall. Первая делает sql-дамп отдельно взятой базы, а вторая, как следует из названия, делает то же самое для всех баз (+бэкапит пользователей). Есть еще утилита pg_basebackup, она делает полный бэкап инстанса на уровне файлов.
Дамп базы в сжатый файл (опция -C добавляет команду CREATE DATABASE в дамп):
$pg_dump -C -U username -h hostname dbname | gzip > dump.sql.gzПолный дамп всех баз и пользователей в сжатый файл:
$pg_dumpall -U username -h hostname | gzip > dump.sql.gzВосстановление базы (или полного дампа, но тогда не нужно указывать dbname) из сжатого файла:
$zcat dump.sql.gz | psql -U username -h hostname dbname

