海量 11 需求 逻辑复制性能优化

1 简介 1.1 目的 逻辑复制是一种在多个数据库实例之间复制数据的功能,通常用于从一个数据库实例中,将针对指定表的insert、delete、update等写操作,复制到其他另一个数据库实例。在数据库术语中,统一称逻辑复制的发送方为发布端,称接收方为订阅端。Oracle、Postgresql、Vastbase等数据库产品,均提供逻辑复制功能。 当前版本,逻辑复制性能较低,以tpcc场景为例,发布端40w tmpc时,订阅端的复制速度约10m/s。在滚动升级等场景,通过逻辑复制在不同实例间同步大量数据,要求逻辑复制性能达到70-100m/s。 发布端、订阅端均存在性能瓶颈,均需要优化。但是,由于交付时间较短,以及订阅端方案仍有瑕疵等因素,本版本交付发布端性能优化,下版本交付订阅端性能优化。 1.2 适用范围 本文主要用于向开发、测试等角色,介绍G100 3.0.9 psu2及之后版本,逻辑复制的性能优化的设计方向与使用方法。 1.3 术语定义、首字母缩写词和缩略语 发布端:逻辑复制场景,发送数据方。 订阅端:逻辑复制场景,接收数据方。 1.3 参考资料 Vastbase G100产品文档中逻辑复制使用介绍:https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6 2 G100审计功能重构 2.1 功能简述 需求背景:逻辑复制使用 使用逻辑复制的流程如下: 发布端:配置逻辑复制 # 设置wal日志详细级别,设计身份等参数,重启集群 gs_guc set -D $PGDATA -c 'wal_level=logical' gs_guc set -D $PGDATA -h "host all all 0.0.0.0/0 md5" gs_guc set -D $PGDATA -h "host replication all 0.0.0.0/0 md5" vb_ctl restart -D $PGDATA 发布端:创建表 CREATE TABLE pt1(c1 INT,c2 TEXT); CREATE TABLE pt2(c1 INT, c2 TEXT); 发布端:创建发布,即指定哪些表需复制 CREATE PUBLICATION pub1 FOR TABLE pt1,pt2; 发布端:创建逻辑复制槽,用于存储复制状态等信息 ...

February 6, 2026 · 2 min · 298 words · Me

海量 透明加密 设计

1 透明加密 1.1 功能简述 关于透明加密的基本概念,请看需求文档。 用户使用透明加密的示例如下: CREATE TABLE t1 (c1 TEXT, c2 TEXT); CREATE ENCRYPTION KEY tde_key WITH (source=local, password='pass.123'); CREATE ENCRYPTION POLICY ep1 FRO t1 KEY tde_key; INSERT INTO t1 VALUES ('data1', 'data2'); INSERT INTO t1 VALUES ('data1', 'data2'); SELECT * FROM t1; 1.2 实现方案 1.2.1 整体架构 透明加密的核心目标,是通过数据加密方案,解决攻击者绕过数据库安全机制,直接从磁盘窃取数据的问题。 在加密数据后,需要确保不影响内核在数据上进行计算。因此,需要在存储层底层,对数据进行加密。另外,为确保存储底层能够识别哪些数据加密,哪些数据不加密,以及使用什么算法加密等,上层需传递加密信息。透明加密逻辑架构如下: 1.2.2 工作流程 为适配存储底层设计,同时兼顾加密性能,以Page为粒度进行加密,并且,在Page中,存储加密信息。 1.2.3 详细流程 一、启动进程 在启动进程阶段,故障恢复时,如果回放到属于加密表的xlog,涉及到解密Page,因此,需在故障恢复前加载密钥。 main # 1. 启动数据库进程(基于pg-16代码) PostmasterMain # 2. 启动postmaster进程 SelectConfigFiles # 3. 读取GUC文件 'tde_load_encryption_key' # 4. 读取密钥文件(后文介绍密钥如何生成) SysLogger_Start StartupDataBase # 5. 开始故障恢复 StartupProcessMain StartupXLOG ReadControlFile PerformWalRecovery for loop: ReadRecord # 6. 读取xlog ApplyWalRecord # 7. 重放xlog GetRmgr.rm_redo ... heap_xlog_insert XLogReadBufferForRedo XLogReadBufferForRedoExtended XLogReadBufferExtended ReadBufferWithoutRelcache ReadBuffer_common smgrread # 8. 读取数据文件 # 需解密,后文统一介绍 ServerLoop for loop: ConnCreate BackendStartup BackendRun PostgresMain # 9. 启动postgres进程 StartCheckpointer StartBackgroundWriter StartChildProcess AuxiliaryProcessMain BackgroundWriterMain # 10. 启动bgwriter进程 二、生成密钥 当前版本,所有表,使用同一个数据密钥。因此,暂时无需新增系统表,存储密钥对象。 ...

March 23, 2026 · 3 min · 545 words · Me

海量 透明加密 需求

1 简介 1.1 目的 透明加密特性提供数据加密功能,核心原理是在数据库将数据存储至磁盘时,先加密再存储。 本需求将从0设计透明加密特性,在保障功能、性能、易用性、可用性、可维护性、可扩展性等的前提下,让特性达到商用标准。 1.2 适用范围 Vastbase V5版本。 1.3 术语定义、首字母缩写词和缩略语 TDE:Transparent Data Encryption,透明数据加密,由数据库提供的数据加密特性 1.4 参考资料 oracle 透明加密特性:https://docs.oracle.com/en/database/oracle/oracle-database/26/dbtde/preface.html sql server 透明加密特性:https://learn.microsoft.com/en-us/sql/relational-databases/security/encryption/transparent-data-encryption?view=sql-server-ver17 oceanbase 透明加密特性:https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475958 kingbase 透明加密特性:https://docs.kingbase.com.cn/cn/KES-V9R1C10/safe/transparent-data-Encyption dm8 透明加密特性:https://eco.dameng.com/document/dm/zh-cn/pm/storage-encryption.html#7.1.1%20%E5%85%A8%E5%BA%93%E5%8A%A0%E5%AF%86 gaussdb 透明加密特性:https://support.huaweicloud.com/intl/zh-cn/fg-gaussdb-dist-v8/gaussdb-18-0019.html 2 透明加密 2.1 功能简述 一、基本原理 通常,用户将数据传输给数据库后,数据库将数据存储到磁盘。攻击者可能利用多种数据库内部或外部漏洞,例如操作系统漏洞等,绕过数据库安全机制,直接从磁盘读取数文件,窃取用户数据。 透明加密,是一种由数据库提供的加密特性,可有效解决攻击者从磁盘窃取数据的问题。开启透明加密后,数据库将数据存储到磁盘时,先加密数据,再存储数据密文;数据库从磁盘读取数据时,先解密数据密文,再进行其他计算。用户访问透明加密表时,包括存储、读取数据等,与访问普通表无任何区别,加密和解密过程由数据库自动完成,即对用户透明。 二、竞品分析 几乎所有商用关系数据库中,都支持透明加密特性,包括oracle, sql server, oceanbase, kingbase, dm8等,postgresql不支持透明加密特性。 使用透明加密时,通常包括3个阶段: 定义用于加密的密钥 使用SQL语法,定义哪些对象需加密,不同产品,定义加密对象的粒度不同 使用SQL语法,访问透明加密表,以及进行其他运维等操作 各产品中,定义加密对象的SQL语法如下: -- 一、oracle CREATE TABLE t1(c1 INT, c2 TEXT ENCRYPT); CREATE TABLESPACE ts1 DATAFILE .. ENCRYPTION USING 'AES192' ENCRYPT; -- 二、sql server CREATE DATABASE ENCRYPTION KEY WITH ALGORITHM = AES_256 .. ALTER DATABASE db1 SET ENCRYPTION ON; -- 三、oceanbase CREATE TABLESPACE ts1 encryption = 'y'; -- mysql cmpt CREATE TABLESPACE ts1 ENCRYPTION USING 'aes-256'; -- oracle cmpt -- 四、kingbase CREATE TABLESPACE ts .. WITH (ENCRYPTION = TRUE); CREATE TABLE ts .. ENCRYPTED BY 'this is a key'; -- 五、dm8 intdb .. ENCRYPT_NAME .. CREATE TABLESPACE .. ENCRYPT WITH .. CREATE TABLE t1 (c1 INT, c2 INT ENCRYPT WITH ..); -- 六、gaussdb CREATE TABLE t1 .. WITH (enable_tde=on); 各产品中,按定义加密对象的粒度,区别如下: ...

