FAQ PostgreSQL¶
Здесь собрал команды, которые часто приходится выполнять работая с PostgreSQL в виде краткой шпаркалки.
Базовые команды¶
Подключение к инстансу на локалхосте под пользователем postgres:
Список баз:
Подключиться к базе:
Cписок таблиц в базе:
Cписок таблиц в базе, в названии которых есть mytable:
Cписок индексов:
Включает или выключает вывод результата списком, а не таблицей:
Вот пример вывода таблицей и списком:
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 |
Работа с пользователями¶
Список пользователей:
Создать пользователя:
Выдать права на базу:
Изменить пароль пользователя:
Удалить пользователя:
Обслуживание¶
Посмотреть размер всех баз:
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:
Принудительно остановить запрос:
Остановить запросы работающие дольше 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 в дамп):
Полный дамп всех баз и пользователей в сжатый файл:
Восстановление базы (или полного дампа, но тогда не нужно указывать dbname) из сжатого файла: