Re: Allow logical replication to copy tables in binary format - Mailing list pgsql-hackers
From | Peter Smith |
---|---|
Subject | Re: Allow logical replication to copy tables in binary format |
Date | |
Msg-id | CAHut+PtdxOXcxLb7Gzewikk2C_2CTeg3ZaSTBP4kR9LvEV48ww@mail.gmail.com Whole thread Raw |
In response to | Re: Allow logical replication to copy tables in binary format (Melih Mutlu <m.melihmutlu@gmail.com>) |
Responses |
Re: Allow logical replication to copy tables in binary format
|
List | pgsql-hackers |
Here is my summary of this thread so far, plus some other thoughts. (I wrote this mostly for my own internal notes/understanding, but maybe it is a helpful summary for others so I am posting it here too). ~~ 1. Initial Goal ------------------ Currently, the CREATE SUBSCRIPTION ... WITH(binary=true) mode does data replication in binary mode, but tablesync COPY phase is still only in text mode. IIUC Melih just wanted to unify those phases so binary=true would mean also do the COPY phase in binary [1]. Actually, this was my very first expectation too. 2. Objections to unification ----------------------------------- Bharath posted suggesting tying the COPY/replication parts is not a good idea [2]. But if these are not to be unified then it requires a new subscription option to be introduced, and currently, the thread refers to this new option as copy_format=binary. 3. A problem: binary replication is not always binary! ---------------------------------------------------------------------- Shi-san reported [3] that under special circumstances (e.g. if the datatype has no binary output function) the current HEAD binary=true mode for replication has the ability to fall back to text replication. Since the binary COPY doesn't do this, it means binary COPY could fail in some cases where the binary=true replication will be OK. AFAIK, this means that even if we *wanted* to unify everything with just 'binary=true' it can't be done like that. 4. New option is needed --------------------------------- OK, so let's assume these options must be separated (because of the problem of #3). ~ 4a. New string option called copy_format? Currently, the patch/thread describes a new 'copy_format' string option with values 'text' (default) and 'binary'. Why? If there are only 2 values then IMO it would be better to have a *boolean* option called something like binary_copy=true/false. ~ 4b. Or, we could extend copy_data Jelte suggested [4] we could extend copy_data = 'text' (aka on/true) OR 'binary' OR 'none' (aka off/false). That was interesting, although - my first impression was to worry about backward compatibility issues for existing application code. I don't know if those are easily solved. - AFAIK such "hybrid" boolean/enum options are kind of frowned upon so I am not sure if a committer would be in favour of introducing another one. 5. Combining options ------------------------------ Because options are separated, it means combinations become possible... ~~ 5a. Combining option: "copy_format = binary" and "copy_data = false" Kuroda [5] wrote such a combination should not be allowed. I kind of disagree with that. IMO everything should be flexible as possible. The patch might end up accidentally stopping something that has a valid use case. Anyway, such restrictions are easy to add later. ~~ 5b. Combining options: binary=true/copy_format=binary, and binary=false/copy_format=binary become possible. AFAIK currently the patch disallows some combinations: + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("%s and %s are mutually exclusive options", + "binary = false", "copy_format = binary"))); I kind of disagree with introducing such rules/restrictions. IMO all this patch needs to do is clearly document all necessary precautions etc. But if the user still wants to do something, we should just let them do it. If they manage to shoot themselves in the foot, well it was their choice after reading the docs, and it's their foot. 6. pub/sub version checking ---------------------------- There were some discussions about doing some server checking to reject some PG combinations from being allowed to use the copy_format=binary. Jelte suggested [5] that it is the "responsibility of the operator to evaluate the risk". I agree. Yes, the patch certainly needs to *document* all precautions, but having too many restrictions might end up accidentally stopping something useful. Anyway, this seems like #5a. I prefer KISS Principle. More restrictions can be added later if found necessary. 7. More doubts & a thought bubble --------------------------------- 7a. What is user action for this scenario? I am unsure about this scenario - imagine that everything is working properly and the copy_format=binary/copy_data=true is all working nicely for weeks for a certain pub/sub... But if the publication was defined as FOR ALL TABLES, or as ALL TABLES IN SCHEMA, then I think the tablesync can still crash if a user creates a new table that suffers the same COPY binary trouble Shi-san described earlier [3]. What is the user supposed to do when that tablesync fails? They had no way to predict it could happen, And it will be too painful to have to DROP and re-create the entire SUBSCRIPTION again now that it has happened. ~~ 7a. A thought bubble I wondered (perhaps this is naive) would it be it possible to enhance the COPY command to enhance the "binary" mode so it can be made to fall back to text mode if it needs to in the same way that binary replication does. If such an enhanced COPY format mode worked, then most of the patch is redundant - there is no need for any new option - tablesync COPY could then *always* use this "binary-with-falback" mode ------ [1] Melih initially wanted a unified binary mode - https://www.postgresql.org/message-id/CAGPVpCQYi9AYQSS%3DRmGgVNjz5ZEnLB8mACwd9aioVhLmbgiAMA%40mail.gmail.com [2] Barath doesn't like the binary/copy_format inter-dependency - https://www.postgresql.org/message-id/CALj2ACVPt-BaLMm3Ezy1-rfUzH9qStxePcyGrHPamPESEZSBFA%40mail.gmail.com [3] Shi-san found binary mode has the ability to fall back to text sometimes - https://www.postgresql.org/message-id/OSZPR01MB6310B58F069FF8E148B247FDFDA49%40OSZPR01MB6310.jpnprd01.prod.outlook.com [4] Jelte idea to enhance the copy_data option - https://www.postgresql.org/message-id/CAGECzQS393xiME%2BEySLU7ceO4xOB81kPjPqNBjaeW3sLgfLhNw%40mail.gmail.com [5] Kuroda-san etc expecting copy_data=false/copy_format=binary combination is not allowed - https://www.postgresql.org/message-id/TYAPR01MB5866DDF02B3CEE59DA024CC3F5AB9%40TYAPR01MB5866.jpnprd01.prod.outlook.com [6] Jelte says it is the operator's responsibility to use the correct options - https://www.postgresql.org/message-id/CAGECzQSStdb%2Bx1BxzCktZd1uSjvd6eYq1wcHV3vPCykrGqxYKQ%40mail.gmail.com Kind Regards, Peter Smith. Fujitsu Australia
pgsql-hackers by date: