Re: row filtering for logical replication
Amit Kapila <amit.kapila16@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Release cache tuple when no longer needed
- ed0fbc8e5ac9 15.0 landed
-
Add some additional tests for row filters in logical replication.
- ceb57afd3ce1 15.0 landed
-
Fix one of the tests introduced in commit 52e4f0cd47.
- cfb4e209ec15 15.0 landed
-
Allow specifying row filters for logical replication of tables.
- 52e4f0cd472d 15.0 landed
-
Move scanint8() to numutils.c
- cfc7191dfea3 15.0 cited
-
Replace Test::More plans with done_testing
- 549ec201d613 15.0 cited
-
Reduce relcache access in WAL sender streaming logical changes
- 6ce16088bfed 15.0 cited
-
Small cleanups related to PUBLICATION framework code
- c9105dd3660f 15.0 cited
-
Add a view to show the stats of subscription workers.
- 8d74fc96db5f 15.0 cited
-
Allow publishing the tables of schema.
- 5a2832465fd8 15.0 cited
-
Doc: improve documentation of CREATE/ALTER SUBSCRIPTION.
- 1882d6cca161 15.0 cited
-
Add PublicationTable and PublicationRelInfo structs
- 0c6828fa987b 15.0 cited
-
Remove unused argument "txn" in maybe_send_schema().
- 93d573d86571 15.0 cited
-
Add prepare API support for streaming transactions in logical replication.
- 63cf61cdeb7b 15.0 cited
-
Unify PostgresNode's new() and get_new_node() methods
- 201a76183e20 15.0 cited
-
Use l*_node() family of functions where appropriate
- 2b00db4fb0c7 15.0 cited
-
Add support for prepared transactions to built-in logical replication.
- a8fd13cab0ba 15.0 cited
-
Restore the portal-level snapshot after procedure COMMIT/ROLLBACK.
- ef9480509622 11.13 cited
-
Rename a parse node to be more general
- 91d1f2d30210 14.0 landed
-
Remove unused column atttypmod from initial tablesync query
- 4ad31bb2ef25 14.0 landed
-
SEARCH and CYCLE clauses
- 3696a600e229 14.0 cited
On Tue, Jul 20, 2021 at 2:39 PM Tomas Vondra <tomas.vondra@enterprisedb.com> wrote: > > On 7/20/21 7:23 AM, Amit Kapila wrote: > > On Mon, Jul 19, 2021 at 7:02 PM Tomas Vondra > > <tomas.vondra@enterprisedb.com> wrote: > > >> So maybe the best thing is to stick to the simple approach already used > >> e.g. by pglogical, which simply user the new row when available (insert, > >> update) and old one for deletes. > >> > >> I think that behaves more or less sensibly and it's easy to explain. > >> > > > > Okay, if nothing better comes up, then we can fall back to this option. > > > >> All the other things (e.g. turning UPDATE to INSERT, advanced conflict > >> resolution etc.) will require a lot of other stuff, > >> > > > > I have not evaluated this yet but I think spending some time thinking > > about turning Update to Insert/Delete (yesterday's suggestion by > > Alvaro) might be worth especially as that seems to be followed by some > > other replication solution as well. > > > > I think that requires quite a bit of infrastructure, and I'd bet we'll > need to handle other types of conflicts too. > Hmm, I don't see why we need any additional infrastructure here if we do this at the publisher. I think this could be done without many changes to the patch as explained in one of my previous emails [1]. > I don't have a clear > opinion if that's required to get this patch working - I'd try getting > the simplest implementation with reasonable behavior, with those more > advanced things as future enhancements. > > >> and I see them as > >> improvements of this simple approach. > >> > >>>>> Maybe a second option is to have replication change any UPDATE into > >>>>> either an INSERT or a DELETE, if the old or the new row do not pass the > >>>>> filter, respectively. That way, the databases would remain consistent. > >>> > >>> Yeah, I think this is the best way to keep the data consistent. > >>> > >> > >> It'd also require REPLICA IDENTITY FULL, which seems like it'd add a > >> rather significant overhead. > >> > > > > Why? I think it would just need similar restrictions as we are > > planning for Delete operation such that filter columns must be either > > present in primary or replica identity columns. > > > > How else would you turn UPDATE to INSERT? For UPDATE we only send the > identity columns and modified columns, and the decision happens on the > subscriber. > Hmm, we log the entire new tuple and replica identity columns for the old tuple in WAL for Update. And, we are going to use a new tuple for Insert, so we have everything we need. [1] - https://www.postgresql.org/message-id/CAA4eK1%2BAXEd5bO-qPp6L9Ptckk09nbWvP8V7q5UW4hg%2BkHjXwQ%40mail.gmail.com -- With Regards, Amit Kapila.