如何编写PostgreSQL逻辑解码插件
这篇文章主要讲解了“如何编写PostgreSQL逻辑解码插件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何编写PostgreSQL逻辑解码插件”吧!
1、以逻辑复制插件为例,先看一下它是怎么运行的:
创建逻辑槽,默认使用test_decoding插件:
pg_recvlogical --create-slot -S test_slot -d flying
可以根据需要指定其他解码插件,参数-P, --plugin=PLUGIN,更多信息 pg_recvlogical --help
查看一下
flying=# select * from pg_replication_slots; slot_name | plugin | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn -----------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+--------------------- test_slot | test_decoding | logical | 12635 | flying | f | f | | | 926 | 0/F05CA448 | 0/F05CA480
开始逻辑复制,这里直接打印到标准输出
pg_recvlogical --start -S test_slot -d flying -f -
给表a(col1 int)插入一条数据:insert into a values(100); 接收端开始输出:
quanzl-mac:bin quanzl$ ./pg_recvlogical --start -S test_slot -d flying -f - BEGIN 926 table public.a: INSERT: col1[integer]:100 COMMIT 926
这个插件更多是演示功能,有人解析它的结果用在生产环境,也是没问题的。新版本还有一个可以参考的插件pgoutput,源代码在src/backend/replication/pgoutput。
2、阅读理解代码,我们可以知道各部分怎样实现
(1)、初始化时设置回调函数 _PG_output_plugin_init
结合文档,理解结构体OutputPluginCallbacks各成员分别代表什么,即使没有注释也很容易理解。
(2)、复制启动参数
pg_recvlogical允许通过 -o 传递参数给插件,从startup_cb可以学习到如何定义我们自己需要的选项。
(3)、各动作解码,四种:begin、change、truncate、commit
尤其change动作,如何区分 INSERT/UPDATE/DELETE,包括如何正确引用对象名,识别空和TOAST,识别已删除字段等等。
(4)、还有一些test_decoding没用到的功能,比如如何找到复制键,默认为主键,也可以通过SQL命令设置:ALTER TABLE ... REPLICA IDENTITY ...
这种怎么办呢?打开与此有关的头文件,include/replication 下,根据注释和名字可以发现它就是 RelationGetReplicaIndex函数。
感谢各位的阅读,以上就是“如何编写PostgreSQL逻辑解码插件”的内容了,经过本文的学习后,相信大家对如何编写PostgreSQL逻辑解码插件这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!