March 20, 2026 · 5 min · 916 words · Me

海量 mac 设计

1 强制访问控制 1.1 功能简述 从实现的角度看,当用户执行SQL时,强制访问控制主要实现以下功能: CREATE ACCESS POLICY ..:在系统表中,记录ACCESS POLICY,以及其中的LABLE等信息 CREATE TABLE ..:创建表时,如果设置acess_policy字段,则自动为表新增1列隐藏列,列名为access_label INSERT ..:向表插入数据时,根据当前用户的write_label,自动为数据生成access_label列的值。 SELECT ..:从表查询数据时,根据当前用户的read_label,自动为查询语句添加过滤条件has_mac_permission(access_label, read_label) 另外,如果为表设置访问策略,需在索引中同时设置访问策略: CREATE INDEX ..:自动为索引新增1列,列名为access_label 对于一些其他语法,也许单独适配,包括: COPY ..:自动修改旧数据的access_label值 1.2 实现方案 1.2.1 整体流程 本文重点从源码角度,介绍强制访问控制策略如何基于隐藏列,实现强制访问控制,包括:创建、填充、匹配隐藏列等流程。 核心功能的大致流程如下: User Vastbase Disk +---------------------------------------------------+---------------------------------------------------------+ # 管理员 | 1. CREATE ACCESS POLICY .. LEVEL .. LABEL .. --> | | 2. 存储access policy至系统表vb_access_policy --> | 3. 存储access level至系统表vb_access_level --> | 4. 存储access label至系统表vb_access_label --> | 5. CREATE TABLE .. (access_policy=..) --> | | 6. 识别是否设置access_policy | 7. 自动添加隐藏列access_label | 8. 存储access_policy至系统表pg_class --> | 9. 存储accessl_label定义至系统表pg_attribute --> | 10. CREATE USER .. ACCESS POLICY .. READ LABEL .. WRITE LABEL --> | | 11. 存储access_policy, read_label, write_label至系统表pg_authid --> # 普通用户 | 12. vsql -U username -W password --> | | 14. set read_label = .. / write_label = .. --> | | 15. 查询pg_authid,判断read_label/write_label是否合法 <-- | 16. 设置临时的read_label/write_label | 17. 如何用户未自动设置read_label/write_label,自动根据pgauthid设置 | 18. INSERT .. --> | | 19. 查询pg_class,判断表是否有access_policy <-- | 20. 自动为隐藏列赋值,取值为write_label | 21. SELECT .. --> | | 22. 查询pg_class,判断表是否有access_policy <-- | 23. 语义分析 | 24. 查询重写:自动新增过滤条件:WHERE has_mac_permission(access_label, read_label) | 24. 计划执行:扫描Tuple,根据过滤条件,过滤不满足权限检查的Tuple 1.2.2 详细流程 一、创建策略 当用户创建策略时,例如: ...

March 23, 2026 · 4 min · 759 words · Me

海量 mac 需求

