PostgreSQL FAQ

В данном разделе написаны команды и функции, которые могут помочь в администрирование сервера БД PostgerSQL

select * from pg_tables where tableowner = 'Х';
SELECT grantor, grantee, table_schema, table_name, privilege_type FROM information_schema.table_privileges WHERE grantee = 'myuser';
select 'ALTER TABLE ' || t.schemaname || '.' || t.tablename || ' OWNER TO "new_owner";' from  pg_tables t where t.schemaname = 'schemaname';
sudo su - postgres
psql -c "SHOW hba_file;" #Найти pg_hba.conf
psql -U postgres -c 'SHOW config_file' #найти postgresql.conf
pg_ctl reload
kill -HUP
=> select pg_reload_conf();
psql -l
select datname, datistemplate, datallowconn, datconnlimit from pg_database;
\c 'database name'
select pg_database_size('database_name');
select pg_size_pretty(pg_database_size('database_name'));
select pg_size_pretty(pg_table_size('table_name')); #размер таблицы без индексов
select pg_size_pretty(pg_indexes_size('table_name')); #размер индексов
select pg_size_pretty(pg_total_relation_size('table_name')); #размер таблицы вместе с индексами
SELECT schema_name, 
       pg_size_pretty(sum(table_size)::bigint),
       (sum(table_size) / pg_database_size(current_database())) * 100
FROM (
  SELECT pg_catalog.pg_namespace.nspname as schema_name,
         pg_relation_size(pg_catalog.pg_class.oid) as table_size
  FROM   pg_catalog.pg_class
     JOIN pg_catalog.pg_namespace ON relnamespace = pg_catalog.pg_namespace.oid
) t
GROUP BY schema_name
ORDER BY schema_name;
alter database test rename to db; #переименовать базу
alter database db connection limit 10; #изменить количество максимальных соединений
\timing	# Показывает время выполняния запроса
\conninfo	# Показывает к каким базам подключены
drop database db;	# Удаляет базу
drop database of exists db;	# Удаляет базу, если она существует (чтобы не возвращало ошибку)
table pg_hba_file_rules;
# На таблицу 
SELECT grantee, privilege_type
FROM information_schema.role_table_grants
WHERE table_name='table_name';

# Чтобы просмотреть привилегии пользователя в базе данных
SELECT * FROM information_schema.table_privileges WHERE grantee = 'postgres' LIMIT 10;
SELECT pg_size_pretty(sum(pg_relation_size(quote_ident(schemaname) || '.' || quote_ident(tablename)))::bigint) FROM pg_tables
WHERE schemaname = 'schema_name';
# Lock an account
ALTER USER someone WITH NOLOGIN;
# Un-lock an account
ALTER USER someone WITH LOGIN;
select rolcanlogin from pg_roles where rolname='database_user';

OUTPUT:
rolcanlogin
-------------
 f
(1 row)

f = false # Can not login
t = true # Can login
grant all privileges on database database_name to "user_name"; #предоставить все права на базу
revoke all privileges on database datavase_name from "user_name"; #забать права на базу
ALTER USER "user_name" WITH SUPERUSER; #сделать польщователя суперюзером
GRANT ALL PRIVILEGES ON TABLE table_name TO user_name; #полные права на таблицу
\l базы данных списков
\du посмотреть права
\conninfo отображение информации о текущем подключении
\c [DBNAME] подключение к новой базе данных, например, \c template1
\dt таблицы списка общедоступной схемы<br>\dt .* перечислите таблицы определенной схемы, например, \dt public.*
\dt <em>.</em> список таблиц всех схем
SELECT pg_get_functiondef(p.oid), p.prosrc
FROM pg_proc p
WHERE proname='func_name'
SELECT datname FROM pg_stat_activity WHERE usename = 'app-user'; # просмотр числа запросов под пользователем
SELECT * FROM pg_stat_activity WHERE state = 'active'; # просмотр всех активных запросов
SELECT pg_cancel_backend(<pid of the process>); # остановка запроса по PID
SELECT pg_terminate_backend(<pid of the process>); # kill процесса по PID
SELECT pid, query, query_start  FROM pg_stat_activity WHERE usename = 'user' and state = 'active';
SELECT pid, usename, client_addr FROM pg_stat_activity where datname = 'BaseName';

При возникновении ошибки «option «locale» not recognized» при развёртывании базы или схемы:

sed 's/LOCALE/LC_COLLATE/' /tmp/1.dmp > /tmp/2.dmp
\c 'database_name'
CREATE USER "va.pupkin" WITH PASSWORD '123456'
GRAND role_name TO "va.pupkin"

Резервное копирование / восстановление

Полный дамп и восстановление схемы:

pg_dumpall -s > dump.dmp
psql -f dump.dmp

Копирование схемы на другой сервер:

pg_dump --schema='schema_name' "Database_Name" > /tmp/schema_name.sql
psql -d "Database_Name" -f /tmp/schema_name.sql

Посмотреть активные сессии:

select client_addr, pid, usename, query, query_start, state_change from pg_stat_activity where state = 'active';

Экспорт функций в файл:

SELECT pg_catalog.pg_get_functiondef('function_name'::regproc) \g /tmp/function_name.sql

SQL

select * from "table_name" order by data desc limit 2; #посмотерть 2 последних значения

WAL

select * from pg_ls_waldir() LIMIT 100;
select * from pg_current_wal_insert_lsn();
SELECT 'AA39/4C451F48'::pg_lsn - 'AA39/3B98D330'::pg_lsn;
select * FROM pg_stat_bgwriter \gx
###
select * from pg_stat_replication;				# посмотреть текущие репликации
select * from pg_replication_slots;				# посмотреть слоты репликации
select * from pg_ls_waldir();					# посмотреть содержание каталога с WAL
SELECT pg_drop_replication_slot('slot_name');	# удалить слот репликации
VACUUM (VERBOSE, ANALYZE) schema."table";	# Запуск VACUUM и анализа для планировщика без блокировки таблицы с полным отчётом.

USER SETTINGS

select usename,useconfig from pg_shadow; # посмотреть настрпойки пользователя
ALTER USER "username" SET ENABLE_SEQSCAN TO ON; # установить значение параметра для пользователя
ALTER USER "username" RESET ENABLE_SEQSCAN; # сбросить занчение параметра для пользователя

PgBouncer

Генерируем MD5 для конфига. Связка состоит из password + username (в одно слово):

echo -n "md5"; echo -n "passworduser" | md5sum | awk '{print $1}'

Размер

Размер временных таблиц:

SELECT nspname || '.' || relname AS "relation",
    pg_size_pretty(pg_relation_size(C.oid)) AS "size"
FROM pg_class C
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
WHERE nspname NOT IN ('pg_catalog', 'information_schema') 
AND nspname LIKE '%pg_temp%'
ORDER BY pg_relation_size(C.oid) DESC
LIMIT 10;

ПУБЛИКАЦИИ:

On master:
select * from pg_stat_replication;

On replica:
select * from pg_stat_wal_receiver;
select * from pg_catalog.pg_publication;
 select * from pg_publication_tables;
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x