简谈PostgreSQL的wal_level=logic

news/2024/7/9 23:12:12 标签: postgresql, 数据库

一、PostgreSQL的wal_level=logic的简介

`wal_level=logic` 是 PostgreSQL 中的一个配置选项,用于启用逻辑复制(logical replication)功能。逻辑复制是一种高级的数据复制技术,它允许您将变更(例如插入、更新和删除)从一个 PostgreSQL 数据库复制到另一个数据库,而不仅仅是将整个数据文件复制到另一个服务器。

启用逻辑复制后,PostgreSQL 将在事务日志(WAL)中记录更改,并将更改发送给订阅者,让其按照相同的顺序应用更改。这种方式可以更灵活地复制部分数据或特定类型的更改,并且可以在不同版本的 PostgreSQL 之间进行复制。

`wal_level=logic` 的配置选项告诉 PostgreSQL 使用逻辑复制模式。在此模式下,PostgreSQL 将在事务日志中记录完整的 SQL 语句,并将其发送给订阅者,从而使其能够准确地重现修改操作。

启用逻辑复制需要在主服务器和目标服务器上创建复制槽,并使用适当的命令来启动逻辑复制进程。一旦启用了逻辑复制,主服务器上的任何更改都将通过复制进程传输到目标服务器上。

逻辑复制在许多场景下很有用,例如实时数据备份、分布式系统和数据分析。它提供了更高级的复制和数据同步功能,使您能够更好地管理和利用 PostgreSQL 数据库的复制能力。

二、PostgreSQL开启wal_level=logic的步骤

要在 PostgreSQL 中启用逻辑复制(logical replication),您需要执行以下步骤:

1. 编辑 PostgreSQL 的配置文件 postgresql.conf。您可以使用命令 `sudo vim $PGDATA/postgresql.conf` 来打开文件。

2. 在配置文件中查找 `wal_level` 参数,并将其设置为 `logical`。如果找不到该参数,您可以在文件的末尾添加以下行:

wal_level = logical

或者直接在psql中执行

alter system set wal_level='logical';

 3. 保存并关闭配置文件。

4. 重新启动 PostgreSQL 服务器以应用更改。您可以使用以下命令重启 PostgreSQL 服务:

sudo systemctl restart postgresql

5. 确保您在主服务器和要进行逻辑复制的目标服务器上都启用了逻辑复制功能。您可以在 PostgreSQL 的配置文件中找到以下配置项,确保两个服务器上都已启用:

max_replication_slots = <desired_number_of_replication_slots>
max_wal_senders = <desired_number_of_wal_senders>

   `<desired_number_of_replication_slots>` 是您希望为逻辑复制使用的复制槽数量,`<desired_number_of_wal_senders>` 是您希望为逻辑复制使用的 WAL 发送进程数量。

6. 在主服务器上创建逻辑复制槽。您可以使用以下命令在主服务器上创建复制槽:

CREATE_REPLICATION_SLOT <slot_name> LOGICAL pgoutput;

   `<slot_name>` 是您为复制槽指定的名称。

7. 在目标服务器上创建逻辑复制槽。您可以使用以下命令在目标服务器上创建复制槽:

CREATE_REPLICATION_SLOT <slot_name> LOGICAL pgoutput;

   `<slot_name>` 是与主服务器上创建的复制槽名称相同的名称。

8. 启动逻辑复制进程。在目标服务器上,您可以使用以下命令启动逻辑复制进程:

START_REPLICATION SLOT <slot_name> LOGICAL <starting_position>;

   `<slot_name>` 是您在目标服务器上创建的复制槽名称,`<starting_position>` 是您希望从主服务器复制的起始位置。

现在,您已经成功地在 PostgreSQL 中启用了逻辑复制。主服务器上的更改将通过逻辑复制传输到目标服务器上。请注意,逻辑复制可能会对系统性能产生一定影响,因此在进行大规模的逻辑复制操作时,需谨慎评估系统的负载和性能。

三、开启wal_level=logical模式的优点

1. 灵活性:逻辑复制允许选择哪些表和数据进行复制。与物理复制相比,它提供了更大的灵活性,可以根据需求选择性地复制数据。

2. 多版本并发控制 (MVCC):逻辑复制可以在源数据库和目标数据库之间实现MVCC。这意味着源数据库在复制操作期间可以继续正常运行,不会阻塞其他事务的执行。

3. 跨版本兼容性:逻辑复制可以在不同版本的PostgreSQL之间进行复制。这对于升级或迁移数据库非常有用,可以在不同版本之间进行平滑的数据迁移。

4. 多节点复制:逻辑复制支持多节点复制,即一个源数据库可以同时复制到多个目标数据库。这可以实现数据的分发和同步,从而提供更高的可用性和数据复制的冗余。

5. 逻辑补充:逻辑复制可以补充物理复制的功能。它允许在源数据库和目标数据库之间执行更复杂的数据转换和处理,例如数据清理、数据过滤和数据转换等。

四、开启wal_level=logical模式的缺点

1. 性能开销:逻辑复制相对于物理复制来说,通常会有更大的性能开销。逻辑复制需要对数据进行解析、转换和重新构建,这会增加系统的负载和延迟。

2. 数据一致性:由于逻辑复制是基于逻辑解析和转换的,可能存在数据一致性的问题。在复制过程中,如果有复杂的数据转换或处理操作,可能会导致数据的不一致性。

3. 配置复杂性:逻辑复制的配置相对较复杂,需要进行更多的设置和参数调整。这可能需要更多的时间和努力来进行配置和管理。

4. 兼容性限制:逻辑复制可能对所使用的PostgreSQL版本和插件有一定的兼容性限制。不同版本之间的差异或插件的不兼容可能导致复制操作无法正常进行。

5. 数据库结构变更限制:逻辑复制对数据库结构变更有一定的限制。某些结构变更可能无法正确地复制,需要额外的手动操作或配置来实现。


http://www.niftyadmin.cn/n/5248480.html

相关文章

【力扣100】7.无重复字符的最长子串

添加链接描述 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 思路是使用队列&#xff0c;加入一次取一个最大值&#xff0c;然后如果重复&#xff0c;则队列出到没有重复值位置# 但是这个队列其实使用数组实现的strlist[]temp0result0if len(s)0:re…

视频号小店怎么选品?选品技巧及思维,教程如下!

我是电商珠珠 开通视频号小店后&#xff0c;除了定类目之外&#xff0c;最终的就是选品了。 很多人不知道怎么选品&#xff0c;特别是新手小白&#xff0c;做起来比较难一些。店铺也会很少有流量进入&#xff0c;没有流量曝光的话&#xff0c;店铺的销量就更不用提了。 我做…

ChatGPT的进化史

真正的人工智能可以变现的完全与人类一样思考时&#xff0c;世界会发生什么变化&#xff1f; ChatGPT就如它的名字一样&#xff0c;人类创造它最初的目的只是一个聊天机器人。聊天嘛&#xff0c;只要你和他对话时他的回答像人类一样自然就行了&#xff0c;看起来并没什么了不起…

java中什么是守护线程?

在 Java 中&#xff0c;线程分为两种类型&#xff1a;用户线程&#xff08;User Thread&#xff09;和守护线程&#xff08;Daemon Thread&#xff09;。 用户线程&#xff08;User Thread&#xff09;&#xff1a; 用户线程是应用程序中的主要线程&#xff0c;当所有的用户线程…

mybatisplus手动获取数据源执行非主数据库事务

mybatisplus手动获取数据源执行非主数据库事务 class A {// 事务管理器Resourceprivate DataSourceTransactionManager dataSourceTransactionManager;Autowiredprivate DataSource dataSource; // 最终是com.baomidou.dynamic.datasource.DynamicRoutingDataSource类型public…

企业阿里云多账号统一管理实践

新钛云服已累计为您分享777篇技术干货 1.多账号架构设计 使用阿里云资源目录RD&#xff0c;就像在一个大仓库中整理和分类存放物品一样&#xff0c;为了帮助我们建立一个清晰的云资源层级结构&#xff0c;基于资源目录可以方便地管理和查找所有的云资源&#xff0c;提高资源的利…

项目状态报告

《项目状态报告》 第1章 当前阶段的工作完成情况 1.1 概述 1.2 各子系统详细进度 第2章 偏差及偏差原因 第3章 偏差纠正措施 第4章 拟进行的变更 第5章 存在的风险及应对计划 第6章 下一阶段主要工作

python列出多重继承类的每个对象属性

1 python列出多重继承类的每个对象属性 1.1 列出实例属性 python通过__dict__列出实例属性。 &#xff08;1&#xff09; 实例.__class__&#xff1a;获取实例所属类。 &#xff08;2&#xff09; 类.__name__&#xff1a;获取类的名称。 &#xff08;3&#xff09; 实例.…