Re: Support logical replication of DDLs
Amit Kapila <amit.kapila16@gmail.com>
From: Amit Kapila <amit.kapila16@gmail.com>
To: Alvaro Herrera <alvherre@alvh.no-ip.org>
Cc: Zheng Li <zhengli10@gmail.com>, Dilip Kumar <dilipbalaut@gmail.com>, PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>, rajesh.rs0541@gmail.com, Ajin Cherian <itsajin@gmail.com>, Hou, Zhijie/侯 志杰 <houzj.fnst@fujitsu.com>
Date: 2022-05-06T13:24:14Z
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
- v1-0001-Functions-to-deparse-DDL-commands.patch (application/octet-stream) patch v1-0001
- v1-0002-Support-DDL-replication.patch (application/octet-stream) patch v1-0002
On Fri, Apr 8, 2022 at 5:04 PM Alvaro Herrera <alvherre@alvh.no-ip.org> wrote: > > On 2022-Apr-08, Amit Kapila wrote: > > > On Thu, Mar 17, 2022 at 3:36 AM Alvaro Herrera <alvherre@alvh.no-ip.org> wrote: > > > For runtime conditions, one of the things you have mentioned in that > > thread is to add schema name in the statement at the required places > > which this patch deals with in a different way by explicitly sending > > it along with the DDL statement. > > Hmm, ok. The point of the JSON-blob route is that the publisher sends a > command representation that can be parsed/processed/transformed > arbitrarily by the subscriber using generic rules; it should be trivial > to use a JSON tool to change schema A to schema B in any arbitrary DDL > command, and produce another working DDL command without having to know > how to write that command specifically. > Attached is a set of two patches as an attempt to evaluate this approach. The first patch provides functions to deparse DDL commands. Currently, it is restricted to just a simple CREATE TABLE statement, the required code is extracted from one of the patches posted in the thread [1]. The second patch allows replicating simple CREATE TABLE DDL replication. To do that we used an event trigger and DDL deparsing facilities. While creating a publication, we register a command end trigger that deparses the DDL as a JSON blob, and WAL logs it. The event trigger is automatically removed at the time of drop publication. The WALSender decodes the WAL and sends it downstream similar to other DML commands. The subscriber then converts JSON back to the DDL command string and executes it. In the subscriber, we also add the newly added rel to pg_subscription_rel so that the DML changes on the new table can be replicated without having to manually run "ALTER SUBSCRIPTION ... REFRESH PUBLICATION". Some of the code related to WAL logging and subscriber-side work is taken from the patch posted by Zheng in this thread but there are quite a few changes in that as we don't need schema, role, transaction vs. non-transactional handling. Note that for now, we have hacked Create Publication code such that when the user specifies the "FOR ALL TABLES" clause, we invoke this new functionality. So, this will work only for "FOR ALL TABLES" publications. For example, we need to below to replicate the simple Create Table command. Publisher: Create Publication pub1 For All Tables; Subscriber: Create Subscription sub1 Connection '...' Publication pub1; Publisher: Create Table t1(c1 int); Subscriber: \d should show t1. As we have hacked CreatePublication function for this POC, the regression tests are not passing but we can easily change it so that we invoke new functionality with the syntax proposed in this thread or with some other syntax and we shall do that in the next patch unless this approach is not worth pursuing. This POC is prepared by Ajin Cherian, Hou-San, and me. Thoughts? [1] - https://www.postgresql.org/message-id/20150215044814.GL3391%40alvh.no-ip.org -- With Regards, Amit Kapila.