1 简介 1.1 目的 本文主要包括以下关键内容: 介绍访问控制的基本概念 调研其他厂商实现强制控制的方式 设计Vastbase强制访问控制特性,介绍如何使用强制访问特性 1.2 适用范围 Vastbase V5版本。 1.3 术语定义、首字母缩写词和缩略语 MAC:Mandatory Access Control,强制访问控制,主体访问客体时,基于主体、客体属性,强制控制访问权限。 DAC:Discretionary Access Control,自主访问控制,数据拥有者可自行设置访问权限。 1.4 参考资料 oracle 强制访问控制(标签访问控制 RLS):https://docs.oracle.com/en/database/oracle/oracle-database/26/olsag/part1.html#GUID-C20C62AE-2A30-45F9-AEEA-52A0D3286FBA oceanbase 强制访问控制(兼容oracle):https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000004475944 kingbase 强制访问控制:https://bbs.kingbase.com.cn/kingbase-doc/v8.6.7.24/safety/safety-guide/label-and-mac.html dm 强制访问控制:https://eco.dameng.com/document/dm/zh-cn/pm/mandatory-access-control.html GB/T-20009-数据库管理系统安全评估准则:https://drive.weixin.qq.com/s?k=AHUAfwdSAA82aDcvvD postgresql 行级访问控制 RLS:https://www.postgresql.org/docs/current/ddl-rowsecurity.html 2 强制访问控制 2.1 功能简述 一、基本概念 访问控制的定义:对主体访问客体的行为,系统按照安全策略进行限制与管理的安全机制。 按安全策略分类,可将访问控制分为很多类,其中,常见的策略有: 自主访问控制DAC:客体的拥有者,可自行向其他主体赋予访问权限。 强制访问控制MAC:系统为主体、客体分配安全标签,通过主体、客体的安全标签控制访问权限,很多情况下,即使客体的拥有者也无法向其他主体赋予访问权限。 角色访问控制RBAC:不在本文讨论范围。 在数据库领域,主体通常指数据库用户,客体通常指数据库对象,例如DATABASE、SCHEMA、TABLE、COLUMN、ROW、FUNCTION等。 自主访问控制比较成熟,几乎所有关系数据库,都提供自主访问控制特性,例如,TABLE(客体)的属主(主体),可通过GRANT .. TO ..等语法,为其他用户(主体)赋予权限。 强制访问控制理论比较成熟,但是,除oracle支持强制访问控制,以及oceanbase等几款产品兼容oracle强制访问控制之外,大部分关系数据库不支持强制访问控制。 实现强制访问控制时,通常将主体、客体的安全标签,简化为安全等级,当主体访问客体时,比较主体、客体等级高低,以判断访问权限。在机密性场景,遵循不上读、不下写原则。在完整性场景,遵循不下读、不上写原则。 本需求将从0设计强制访问控制特性,在保障功能、性能、易用性、可用性、可维护性、可扩展性等的前提下,让特性达到商用标准。 二、竞品分析 oracle支持强制访问控制,客体是ROW,即行级强制访问控制。oceanbase、kingbase、dm的访问控制,与oracle一致。sql server、postgresql等其他产品不支持强制访问控制。 oracle强制访问控制使用示例如下: -- 1 定义策略 SA_SYSDBA.CREATE_POLICY(policy_name => 'p1', column_name => 'lab_col1') -- 2 定义级别 SA_COMPONENTS.CREATE_LEVEL(policy_name => 'p1', level_num => 1, short_name => 'x1', long_name => 'x1'); SA_COMPONENTS.CREATE_LEVEL('p1', 20, 'x2', 'x2'); SA_COMPONENTS.CREATE_LEVEL('p1', 30, 'x3', 'x3'); -- 3 定义组件 SA_COMPONENTS.CREATE_LEVEL(policy_name =>'p1', comp_num => 100, short_name => 'sec', long_name => 'security'); SA_COMPONENTS.CREATE_LEVEL('p1', 200, 'stg', 'storage'); -- 4 创建标签 SA_SYSDBA.CREATE_LABEL(policy_name => 'p1', label_tag => 'sec_normal', label_value => 'x1:security', data_label => TRUE); SA_SYSDBA.CREATE_LABEL('p1', 'sec_leader', 'x3:security', false); -- 5 为主体设置属性 SA_USER_ADMIN.SET_LEVELS(policy_name => 'p1', user_name => 'user1', max_level => 'x2', min_level => 'x1', default_level => 'x1', row_level => 'x1'); SA_USER_ADMIN.SET_COMPARTMENTS(policy_name => 'p1', user_name => 'user1', read_comps => 'sec', write_comps => 'sec', default_comps => 'sec', row_comps => 'sec'); -- 6 为客体设置属性 CREATE TABLE t1(c1 INT); SA_USER_ADMIN.APPLY_TABLE_POLICY(policy_name=> 'p1', shema_name => 's1', table_name => 't1', table_options => 'READ_CONTROL, WRITE_CONTROL, CHECK_CONTROL', label_function => 'f_create_t1_label(level, comp)'); -- 7 插入数据(主动定义标签) INSERT INTO t1 (c1, lab_col1) VALUES (1, CHAR_TO_LABEL('p1', 'x1:sec')); 三、实现思路 在数据库领域,除oracle外,没有其他可借鉴的方案。oracle的设计,太复杂,易用性太低。 本需求将参考oracle的思想,简化oracle设计。 ...

