14 KiB
Разное полезное
Команды
-
sudo -u postgres psql postgres
- подключиться к базе данныхpostgres
от имени пользователя Linuxpostgres
!!! tip ""sudo -u postgres psql
Если не указано имя базы данных при подключении,
psql
попытается подключиться к базе данных с именем, совпадающим с именем пользователя. В данном случае это будет база данных postgres -
sudo -u postgres psql -d имя_базы_данных -f путь_к_скрипту.sql
- выполнить SQL-скрипт на базе -
sudo -u postgres psql -d имя_базы_данных -c "SQL-запрос"
- выполнить SQL-скрипт на базе -
\l
- просмотр списка БД -
\du
- посмотреть какие роли назначены пользователю -
\q
- выход из psql -
\c <database_name> <user_name>
- подключение к БД или из bashpsql -U username -d <database_name>
-
\dt
- просмотр списка таблиц -
\d <table_name>
- показывает столбцы, типы данных и индексы -
\dn
- список схем -
\dt <schema_name>
- список таблиц в схеме -
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` - Устанавливает пароль для роли
CREATE ROLE admin WITH LOGIN PASSWORD 'password' CREATEDB CREATEROLE
PostgreSQL пользователя (USER) можно добавить в роль (ROLE). Когда пользователь добавляется в роль, он автоматически наследует все права, связанные с этой ролью.
-- Создаем роль CREATE ROLE read_only; -- Создаем пользователя CREATE USER myuser WITH PASSWORD 'password'; -- Добавляем пользователя в роль GRANT read_only TO myuser;
-- удалить пользователя из роли REVOKE имя_роли FROM имя_пользователя;
-
GRANT ALL PRIVILEGES ON DATABASE имя_базы TO имя_пользователя;
-
DROP USER имя_пользователя;
-
DROP ROLE имя_роли;
-
ALTER TABLE
— это команда в SQL, которая используется для изменения структуры уже существующей таблицы в базе данных.
ALTER TABLE имя_таблицы ADD имя_столбца тип_данных;
ALTER TABLE имя_таблицы DROP COLUMN имя_столбца;
ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца SET DATA TYPE новый_тип;
ALTER TABLE имя_таблицы ADD CONSTRAINT имя_ограничения тип_ограничения (столбец);
ALTER TABLE employees ADD CONSTRAINT age_check CHECK (age >= 18);
ALTER DATABASE "<old_name>" RENAME TO "<new_name>";
-- какие роли назначены пользователю
SELECT rolname, memberof
FROM pg_roles
WHERE rolname = 'myuser';
-- отключить все подключения к бд
SELECT pg_terminate_backend( pid ) FROM pg_stat_activity WHERE pid <> pg_backend_pid( ) AND datname = '<database_name>';
-- убить процесс по pid
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = <process_id>;
Статистика
SELECT * FROM pg_stat_activity;
- просмотр текущий подключенийSELECT * FROM pg_locks;
- просмотр блокировок
-- просмотр текущих подключений подробно
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;
-- смотрим базы и их размер
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;
-- общий размер конкретной БД
select pg_size_pretty(pg_database_size('название базы'));
-- общий размер индекса в БД
SELECT
pg_size_pretty(SUM(pg_relation_size(indexrelid))) AS total_index_size
FROM
pg_stat_all_indexes;
-- размер таблиц в БД
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;
-- размер индексов в БД
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;
-- общий размер индексов в таблице
SELECT
pg_size_pretty(SUM(pg_relation_size(indexrelid))) AS total_index_size
FROM
pg_stat_all_indexes
WHERE
relname = 'название таблицы';
-- блокировки в БД
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;
-- использование памяти и ресурсов в БД
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 <user_name> -t <table_name> -h <host_ip> -d <database_name> | gzip > <dir>/<table_name>.sql.gz
- снятие дампа с таблицыgunzip /tmp/<dump_name>.sql.gz | psql -h <host_ip> -U <user_name> -d <database_name> -t <table_name> >> <log_name>.log
- восстановление таблицы
# TODO дополнить раздел
Разное
ps -ef | grep -v grep | grep postgres
- определяет есть ли процесс постгрес на машинеwhich psql
- есть ли в локальном окружении psqlsudo 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
Где что лежит??
- Каталог данных
/var/lib/postgresql/<версия>/main/
- Debian/Ubuntu/var/lib/pgsql/<версия>/data/
- CentOS/Fedorapsql -U postgres -c "SHOW data_directory;"
- Конфигурационные файлы (могут находится в каталоге данных)
/etc/postgresql/<версия>/main/
psql -U postgres -c "SHOW config_file;"
- путь к конфигуpsql -U postgres -c "SHOW hba_file;"
- путь к настройкам аутентификации
- Каталог логов
/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).