ШПАРГАЛКИ
CI/CD
KUBERNETES
  • DOCKERFILE
  • DOCKER-COMPOSE
  • JENKINSFILE
  • JENKINS-PIPELINE
  • GITLAB CI/CD
  • GROOVIE
  • INSTALL
  • PODS
  • INGRESS

Памятка по командам PostgreSQL (пополняемая)

Так как я не ДБА, то частенько забываю, как выдавать ралзичные права, создавать пользователей и так далее. Так что тут буду собирать команды SQL для облегчения жизни...

Выдать пользователю RO на базу

-- Создаем группу для RO
CREATE ROLE readonly;

-- Даём доступ к существующим таблицам
GRANT USAGE ON SCHEMA public TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;

-- Даём доступ к будущим таблицам
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO readonly;

-- Создаем пользователя с правами RO
CREATE USER пользователь WITH PASSWORD 'пароль';
GRANT readonly TO пользователь;
-- На конкретную базу
GRANT CONNECT ON DATABASE ИМЯ_БД TO пользователь;
GRANT USAGE ON SCHEMA public TO пользователь;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO пользователь;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO пользователь;

Дампим БД с исключением таблиц и восстанавливаем на другом Хосте

Сначала склонируем:

pg_dump \
--clean \
--encoding=utf8 \
--format=directory \
--jobs=5 \
--verbose \
--compress=5 \
--exclude-table=table_num_1_to_exclude \
--exclude-table=table_num_1_to_exclude \
--file=DIR_NAME \
--dbname=DB_NAME \
--host=HOST \
--port=PORT \
--username=USERNAME \
--password

Потом архивируем

tar -cvf ARCHIVE_NAME.tar.gz DIR_NAME/
rm -rf DIR_NAME/

Потом копируем на удаленный хост и разархивируем

tar -xvf ARCHIVE_NAME.tar.gz
rm ARCHIVE_NAME.tar.gz

И восстанавливаем

pg_restore \
--dbname=IMPORT_DAB_NAME \
--format=directory \
--jobs=5 \
--verbose \
--host=HOST \
--port=PORT \
--username=USERNAME \
--password \
DIR_NAME

Смотрим отставание реплик в кластере PostgreSQL + Patroni

--получить лаг в реплика
select 
    r.client_addr,
    r.usename,
    r.application_name,
    r.state,
    r.sync_state,
    --сколько сгенерировано, но не отправлено
    --если > 0, то говорит о сетевой проблеме => запусти nicstat
    (pg_wal_lsn_diff(pg_current_wal_lsn(), r.sent_lsn) / 1024)::int as pending,

    --сколько отправлено, но не записано
    --если много, то проблема с диском -> запусти io top
    (pg_wal_lsn_diff(r.sent_lsn,  r.write_lsn) / 1024)::int as write,

    --записано, но не было выпущено (еще  в ОЗУ) не закоммичено
    --если много => trouble at HDDs => запусти IO STAT || io top
    (pg_wal_lsn_diff(r.write_lsn, r.flush_lsn) / 1024)::int as flush,

    --данные засинканы, но не воспроизведены репликой
    --если >0 => диски или цпу => запусти IO STAT || io top
    (pg_wal_lsn_diff(r.flush_lsn, r.replay_lsn) / 1024)::int as replay,
    --всего
    ((pg_wal_lsn_diff(pg_current_wal_lsn(), r.replay_lsn)) / 1024)::int as total_lag
from pg_catalog.pg_stat_replication as r

Оцените статью

Еще никто не оставил комментарий. Будьте первым!