March 23, 2026 · 6 min · 1130 words · Me

海量 15 设计 逻辑复制性能优化

1 逻辑复制性能优化 1.1 功能简述 原理: 假设,发布端执行INSERT INTO t1 VALUES(1,'data1'),更改1行数据,产生1条wal日志。逻辑复制功能将读取这条wal,解码并生成1条message,将message发送至订阅端。订阅端应用这条message,等价于重新执行INSERT INTO t1 VALUES(1,'data1')。 问题: 308.1 psu1以及之前版本,逻辑复制性能较低。以tpcc场景为例,40w tmpc时,发布端产生wal日志速度约100m/s,订阅端的复制速度约10+m/s。 客户: 滚动升级场景中,备机停机升级,主机持续执行业务,备机升级后使用逻辑复制追赶主机数据。长存客户场景,主机产生wal日志速度约40-50m/s,旧版本逻辑复制速度10+m/s,由于逻辑复制速度太慢,备机无法追赶主机,最终导致升级失败。 优化 本需求设计与实现并行逻辑复制机制,大幅提高逻辑复制速度,在上述场景中,订阅端速度可达到70-90m/s。并行逻辑复制分为3个关键子机制: 发布端多线程并行解码 发布端与订阅端流复制传输协议 订阅端多线程并行应用 1.2 实现方案 本章分3个章节,分别介绍3个关键子机制。 1.2.1 发布端并行解码机制 在旧版本中,发布端采用串行解码机制,只有1个walsender线程,串行执行:1次读取1条wal日志,解码1条wal生成1条message,缓存或发送message。 旧版本代码中,发布端有实现并行解码的代码,但是,无法直接使用,订阅端只能是工具,不能是数据库实例,且存在大量问题。本需求基于旧版本并行解码,实现权限的并行解码机制。 并行解码机制,将启动多个线程,包括1个reader、多个decoder、1个walsender,它们的功能如下: reader:1次读取1条wal日志,将wal发送给decoder decoder:1次接收1条reader发送的wal,解码生成message,将message发送给walsender walsender:1次接收1条decoder发送的message,将message发送给订阅端 线程架构图如下: lsn 1-10 d1 1 4 collect 阻塞 1 d2 2 5 2 d3 3 6 3 1.2.2 发布端与订阅端流复制协议 一、握手阶段 订阅端与发布端建立连接时,订阅端会根据CRETE SUBSCRIPTION语法设置的参数,生成连接命令,根据连接命令,发布端和订阅端决定采用哪种通信协议,究竟是采用事务复制协议(旧版本)还是流复制协议(新版本)。 事务复制协议(旧版本) 订阅端发送的连接命令如下: START_REPLICATION SLOT "$slot_name" LOGICAL $start_lsn (proto_version '3', publication_names '"$publication_name"') 流复制协议(新版本) 如果CRETE SUBSCRIPTION时,指定worker_number>1,即启用并行逻辑复制机制,将使用新的连接命令,订阅端发送的连接命令如下: START_REPLICATION SLOT "$slot_name" LOGICAL $start_lsn (proto_version '3', publication_names '"$publication_name"', streaming 'extreme', parallel-decode-num '20', max-recordbuffer-in-memory '100', max-txn-in-memory '100') 上述命令中新增了多个参数: ...

