Администрирование PostgreSQL. Несколько полезных запросов и команд
Создание и удаление базы данных.
createdb dbname
dropdb dbname
Дамп базы данных.
pg_dump dbname > dbdump.sql
С удаленного хоста:
pg_dump -h hostname dbname > dbdump.sql
Импорт данных из дампа в существующую базу данных.
psql -f dump.sql -d dbname
или
psql -f dump.sql dbname
Для удаленного хоста:
psql -h hostname -f dump.sql -d dbname
Сборка мусора и анализ базы данных.
VACUUM (VERBOSE, ANALYZE);
Для одной таблицы:
VACUUM (VERBOSE, ANALYZE) tablename;
Статистика использования VACUUM и ANALYZE.
SELECT relname, last_vacuum, last_autovacuum, last_analyze, last_autoanalyze
FROM pg_stat_user_tables;
Список таблиц с наличием «мёртвых» строк.
SELECT relname, n_dead_tup, last_vacuum, last_autovacuum
FROM pg_catalog.pg_stat_all_tables
WHERE n_dead_tup>0
ORDER BY n_dead_tup DESC;
Просмотр всех подключений к базе данных.
SELECT * FROM pg_stat_activity WHERE datname='DBNAME';
См. также Как удалить базу данных PostgreSQL, если есть активные подключения к ней?
Просмотр выполняющихся запросов.
SELECT pid, age(query_start, clock_timestamp()), usename, query
FROM pg_stat_activity
WHERE state!='idle' AND query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start desc;
Для версий 9.1 и ниже:
SELECT procpid, age(query_start, clock_timestamp()), usename, current_query
FROM pg_stat_activity
WHERE current_query!='<IDLE>' AND current_query NOT ILIKE '%pg_stat_activity%'
ORDER BY query_start desc;
Отменить текущий запрос в обслуживающем процессе.
SELECT pg_cancel_backend(pid);
Код активного процесса (pid) можно получить из столбца pid представления pg_stat_activity (см. выше информацию по просмотру выполняющихся запросов).
Завершить обслуживающий процесс.
SELECT pg_terminate_backend(procpid);
Код активного процесса (pid) можно получить из столбца pid представления pg_stat_activity (см. выше информацию по просмотру всех подключений к базе данных).
Список запросов выполняющихся более чем.
SELECT now()-query_start as runtime, usename, datname, waiting, state, query
FROM pg_stat_activity
WHERE now()-query_start > '1 minutes'::interval
ORDER BY runtime DESC;
Для версий 9.1 и ниже:
SELECT now()-query_start as runtime, usename, datname, waiting, current_query
FROM pg_stat_activity
WHERE now()-query_start > '10 second'::interval AND current_query!='<IDLE>'
ORDER BY runtime DESC;
Список пользователей.
SELECT * FROM pg_user;
Список баз данных и их размеры
SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
Более сложный вариант запроса, учитывающий права доступа к БД:
SELECT d.datname AS Name, pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
ELSE 'No Access'
END AS SIZE
FROM pg_catalog.pg_database d
ORDER BY
CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
THEN pg_catalog.pg_database_size(d.datname)
ELSE NULL
END DESC;
Размер таблиц базы данных.
SELECT nspname || '.' || relname AS "relation",
pg_size_pretty(pg_total_relation_size(C.oid)) AS "total_size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema')
AND C.relkind <> 'i'
AND nspname !~ '^pg_toast'
ORDER BY pg_total_relation_size(C.oid) DESC;
Частота использования кеша для данных
SELECT sum(heap_blks_read) as heap_read, sum(heap_blks_hit) as heap_hit, (sum(heap_blks_hit) - sum(heap_blks_read)) / sum(heap_blks_hit) as ratio
FROM pg_statio_user_tables;
Частота использования кеша для индексов
SELECT sum(idx_blks_read) as idx_read, sum(idx_blks_hit) as idx_hit, (sum(idx_blks_hit) - sum(idx_blks_read)) / sum(idx_blks_hit) as ratio
FROM pg_statio_user_indexes;
Частота использования индексов таблиц.
SELECT relname,
CASE WHEN (seq_scan + idx_scan) != 0
THEN round(100.000 * idx_scan / (seq_scan + idx_scan) , 3)
ELSE 0.000
END AS percent_of_times_index_used,
n_live_tup AS rows_in_table
FROM pg_stat_user_tables
ORDER BY n_live_tup DESC;
Бонус.
Как сделать дамп функций из базы данных.
Как получить список представлений.
(#) Gorus:
Большое Вам человеческое спасибо!
(#) first1111:
SELECT datname, pg_size_pretty(pg_database_size(datname))
FROM pg_database
ORDER BY pg_database_size(datname) DESC;
Команда вывела все базы данных, а как их разделить по серверам, к которым они принадлежат???