Това, което наистина искате, е логическото декодиране на PostgreSQL 9.4 поддръжка, която ви позволява да извлечете поток за промяна от сървъра. За да го използвате, имате нужда от плъгин за логическо декодиране, който превръща потока от промени на сървъра в нещо, което приложението ви може да използва. Има редица в процес на разработка, но все още е доста рано.
Тъй като отбелязахте в коментар, че използвате AWS RDS, в момента нямате късмет, тъй като RDS към момента на писане не предлага никакви добавки за декодиране и ще ви трябват привилегии на суперпотребител, за да ги инсталирате.
Не можете да използвате xmin и xmax за пълно инкрементално копиране, защото не можете да правите мръсни четения в PostgreSQL, така че не можете да видите дали даден кортеж е бил DELETE
д. За да използвате идентификатори на транзакции, трябва да предотвратите VACUUM
от премахване на "мъртви" редове, т.е. редове, които нито една текуща транзакция все още не трябва да изпълнява правилно. Също така ще трябва да можете да правите мръсни четения. Нито един от тях няма лесни решения в PostgreSQL.
Ако имате таблици само за вмъкване (или правите вмъквания и актуализации, никога не изтривате и никога не променяте първичния ключ на ред), тогава можете евентуално да използвате транзакцията xmin. Ще трябва да се справите с transaction-id wraparound
като проверите pg_database.datfrozenxid
и pg_class.relfrozenxid
за лихвеното отношение. Вижте изходния код и коментарите в кода за подробности. VACUUM
и липсата на мръсни четения не е проблем, ако никога не изтриете запис, тъй като не е необходимо да виждате "изчезнали" редове.
Използвайте логическо декодиране в 9.4+, ако е възможно. За по-стари версии, ако имате нужда от пълна репликация, трябва да натрупате опашка за промяна с тригери.
Ако можете да забраните напълно изтриванията и промените на първичния ключ, можете да използвате xmin
за намиране на променени редове, стига да сте сигурни, че няма delete
или всяка update
които променят primary key
с.