May 6, 2026 · 6 min · 1200 words · Me

海量 15 需求 逻辑复制性能优化

1 简介 1.1 目的 逻辑复制是一种在多个数据库实例之间复制数据的功能,通常用于从一个数据库实例中,将针对指定表的insert、delete、update等写操作,复制到其他另一个数据库实例。在数据库术语中,统一称逻辑复制的发送方为发布端,称接收方为订阅端。Oracle、Postgresql、Vastbase等数据库产品,均提供逻辑复制功能。 当前版本,逻辑复制性能较低。以tpcc场景为例,发布端40w tmpc时,产生wal日志速度约100+m/s,订阅端的复制速度约10+m/s。在滚动升级场景,主机和备机可能是不同的产品版本,主备复制数据时,不能使用物理复制,只能使用逻辑复制。在长存客户场景中,主机产生wal日志速度在50+m/s左右,备机使用逻辑复制,复制速度约10+m/s,备机将追赶不上主机进度,导致滚动升级失败。 主a 备b 备c +-----------------------+---------------------------+----------------------------- |1 ==>执行业务 |2 开始滚动升级,暂停流复制 lag=400M |3 暂停流复制(物理复制) |4 创建逻辑复制槽 lsn1=1G |5 恢复流复制 |6 物理复制追赶,到逻辑复制槽 |6 开始单节点升级 |7 [升级] 停止进程 |8 [升级] 替换二进制等 |9 [升级] 启动进程 |10 单节点升级成功 |11 持续执行业务 lsn2=2G |12 创建订阅,启动逻辑复制,lsn1=1G |13 逻辑复制开始追赶(初始差距:lsn2-lsn1) |14 持续执行业务 lsn3=2.5G |15 逻辑复制持续追赶 lsn=1.6G |16 (可重置lag) |17 差距持续缩小(从lsn2-lsn1降低到lag) |18 发送停机命令 |19 停止业务 |20 差距持续缩小,从lag缩小至0 |21 停止进程成功 因此,需大幅提高逻辑复制速度,在长存客户场景中,逻辑复制速度至少需达到70+m/s。目前,发布端、订阅端均存在性能瓶颈,均需要优化。 1.2 适用范围 G100 3.0.9 psu2及之后版本 1.3 术语定义、首字母缩写词和缩略语 发布端:逻辑复制场景,发送数据方。 订阅端:逻辑复制场景,接收数据方。 1.4 参考资料 Vastbase G100产品文档中逻辑复制使用介绍:https://docs.vastdata.com.cn/zh_CN/VastbaseG100/V3.0.8/1/f5c2ae8eb9744d429ad39c02438addf6 oracle goldengate并行复制:https://oracle.hydrogen.sagittarius.connect.product.adaptavist.com/en/database/goldengate/core/26/coredoc/replicat-parallel-replicat.html#GUID-F1CD8E03-8DA1-4A78-95D3-C0516F1DA09A 2 逻辑复制性能优化 2.1 功能简述 一、逻辑复制使用示例 使用逻辑复制,可概括为3个阶段: ...

May 6, 2026 · 4 min · 715 words · Me

G100学习笔记

