On Mon, Jul 26, 2021 at 10:45 AM Dilip Kumar <dilipbal...@gmail.com> wrote: > > I was thinking more about this idea, but IMHO, unless we send the key > toasted tuple from the publisher how is the subscriber supposed to > fetch it. Because that is the key value for finding the tuple on the > subscriber side and if we haven't sent the key value, how are we > supposed to find the tuple on the subscriber side? >
I was thinking of using toast pointer but that won't work because it can be different on the subscriber-side. I don't see any better ideas to fix this issue. This problem seems to be from the time Logical Replication has been introduced, so adding others (who are generally involved in this area) to see what they think about this bug? I think people might not be using toasted columns for Replica Identity due to which this problem has been reported yet but I feel this is quite a fundamental issue and we should do something about this. Let me summarize the problem for the ease of others. The logical replica can go out of sync for UPDATES when there is a toast column as part of REPLICA IDENTITY. In such cases, updates are not replicated if the key column doesn't change because we don't log the actual key value for the unchanged toast key. It is neither logged as part of old_key_tuple nor for new tuple due to which we are not able to find the tuple to be updated on the subscriber-side and the update is ignored on the subscriber-side. We log this in DEBUG1 mode but I don't think the user can do anything about this and the replica will go out-of-sync. This works when the replica identity column value is not toasted because then it will be part of the new tuple and we use that to fetch the tuple on the subscriber. Now, it is not clear if the key-value (for the toast column which is part of replica identity) is not present in WAL how we can find the tuple to update on subscriber? We can't use the toast pointer in the new tuple to fetch the toast information as that can be different on subscribers. The simple way is to WAL LOG the unchanged toasted value as part of old_key_tuple, this will be required only for toast columns. Note that Delete works because we WAL Log the unchanged key tuple in that case. -- With Regards, Amit Kapila.