CREATE SUBSCRIPTION
CREATE SUBSCRIPTION â ÑоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ
СинÑакÑиÑ
CREATE SUBSCRIPTIONимÑ_подпиÑкиCONNECTION 'ÑÑÑока_подклÑÑениÑ' PUBLICATIONимÑ_пÑбликаÑии[, ...] [ WITH (паÑамеÑÑ_подпиÑки[=знаÑение] [, ... ] ) ]
ÐпиÑание
CREATE SUBSCRIPTION ÑоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии. ÐолÑзоваÑелÑ, ÑоздаÑÑий подпиÑкÑ, ÑÑановиÑÑÑ ÐµÑ Ð²Ð»Ð°Ð´ÐµÐ»ÑÑем. ÐÐ¼Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки должно оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼Ñн дÑÑгиÑ
ÑÑÑеÑÑвÑÑÑиÑ
подпиÑок в ÑекÑÑей базе.
ÐодпиÑка пÑедÑÑавлÑÐµÑ Ñобой ÑеплиÑиÑÑÑÑее подклÑÑение к пÑбликÑÑÑÐµÐ¼Ñ ÑеÑвеÑÑ. ÐоÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ð°Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° не ÑолÑко добавлÑÐµÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки в локалÑнÑе каÑалоги, но Ñакже ÑоздаÑÑ ÑÐ»Ð¾Ñ ÑепликаÑии на ÑдалÑнном ÑеÑвеÑе.
Ð Ð¼Ð¾Ð¼ÐµÐ½Ñ ÑикÑаÑии ÑÑанзакÑии, в ÑÐ°Ð¼ÐºÐ°Ñ ÐºÐ¾ÑоÑой вÑполнÑеÑÑÑ ÑÑа команда, бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑен ÑабоÑий пÑоÑеÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии, еÑли подпиÑка ÑоздаÑÑÑÑ Ð½Ðµ в оÑклÑÑÑнном ÑоÑÑоÑнии.
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ, необÑ
одимо имеÑÑ Ð¿Ñава Ñоли pg_create_subscription, а Ñакже пÑаво CREATE Ð´Ð»Ñ ÑекÑÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
ÐополниÑелÑнÑе ÑÐ²ÐµÐ´ÐµÐ½Ð¸Ñ Ð¾ подпиÑÐºÐ°Ñ Ð¸ логиÑеÑкой ÑепликаÑии в Ñелом можно найÑи в Разделе 29.2 и Ðлаве 29.
ÐаÑамеÑÑÑ
имÑ_подпиÑки#ÐÐ¼Ñ Ð½Ð¾Ð²Ð¾Ð¹ подпиÑки.
CONNECTION '#ÑÑÑока_подклÑÑениÑ'СÑÑока подклÑÑÐµÐ½Ð¸Ñ libpq, опÑеделÑÑÑаÑ, как подклÑÑаÑÑÑÑ Ðº базе даннÑÑ Ð¿ÑбликаÑии. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 32.1.1.
PUBLICATION#имÑ_пÑбликаÑии[, ...]Ðмена пÑбликаÑий на пÑбликÑÑÑем ÑеÑвеÑе, на коÑоÑÑе оÑоÑмлÑеÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñка.
WITH (#паÑамеÑÑ_подпиÑки[=знаÑение] [, ... ] )Ð ÑÑом пÑедложении задаÑÑÑÑ Ð½ÐµÐ¾Ð±ÑзаÑелÑнÑе паÑамеÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки.
СледÑÑÑие паÑамеÑÑÑ Ð¾Ð¿ÑеделÑÑÑ, как бÑÐ´ÐµÑ ÑоздаваÑÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñка:
connect(boolean) #ÐпÑеделÑеÑ, нÑжно ли пÑи вÑполнении
CREATE SUBSCRIPTIONподклÑÑаÑÑÑÑ Ðº пÑбликÑÑÑÐµÐ¼Ñ ÑеÑвеÑÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âtrue. ÐÑли ÑавнÑеÑÑÑfalse, паÑамеÑÑÑcreate_slot,enabledиcopy_dataÑоже пÑинимаÑÑ Ð·Ð½Ð°Ñениеfalse. (ÐнаÑениеfalseпаÑамеÑÑаconnectнеÑовмеÑÑимо Ñо знаÑениемtrueпаÑамеÑÑовcreate_slot,enabledиcopy_data.)Так как Ñо знаÑением
falseÑоединение не ÑÑÑанавливаеÑÑÑ, подпиÑка на ÑаблиÑÑ Ð½Ðµ оÑоÑмлÑеÑÑÑ. ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ ÑепликаÑиÑ, поÑÑебÑеÑÑÑ Ð²ÑÑÑнÑÑ ÑоздаÑÑ ÑÐ»Ð¾Ñ ÑепликаÑии, пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи вклÑÑиÑÑfailover, вклÑÑиÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÑ Ð¸ обновиÑÑ ÐµÑ. ÐÑимеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в ÐодÑазделе 29.2.3.create_slot(boolean) #ÐпÑеделÑеÑ, должна ли команда ÑоздаваÑÑ ÑÐ»Ð¾Ñ ÑепликаÑии на пÑбликÑÑÑем ÑеÑвеÑе. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
true.ÐÑи знаÑении
falseпоÑÑебÑеÑÑÑ ÑоздаÑÑ ÑÐ»Ð¾Ñ Ð½Ð° пÑбликÑÑÑем ÑеÑвеÑе дÑÑгим ÑпоÑобом. ÐÑимеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в ÐодÑазделе 29.2.3.enabled(boolean) #ÐпÑеделÑеÑ, акÑивиÑоваÑÑ Ð»Ð¸ ÑепликаÑÐ¸Ñ Ð² подпиÑке, или ÐµÑ Ð½Ñжно ÑолÑко наÑÑÑоиÑÑ, но не запÑÑкаÑÑ ÑÑазÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
true.slot_name(string) #ÐÐ¼Ñ ÑлоÑа ÑепликаÑии на пÑбликÑÑÑем ÑеÑвеÑе, коÑоÑое должно иÑполÑзоваÑÑÑÑ. Ðо ÑмолÑÐ°Ð½Ð¸Ñ Ð² каÑеÑÑве имени ÑлоÑа иÑполÑзÑеÑÑÑ Ð¸Ð¼Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки.
Ðогда в каÑеÑÑве
slot_nameзадаÑÑÑÑNONE, Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñкой не бÑÐ´ÐµÑ ÑвÑзан ÑÐ»Ð¾Ñ ÑепликаÑии. У ÑÐ°ÐºÐ¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñок Ñакже Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ ÑавнÑfalseÑвойÑÑваenabledиcreate_slot. ÐÑполÑзÑйÑе ÑÑо знаÑение, еÑли бÑдеÑе ÑоздаваÑÑ ÑÐ»Ð¾Ñ ÑепликаÑии позднее вÑÑÑнÑÑ. ÐÑимеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в ÐодÑазделе 29.2.3.ÐÑли задаÑÑ Ð² каÑеÑÑве
slot_nameкоÑÑекÑное имÑ, а длÑcreate_slotÑказаÑÑfalse, знаÑениеfailoverÑказанного ÑлоÑа Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð·Ð½Ð°ÑениÑfailoverв подпиÑке. ÐÑи Ñоздании ÑлоÑа ÑбедиÑеÑÑ, ÑÑо знаÑениеfailoverÑлоÑа ÑÐ¾Ð²Ð¿Ð°Ð´Ð°ÐµÑ Ñ ÑказаннÑм в подпиÑке, инаÑе ÑÐ»Ð¾Ñ Ð½Ð° пÑбликÑÑÑем ÑеÑвеÑе Ð¼Ð¾Ð¶ÐµÑ Ð²ÐµÑÑи ÑÐµÐ±Ñ Ð½ÐµÐ¾Ð¶Ð¸Ð´Ð°Ð½Ð½Ð¾: напÑимеÑ, ÑÐ»Ð¾Ñ Ð½Ð° пÑбликÑÑÑем ÑеÑвеÑе Ð¼Ð¾Ð¶ÐµÑ ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑÑÑ Ñ ÑезеÑвнÑми ÑеÑвеÑами даже пÑи вÑклÑÑенном в подпиÑке паÑамеÑÑеfailoverи не ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑÑÑ Ð´Ð°Ð¶Ðµ пÑи вклÑÑÑнном в подпиÑке паÑамеÑÑеfailover.
СледÑÑÑие паÑамеÑÑÑ ÑпÑавлÑÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÐ¼ ÑепликаÑии подпиÑки поÑле ÐµÑ ÑозданиÑ:
binary(boolean) #ÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ подпиÑки запÑаÑиваÑÑÑÑ Ð¿ÐµÑедаÑа даннÑÑ Ð² двоиÑном (а не в ÑекÑÑовом) виде. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
false. ÐаннÑе Ð´Ð»Ñ Ð½Ð°ÑалÑной ÑÐ¸Ð½Ñ ÑонизаÑии ÑÐ°Ð±Ð»Ð¸Ñ ÐºÐ¾Ð¿Ð¸ÑÑÑÑÑÑ (Ñм.copy_data) в Ñом же ÑоÑмаÑе. ÐвоиÑнÑй ÑоÑÐ¼Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð±ÑабаÑÑваÑÑÑÑ Ð±ÑÑÑÑее, Ñем ÑекÑÑовÑй, но он Ð¼Ð¾Ð¶ÐµÑ Ð¾ÐºÐ°Ð·Ð°ÑÑÑÑ Ð½ÐµÐ¿ÐµÑеноÑимÑм Ð¼ÐµÐ¶Ð´Ñ ÑазнÑми маÑиннÑми аÑÑ Ð¸ÑекÑÑÑами и веÑÑиÑми PostgreSQL. ÐÑоме Ñого, двоиÑнÑй ÑоÑÐ¼Ð°Ñ ÑилÑно завиÑÐ¸Ñ Ð¾Ñ Ñипов даннÑÑ : напÑимеÑ, он не позволÑÐµÑ ÐºÐ¾Ð¿Ð¸ÑоваÑÑ Ð´Ð°Ð½Ð½Ñе из ÑÑолбÑа Ñ Ñипомsmallintвinteger, Ñ Ð¾ÑÑ Ñ ÑекÑÑовÑм ÑоÑмаÑом ÑÑо вполне возможно. Ðаже еÑли ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð²ÐºÐ»ÑÑÑн, в двоиÑном виде бÑдÑÑ Ð¿ÐµÑедаваÑÑÑÑ ÑолÑко Ñе ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ , Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑÑнкÑии двоиÑного полÑÑениÑ/оÑпÑавки. ÐбÑаÑиÑе внимание, ÑÑо Ð´Ð»Ñ Ð½Ð°ÑалÑной ÑÐ¸Ð½Ñ ÑонизаÑии ÑÑебÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð´Ð»Ñ Ð²ÑÐµÑ Ñипов даннÑÑ Ð±Ñли опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑÑнкÑии двоиÑного полÑÑениÑ/оÑпÑавки, в пÑоÑивном ÑлÑÑае ÑÐ¸Ð½Ñ ÑонизаÑÐ¸Ñ Ð¿ÑеÑвÑÑÑÑ Ð¾Ñибкой (более подÑобно ÑÑнкÑии полÑÑениÑ/оÑпÑавки опиÑÐ°Ð½Ñ Ð² CREATE TYPE).ÐÑи ÑепликаÑии Ð¼ÐµÐ¶Ð´Ñ ÑеÑвеÑами ÑазнÑÑ Ð²ÐµÑÑий возможна ÑиÑÑаÑиÑ, когда Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑого Ñипа на ÑÑоÑоне пÑбликаÑии бÑÐ´ÐµÑ Ð¾Ð¿Ñеделена ÑÑнкÑÐ¸Ñ Ð´Ð²Ð¾Ð¸Ñной оÑпÑавки, а на ÑÑоÑоне подпиÑки не бÑÐ´ÐµÑ ÑооÑвеÑÑÑвÑÑÑей ÑÑнкÑии двоиÑного полÑÑениÑ. Ð Ñакой ÑиÑÑаÑии пеÑедаÑа даннÑÑ Ð±ÑÐ´ÐµÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð°, и паÑамеÑÑ
binaryиÑполÑзоваÑÑ Ð½ÐµÐ»ÑзÑ.ÐÑли веÑÑÐ¸Ñ Ð¿ÑбликÑÑÑего ÑеÑвеÑа ниже PostgreSQL 16, даннÑе Ð´Ð»Ñ Ð½Ð°ÑалÑной ÑÐ¸Ð½Ñ ÑонизаÑии ÑÐ°Ð±Ð»Ð¸Ñ Ð±ÑдÑÑ Ð¿ÐµÑедаваÑÑÑÑ Ð² ÑекÑÑовом ÑоÑмаÑе, даже еÑли задаÑÑ
binary = true.copy_data(boolean) #ÐпÑеделÑеÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð»Ð¸ копиÑоваÑÑÑÑ Ñже ÑÑÑеÑÑвÑÑÑие даннÑе в пÑбликаÑиÑÑ , на коÑоÑÑе оÑоÑмлÑеÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñка, ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле наÑала ÑепликаÑии. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
true.ÐÑедложениÑ
WHERE, ÑодеÑжаÑиеÑÑ Ð² пÑбликаÑиÑÑ , влиÑÑÑ Ð½Ð° Ñо, какие даннÑе бÑдÑÑ ÑкопиÑованÑ. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐамеÑаниÑ.Ð ÐамеÑÐ°Ð½Ð¸Ñ Ð¾Ð¿Ð¸Ñано поведение пÑи копиÑовании даннÑÑ (
copy_data = true) Ñ Ð¿Ð°ÑамеÑÑомorigin.streaming(enum) #ÐпÑеделÑеÑ, вклÑÑаÑÑ Ð»Ð¸ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ подпиÑки пеÑедаÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ еÑÑ Ð²ÑполнÑÑÑÐ¸Ñ ÑÑ ÑÑанзакÑий. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
parallel, Ñо еÑÑÑ Ð´Ð¾ÑÑÑпнÑй паÑаллелÑнÑй ÑабоÑий пÑоÑеÑÑ Ð¿ÑименÑÐµÑ Ð¿Ð¾ÑÑÑпаÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½Ð°Ð¿ÑÑмÑÑ. ÐÑли Ð½ÐµÑ Ñвободного паÑаллелÑного ÑабоÑего пÑоÑеÑÑа Ð´Ð»Ñ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ пеÑедаваемÑÑ Ð² поÑоке ÑÑанзакÑий, Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð²Ð¾ вÑеменнÑе ÑÐ°Ð¹Ð»Ñ Ð¸ пÑименÑÑÑÑÑ Ð¿Ð¾Ñле ÑикÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑанзакÑии. ÐбÑаÑиÑе внимание, ÑÑо в ÑлÑÑае ÑÐ±Ð¾Ñ Ð¿Ð°ÑаллелÑного ÑабоÑего пÑоÑеÑÑа LSN завеÑÑÐµÐ½Ð¸Ñ ÑдалÑнной ÑÑанзакÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ запиÑан в жÑÑнал ÑеÑвеÑа.Ðнимание
ÐÑи ÑазлиÑии ÑÑ ÐµÐ¼ пÑбликÑÑÑего ÑеÑвеÑа и подпиÑÑика Ð²Ð¾Ð·Ð½Ð¸ÐºÐ°ÐµÑ ÑиÑк взаимоблокиÑовки, Ñ Ð¾ÑÑ Ñакие ÑлÑÑаи Ñедки. РабоÑий пÑоÑеÑÑ Ð¿ÑÐ¸Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ ÑпоÑобен авÑомаÑиÑеÑки повÑоÑиÑÑ Ð¿Ð¾Ð¿ÑÑÐºÑ ÑÑÐ¸Ñ ÑÑанзакÑий.
ÐÑли ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð²ÐºÐ»ÑÑÑн (
on), поÑÑÑпаÑÑие Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸ÑÑваÑÑÑÑ Ð²Ð¾ вÑеменнÑе ÑÐ°Ð¹Ð»Ñ Ð¸ пÑименÑÑÑÑÑ Ð¿Ð¾Ñле ÑикÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑÑанзакÑии на пÑбликÑÑÑем ÑеÑвеÑе и полÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиком.ÐÑи знаÑении
offÐºÐ°Ð¶Ð´Ð°Ñ ÑÑанзакÑÐ¸Ñ ÑнаÑала Ñеликом декодиÑÑеÑÑÑ Ð½Ð° ÑÑоÑоне пÑбликаÑии и ÑолÑко заÑем пеÑедаÑÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑÐ¸ÐºÑ ÐºÐ°Ðº единое Ñелое.synchronous_commit(enum) #ÐнаÑение ÑÑого паÑамеÑÑа пеÑеопÑеделÑÐµÑ ÑвойÑÑво synchronous_commit Ð´Ð»Ñ ÑабоÑÐ¸Ñ Ð¿ÑоÑеÑÑов, пÑименÑÑÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ подпиÑки. Ðо ÑмолÑÐ°Ð½Ð¸Ñ â
off.ÐнаÑение
offбезопаÑно Ð´Ð»Ñ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии: еÑли подпиÑÑик поÑеÑÑÐµÑ ÑÑанзакÑии из-за наÑÑÑÐµÐ½Ð¸Ñ ÑÐ¸Ð½Ñ ÑонизаÑии, даннÑе бÑдÑÑ Ð¿Ð¾Ð²ÑоÑно пеÑÐµÐ´Ð°Ð½Ñ Ñ Ð¿ÑбликÑÑÑего ÑеÑвеÑа.ÐÑи вÑполнении ÑÐ¸Ð½Ñ Ñонной логиÑеÑкой ÑепликаÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑмеÑÑно дÑÑгое знаÑение. РабоÑие пÑоÑеÑÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии пеÑедаÑÑ Ð¿Ð¾Ð·Ð¸Ñии запиÑаннÑÑ Ð¸ ÑÐ¾Ñ ÑанÑннÑÑ Ð½Ð° диÑке даннÑÑ Ð¿ÑбликÑÑÑÐµÐ¼Ñ ÑеÑвеÑÑ, Ñак ÑÑо пÑи ÑÐ¸Ð½Ñ Ñонной ÑепликаÑии он бÑÐ´ÐµÑ Ð¶Ð´Ð°ÑÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ ÑÐ¾Ñ ÑанениÑ. ÐÑо знаÑиÑ, ÑÑо знаÑение
offпаÑамеÑÑаsynchronous_commitна подпиÑÑике Ð¼Ð¾Ð¶ÐµÑ ÑвелиÑиÑÑ Ð·Ð°Ð´ÐµÑÐ¶ÐºÑ Ð¿Ñи вÑполненииCOMMITна ÑеÑвеÑе пÑбликаÑии. ÐÑи Ñаком ÑÑенаÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñгоднее задаÑÑ Ð´Ð»Ñsynchronous_commitзнаÑениеlocalили вÑÑе.two_phase(boolean) #ÐпÑеделÑеÑ, вклÑÑаеÑÑÑ Ð»Ð¸ двÑÑ ÑÐ°Ð·Ð½Ð°Ñ ÑикÑаÑÐ¸Ñ Ð´Ð»Ñ ÑÑой подпиÑки. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
false.Ðогда двÑÑ ÑÐ°Ð·Ð½Ð°Ñ ÑикÑаÑÐ¸Ñ Ð²ÐºÐ»ÑÑена, подгоÑовленнÑе ÑÑанзакÑии оÑпÑавлÑÑÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑÐ¸ÐºÑ Ð²Ð¾ вÑемÑ
PREPARE TRANSACTIONи Ñакже обÑабаÑÑваÑÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиком как двÑÑ ÑазнÑе ÑÑанзакÑии. РпÑоÑивном ÑлÑÑае подгоÑовленнÑе ÑÑанзакÑии оÑпÑавлÑÑÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑÐ¸ÐºÑ ÑолÑко поÑле ÑикÑаÑии, а заÑем немедленно обÑабаÑÑваÑÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиком.РеализаÑÐ¸Ñ Ð´Ð²ÑÑ Ñазной ÑикÑаÑии ÑÑебÑеÑ, ÑÑÐ¾Ð±Ñ Ð¿ÑоÑедÑÑа ÑепликаÑии ÑÑпеÑно завеÑÑила наÑалÑнÑÑ ÑÐ°Ð·Ñ ÑÐ¸Ð½Ñ ÑонизаÑии ÑаблиÑ. Таким обÑазом, даже еÑли Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки вклÑÑÑн паÑамеÑÑ
two_phase, внÑÑÑенним ÑоÑÑоÑнием двÑÑ Ñазной ÑикÑаÑии вÑеменно оÑÑаÑÑÑÑ Â«Ð² ожидании», пока не завеÑÑиÑÑÑ Ñаза иниÑиализаÑии. ФакÑиÑеÑкое ÑоÑÑоÑние двÑÑ Ñазной ÑикÑаÑии можно ÑвидеÑÑ Ð² ÑÑолбÑеsubtwophasestateвpg_subscription.disable_on_error(boolean) #ÐпÑеделÑеÑ, ÑледÑÐµÑ Ð»Ð¸ авÑомаÑиÑеÑки оÑклÑÑаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ, еÑли ÑабоÑие пÑоÑеÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑика обнаÑÑÐ¶Ð°Ñ ÐºÐ°ÐºÐ¸Ðµ-либо оÑибки пÑи ÑепликаÑии даннÑÑ Ð¿ÑбликаÑии. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
false.password_required(boolean) #ÐÑли задано знаÑение
true, подклÑÑÐµÐ½Ð¸Ñ Ðº пÑбликÑÑÑÐµÐ¼Ñ ÑеÑвеÑÑ, ÑоздаваемÑе в ÑезÑлÑÑаÑе подпиÑки, Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑебоваÑÑ Ð°ÑÑенÑиÑикаÑии по паÑолÑ, пÑи ÑÑом паÑÐ¾Ð»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑказÑваÑÑÑÑ ÐºÐ°Ðº ÑаÑÑÑ ÑÑÑоки подклÑÑениÑ. ÐÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¸Ð³Ð½Ð¾ÑиÑÑеÑÑÑ, еÑли владелÑÑем подпиÑки ÑвлÑеÑÑÑ ÑÑпеÑполÑзоваÑелÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ âtrue. ÐадаÑÑ Ð·Ð½Ð°ÑениеfalseмогÑÑ ÑолÑко ÑÑпеÑполÑзоваÑели.run_as_owner(boolean) #ÐÑли true, вÑе дейÑÑÐ²Ð¸Ñ ÑепликаÑии вÑполнÑÑÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ владелÑÑа подпиÑки. ÐÑли false (по ÑмолÑаниÑ), ÑабоÑие пÑоÑеÑÑÑ ÑепликаÑии вÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑии Ñ ÑаблиÑами Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ владелÑÑа ÑаблиÑÑ, ÑÑо в Ñелом намного более безопаÑно (за подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº РазделÑ 29.11).
origin(string) #ÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ подпиÑки запÑаÑиваÑÑÑÑ Ð¿ÐµÑедаÑа изменений, не оÑмеÑеннÑÑ Ð¸ÑÑоÑником ÑепликаÑии, или вÑÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ незавиÑимо Ð¾Ñ Ð¸ÑÑоÑника. ÐÑли задаÑÑ Ð´Ð»Ñ
originзнаÑениеnone, Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑаÑиваÑÑÑÑ Ð¿ÐµÑедаÑа изменений, не оÑмеÑеннÑÑ Ð¸ÑÑоÑником ÑепликаÑии. ÐÑли задаÑÑ Ð´Ð»ÑoriginзнаÑениеany, пÑбликÑÑÑий ÑеÑÐ²ÐµÑ Ð¾ÑпÑавлÑÐµÑ Ð²Ñе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ð¸Ñ Ð¸ÑÑоÑника. Ðо ÑмолÑÐ°Ð½Ð¸Ñ âany.Ð ÐамеÑÐ°Ð½Ð¸Ñ Ð¾Ð¿Ð¸Ñано поведение пÑи копиÑовании даннÑÑ (
copy_data = true) Ñ Ð¿Ð°ÑамеÑÑомorigin.failover(boolean) #ÐпÑеделÑеÑ, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð»Ð¸ ÑлоÑÑ ÑепликаÑии, ÑвÑзаннÑе Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñкой, ÑÐ¸Ð½Ñ ÑонизиÑоваÑÑÑÑ Ñ Ð²ÐµÐ´Ð¾Ð¼Ñм ÑеÑвеÑом, ÑÑÐ¾Ð±Ñ Ð»Ð¾Ð³Ð¸ÑеÑкÑÑ ÑепликаÑÐ¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ бÑло возобновиÑÑ Ð½Ð° новом ведÑÑем ÑеÑвеÑе ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле пеÑеклÑÑениÑ. ÐнаÑение по ÑмолÑÐ°Ð½Ð¸Ñ â
false.
ÐÑли Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа Ñипа boolean опÑÑÑиÑÑ = знаÑение, ÑÑо ÑавнознаÑно ÑÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ TRUE.
ÐамеÑаниÑ
ÐодÑобнее о Ñом, как оÑганизоваÑÑ ÑпÑавление доÑÑÑпом подпиÑÑиков к пÑбликÑÑÑÐµÐ¼Ñ ÑеÑвеÑÑ, ÑаÑÑказÑваеÑÑÑ Ð² Разделе 29.11.
ÐÑи Ñоздании ÑлоÑа ÑепликаÑии (поведение по ÑмолÑаниÑ) CREATE SUBSCRIPTION нелÑÐ·Ñ Ð²ÑполнÑÑÑ Ð²Ð½ÑÑÑи блока ÑÑанзакÑии.
Создание подпиÑки Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑением к ÑÐ¾Ð¼Ñ Ð¶Ðµ клаÑÑеÑÑ Ð±Ð°Ð· даннÑÑ
(напÑимеÑ, Ð´Ð»Ñ Ð¾ÑганизаÑии ÑепликаÑии Ð¼ÐµÐ¶Ð´Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ
в одном клаÑÑеÑе или в одной базе даннÑÑ
) бÑÐ´ÐµÑ ÑÑпеÑнÑм, ÑолÑко еÑли ÑÐ»Ð¾Ñ ÑепликаÑии не ÑоздаÑÑÑÑ Ñой же командой. РпÑоÑивном ÑлÑÑае команда CREATE SUBSCRIPTION завиÑнеÑ. ЧÑÐ¾Ð±Ñ Ð¾ÑоÑмиÑÑ ÑакÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ, ÑÐ»Ð¾Ñ ÑепликаÑии нÑжно ÑоздаÑÑ Ð¾ÑделÑно (воÑполÑзовавÑиÑÑ ÑÑнкÑией pg_create_logical_replication_slot и пеÑедав ей Ð¸Ð¼Ñ Ð¼Ð¾Ð´ÑÐ»Ñ pgoutput) и ÑоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÑ Ñ Ð¿Ð°ÑамеÑÑом create_slot = false. ÐÑимеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ найÑи в ÐодÑазделе 29.2.3. ÐÑо огÑаниÑение ÑеализаÑии Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÑÑÑанено в бÑдÑÑем вÑпÑÑке.
ÐÑли Ð´Ð»Ñ ÐºÐ°ÐºÐ¾Ð¹-либо ÑаблиÑÑ Ð² пÑбликаÑии Ñказано пÑедложение WHERE, ÑÑÑоки, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ
вÑÑажение вÑдаÑÑ Ð·Ð½Ð°Ñение false или null, не бÑдÑÑ Ð¿ÑбликоваÑÑÑÑ. Ðогда в подпиÑке еÑÑÑ Ð½ÐµÑколÑко пÑбликаÑий, в коÑоÑÑÑ
одна и Ñа же ÑаблиÑа опÑбликована Ñ ÑазнÑми пÑедложениÑми WHERE, ÑÑÑока бÑÐ´ÐµÑ Ð¾Ð¿Ñбликована, еÑли вÑполнÑеÑÑÑ Ð»Ñбое из вÑÑажений (оÑноÑÑÑееÑÑ Ðº ÑÑой опеÑаÑии пÑбликаÑии). Ð ÑлÑÑае неодинаковÑÑ
пÑедложений WHERE, еÑли в одной из пÑбликаÑий Ð½ÐµÑ Ð¿ÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ WHERE (оÑноÑÑÑегоÑÑ Ðº ÑÑой опеÑаÑии пÑбликаÑии) или пÑбликаÑÐ¸Ñ Ð¾Ð±ÑÑвлена как FOR ALL TABLES или FOR TABLES IN SCHEMA, ÑÑÑоки вÑегда пÑбликÑÑÑÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð´ÑÑгиÑ
вÑÑажений. ÐÑли на ÑÑоÑоне подпиÑÑика иÑполÑзÑеÑÑÑ Ð²ÐµÑÑÐ¸Ñ PostgreSQL ниже 15, на ÑÑапе наÑалÑной ÑинÑ
ÑонизаÑии даннÑÑ
вÑе ÑилÑÑÑÑ ÑÑÑок игноÑиÑÑÑÑÑÑ. Ð ÑÑом ÑлÑÑае ÑледÑÐµÑ ÑаÑÑмоÑÑеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑдалиÑÑ Ð²Ñе изнаÑалÑно ÑкопиÑованнÑе даннÑе, коÑоÑÑе бÑдÑÑ Ð½ÐµÑовмеÑÑÐ¸Ð¼Ñ Ñ ÑилÑÑÑами впоÑледÑÑвии. Так как пÑи пеÑвонаÑалÑной ÑинÑ
ÑонизаÑии даннÑÑ
паÑамеÑÑ Ð¿ÑбликаÑии publish не ÑÑиÑÑваеÑÑÑ, пÑи копиÑовании ÑÑÑеÑÑвÑÑÑиÑ
даннÑÑ
могÑÑ Ð±ÑÑÑ ÑкопиÑÐ¾Ð²Ð°Ð½Ñ ÑÑÑоки, коÑоÑÑе не бÑли Ð±Ñ ÑеплиÑиÑÐ¾Ð²Ð°Ð½Ñ Ð¿Ñи вÑполнении опеÑаÑий DML. ÐÑимеÑÑ Ð¿ÑÐ¸Ð²ÐµÐ´ÐµÐ½Ñ Ð² ÐодÑазделе 29.2.2.
СоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð¸Ñки, ÑвÑзаннÑе Ñ Ð½ÐµÑколÑкими пÑбликаÑиÑми, в коÑоÑÑÑ Ð¾Ð´Ð½Ð° и Ñа же ÑаблиÑа опÑбликована Ñ ÑазнÑми ÑпиÑками ÑÑолбÑов, нелÑзÑ.
ÐÑи Ñоздании подпиÑок допÑÑкаеÑÑÑ Ñказание неÑÑÑеÑÑвÑÑÑиÑ
пÑбликаÑий, ÑÑо позволÑÐµÑ ÑоздаваÑÑ Ð½ÑжнÑе пÑбликаÑии позже. Таким обÑазом, в pg_subscription могÑÑ ÑигÑÑиÑоваÑÑ Ð½ÐµÑÑÑеÑÑвÑÑÑие пÑбликаÑии.
Ðогда Ð´Ð»Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñки Ð·Ð°Ð´Ð°Ð½Ñ Ð¿Ð°ÑамеÑÑÑ copy_data = true и origin = NONE, даннÑе Ð´Ð»Ñ Ð½Ð°ÑалÑной ÑинÑ
ÑонизаÑии копиÑÑÑÑÑÑ Ð½Ð°Ð¿ÑÑмÑÑ Ñ Ð¿ÑбликÑÑÑего ÑеÑвеÑа, Ñо еÑÑÑ Ð¸ÑÑ
однÑй иÑÑоÑник даннÑÑ
опÑеделиÑÑ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾. ÐÑли пÑбликÑÑÑий ÑеÑÐ²ÐµÑ Ñам ÑвлÑеÑÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиком, копиÑÑемÑе даннÑе могли бÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð¸Ð· дÑÑгого иÑÑоÑника. ÐÑи вÑÑвлении Ñакой ÑиÑÑаÑии полÑзоваÑÐµÐ»Ñ Ð²ÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение, коÑоÑое ÑолÑко ÑказÑÐ²Ð°ÐµÑ Ð½Ð° возможнÑÑ Ð¿ÑоблемÑ, â полÑзоваÑÐµÐ»Ñ Ð½ÐµÐ¾Ð±Ñ
одимо ÑамоÑÑоÑÑелÑно ÑбедиÑÑÑÑ Ð² необÑ
одимоÑÑи копиÑоваÑÑ Ð´Ð°Ð½Ð½Ñе из ÑÑеÑÑего иÑÑоÑника.
ЧÑÐ¾Ð±Ñ Ð½Ð°Ð¹Ñи ÑаблиÑÑ, даннÑе в коÑоÑÑÑ Ð¼Ð¾Ð³Ð»Ð¸ бÑÑÑ Ð¿Ð¾Ð»ÑÑÐµÐ½Ñ Ð¸Ð· ÑÑеÑÑего иÑÑоÑника (из-за подпиÑок на пÑбликÑÑÑем ÑеÑвеÑе), воÑполÑзÑйÑеÑÑ Ñаким SQL-запÑоÑом:
# замениÑе <pub-names> именами подпиÑок Ð´Ð»Ñ Ð·Ð°Ð¿ÑоÑа
SELECT DISTINCT PT.schemaname, PT.tablename
FROM pg_publication_tables PT
JOIN pg_class C ON (C.relname = PT.tablename)
JOIN pg_namespace N ON (N.nspname = PT.schemaname),
pg_subscription_rel PS
WHERE C.relnamespace = N.oid AND
(PS.srrelid = C.oid OR
C.oid IN (SELECT relid FROM pg_partition_ancestors(PS.srrelid) UNION
SELECT relid FROM pg_partition_tree(PS.srrelid))) AND
PT.pubname IN (<pub-names>);ÐÑимеÑÑ
Создание подпиÑки на ÑепликаÑии mypublication и insert_only на ÑдалÑнном ÑеÑвеÑе Ñ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ñм запÑÑком ÑепликаÑии пÑи ÑикÑиÑовании ÑÑанзакÑии:
CREATE SUBSCRIPTION mysub
CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
PUBLICATION mypublication, insert_only;Создание подпиÑки на пÑбликаÑÐ¸Ñ insert_only на ÑдалÑнном ÑеÑвеÑе Ñ Ð¾ÑклÑÑением ÑепликаÑии Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка в бÑдÑÑем.
CREATE SUBSCRIPTION mysub
CONNECTION 'host=192.168.1.50 port=5432 user=foo dbname=foodb'
PUBLICATION insert_only
WITH (enabled = false);СовмеÑÑимоÑÑÑ
CREATE SUBSCRIPTION ÑвлÑеÑÑÑ ÑаÑÑиÑением PostgreSQL.