G100学习笔记 1. page相关 1.1 page的关键数据结构 typedef struct { PageXLogRecPtr pd_lsn; /* 当前页的最后一次修改对应的WAL记录的LSN */ uint16 pd_checksum; /* 当前页的checksum校验和,用来维护页面的完整性,使用特定的算法生成固定大小的值,在写入时计算,读取时校验,读取时计算checksum,与本记录比对 */ uint16 pd_flags; /* 页状态标志位 */ uint16 pd_lower; /* }

September 11, 2026 · 1 min · 27 words · Me

Babelfish搭建指南

Babelfish 编译环境搭建指南 适用环境:CentOS 7,离线环境,vastbase-server + sqlserver-extensions 一、创建用户 # 创建用户并设置密码 useradd vast echo "vast:gauss@123" | chpasswd # 授予 sudo 权限(加入 wheel 组) usermod -aG wheel vast # 验证 id vast 二、配置环境变量 将以下内容写入 ~/.bash_profile,每次登录自动生效: cat >> ~/.bash_profile << 'EOF' # Babelfish 基础路径 export BABELFISH_HOME=~/vastbase-server/install export BINARYLIBS=~/vastbase-server/binarylibs export GCC_PATH=$BINARYLIBS/buildtools/gcc7.3 # 编译器 export CC=$GCC_PATH/gcc/bin/gcc export CXX=$GCC_PATH/gcc/bin/g++ # cmake(优先使用项目自带版本,放在 PATH 最前面) export PATH=$BINARYLIBS/buildtools/cmake/bin:$GCC_PATH/gcc/bin:$BABELFISH_HOME/bin:$PATH # 动态库路径 export LD_LIBRARY_PATH=$GCC_PATH/gcc/lib64:$BABELFISH_HOME/lib:$BINARYLIBS/kernel/dependency/openssl/comm/lib:$LD_LIBRARY_PATH # cmake 变量(防止 Makefile 调用系统旧版本) export cmake=$(which cmake) # PG 相关 export PG_CONFIG=$BABELFISH_HOME/bin/pg_config export PG_SRC=`pwd` EOF source ~/.bash_profile 验证工具版本: ...

February 27, 2026 · 3 min · 470 words · Me

避免用户错误使用到pg插件

基本概念 这里是融合版的一个需求,属于兼容性需求类别,主要实现的是一个黑名单,是要把一个列表中的多个插件不允许在MSSQL兼容安装包中出现,或只能在5432端口(PG模式)中使用,不能在1433端口(MSSQL模式)中使用。 初步分析 根据需求列表,可以基本将需要修改的插件分为三类: 禁止在双端口安装使用; 在5432端口允许使用,1433端口禁止安装使用; 双端口都允许使用; 其中,需求描述特别提到,允许在编译阶段进行修改,由此可以对应的提出三类插件的修改方案: 在编译阶段不安装,也就是在contrib/Makefile中的SUBDIR安装插件,删除这些不允许在双端口安装的插件; 在hooks.c中增加一个名单,名单中包含这些允许在5432不允许在1433安装的插件,首先检测当前dialect是否为tsql,如果为tsql,检查是否是T_CreExtensionStmt,如果是则检查插件名单是否在这个名单之内,如果没有则放行,有则报错; 不做任何处理; 理论上,以上方案实施后,能够达到双端口不可用则直接无法找到插件,用户自行安装则不保证可能出现的任何问题;对于5432可用1433不可用,会进行报错;其他类型不做处理;应该可以达到需求描述的目的实现; 边界考虑 由于删除了某些插件编译且对某些插件在一定场景进行了屏蔽,考虑数据库升级场景,如果以前使用过此插件,现在进行了屏蔽,可能导致升级失败; 灵活性 现在的屏蔽方式是使用直接修改编译文件与硬编码名单的方式实现,如果在一个版本内,由于某些特殊原因想启用已屏蔽的插件,则在当前版本是无法实现的。如果将名单作成guc参数,则可以提供灵活性,但是一旦被手动篡改,则无法预料可能产生的问题;

February 25, 2026 · 1 min · 16 words · Me
心情不好的时候可以点一下 🐱
×
🤖 Doubao AI ×
Hi! 我是你的技术助手。关于代码、架构或 Bug,随时问我!🚀