29.5. ÐонÑликÑÑ
ÐогиÑеÑÐºÐ°Ñ ÑепликаÑÐ¸Ñ ÑабоÑÐ°ÐµÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð¾ обÑÑнÑм опеÑаÑиÑм DML в Ñом ÑмÑÑле, ÑÑо даннÑе бÑдÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ, даже еÑли они незавиÑимо изменÑлиÑÑ Ð½Ð° ÑÑоÑоне подпиÑÑика. ÐÑли вÑ
одÑÑие даннÑе наÑÑÑÐ°Ñ ÐºÐ°ÐºÐ¸Ðµ-либо огÑаниÑениÑ, ÑепликаÑÐ¸Ñ Ð¾ÑÑановиÑÑÑ. ÐÑа ÑиÑÑаÑÐ¸Ñ Ð½Ð°Ð·ÑваеÑÑÑ ÐºÐ¾Ð½ÑликÑом. ÐÑи ÑепликаÑии опеÑаÑий UPDATE или DELETE оÑÑÑÑÑÑвие даннÑÑ
не вÑзÑÐ²Ð°ÐµÑ ÐºÐ¾Ð½ÑликÑа, Ñак ÑÑо Ñакие опеÑаÑии пÑоÑÑо пÑопÑÑкаÑÑÑÑ.
ÐпеÑаÑии логиÑеÑкой ÑепликаÑии вÑполнÑÑÑÑÑ Ñ Ð¿Ñавами Ñоли, коÑоÑой пÑÐ¸Ð½Ð°Ð´Ð»ÐµÐ¶Ð¸Ñ Ð¿Ð¾Ð´Ð¿Ð¸Ñка. ÐоÑÑÐ¾Ð¼Ñ Ð¿Ñи оÑÑÑÑÑÑвии необÑ
одимÑÑ
пÑав доÑÑÑпа к ÑелевÑм ÑаблиÑам возникнÑÑ ÐºÐ¾Ð½ÑликÑÑ ÑепликаÑии, как и пÑи вклÑÑÑнной Ð´Ð»Ñ ÑелевÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð·Ð°ÑиÑе на ÑÑовне ÑÑÑок, огÑаниÑиваÑÑей владелÑÑа подпиÑки. ÐÑи ÑÑом не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениÑ, ÑÑÑеÑÑвÑÐµÑ Ð»Ð¸ полиÑика, коÑоÑÐ°Ñ Ð±Ñ Ð·Ð°Ð¿ÑеÑала ÑеплиÑиÑÑемÑе опеÑаÑии INSERT, UPDATE, DELETE или TRUNCATE. ÐгÑаниÑение, ÑвÑзанное Ñ Ð·Ð°ÑиÑой на ÑÑовне ÑÑÑок, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑбÑано в ÑледÑÑÑиÑ
веÑÑиÑÑ
PostgreSQL.
Ð ÑлÑÑае конÑликÑа вÑдаÑÑÑÑ Ð¾Ñибка и ÑепликаÑÐ¸Ñ Ð¾ÑÑанавливаеÑÑÑ; ÑазÑеÑиÑÑ Ð²Ð¾Ð·Ð½Ð¸ÐºÑÑÑ Ð¿ÑÐ¾Ð±Ð»ÐµÐ¼Ñ Ð¿Ð¾Ð»ÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ вÑÑÑнÑÑ. ÐодÑобноÑÑи конÑликÑа можно найÑи в жÑÑнале ÑеÑвеÑа-подпиÑÑика.
РазÑеÑиÑÑ ÐºÐ¾Ð½ÑÐ»Ð¸ÐºÑ Ð¼Ð¾Ð¶Ð½Ð¾, изменив даннÑе или ÑазÑеÑÐµÐ½Ð¸Ñ Ð½Ð° ÑÑоÑоне подпиÑÑика, ÑÑÐ¾Ð±Ñ Ð¾Ð½Ð¸ не конÑликÑовали Ñ Ð¿Ð¾ÑÑÑпаÑÑими изменениÑми, или пÑопÑÑÑив ÑÑанзакÑиÑ, конÑликÑÑÑÑÑÑ Ñ ÑÑÑеÑÑвÑÑÑими даннÑми. Ðогда в ÑлÑÑае конÑликÑа вÑдаÑÑÑÑ Ð¾Ñибка, ÑепликаÑÐ¸Ñ Ð¾ÑÑанавливаеÑÑÑ, а ÑабоÑий пÑоÑеÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкой ÑепликаÑии вÑÐ²Ð¾Ð´Ð¸Ñ Ð² жÑÑнал ÑеÑвеÑа подпиÑÑика ÑообÑение ÑледÑÑÑего вида:
ERROR: duplicate key value violates unique constraint "test_pkey" DETAIL: Key (c)=(1) already exists. CONTEXT: processing remote data for replication origin "pg_16395" during "INSERT" for replication target relation "public.test" in transaction 725 finished at 0/14C0378
Ð ÑÑом ÑообÑении можно ÑвидеÑÑ LSN ÑÑанзакÑии, ÑодеÑжаÑей изменение, коÑоÑое наÑÑÑÐ°ÐµÑ Ð¾Ð³ÑаниÑение, и Ð¸Ð¼Ñ Ð¸ÑÑоÑника даннÑÑ
ÑепликаÑии (в данном ÑлÑÑае LSN 0/14C0378 и pg_16395, ÑооÑвеÑÑÑвенно). ТÑанзакÑиÑ, вÑзвавÑÑÑ ÐºÐ¾Ð½ÑликÑ, можно пÑопÑÑÑиÑÑ, вÑполнив ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER SUBSCRIPTION ... SKIP Ñ LSN ÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ (Ñо еÑÑÑ LSN 0/14C0378). РкаÑеÑÑве LSN завеÑÑÐµÐ½Ð¸Ñ ÑÑанзакÑии Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑÑÑ LSN, Ñ ÐºÐ¾ÑоÑÑм ÑÑанзакÑÐ¸Ñ Ð±Ñла заÑикÑиÑована или подгоÑовлена на ÑеÑвеÑе пÑбликаÑии. ÐонÑликÑÑÑÑÑÑ ÑÑанзакÑÐ¸Ñ Ñакже можно пÑопÑÑÑиÑÑ, вÑзвав ÑÑнкÑÐ¸Ñ pg_replication_origin_advance(). ÐÑежде Ñем вÑзÑваÑÑ ÑÑÑ ÑÑнкÑиÑ, нÑжно либо вÑеменно оÑклÑÑиÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑкÑ, вÑполнив ALTER SUBSCRIPTION ... DISABLE, либо иÑполÑзоваÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÐºÑ Ñ Ð¿Ð°ÑамеÑÑом disable_on_error. ÐаÑем можно вÑзваÑÑ ÑÑнкÑÐ¸Ñ pg_replication_origin_advance(), пеÑедав ей node_name (Ñо еÑÑÑ pg_16395) и LSN, ÑледÑÑÑий за LSN завеÑÑÐµÐ½Ð¸Ñ (Ñо еÑÑÑ 0/14C0379). ТекÑÑие позиÑии иÑÑоÑников ÑепликаÑии можно ÑвидеÑÑ Ð² ÑиÑÑемном пÑедÑÑавлении pg_replication_origin_status. ÐбÑаÑиÑе внимание: когда пÑопÑÑкаеÑÑÑ Ð²ÑÑ ÑÑанзакÑиÑ, пÑопÑÑкаÑÑÑÑ Ð²Ñе ÐµÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ, в Ñом ÑиÑле не наÑÑÑаÑÑие никакиÑ
огÑаниÑений. Ð ÑезÑлÑÑаÑе ÑоÑÑоÑние подпиÑÑика легко можно оказаÑÑÑÑ Ð½ÐµÑоглаÑованнÑм.