28.2. ÐодпиÑка #
ÐодпиÑка â ÑÑо пÑинимаÑÑÐ°Ñ ÑÑоÑона логиÑеÑкой ÑепликаÑии. Узел, на коÑоÑом опÑеделÑеÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñка, назÑваеÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиком. Ð ÑвойÑÑÐ²Ð°Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки опÑеделÑеÑÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑÑение к дÑÑгой базе даннÑÑ Ð¸ Ð½Ð°Ð±Ð¾Ñ Ð¿ÑбликаÑий (из одной или неÑколÑÐºÐ¸Ñ ), на коÑоÑÑе подпиÑÑик Ñ Ð¾ÑÐµÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑаÑÑÑÑ.
Ðаза даннÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑика ÑабоÑÐ°ÐµÑ Ñак же, как и ÑкземплÑÑ Ð»Ñбой дÑÑгой Ð±Ð°Ð·Ñ Postgres Pro, и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿ÑбликÑÑÑей Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ Ð±Ð°Ð·, еÑли в ней опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑобÑÑвеннÑе подпиÑки.
Узел подпиÑÑика Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑваÑÑÑÑ Ð½Ð° неÑколÑко подпиÑок, еÑли ÑÑебÑеÑÑÑ. Родной паÑе пÑбликÑÑÑий ÑеÑвеÑ/подпиÑÑик могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð½ÐµÑколÑко подпиÑок, но пÑи ÑÑом нÑжно позабоÑиÑÑÑÑ Ð¾ Ñом, ÑÑÐ¾Ð±Ñ Ð¿ÑбликÑемÑе обÑекÑÑ Ð² ÑазнÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÐ°Ñ Ð½Ðµ пеÑекÑÑвалиÑÑ.
ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² каждой подпиÑке бÑдÑÑ Ð¿ÑÐ¸Ñ Ð¾Ð´Ð¸ÑÑ ÑеÑез один ÑÐ»Ð¾Ñ ÑепликаÑии (Ñм. ÐодÑаздел 25.2.6). ÐополниÑелÑнÑе ÑлоÑÑ ÑепликаÑии могÑÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ Ð´Ð»Ñ Ð½Ð°ÑалÑной ÑÐ¸Ð½Ñ ÑонизаÑии даннÑÑ , Ñже ÑÑÑеÑÑвÑÑÑÐ¸Ñ Ð² ÑаблиÑÐ°Ñ , но бÑдÑÑ ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð² конÑе ÑÐ¸Ð½Ñ ÑонизаÑии.
ÐодпиÑка логиÑеÑкой ÑепликаÑии Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедÑÑавлÑÑÑ Ñобой ведомÑй Ñзел Ð´Ð»Ñ ÑинÑ
Ñонной ÑепликаÑии (Ñм. ÐодÑаздел 25.2.8). Ð ÑÑом ÑлÑÑае именем ведомого Ñзла по ÑмолÑÐ°Ð½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки. ÐÑÑгое Ð¸Ð¼Ñ Ð¼Ð¾Ð¶Ð½Ð¾ задаÑÑ Ð² ÑвойÑÑве application_name в ÑÑÑоке подклÑÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ подпиÑки.
ÐодпиÑки могÑÑ Ð±ÑÑÑ Ð²ÑгÑÑÐ¶ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ pg_dump, еÑли ÐµÑ Ð²ÑполнÑÐµÑ ÑÑпеÑполÑзоваÑелÑ. РпÑоÑивном ÑлÑÑае вÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение и подпиÑки пÑопÑÑкаÑÑÑÑ, Ñак как обÑÑнÑм полÑзоваÑелÑм не ÑазÑеÑено ÑиÑаÑÑ Ð²ÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ подпиÑкаÑ
из каÑалога pg_subscription.
ÐодпиÑки добавлÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ CREATE SUBSCRIPTION и могÑÑ Ð±ÑÑÑ Ð¾ÑÑановленÑ/Ð²Ð¾Ð·Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð² лÑбой Ð¼Ð¾Ð¼ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ ALTER SUBSCRIPTION, а Ñакже ÑÐ´Ð°Ð»ÐµÐ½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ DROP SUBSCRIPTION.
Ðогда подпиÑка ÑдалÑеÑÑÑ Ð¸ пеÑеÑоздаÑÑÑÑ, инÑоÑмаÑÐ¸Ñ Ð¾ ÑÐ¸Ð½Ñ ÑонизаÑии ÑеÑÑеÑÑÑ. ÐÑо ознаÑаеÑ, ÑÑо поÑле ÑÑого даннÑе Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑ Ð·Ð°Ð½Ð¾Ð²Ð¾.
ÐпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑ ÐµÐ¼Ñ Ð½Ðµ ÑеплиÑиÑÑÑÑÑÑ, а пÑбликÑемÑе ÑаблиÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑеÑÑвоваÑÑ Ð² базе подпиÑÑика. ÐбÑекÑами ÑепликаÑии могÑÑ Ð±ÑÑÑ ÑолÑко обÑÑнÑе ÑаблиÑÑ. Так, напÑимеÑ, нелÑÐ·Ñ Ð¿ÑоизвеÑÑи ÑепликаÑÐ¸Ñ Ð² пÑедÑÑавление.
ТаблиÑÑ Ð¿ÑбликаÑии ÑопоÑÑавлÑÑÑÑÑ Ñ ÑаблиÑами подпиÑÑика по полноÑÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñм именам ÑаблиÑ. РепликаÑÐ¸Ñ Ð² ÑаблиÑÑ Ñ Ð´ÑÑгими именами на ÑÑоÑоне подпиÑÑика не поддеÑживаеÑÑÑ.
СÑолбÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ñакже ÑопоÑÑавлÑÑÑÑÑ Ð¿Ð¾ именам. ÐоÑÑдок ÑÑолбÑов в ÑаблиÑе подпиÑÑика Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð¿Ð¾ÑÑдка ÑÑолбÑов в пÑбликаÑии. Также могÑÑ Ð½Ðµ ÑовпадаÑÑ ÑÐ¸Ð¿Ñ ÑÑолбÑов; доÑÑаÑоÑно ÑолÑко возможноÑÑи пÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑекÑÑового пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
в Ñелевой Ñип. ÐапÑимеÑ, даннÑе ÑÑолбÑа Ñипа integer могÑÑ ÑеплиÑиÑоваÑÑÑÑ Ð² ÑÑÐ¾Ð»Ð±ÐµÑ Ñипа bigint. Ð¦ÐµÐ»ÐµÐ²Ð°Ñ ÑаблиÑа Ð¼Ð¾Ð¶ÐµÑ Ñакже ÑодеÑжаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе ÑÑолбÑÑ, оÑÑÑÑÑÑвÑÑÑие в пÑбликÑемой ÑаблиÑе. Такие ÑÑолбÑÑ Ð±ÑдÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð·Ð½Ð°ÑениÑми по ÑмолÑаниÑ, заданнÑми в опÑеделении Ñелевой ÑаблиÑÑ. Ðднако логиÑеÑÐºÐ°Ñ ÑепликаÑÐ¸Ñ Ð² двоиÑном ÑоÑмаÑе Ð¸Ð¼ÐµÐµÑ Ð±Ð¾Ð»ÐµÐµ ÑÑÑогие огÑаниÑениÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº опиÑÐ°Ð½Ð¸Ñ Ð¿Ð°ÑамеÑÑа binary ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ CREATE SUBSCRIPTION.
28.2.1. УпÑавление ÑлоÑами ÑепликаÑии #
Ðак ÑпоминалоÑÑ Ñанее, ÐºÐ°Ð¶Ð´Ð°Ñ (акÑивнаÑ) подпиÑка полÑÑÐ°ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð· ÑлоÑа ÑепликаÑии на ÑдалÑнной (пÑбликÑÑÑей) ÑÑоÑоне.
ÐополниÑелÑнÑе ÑлоÑÑ ÑинÑ
ÑонизаÑии ÑÐ°Ð±Ð»Ð¸Ñ Ð¾Ð±ÑÑно ÑÑÑеÑÑвÑÑÑ Ð²Ñеменно, ÑоздаÑÑÑÑ ÑолÑко Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð°ÑалÑной ÑинÑ
ÑонизаÑии ÑÐ°Ð±Ð»Ð¸Ñ Ð¸ авÑомаÑиÑеÑки ÑдалÑÑÑÑÑ, когда ÑÑановÑÑÑÑ Ð½Ðµ нÑжнÑ. ÐÑи ÑлоÑÑ ÑинÑ
ÑонизаÑии ÑÐ°Ð±Ð»Ð¸Ñ Ð½Ð°Ð·ÑваÑÑÑÑ Ñак: «pg_%u_sync_%u_%llu» (паÑамеÑÑÑ: oid подпиÑки, relid ÑаблиÑÑ, ÑиÑÑемнÑй иденÑиÑикаÑÐ¾Ñ sysid).
ÐбÑÑно ÑаÑположеннÑй ÑдалÑнно ÑÐ»Ð¾Ñ ÑепликаÑии авÑомаÑиÑеÑки ÑоздаÑÑÑÑ Ð¿Ñи Ñоздании подпиÑки командой CREATE SUBSCRIPTION подпиÑка и авÑомаÑиÑеÑки ÑдалÑеÑÑÑ Ð¿Ñи Ñдалении подпиÑки командой DROP SUBSCRIPTION. Ðднако в некоÑоÑÑÑ
ÑиÑÑаÑиÑÑ
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾ или даже необÑ
одимо манипÑлиÑоваÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñкой и нижележаÑим ÑлоÑом по оÑделÑноÑÑи. ÐапÑимеÑ, Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ñакие ÑÑенаÑии:
ÐÑи Ñоздании подпиÑки ÑÐ»Ð¾Ñ ÑепликаÑии Ð¼Ð¾Ð¶ÐµÑ Ñже ÑÑÑеÑÑвоваÑÑ. Ð ÑÑом ÑлÑÑае подпиÑÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаÑÑ Ñ Ð¿Ð°ÑамеÑÑом
create_slot = false, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð° бÑла ÑвÑзана Ñ ÑÑÑеÑÑвÑÑÑим ÑлоÑом.ÐÑи Ñоздании подпиÑки ÑаÑположеннÑй ÑдалÑнно Ñзел Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпен или Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑÑ Ð² неÑабоÑем ÑоÑÑоÑнии. Ð ÑÑом ÑлÑÑае подпиÑÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑоздаÑÑ Ñ Ñказанием
connect = false. ÐÑи ÑÑом подклÑÑение к ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð½Ð¾Ð¼Ñ ÑдалÑнно ÑÐ·Ð»Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑÑÑанавливаÑÑÑÑ. ÐÑÐ¾Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ Ð¸ÑполÑзÑÐµÑ pg_dump. ЧÑÐ¾Ð±Ñ Ð°ÐºÑивиÑоваÑÑ ÑакÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÑ Ð²Ð¿Ð¾ÑледÑÑвии, ÑаÑположеннÑй ÑдалÑнно ÑÐ»Ð¾Ñ ÑепликаÑии нÑжно бÑÐ´ÐµÑ ÑоздаÑÑ Ð²ÑÑÑнÑÑ.ÐÑи ликвидаÑии пÑбликаÑии Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑÑебоваÑÑÑÑ ÑÐ¾Ñ ÑаниÑÑ ÑÐ»Ð¾Ñ ÑепликаÑии. ÐапÑимеÑ, ÑÑо полезно, когда нÑжно пеÑенеÑÑи Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑика на дÑÑгой Ñзел и акÑивиÑоваÑÑ ÐµÑ Ñам. Ð ÑÑом ÑлÑÑае ÑазоÑвиÑе ÑвÑÐ·Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки Ñо ÑлоÑом, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
ALTER SUBSCRIPTION, пÑежде Ñем ÑдалÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ.ÐÑи ликвидаÑии подпиÑки ÑаÑположеннÑй ÑдалÑнно Ñзел Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпен. Ð ÑÑом ÑлÑÑае ÑазоÑвиÑе ÑвÑÐ·Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки Ñо ÑлоÑом, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
ALTER SUBSCRIPTION, пÑежде Ñем пÑÑаÑÑÑÑ ÑдалÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ. ÐÑли ÑаÑположеннÑй ÑдалÑнно ÑкземплÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿ÑекÑаÑил ÑÑÑеÑÑвование, болÑÑе никакие дейÑÑÐ²Ð¸Ñ Ð½Ðµ ÑÑебÑÑÑÑÑ. ÐÑли же Ñакой ÑкземплÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿ÑоÑÑо оказалÑÑ Ð½ÐµÐ´Ð¾ÑÑÑпнÑм, ÑÐ»Ð¾Ñ ÑепликаÑии (и вÑе оÑÑавÑиеÑÑ ÑлоÑÑ ÑÐ¸Ð½Ñ ÑонизаÑии ÑаблиÑ) нÑжно бÑÐ´ÐµÑ ÑдалиÑÑ Ð²ÑÑÑнÑÑ; в пÑоÑивном ÑлÑÑае пÑбликÑÑÑий ÑеÑвеÑ(Ñ) пÑÐ¾Ð´Ð¾Ð»Ð¶Ð¸Ñ ÑÐ¾Ñ ÑанÑÑÑ WAL и Ð¼Ð¾Ð¶ÐµÑ Ð² конÑе конÑов заполниÑÑ Ð²ÑÑ Ð¼ÐµÑÑо на диÑке. Такие ÑлÑÑаи заÑлÑживаÑÑ Ñамого ÑеÑÑÑзного ÑазбиÑаÑелÑÑÑва.
28.2.2. ÐÑимеÑÑ: наÑÑÑойка логиÑеÑкой ÑепликаÑии #
СоздайÑе неÑколÑко ÑеÑÑовÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð½Ð° пÑбликÑÑÑем ÑеÑвеÑе.
/* pub # */ CREATE TABLE t1(a int, b text, PRIMARY KEY(a)); /* pub # */ CREATE TABLE t2(c int, d text, PRIMARY KEY(c)); /* pub # */ CREATE TABLE t3(e int, f text, PRIMARY KEY(e));
СоздайÑе Ñакие же ÑаблиÑÑ Ð½Ð° ÑÑоÑоне подпиÑÑика.
/* sub # */ CREATE TABLE t1(a int, b text, PRIMARY KEY(a)); /* sub # */ CREATE TABLE t2(c int, d text, PRIMARY KEY(c)); /* sub # */ CREATE TABLE t3(e int, f text, PRIMARY KEY(e));
ÐÑÑавÑÑе даннÑе в ÑаблиÑÑ Ð½Ð° ÑÑоÑоне пÑбликÑÑÑего ÑеÑвеÑа.
/* pub # */ INSERT INTO t1 VALUES (1, 'one'), (2, 'two'), (3, 'three'); /* pub # */ INSERT INTO t2 VALUES (1, 'A'), (2, 'B'), (3, 'C'); /* pub # */ INSERT INTO t3 VALUES (1, 'i'), (2, 'ii'), (3, 'iii');
СоздайÑе пÑбликаÑии Ð´Ð»Ñ ÑаблиÑ. ÐÐ»Ñ Ð¿ÑбликаÑий pub2 и pub3a паÑамеÑÑом publish оÑклÑÑаÑÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе опеÑаÑии, а пÑбликаÑÐ¸Ñ pub3b ÑоздаÑÑÑÑ Ñ ÑилÑÑÑом ÑÑÑок (Ñм. Раздел 28.4).
/* pub # */ CREATE PUBLICATION pub1 FOR TABLE t1; /* pub # */ CREATE PUBLICATION pub2 FOR TABLE t2 WITH (publish = 'truncate'); /* pub # */ CREATE PUBLICATION pub3a FOR TABLE t3 WITH (publish = 'truncate'); /* pub # */ CREATE PUBLICATION pub3b FOR TABLE t3 WHERE (e > 5);
СоздайÑе подпиÑки на пÑбликаÑии. ÐодпиÑка sub3 оÑоÑмлÑеÑÑÑ ÑÑÐ°Ð·Ñ Ð½Ð° две пÑбликаÑии, pub3a и pub3b. ÐÐ»Ñ Ð²ÑеÑ
подпиÑок бÑдÑÑ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ ÑкопиÑÐ¾Ð²Ð°Ð½Ñ Ð½Ð°ÑалÑнÑе даннÑе.
/* sub # */ CREATE SUBSCRIPTION sub1 /* sub - */ CONNECTION 'host=localhost dbname=test_pub application_name=sub1' /* sub - */ PUBLICATION pub1; /* sub # */ CREATE SUBSCRIPTION sub2 /* sub - */ CONNECTION 'host=localhost dbname=test_pub application_name=sub2' /* sub - */ PUBLICATION pub2; /* sub # */ CREATE SUBSCRIPTION sub3 /* sub - */ CONNECTION 'host=localhost dbname=test_pub application_name=sub3' /* sub - */ PUBLICATION pub3a, pub3b;
ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑбедиÑÑÑÑ Ð² Ñом, ÑÑо наÑалÑнÑе даннÑе ÑаблиÑÑ ÐºÐ¾Ð¿Ð¸ÑÑÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ñого, какие опеÑаÑии иÑклÑÑÐµÐ½Ñ Ð¿Ð°ÑамеÑÑом publish.
/* sub # */ SELECT * FROM t1; a | b ---+------- 1 | one 2 | two 3 | three (3 rows) /* sub # */ SELECT * FROM t2; c | d ---+--- 1 | A 2 | B 3 | C (3 rows)
ÐÑоме Ñого, поÑколÑÐºÑ Ð¿Ñи копиÑовании иÑÑ
однÑÑ
даннÑÑ
игноÑиÑÑеÑÑÑ Ð¸ÑклÑÑение опеÑаÑий, опÑеделÑемое в publish, и Ñ Ð¿ÑбликаÑии pub3a Ð½ÐµÑ ÑилÑÑÑа ÑÑÑок, ÑкопиÑÐ¾Ð²Ð°Ð½Ð½Ð°Ñ ÑаблиÑа t3 ÑодеÑÐ¶Ð¸Ñ Ð²Ñе ÑÑÑоки, пÑи Ñом ÑÑо они не ÑооÑвеÑÑÑвÑÑÑ ÑилÑÑÑÑ ÑÑÑок пÑбликаÑии pub3b.
/* sub # */ SELECT * FROM t3; e | f ---+----- 1 | i 2 | ii 3 | iii (3 rows)
ÐÑÑавÑÑе дополниÑелÑнÑе даннÑе в ÑаблиÑÑ Ð½Ð° ÑÑоÑоне пÑбликаÑии.
/* pub # */ INSERT INTO t1 VALUES (4, 'four'), (5, 'five'), (6, 'six'); /* pub # */ INSERT INTO t2 VALUES (4, 'D'), (5, 'E'), (6, 'F'); /* pub # */ INSERT INTO t3 VALUES (4, 'iv'), (5, 'v'), (6, 'vi');
ТепеÑÑ Ð½Ð° ÑÑоÑоне пÑбликаÑии даннÑе вÑглÑдÑÑ Ñак:
/* pub # */ SELECT * FROM t1; a | b ---+------- 1 | one 2 | two 3 | three 4 | four 5 | five 6 | six (6 rows) /* pub # */ SELECT * FROM t2; c | d ---+--- 1 | A 2 | B 3 | C 4 | D 5 | E 6 | F (6 rows) /* pub # */ SELECT * FROM t3; e | f ---+----- 1 | i 2 | ii 3 | iii 4 | iv 5 | v 6 | vi (6 rows)
ÐÑ Ð¼Ð¾Ð¶ÐµÑе замеÑиÑÑ, ÑÑо в пÑоÑеÑÑе обÑÑной ÑепликаÑии ÑÑиÑÑваеÑÑÑ ÑпиÑок опеÑаÑий, опÑеделÑннÑй в publish. ÐÑледÑÑвие ÑÑого ÑеÑез пÑбликаÑии pub2 и pub3a не ÑеплиÑиÑÑÑÑÑÑ Ð¾Ð¿ÐµÑаÑии INSERT. ÐÑоме Ñого, Ð´Ð»Ñ Ð¿ÑбликаÑии pub3b ÑеплиÑиÑÑÑÑÑÑ ÑолÑко даннÑе, ÑооÑвеÑÑÑвÑÑÑие ÑилÑÑÑÑ ÑÑÑок pub3b. ТепеÑÑ Ð´Ð°Ð½Ð½Ñе на ÑÑоÑоне подпиÑÑика вÑглÑдÑÑ Ñак:
/* sub # */ SELECT * FROM t1; a | b ---+------- 1 | one 2 | two 3 | three 4 | four 5 | five 6 | six (6 rows) /* sub # */ SELECT * FROM t2; c | d ---+--- 1 | A 2 | B 3 | C (3 rows) /* sub # */ SELECT * FROM t3; e | f ---+----- 1 | i 2 | ii 3 | iii 6 | vi (4 rows)
28.2.3. ÐÑимеÑÑ: оÑложенное Ñоздание ÑлоÑа ÑепликаÑии #
РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
(напÑимеÑ, ÐодÑаздел 28.2.1), еÑли ÑÐ»Ð¾Ñ ÑепликаÑии не бÑл Ñоздан ÑдалÑнно авÑомаÑиÑеÑки, полÑзоваÑÐµÐ»Ñ Ð½ÐµÐ¾Ð±Ñ
одимо ÑоздаÑÑ ÐµÐ³Ð¾ вÑÑÑнÑÑ, пÑежде Ñем подпиÑÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾ бÑÐ´ÐµÑ Ð°ÐºÑивиÑоваÑÑ. Шаги по ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑлоÑа и акÑиваÑии подпиÑки Ð¿Ð¾ÐºÐ°Ð·Ð°Ð½Ñ Ð² ÑледÑÑÑиÑ
пÑимеÑаÑ
. Ð ÑÑиÑ
пÑимеÑаÑ
Ñказан ÑÑандаÑÑнÑй модÑÐ»Ñ Ð²Ñвода логиÑеÑкого декодиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (pgoutput), коÑоÑÑй иÑполÑзÑеÑÑÑ Ð²ÑÑÑоенной логиÑеÑкой ÑепликаÑией.
СнаÑала ÑоздайÑе пÑбликаÑиÑ, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ Ð¿ÑимеÑов.
/* pub # */ CREATE PUBLICATION pub1 FOR ALL TABLES;
ÐÑÐ¸Ð¼ÐµÑ 1: РподпиÑке Ñказано connect = false.
СоздайÑе подпиÑкÑ.
/* sub # */ CREATE SUBSCRIPTION sub1 /* sub - */ CONNECTION 'host=localhost dbname=test_pub' /* sub - */ PUBLICATION pub1 /* sub - */ WITH (connect=false); ÐÐ ÐÐУÐÐ ÐÐÐÐÐÐÐ: подпиÑка Ñоздана, но не подклÑÑена ÐÐÐСÐÐÐÐÐ: ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ ÑепликаÑиÑ, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑÑÑнÑÑ ÑоздаÑÑ ÑÐ»Ð¾Ñ ÑепликаÑии, вклÑÑиÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ, а заÑем обновиÑÑ ÐµÑ.
Ðа пÑбликÑÑÑем ÑеÑвеÑе вÑÑÑнÑÑ ÑоздайÑе ÑлоÑ. ÐоÑколÑÐºÑ Ð¸Ð¼Ñ Ð½Ðµ бÑло Ñказано пÑи вÑполнении
CREATE SUBSCRIPTION, Ð¸Ð¼Ñ Ñоздаваемого ÑлоÑа ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ подпиÑки, напÑÐ¸Ð¼ÐµÑ Â«sub1»./* pub # */ SELECT * FROM pg_create_logical_replication_slot('sub1', 'pgoutput'); slot_name | lsn -----------+----------- sub1 | 0/19404D0 (1 row)Ðа подпиÑÑике вÑполниÑе акÑиваÑÐ¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки. ÐоÑле ÑÑого ÑаблиÑÑ
pub1наÑнÑÑ ÑеплиÑиÑоваÑÑÑÑ./* sub # */ ALTER SUBSCRIPTION sub1 ENABLE; /* sub # */ ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
ÐÑÐ¸Ð¼ÐµÑ 2: РподпиÑке Ñказано connect = false, но Ñакже Ñказан паÑамеÑÑ slot_name.
СоздайÑе подпиÑкÑ.
/* sub # */ CREATE SUBSCRIPTION sub1 /* sub - */ CONNECTION 'host=localhost dbname=test_pub' /* sub - */ PUBLICATION pub1 /* sub - */ WITH (connect=false, slot_name='myslot'); ÐÐ ÐÐУÐÐ ÐÐÐÐÐÐÐ: подпиÑка Ñоздана, но не подклÑÑена ÐÐÐСÐÐÐÐÐ: ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ ÑепликаÑиÑ, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð²ÑÑÑнÑÑ ÑоздаÑÑ ÑÐ»Ð¾Ñ ÑепликаÑии, вклÑÑиÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ, а заÑем обновиÑÑ ÐµÑ.
Ðа пÑбликÑÑÑем ÑеÑвеÑе вÑÑÑнÑÑ ÑоздайÑе ÑÐ»Ð¾Ñ Ñ Ñем же именем, коÑоÑое иÑполÑзовалоÑÑ Ð¿Ñи вÑполнении
CREATE SUBSCRIPTION, напÑÐ¸Ð¼ÐµÑ Â«myslot»./* pub # */ SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput'); slot_name | lsn -----------+----------- myslot | 0/19059A0 (1 row)Ðа подпиÑÑике оÑÑалÑнÑе Ñаги акÑиваÑии подпиÑки Ñакие же, как Ñказано вÑÑе.
/* sub # */ ALTER SUBSCRIPTION sub1 ENABLE; /* sub # */ ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;
ÐÑÐ¸Ð¼ÐµÑ 3: РподпиÑке Ñказано slot_name = NONE
СоздайÑе подпиÑкÑ. ÐÑли
slot_name = NONE, Ñакже Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ ÑказаÑÑenabled = falseиcreate_slot = false./* sub # */ CREATE SUBSCRIPTION sub1 /* sub - */ CONNECTION 'host=localhost dbname=test_pub' /* sub - */ PUBLICATION pub1 /* sub - */ WITH (slot_name=NONE, enabled=false, create_slot=false);
Ðа пÑбликÑÑÑем ÑеÑвеÑе вÑÑÑнÑÑ ÑоздайÑе ÑÐ»Ð¾Ñ Ñ Ð»ÑбÑм именем, напÑÐ¸Ð¼ÐµÑ Â«myslot».
/* pub # */ SELECT * FROM pg_create_logical_replication_slot('myslot', 'pgoutput'); slot_name | lsn -----------+----------- myslot | 0/1905930 (1 row)Ðа подпиÑÑике ÑвÑжиÑе подпиÑÐºÑ Ñ ÑолÑко ÑÑо ÑозданнÑм именем ÑлоÑа.
/* sub # */ ALTER SUBSCRIPTION sub1 SET (slot_name='myslot');
ÐÑÑалÑнÑе Ñаги акÑиваÑии подпиÑки Ñакие же, как Ñказано вÑÑе.
/* sub # */ ALTER SUBSCRIPTION sub1 ENABLE; /* sub # */ ALTER SUBSCRIPTION sub1 REFRESH PUBLICATION;