В данном разделе написаны команды и функции, которые могут помочь в администрирование сервера БД 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;