### Полезные ссылки [Cheat sheet](https://gist.github.com/Kartones/dd3ff5ec5ea238d4c546) ### Команды - `sudo -u postgres psql postgres` - подключиться к базе данных `postgres` от имени пользователя Linux `postgres` !!! tip "" `sudo -u postgres psql` Если не указано имя базы данных при подключении, `psql` попытается подключиться к базе данных с именем, совпадающим с именем пользователя. В данном случае это будет база данных postgres - `sudo -u postgres psql -d имя_базы_данных -f путь_к_скрипту.sql` - выполнить SQL-скрипт на базе - `sudo -u postgres psql -d имя_базы_данных -c "SQL-запрос"` - выполнить SQL-скрипт на базе !!! tip "Команды `psql` начинаются с `\`" - `\l` - просмотр списка БД - `\du` - посмотреть какие роли назначены пользователю - `\q` - выход из psql - `\e` - открывает текстовый редактор для написания SQL-запроса - `\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 ``` Пользователя (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 { .code-wrap } 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_table_size(relid)) AS data_size, pg_size_pretty(pg_indexes_size(relid)) AS index_size FROM pg_catalog.pg_statio_user_tables ORDER BY pg_total_relation_size(relid) DESC, pg_table_size(relid) DESC; ``` ```sql -- размер индексов в БД SELECT pg_size_pretty(SUM(pg_relation_size(indexrelid))) AS total_index_size FROM pg_index JOIN pg_class ON pg_index.indexrelid = pg_class.oid WHERE pg_class.relkind = 'i'; ``` ```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 pgstats where tablename = '' and attname = '' ``` ```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).