diff --git a/docs/postgresql/Разное.md b/docs/postgresql/Разное.md new file mode 100644 index 0000000..5222af9 --- /dev/null +++ b/docs/postgresql/Разное.md @@ -0,0 +1,262 @@ +## Разное полезное + +[Cheat sheet](https://gist.github.com/Kartones/dd3ff5ec5ea238d4c546) + +### Команды + +- `sudo -u postgres psql postgres` - подключиться к базе данных `postgres` от имени пользователя Linux `postgres` +!!! tip "" + Если не указано имя базы данных, psql попытается подключиться к базе данных с именем, совпадающим с именем пользователя. В данном случае это будет база данных postgres +- `sudo -u postgres psql -d имя_базы_данных -f путь_к_скрипту.sql` - выполнить SQL-скрипт на базе +- `sudo -u postgres psql -d имя_базы_данных -c "SQL-запрос"` - выполнить SQL-скрипт на базе + + +- `\l` - просмотр списка БД +- `\du` - посмотреть какие роли назначены пользователю +- `\q` - выход из psql +- `\c ` - подключение к БД или из bash `psql -U username -d ` +- `\dt` - просмотр списка таблиц +- `\d ` - показывает столбцы, типы данных и индексы +- `\dn` - список схем +- `\dt ` - список таблиц в схеме +- `psql -U postgres -d my_database -f /etc/script.sql` - выполнить скрипт + +--- + +- `CREATE TABLE имя_таблицы (id SERIAL PRIMARY KEY, колонка1 тип, колонка2 тип, ...);` - создание таблицы +- `CREATE USER имя_пользователя WITH PASSWORD 'пароль';` +- `CREATE ROLE имя_роли;` +??? info "В чём разница USER и ROLE?" + Пользователь (USER) — это роль, которая по умолчанию ИМЕЕТ право на подключение к базе данных + Роль (ROLE) — это более общее понятие. Она может быть как пользователем, так и группой. Роль по умолчанию НЕ ИМЕЕТ права на подключение к базе данных (если не указан атрибут LOGIN) + + Роли (и пользователи) могут иметь дополнительные атрибуты, которые определяют их поведение. Вот основные атрибуты: + - `LOGIN` - Позволяет роли подключаться к базе данных (по умолчанию для USER) + - `SUPERUSER` - Дает роли права суперпользователя + - `CREATEDB` - Позволяет роли создавать базы данных + - `CREATEROLE` - Позволяет роли создавать другие роли + - `INHERIT` - Позволяет роли наследовать права от других ролей (по умолчанию TRUE) + - `REPLICATION`- Позволяет роли использоваться для репликации + - `PASSWORD` - Устанавливает пароль для роли + ```sql + CREATE ROLE admin WITH LOGIN PASSWORD 'password' CREATEDB CREATEROLE + ``` + PostgreSQL пользователя (USER) можно добавить в роль (ROLE). Когда пользователь добавляется в роль, он автоматически наследует все права, связанные с этой ролью. + ```sql + -- Создаем роль + CREATE ROLE read_only; + -- Создаем пользователя + CREATE USER myuser WITH PASSWORD 'password'; + -- Добавляем пользователя в роль + GRANT read_only TO myuser; + ``` + ```sql + # удалить пользователя из роли + REVOKE имя_роли FROM имя_пользователя; + ``` +- `GRANT ALL PRIVILEGES ON DATABASE имя_базы TO имя_пользователя;` +- `DROP USER имя_пользователя;` +- `DROP ROLE имя_роли;` +- `ALTER TABLE` — это команда в SQL, которая используется для изменения структуры уже существующей таблицы в базе данных. +```sql +ALTER TABLE имя_таблицы ADD имя_столбца тип_данных; +``` +```sql +ALTER TABLE имя_таблицы DROP COLUMN имя_столбца; +``` +```sql +ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца SET DATA TYPE новый_тип; +``` +```sql +ALTER TABLE имя_таблицы ADD CONSTRAINT имя_ограничения тип_ограничения (столбец); +``` +```sql +ALTER TABLE employees ADD CONSTRAINT age_check CHECK (age >= 18); +``` +```sql +ALTER DATABASE "" RENAME TO ""; +``` +```sql +-- какие роли назначены пользователю +SELECT rolname, memberof +FROM pg_roles +WHERE rolname = 'myuser'; +``` +--- + +```sql +-- отключить все подключения к бд +SELECT pg_terminate_backend( pid ) FROM pg_stat_activity WHERE pid <> pg_backend_pid( ) AND datname = ''; +``` +```sql +-- убить процесс по pid +SELECT pg_terminate_backend(pid) +FROM pg_stat_activity +WHERE pid = ; +``` + +#### Статистика + +- `SELECT * FROM pg_stat_activity;` - просмотр текущий подключений +- `SELECT * FROM pg_locks;` - просмотр блокировок + +```sql +-- просмотр текущих подключений подробно +SELECT + pid, -- Идентификатор процесса + state, -- Состояние процесса + now() - query_start AS query_runtime, -- Время выполнения текущего запроса + now() - xact_start AS transaction_runtime, -- Время выполнения транзакции + application_name, + query, -- Текущий запрос + usename, -- Пользователь + datname, -- База данных + xact_start -- Время начала транзакции +FROM pg_stat_activity +WHERE state IN ('active', 'idle in transaction') and datname = current_database() +ORDER BY transaction_runtime DESC; +``` +```sql +-- смотрим базы и их размер +SELECT pg_database.datname, + pg_size_pretty(pg_database_size(pg_database.datname)) AS size +FROM pg_database +ORDER BY pg_database_size(pg_database.datname) DESC; +``` +```sql +-- общий размер конкретной БД +select pg_size_pretty(pg_database_size('название базы')); +``` +```sql +-- общий размер индекса в БД +SELECT + pg_size_pretty(SUM(pg_relation_size(indexrelid))) AS total_index_size +FROM + pg_stat_all_indexes; +``` +```sql +-- размер таблиц в БД +select schemaname as table_schema, +relname as table_name, +pg_size_pretty(pg_total_relation_size(relid)) as total_size, +pg_size_pretty(pg_relation_size(relid)) as data_size, +pg_size_pretty(pg_total_relation_size(relid) - pg_relation_size(relid)) +as index_size +from pg_catalog.pg_statio_user_tables +order by pg_total_relation_size(relid) desc, +pg_relation_size(relid) desc; +``` +```sql +-- размер индексов в БД +SELECT + pg_size_pretty(pg_relation_size(indexrelid)) AS index_size, + indexrelname AS index_name, + t.relname AS table_name +FROM + pg_stat_all_indexes +JOIN + pg_class t ON t.oid = pg_stat_all_indexes.relid +ORDER BY + pg_relation_size(indexrelid) DESC; +``` +```sql +-- общий размер индексов в таблице +SELECT + pg_size_pretty(SUM(pg_relation_size(indexrelid))) AS total_index_size +FROM + pg_stat_all_indexes +WHERE + relname = 'название таблицы'; +``` +```sql +-- блокировки в БД +SELECT + blocked_locks.pid AS blocked_pid, + blocked_activity.usename AS blocked_user, + blocking_locks.pid AS blocking_pid, + blocking_activity.usename AS blocking_user, + blocking_activity.state AS blocking_state, + blocked_activity.query AS blocked_statement, + blocking_activity.query AS current_statement_in_blocking_process, + blocked_locks.locktype AS blocked_locktype, + blocking_locks.locktype AS blocking_locktype +FROM pg_catalog.pg_locks blocked_locks +JOIN pg_catalog.pg_stat_activity blocked_activity + ON blocked_activity.pid = blocked_locks.pid +JOIN pg_catalog.pg_locks blocking_locks + ON blocking_locks.locktype = blocked_locks.locktype + AND blocking_locks.DATABASE IS NOT DISTINCT FROM blocked_locks.DATABASE + AND blocking_locks.relation IS NOT DISTINCT FROM blocked_locks.relation + AND blocking_locks.page IS NOT DISTINCT FROM blocked_locks.page + AND blocking_locks.tuple IS NOT DISTINCT FROM blocked_locks.tuple + AND blocking_locks.virtualxid IS NOT DISTINCT FROM blocked_locks.virtualxid + AND blocking_locks.transactionid IS NOT DISTINCT FROM blocked_locks.transactionid + AND blocking_locks.classid IS NOT DISTINCT FROM blocked_locks.classid + AND blocking_locks.objid IS NOT DISTINCT FROM blocked_locks.objid + AND blocking_locks.objsubid IS NOT DISTINCT FROM blocked_locks.objsubid + AND blocking_locks.pid != blocked_locks.pid +JOIN pg_catalog.pg_stat_activity blocking_activity + ON blocking_activity.pid = blocking_locks.pid +WHERE NOT blocked_locks.GRANTED; +``` +```sql +-- использование памяти и ресурсов в БД +SELECT * +FROM pg_stat_database; +``` +??? info "Расшифровка атрибутов `pg_stat_database`" + - `datid` — Идентификатор базы данных (OID). + - `datname` — Имя базы данных. + - `numbackends` — Количество активных соединений (клиентов) с этой базой. + - `xact_commit` — Общее количество успешно завершённых транзакций. + - `xact_rollback` — Общее количество откатов транзакций. + - `blks_read` — Количество блоков, считанных с диска. + - `blks_hit` — Количество блоков, найденных в кеше (попадания в shared_buffers). + - `tup_returned` — Количество строк, возвращённых клиенту. + - `tup_fetched` — Количество строк, извлечённых (например, SELECT). + - `tup_inserted` — Количество вставленных строк (INSERT). + - `tup_updated` — Количество обновлённых строк (UPDATE). + - `tup_deleted` — Количество удалённых строк (DELETE). + - `conflicts` — Количество конфликтов (например, из-за репликации). + - `temp_files` — Количество временных файлов, созданных сервером. + - `temp_bytes` — Количество данных, записанных во временные файлы (в байтах). + - `deadlocks` — Количество взаимоблокировок. + - `blk_read_time` — Общее время чтения блоков с диска (в миллисекундах). + - `blk_write_time` — Общее время записи блоков на диск (в миллисекундах). + +### Бэкапирование + +- `pg_dump -U -t -h -d | gzip > /.sql.gz` - снятие дампа с таблицы +- `gunzip /tmp/.sql.gz | psql -h -U -d -t >> .log` - восстановление таблицы + +\# TODO дополнить раздел + +### Разное + +- `ps -ef | grep -v grep | grep postgres` - определяет есть ли процесс постгрес на машине +- `which psql` - есть ли в локальном окружении psql +- `sudo docker inspect <имя_контейнера> | grep postgres` - есть ли постгрес в контейнере +--- +- `psql -U postgres -c "SHOW server_version;"` - версия пг или `psql -V` или `/usr/bin/psql -V` +- `psql -U postgres -c "SHOW port;"` - порт на котором работает пг +- `psql -U postgres -c "SHOW wal_directory;"` - каталог WAL + + +#### Где что лежит?? + +1. Каталог данных +- `/var/lib/postgresql/<версия>/main/` - Debian/Ubuntu +- `/var/lib/pgsql/<версия>/data/` - CentOS/Fedora +- `psql -U postgres -c "SHOW data_directory;"` +2. Конфигурационные файлы (могут находится в каталоге данных) +- `/etc/postgresql/<версия>/main/` +- `psql -U postgres -c "SHOW config_file;"` - путь к конфигу +- `psql -U postgres -c "SHOW hba_file;"` - путь к настройкам аутентификации +3. Каталог логов +- `/var/log/postgresql/` +- `psql -U postgres -c "SHOW log_directory;"` +--- + +- `SHOW shared_preload_libraries;` - список библиотек, которые были загружены при старте PostgreSQL с помощью параметра `shared_preload_libraries` в `postgresql.conf` +- `pg_config --pkglibdir` - показывает путь к каталогу, где находятся библиотеки пг (shared libraries). +