Re: row filtering for logical replication
Tomas Vondra <tomas.vondra@enterprisedb.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 7/20/21 11:42 AM, Amit Kapila wrote: > 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]. > Oh, I see. I've been thinking about doing the "usual" conflict resolution on the subscriber side. I'm not sure about doing this on the publisher ... >> 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. > Do we log the TOAST-ed values that were not updated? regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company