Re: Support logical replication of DDLs
Zheng Li <zhengli10@gmail.com>
From: Zheng Li <zhengli10@gmail.com>
To: Amit Kapila <amit.kapila16@gmail.com>
Cc: "houzj.fnst@fujitsu.com" <houzj.fnst@fujitsu.com>,
Masahiko Sawada <sawada.mshk@gmail.com>, Japin Li <japinli@hotmail.com>, Alvaro Herrera <alvherre@alvh.no-ip.org>, Dilip Kumar <dilipbalaut@gmail.com>,
rajesh singarapu <rajesh.rs0541@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2022-06-17T19:38:03Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Add a run_as_owner option to subscriptions.
- 482675987bcd 16.0 cited
-
Refactor pgoutput_change().
- da324d6cd45b 16.0 cited
-
Print the correct aliases for DML target tables in ruleutils.
- df931e9ab35b 11.20 landed
- c8a5f1685fb7 15.3 landed
- 4efb4f0d4878 13.11 landed
- 3dd287c14fac 12.15 landed
- 393430f57544 16.0 landed
- 14345f3c6a7b 14.8 landed
-
Fix object identity string for transforms
- 9a312562314a 16.0 landed
-
Add grantable MAINTAIN privilege and pg_maintain role.
- 60684dd834a2 16.0 cited
-
Get rid of recursion-marker values in enum AlterTableType
- 840ff5f451cd 16.0 cited
-
Release cache tuple when no longer needed
- ed0fbc8e5ac9 15.0 cited
-
Empty search_path in logical replication apply worker and walsender.
- 11da97024abb 14.0 cited
-
Refactor format_type APIs to be more modular
- a26116c6cbf4 11.0 cited
-
Use wrappers of PG_DETOAST_DATUM_PACKED() more.
- 3a0d473192b2 10.0 cited
Attachments
- 0003-Logical-replication-of-DDL-messages.patch (application/octet-stream) patch 0003
- 0005-Support-replication-of-CREATE-.-AS-.-and-SELECT-.-IN.patch (application/octet-stream) patch 0005
- 0002-Support-logical-logging-and-decoding-of-DDL-command-.patch (application/octet-stream) patch 0002
- 0001-Define-DDL-replication-levels-via-the-CREATE-PUBLICA.patch (application/octet-stream) patch 0001
- 0004-Enable-replication-of-CREATE-MATERIALIZED-VIEW-AS-st.patch (application/octet-stream) patch 0004
- 0008-Fail-replication-worker-on-DDL-command-that-rewrites.patch (application/octet-stream) patch 0008
- 0009-Support-replication-of-DDL-type-T_RenameStmt-table-r.patch (application/octet-stream) patch 0009
- 0007-Enable-logging-and-replication-of-DDLs-executed-insi.patch (application/octet-stream) patch 0007
- 0010-Handle-partitioned-table-creation-on-the-apply-worke.patch (application/octet-stream) patch 0010
- 0006-Add-couple-tests-for-DDL-replication-case.patch (application/octet-stream) patch 0006
- 0012-Support-replication-of-ALTER-TABLE-commands-that-rew.patch (application/octet-stream) patch 0012
- 0011-Remove-non-transactional-ddl-message-decoding-becaus.patch (application/octet-stream) patch 0011
On Wed, Jun 15, 2022 at 12:00 AM Amit Kapila <amit.kapila16@gmail.com> wrote: > > On Wed, Jun 15, 2022 at 5:44 AM Zheng Li <zhengli10@gmail.com> wrote: > > > > > > While I agree that the deparser is needed to handle the potential > > syntax differences between > > the pub/sub, I think it's only relevant for the use cases where only a > > subset of tables in the database > > are replicated. For other use cases where all tables, functions and > > other objects need to be replicated, > > (for example, creating a logical replica for major version upgrade) > > there won't be any syntax difference to > > handle and the schemas are supposed to match exactly between the > > pub/sub. In other words the user seeks to create an identical replica > > of the source database and the DDLs should be replicated > > as is in this case. > > > > I think even for database-level replication we can't assume that > source and target will always have the same data in which case "Create > Table As ..", "Alter Table .. " kind of statements can't be replicated > as it is because that can lead to different results. "Create Table As .." is already handled by setting the skipData flag of the statement parsetreee before replay: /* * Force skipping data population to avoid data inconsistency. * Data should be replicated from the publisher instead. */ castmt->into->skipData = true; "Alter Table .. " that rewrites with volatile expressions can also be handled without any syntax change, by enabling the table rewrite replication and converting the rewrite inserts to updates. ZJ's patch introduced this solution. I've also adopted this approach in my latest patch 0012-Support-replication-of-ALTER-TABLE-commands-that-rew.patch > The other point > is tomorrow we can extend the database level option/syntax to exclude > a few objects (something like [1]) as well in which case we again need > to filter at the publisher level I think for such cases it's not full database replication and we could treat it as table level DDL replication, i.e. use the the deparser format. > > So I think it's better to define DDL replication levels [1] to tailor > > for the two different use cases. We can use different logging format > > based on the DDL replication level. For example, > > we can simply log the DDL query string and the search_path for > > database level DDL replication. But for table level DDL replication we > > need to use the deparser format in order to > > handle the potential syntax differences and schema mapping requests. > > > > I think having different logging formats is worth considering but I am > not sure we can distinguish it for database and table level > replication because of the reasons mentioned above. One thing which > may need a different format is the replication of global objects like > roles, tablespace, etc. but we haven't analyzed them in detail about > those. I feel we may also need a different syntax altogether to > replicate such objects. Yes, global objects are not schema qualified so we probably don't need to use the deparser format for these. We plan to do some evaluation on replication of global objects. > Also, I think we may want to optimize the > current format in some cases so that the WAL amount could be reduced. > > I feel if we think that deparsing is required for this project then > probably at this stage it would be a good idea to explore ways to have > independent ways to test it. One way is to do testing via the logical > replication of DDL (aka via this patch) and the other is to write an > independent test suite as Sawada-San seems to be speculating above > [2]. I am not sure if there is any progress yet on the independent > test suite front yet. Testing DDL deparsing support has been discussed before in [1], we will also take a close look on it. [1] https://www.postgresql.org/message-id/5477FD78.1060306%402ndquadrant.com Regards, Zheng