Справочник команд
Все команды PostgreSQL для практикума по репликации
Управление кластером
pg_lsclusters
pg_lsclustersПоказать список кластеров PostgreSQL
pg_lsclustersVer Cluster Port Status Owner Data directory Log file 16 training 5433 online postgres /var/lib/postgresql/16/training /var/log/postgresql/postgresql-16-training.log
pg_ctlcluster
sudoУправление кластером (старт/стоп/рестарт)
sudo pg_ctlcluster 16 training startpg_createcluster
sudoСоздание нового кластера
sudo pg_createcluster 16 training -- --auth-local=peer --auth-host=md5pg_dropcluster
sudoУдаление кластера
sudo pg_dropcluster 16 training --stopРепликация
pg_basebackup
sudoСоздание базовой копии для реплики
sudo -u postgres pg_basebackup -h MASTER_HOST -p 5433 -D /var/lib/postgresql/16/training -U replicator -Fp -Xs -P -Rpg_rewind
sudoСинхронизация узла после failover
sudo -u postgres pg_rewind --target-pgdata=/var/lib/postgresql/16/training --source-server='host=NEW_MASTER port=5433 user=replicator dbname=postgres' --progresspg_stat_replication
sudoПросмотр состояния репликации на мастере
sudo -u postgres psql -p 5433 -c "SELECT client_addr, state, sent_lsn, write_lsn, flush_lsn, replay_lsn FROM pg_stat_replication;"pg_stat_wal_receiver
sudoПросмотр состояния WAL-приёмника на реплике
sudo -u postgres psql -p 5433 -c "SELECT status, receive_start_lsn, received_lsn, last_msg_send_time FROM pg_stat_wal_receiver;"Проверка подключения к реплике
sudoТест подключения к реплике через psql
sudo -u postgres psql -h REPLICA_HOST -p 5433 -U replicator -c "SELECT pg_is_in_recovery();"pg_is_in_recovery --------------------- t (1 row)
Тест записи на мастере
sudoПроверка записи данных на мастере
sudo -u postgres psql -p 5433 -c "INSERT INTO repl_demo(note) VALUES ('test record'); SELECT * FROM repl_demo;"Проверка чтения на реплике
sudoПроверка чтения данных на реплике
sudo -u postgres psql -h REPLICA_HOST -p 5433 -c "SELECT * FROM repl_demo;"id | note | created_at ----+-------------+------------------------------ 1 | test record | 2024-01-15 10:30:00+00 (1 row)
Проверка записи на реплике
sudoПопытка записи на реплику (должна вернуть ошибку)
sudo -u postgres psql -h REPLICA_HOST -p 5433 -c "INSERT INTO repl_demo(note) VALUES ('should fail');"ERROR: cannot execute INSERT in a read-only transaction
Безопасность
Создание роли репликации
sudoСоздание роли с атрибутом REPLICATION
sudo -u postgres psql -p 5433 -c "CREATE ROLE replicator WITH REPLICATION LOGIN PASSWORD 'your_password';"Создание слота
sudoСоздание физического слота репликации
sudo -u postgres psql -p 5433 -c "SELECT pg_create_physical_replication_slot('training_slot');"Просмотр слотов
sudoПроверка активности слотов репликации
sudo -u postgres psql -p 5433 -c "SELECT slot_name, active, restart_lsn FROM pg_replication_slots;"Настройка pg_hba.conf
echoДобавление правила для репликации
echo 'hostssl replication replicator REPLICA_HOST/32 scram-sha-256' | sudo tee -a /etc/postgresql/16/training/pg_hba.confГенерация самоподписанного сертификата
sudoСоздание TLS-сертификата для шифрования
sudo -u postgres openssl req -new -x509 -days 365 -nodes -text -out server.crt -keyout server.key -subj "/CN=MASTER_HOST"Проверка сертификата
sudoПросмотр информации о сертификате
sudo -u postgres openssl x509 -in server.crt -text -noout | head -20Копирование сертификата на реплику
scpПередача сертификата мастера на реплику
scp /var/lib/postgresql/16/training/server.crt REPLICA_HOST:/tmp/master-server.crtПроверка прав доступа
sudoПросмотр правил pg_hba.conf
sudo -u postgres psql -p 5433 -c "SELECT type, database, user_name, address, method FROM pg_hba_file_rules WHERE type = 'host';"Мониторинг
Проверка WAL
sudoПросмотр сегментов WAL
sudo -u postgres psql -p 5433 -c "SELECT * FROM pg_ls_waldir() ORDER BY modification DESC LIMIT 10;"Проверка размера БД
sudoПросмотр размера базы данных
sudo -u postgres psql -p 5433 -c "SELECT pg_database.datname, pg_size_pretty(pg_database_size(pg_database.datname)) FROM pg_database ORDER BY pg_database_size(pg_database.datname) DESC;"Просмотр конфигурации
sudoПроверка параметров репликации
sudo -u postgres psql -p 5433 -c "SHOW wal_level; SHOW max_wal_senders; SHOW hot_standby;"Логи репликации
tailПросмотр логов кластера
tail -f /var/log/postgresql/postgresql-16-training.logПроверка отставания реплики
sudoРасчет отставания реплики в секундах
sudo -u postgres psql -p 5433 -c "SELECT CASE WHEN pg_last_wal_receive_lsn() = pg_last_wal_replay_lsn() THEN 0 ELSE EXTRACT(EPOCH FROM now() - pg_last_xact_replay_timestamp())::int END AS lag_seconds;" lag_seconds
-------------
0
(1 row)Просмотр активных запросов
sudoМониторинг активных соединений
sudo -u postgres psql -p 5433 -c "SELECT pid, usename, application_name, state, query_start, left(query, 50) AS query FROM pg_stat_activity WHERE state = 'active';"Проверка размера WAL
sudoПросмотр текущего размера WAL
sudo -u postgres psql -p 5433 -c "SELECT pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_lsn(), '0/0')) AS wal_size;"Проверка replication slots
sudoДетальная информация о слотах
sudo -u postgres psql -p 5433 -c "SELECT slot_name, plugin, slot_type, database, active, xmin, catalog_xmin, restart_lsn, confirmed_flush_lsn FROM pg_replication_slots;"Проверка конфигурации
sudoПросмотр всех параметров репликации
sudo -u postgres psql -p 5433 -c "SELECT name, setting, unit, category FROM pg_settings WHERE name IN ('wal_level', 'max_wal_senders', 'wal_keep_size', 'hot_standby', 'wal_log_hints', 'max_replication_slots');"Полезные SQL-запросы
1-- Проверка состояния репликации на мастере2SELECT3 client_addr,4 state,5 sent_lsn,6 write_lsn,7 flush_lsn,8 replay_lsn,9 (sent_lsn - replay_lsn) AS replication_lag10FROM pg_stat_replication;1112-- Просмотр слотов репликации13SELECT14 slot_name,15 active,16 restart_lsn,17 confirmed_flush_lsn18FROM pg_replication_slots;1920-- Создание тестовой таблицы для проверки21CREATE TABLE repl_demo (22 id SERIAL PRIMARY KEY,23 note TEXT,24 created_at TIMESTAMPTZ DEFAULT NOW()25);2627-- Проверка роли репликации28SELECT rolname, rolsuper, rolinherit, rolreplication, rolcanlogin29FROM pg_roles30WHERE rolname = 'replicator';3132-- Проверка pg_hba.conf для репликации33SELECT type, database, user_name, address, method34FROM pg_hba_file_rules35WHERE type = 'host' AND user_name = 'replicator';3637-- Проверка WAL уровня38SHOW wal_level;39-- Должно быть: replica4041-- Проверка максимального числа WAL-отправителей42SHOW max_wal_senders;43-- Рекомендуется: 10 или больше4445-- Проверка hot_standby (для чтения на реплике)46SHOW hot_standby;47-- Должно быть: on