Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
Сначала установите параметры конфигурации в postgresql.conf:
wal_level = logical
Другие необходимые параметры по умолчанию имеют значения, подходящие для базовой настройки.
В файл pg_hba.conf необходимо внести изменения, чтобы разрешить репликацию (конкретные значения будут зависеть от фактической конфигурации сети и имени пользователя, с которым вы будете подключаться):
host all all all md5
Затем в базе данных публикации выполните:
CREATE PUBLICATION mypub FOR TABLE "category_trees", "brands", "card_products", "category_vendor", "characteristics", "comments", "countries", "filters", "filter_types", "grades", "images", "positions", "prices", "purposes", "sales", "search_requests", "shippings", "stocks_jsons", "suppliers";
И в базе данных подписчика:
CREATE SUBSCRIPTION mysub CONNECTION 'dbname=parser_wb host=10.5.0.5 user=parser_wb port=5432 password=parser_wb' PUBLICATION mypub;
Показанная выше команда запустит процесс репликации, который вначале синхронизирует исходное содержимого таблиц users и departments, а затем начнёт перенос инкрементальных изменений в этих таблицах.
SELECT pr.* ,pc.relname, pp.pubname FROM pg_publication_rel pr INNER JOIN pg_class pc ON pc.oid = pr.prrelid INNER JOIN pg_publication pp ON pp.oid = pr.prpubid
SELECT psr.*, pc.relname, ps.subname, ps.subenabled,ps.subconninfo FROM pg_subscription_rel psr INNER JOIN pg_class pc ON pc.oid = psr.srrelid INNER JOIN pg_subscription ps ON ps.oid = psr.srsubid
ALTER PUBLICATION mypub SET (publish = 'update, delete');
ALTER PUBLICATION mypub ADD TABLE users, departments;
На мастере заполняем таблицу и создаем публикацию:
INSERT INTO test VALUES ('k1', 'v1'), ('k2', 'v2'); CREATE PUBLICATION mypub FOR ALL TABLES;
Здесь в публикацию были добавлены все сущесвтующие таблицы, но также можно указать и список конкретных таблиц:
CREATE PUBLICATION mypub FOR TABLE table1, table2;
Кроме того, можно указать, какие именно изменения следует публиковать:
CREATE PUBLICATION mypub FOR ALL TABLES WITH (publish = 'insert,update');
Изменение списка таблиц в публикации происходит так:
ALTER PUBLICATION mypub ADD TABLE t1, t2;
ALTER PUBLICATION mypub SET TABLE t3, t4;
ALTER PUBLICATION mypub DROP TABLE t5, t6;
На реплике создаем подписку и проверяем содержимое таблицы:
– можно указывать и несколько публикаций через запятую
CREATE SUBSCRIPTION allsub CONNECTION 'host=10.128.0.16 user=eax dbname=eax' PUBLICATION mypub; SELECT * FROM test;
Если все было сделано правильно, на реплике вы увидите все те же данные, что и на мастере. Кроме того, любые изменения таблицы на мастере будут приводить к соответствующим изменениям на реплике. При желании можно проверить работу логической репликации под нагрузкой, например, так:
INSERT INTO test SELECT 'kk' %%|%%| i, 'vv' %%|%%| i FROM generate_series(1, 10000) AS i;
При создании новых таблиц реплика не будет автоматически их тянуть, даже если публикация была создана как FOR ALL TABLES. Как уже было отмечено, DDL не реплицируется. Для решения проблемы нужно создать на реплике таблицы с такой же схемой, что и на мастере (с поправкой на порядок полей и прочее, см выше), а затем сказать:
ALTER SUBSCRIPTION mysub REFRESH PUBLICATION;
Подписку можно временно включать и выключать:
ALTER SUBSCRIPTION mysub ENABLE; ALTER SUBSCRIPTION mysub DISABLE;
… а также менять мастера:
ALTER SUBSCRIPTION mysub CONNECTION 'host=...';
Наконец, рассмотрим удаление публикации и подписки:
– на реплике
DROP SUBSCRIPTION mysub;
– на мастере
DROP PUBLICATION mypub;
Казалось бы, что это все. Однако на практике репликацию нужно еще и как-то мониторить. Давайте выясним, как это делается.
SELECT * FROM pg_publication;
Каталог pg_publication содержит все публикации, созданные в базе данных. Подробнее о публикациях можно узнать в Разделе 30.1.
Столбцы pg_publication
| Имя | Тип | Ссылки | Описание |
|---|---|---|---|
oid | oid | Идентификатор строки (скрытый атрибут; должен выбираться явно) | |
pubname | name | Имя публикации | |
pubowner | oid | pg_authid.oid | Владелец публикации |
puballtables | bool | Если true, эта публикация автоматически включает все таблицы в базе данных, в том числе и те, что будут созданы в будущем. | |
pubinsert | bool | Если true, операции INSERT реплицируются для таблиц в репликации. |
|
pubupdate | bool | Если true, операции UPDATE реплицируются для таблиц в публикации. |
|
pubdelete | bool | Если true, операции DELETE реплицируются для таблиц в публикации. |
Каталог pg_publication_rel содержит сопоставления отношений и публикаций в базе данных (это сопоставления вида многие-ко-многим). Более понятное пользователю представление этой информации можно также получить в Разделе 49.78.
Столбцы pg_publication_rel
| Имя | Тип | Ссылки | Описание |
|---|---|---|---|
prpubid | oid | pg_publication.oid | Ссылка на публикацию |
prrelid | oid | pg_class.oid | Ссылка на отношение |
Каталог pg_subscription_rel содержит состояние каждого реплицируемого отношения в каждой подписке (это связь вида многие-ко-многим).
Этот каталог содержит только таблицы, известные в подписке после выполнения CREATE SUBSCRIPTION или ALTER SUBSCRIPTION … REFRESH PUBLICATION.
Столбцы pg_subscription_rel
| Имя | Тип | Ссылки | Описание |
|---|---|---|---|
srsubid | oid | pg_subscription.oid | Ссылка на подписку |
srrelid | oid | pg_class.oid | Ссылка на отношение |
srsubstate | char | Код состояния: i = инициализация, d = копирование данных, s = синхронизация выполнена, r = готовность (обычная репликация) |
|
srsublsn | pg_lsn | LSN изменения состояния на удалённой стороне, который используются для координации синхронизации в состояниях s или r; в других случаях — null |
| Имя представления | Описание |
|---|---|
pg_stat_activity | Одна строка для каждого серверного процесса c информацией по текущей активности процесса, такой как состояние и текущий запрос. За подробностями обратитесь к pg_stat_activity. |
pg_stat_replication | По одной строке для каждого процесса-передатчика WAL со статистикой по репликации на ведомом сервере, к которому подключён этот процесс. За подробностями обратитесь к pg_stat_replication. |
pg_stat_wal_receiver | Только одна строка со статистикой приёмника WAL, полученной с сервера, на котором работает приёмник. За подробностями обратитесь к pg_stat_wal_receiver. |
pg_stat_subscription | Как минимум одна строка для подписки, сообщающая о рабочих процессах подписки. За подробностями обратитесь к pg_stat_subscription. |
pg_stat_ssl | Одна строка для каждого подключения (обычного и реплицирующего), в которой показывается информация об использовании SSL для данного подключения. За подробностями обратитесь к pg_stat_ssl. |
pg_stat_progress_vacuum | По одной строке с текущим состоянием для каждого обслуживающего процесса (включая рабочие процессы автоочистки), в котором работает VACUUM. См. Подраздел 27.4.1. |
| Имя | Тип | Ссылки | Описание |
|---|---|---|---|
oid | oid | Идентификатор строки (скрытый атрибут; должен выбираться явно) | |
relname | name | Имя таблицы, индекса, представления и т. п. | |
relnamespace | oid | pg_namespace.oid | OID пространства имён, содержащего это отношение |
reltype | oid | pg_type.oid | OID типа данных, соответствующего типу строки этой таблицы, если таковой есть (ноль для индексов, так как они не имеют записи в pg_type) |
reloftype | oid | pg_type.oid | Для типизированных таблиц, OID нижележащего составного типа, или ноль для всех других отношений |
relowner | oid | pg_authid.oid | Владелец отношения |
relam | oid | pg_am.oid | Если это индекс, применяемый метод доступа (B-дерево, хеш и т. д.) |
relfilenode | oid | Имя файла на диске с этим отношением; ноль означает, что это «отображённое» представление, имя файла для которого определяется состоянием на нижнем уровне | |
reltablespace | oid | pg_tablespace.oid | Табличное пространство, в котором хранится это отношение. Если ноль, подразумевается пространство базы данных по умолчанию. (Не имеет значения, если с отношением не связан файл на диске.) |
relpages | int4 | Размер представления этой таблицы на диске (в страницах размера BLCKSZ). Это лишь примерная оценка, используемая планировщиком. Она обновляется командами VACUUM, ANALYZE и несколькими командами DDL, например, CREATE INDEX. |
|
reltuples | float4 | Число строк в таблице. Это лишь примерная оценка, используемая планировщиком. Она обновляется командами VACUUM, ANALYZE и несколькими командами DDL, например, CREATE INDEX. |
|
relallvisible | int4 | Число страниц, помеченных как «полностью видимые» в карте видимости таблицы. Это лишь примерная оценка, используемая планировщиком. Она обновляется командами VACUUM, ANALYZE и несколькими командами DDL, например, CREATE INDEX. |
|
reltoastrelid | oid | pg_class.oid | OID таблицы TOAST, связанной с данной таблицей, или 0, если таковой нет. В таблицу TOAST, как во вторичную, «выносятся» большие атрибуты. |
relhasindex | bool | True, если это таблица и она имеет (или недавно имела) индексы | |
relisshared | bool | True, если эта таблица разделяется всеми базами данных в кластере. Разделяемыми являются только некоторые системные каталоги (как например, pg_database). |
|
relpersistence | char | p = постоянная таблица (permanent), u = нежурналируемая таблица (unlogged), t = временная таблица (temporary) |
|
relkind | char | r = обычная таблица (Relation), i = индекс (Index), S = последовательность (Sequence), t = таблица TOAST, v = представление (View), m = материализованное представление (Materialized view), c = составной тип (Composite type), f = сторонняя таблица (Foreign table), p = секционированная таблица (Partitioned table) |
|
relnatts | int2 | Число пользовательских столбцов в отношении (системные столбцы не считаются). Столько же соответствующих строк должно быть в pg_attribute. См. также pg_attribute.attnum. |
|
relchecks | int2 | Число ограничений CHECK в таблице; см. каталог pg_constraint |
|
relhasoids | bool | True, если для каждой строки отношения генерируется OID | |
relhaspkey | bool | True, если в таблице имеется (или имелся) первичный ключ | |
relhasrules | bool | True, если для таблицы определены (или были определены) правила; см. каталог pg_rewrite |
|
relhastriggers | bool | True, если для таблицы определены (или были определены) триггеры; см. каталог pg_trigger |
|
relhassubclass | bool | True, если у таблицы есть (или были) потомки в иерархии наследования | |
relrowsecurity | bool | True, если для таблицы включена защита на уровне строк; см. каталог pg_policy |
|
relforcerowsecurity | bool | True, если защита на уровне строк (когда она включена) также применяется к владельцу таблицы; см. каталог pg_policy |
|
relispopulated | bool | True, если отношение наполнено данными (это истинно для всех отношений, кроме некоторых материализованных представлений) | |
relreplident | char | Столбцы, формирующие «идентификатор реплики» для строк: d = по умолчанию (первичный ключ, если есть), n = никакие (nothing), f = все столбцы, i = индекс со свойством indisreplident (если ранее использованный индекс удалён, действует так же, как n) |
|
relispartition | bool | True, если таблица является секцией | |
relfrozenxid | xid | Идентификаторы транзакций, предшествующие данному, в этой таблице заменены постоянным («замороженным») идентификатором транзакции. Это нужно для определения, когда требуется очищать таблицу для предотвращения зацикливания идентификаторов или для сокращения объёма pg_xact. Если это отношение — не таблица, значение равно нулю (InvalidTransactionId). |
|
relminmxid | xid | Идентификаторы мультитранзакций, предшествующие данному, в этой таблице заменены другим идентификатором транзакции. Это нужно для определения, когда требуется очищать таблицу для предотвращения зацикливания идентификаторов мультитранзакций или для сокращения объёма pg_multixact. Если это отношение — не таблица, значение равно нулю (InvalidMultiXactId). |
|
relacl | aclitem[] | Права доступа; за подробностями обратитесь к описанию GRANT и REVOKE | |
reloptions | text[] | Специальные параметры для методов доступа, в виде строк «ключ=значение» | |
relpartbound | pg_node_tree | Если таблица является секцией (см. relispartition), внутреннее представление границ секции |