# PostgreSQL vector数据同步到RDS for PostgreSQL
#### 场景描述
在电商推荐、内容搜索、大模型知识库问答及多模态检索等业务中，语义检索发挥着关键作用。其基础是向量数据：嵌入模型将文本、图像等数据转化为高维向量，再通过计算向量间的相似度来衡量语义。通过安装vector插件，PostgreSQL可支持vector、halfvec、sparsevec等向量类型与ivfflat、hnsw等向量索引，使企业能够在一套数据库中统一管理业务数据与向量数据、直接开展向量检索，无需另建专用向量数据库。
数据复制服务（DRS）支持将本地IDC自建、ECS自建及云上PostgreSQL中的向量数据同步至华为云RDS for PostgreSQL，使企业可获得托管高可用、与云上AI应用低时延协同、跨区域就近访问及异地容灾等收益。
本实践通过数据复制服务DRS，将本地 IDC自建PostgreSQL中的向量数据迁移至华为云RDS for PostgreSQL；借助全量+增量同步，实现源库与目标库向量数据的长期实时同步，支撑业务平滑割接。若源库为其他云PostgreSQL或华为云RDS for PostgreSQL，整体操作类似，详细差异请参考"其他源库场景差异"。
#### 迁移原理
本实践使用全量+增量同步，原理如下：
- 全量同步前，DRS启动增量数据抽取（默认使用源库test_decoding逻辑解码获取实时增量数据），确保全量期间的增量数据完整抽取到DRS实例。
- 全量同步阶段，DRS迁移表结构（含向量列类型与维度）与数据至目标库，向量索引随表结构一并迁移。
- 全量完成后自动进入增量同步，从全量抽取位点开始回放并持续同步，将源库向量数据的INSERT/UPDATE/DELETE实时同步至目标库，保持源库与目标库数据持续一致。
- 增量同步阶段时延趋于 0（数据追平）后，可启动数据对比任务校验源库与目标库的一致性。
- 数据对比一致后，即可启动业务割接（建议在业务低峰期进行）。
图1迁移原理流程图   
![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002753279469.png)
DRS将vector类型作为常规PostgreSQL数据类型处理，任务无需为vector做额外配置；目标库预先安装vector插件即可接收向量数据。同步对象选择表级同步时，DRS不会在目标库自动安装vector，需由您在同步前手动安装（见"源库与目标库准备"）。
#### 服务列表
- 虚拟私有云 VPC
- 云数据库 RDS for PostgreSQL
- 数据复制服务 DRS
- 数据管理服务 DAS
 
#### 前提条件
- 拥有华为云实名认证账号，账户余额大于等于0元。
- 已知源库的IP地址、端口、账号和密码。
- 源库已配置逻辑复制：wal_level=logical、test_decoding 逻辑解码插件可用、账号具备REPLICATION权限。
 
#### 规划与选型建议
迁移前完成以下规划。各项给出推荐与选择依据，您可按实际业务调整。
表1规划与选型建议 
| 规划项        | 推荐                       | 说明                                                                                                                                                |
|:---|:---|:---|
| VPC与Region | 与目标RDS、DRS实例同Region同VPC  | 同VPC内通信时延最低；跨Region需打通对等连接。                                                                                                                       |
| 源库账号       | 具备REPLICATION与表SELECT等权限 | 最小权限见"源库与目标库准备"。                                                                                                                                  |
| 目标库版本      | 不低于源库版本且不低于PostgreSQL 12 | 华为云 RDS for PostgreSQL支持vector的最低版本为PostgreSQL 12。                                                                                                |
| RDS实例类型    | 生产环境推荐主备                 | 主备提供高可用与故障切换；单机仅适用于非生产验证。                                                                                                                         |
| RDS规格      | 按数据量与并发选择                | 数据量大或含大字段（如 bytea/text）的表建议选择较高规格，避免同步时的内存压力。                                                                                                     |
| RDS存储      | 按源库数据量预估并预留余量            | 全量初始化并发写入会使目标表空间略大于源；另需预留增量WAL空间。                                                                                                                 |
| RDS端口      | 5432（默认，可修改）             | 修改后需在安全组与DRS连接配置中一并更新。                                                                                                                            |
| 网络类型       | 按源库位置选择                  | 源库在华为云同VPC选VPC网络；IDC或跨云选公网网络（源库须绑EIP）或VPN/专线网络。三种均支持，公网会产生数据传输费用。                                                                                 |
| DRS同步实例规格  | 按数据量与同步时效选择              | 规格类型对应不同性能上限，数据量大或要求低时延建议选择较高规格。 详见[实时同步链路规格说明](https://support.huaweicloud.com/productdesc-drs/drs_01_0314.html)。 |
| DRS同步模式    | 全量+增量                    | 先全量迁移存量数据，再持续增量同步，保持源库与目标库长期一致；本实践选用全量+增量。                                                                                                        |
   
#### 操作流程
主要任务流程如下：
1. 创建VPC。
2. 创建安全组。
3. 创建RDS for PostgreSQL实例。
4. 源库与目标库准备。
5. 创建DRS同步任务。
6. 同步后数据校验。
 
#### 创建 VPC
创建VPC，为RDS实例与DRS同步实例准备网络资源。
1. 登录[华为云控制台](https://console.huaweicloud.com)，单击管理控制台左上角选择区域。
2. 单击左侧服务列表图标，选择"网络 \> 虚拟私有云 VPC"。
3. 单击"创建虚拟私有云"，配置基本信息：区域、可用区、VPC名称、VPC网段（如 192.168.0.0/16）、子网名称、子网网段（如 192.168.0.0/24），单击"立即创建"。 
   图2创建虚拟私有云   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002724792800.png)
   
   
4. 返回 VPC 列表，当 VPC 状态为"可用"时，表示创建完成。
 
#### 创建安全组
创建安全组，为RDS实例配置访问控制规则，放通DRS与业务访问。
1. 登录[华为云控制台](https://console.huaweicloud.com)，选择区域。
2. 服务列表选择"网络 \> 虚拟私有云 VPC"。
3. 选择"访问控制 \> 安全组"，单击"创建安全组"，填写安全组名称等信息，单击"确定"。
4. 返回安全组列表，单击安全组名称，选择"入方向规则"，单击"添加规则"，配置入方向规则放通DRS访问（协议TCP、端口5432、源地址填DRS实例IP或所在子网网段）。 
   图3配置安全组入方向规则   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002754352627.png)
   
   
 
#### 创建RDS for PostgreSQL实例
1. 登录[华为云控制台](https://console.huaweicloud.com)，选择区域。
2. 服务列表选择"数据库 \> 云数据库 RDS"。
3. 单击"购买数据库实例"。
4. 配置实例基本信息：引擎选PostgreSQL；版本选不低于源库版本且不低于PostgreSQL12（需支持vector）；实例类型选择主备；选择规格、存储类型与容量、可用区；选择上文创建的VPC与安全组；配置数据库端口（默认5432，可修改）与管理员账号密码；参数模板可选默认或自定义。 
   图4购买RDS for PostgreSQL实例   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002724632860.png)
   
   
5. 单击"立即购买"，确认信息并提交。
6. 返回实例列表，当实例状态为"正常"时，表示创建完成。实例内网地址与端口在"实例管理 → 实例 → 连接管理 → 连接信息"查看，供DRS填写目标库信息。 
   实例购买与各项配置详见[购买RDS for PostgreSQL实例](https://support.huaweicloud.com/usermanual-rds-pg/rds_pg_10_0028.html)。
   
   
 
#### 源库与目标库准备
- **源库配置逻辑复制**
  1. 修改源库postgresql.conf，确认以下参数，修改后重启PostgreSQL。
     ```
     wal_level = logical
     max_replication_slots = 10   # 须大于当前已用复制槽数，请按实际调整
     max_wal_senders = 10         # 须大于或等于 max_replication_slots
     ```
     
  
  2. 修改pg_hba.conf，在所有配置前增加一行，放通DRS以 replication方式连接（认证方式按源库password_encryption参数值选择scram-sha-256或md5）。
     ```
     host replication <账号名> <DRS实例IP>/32 md5
     ```
     DRS实例IP在创建同步任务（见"创建DRS同步任务"）时由DRS分配。建议先创建同步任务至"同步实例"步骤获取DRS实例IP，回填此处后以UPERUSER执行select pg_reload_conf(); 重新加载（或重启PostgreSQL），再返回任务继续配置源库连接测试。
     
  
  3. 确认test_decoding逻辑解码可用（创建临时复制槽验证，未报"无法访问test_decoding"的错误即表示支持，验证后删除）：
     ```
     SELECT * FROM pg_create_logical_replication_slot('temp_decoding_slot', 'test_decoding', true);
     SELECT * FROM pg_drop_replication_slot('temp_decoding_slot');
     ```
     
  
  4. 对无主键的待同步表设置replica identity：
     ```
     ALTER TABLE <schema>.<表名> REPLICA IDENTITY FULL;
     ```
     
   
- **源库账号与权限**
  创建或指定具备REPLICATION权限的账号，并授予同步所需权限。
  ```
  CREATE USER <账号名> WITH LOGIN REPLICATION PASSWORD '<密码>';
  GRANT CONNECT ON DATABASE <库名> TO <账号名>;
  GRANT USAGE ON SCHEMA <schema> TO <账号名>;
  GRANT SELECT ON ALL TABLES IN SCHEMA <schema> TO <账号名>;
  ```
  请示例命令中 \<账号名\>、\<密码\>、\<库名\>、\<schema\> 替换为您的实际值。
  
- **源库对象检查**
  - 待同步表建议有主键或非空唯一约束；若无主键，须按上方步骤4设置replica identity=full以支持增量UPDATE/DELETE。
  
  - 向量列的维度（typmod，如vector(3)）正确。
  
  - 向量索引的opclass完整（如vector_cosine_ops、halfvec_l2_ops）。
  
  - 若表有依赖序列且目标库无同名序列，须将序列一并纳入同步对象。
  
  
  以下示例演示含向量类型与向量索引的表创建，供您参考，请按实际表结构调整：
  ```
  CREATE TABLE vec_test (
    id int PRIMARY KEY,
    v vector(3),
    hv halfvec(4),
    sv sparsevec(5)
  );
  CREATE INDEX idx_vec_l2 ON vec_test USING ivfflat (v vector_l2_ops) WITH (lists = 100);
  CREATE INDEX idx_vec_cos ON vec_test USING hnsw (v vector_cosine_ops);
  ```
  
- **目标库安装vector插件**
  目标库须安装vector插件，是向量同步成功的前提。可通过如下SQL查询目标库支持的vector插件版本列表（结果为空表示不支持）。
  ```
  SELECT v.name, v.version, (v.version = e.default_version) AS is_default FROM pg_available_extension_versions v JOIN pg_available_extensions e ON v.name = e.name WHERE v.name = 'vector';
  ```
  支持vector插件的内核版本请详见：[支持的插件列表](https://support.huaweicloud.com/usermanual-rds-pg/rds_09_0045.html)。
  华为云RDS for PostgreSQL已预置vector，可通过控制台安装：目标实例"概览"→ 左侧"插件管理"→ 选择目标库 → 在vector插件上单击"安装"，安装后可在"已安装插件"页查看与管理。
  - 表级同步：DRS不涉及插件对象，需由您在同步前手动安装vector。
  
  - 库级同步：DRS将自动在目标库安装数据库默认版本的vector插件。
  
  
  图5目标库安装 vector 插件（表级同步控制台安装示例）   
  ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002754232519.png) 
 
#### 创建 DRS 同步任务
1. 登录[华为云控制台](https://console.huaweicloud.com)，选择区域。
2. 服务列表选择"数据库 \> 数据复制服务 DRS"。
3. 左侧导航栏选择"实时同步管理"，单击"创建同步任务"。
4. 配置同步实例信息：选择区域、项目，填写任务名称；数据流动方向选"入云"，源数据库引擎选PostgreSQL，目标数据库引擎选PostgreSQL；网络类型选择公网网络；目标数据库实例选上一步创建的RDS实例；同步实例子网选有可用IP的子网；IP类型选IPv4（或IPv4\&IPv6双栈）；同步模式选全量+增量；访问公网策略选择EIP，指定公网IP选择可用的公网IP；其余选项保持默认。单击"开始创建"。 
   图6配置同步实例信息   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002724792802.png)
   
   
5. 配置源库及目标库信息：填写源库IP、端口、账号、密码；填写目标库账号和密码。单击"测试连接"测试连通性。连通后单击"下一步"，阅读提示后单击"同意，并继续"。 
   图7配置源库及目标库信息   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002754352629.png)
   
   
6. 设置同步后单击"下一步"。 
   - 增量冲突策略：选"覆盖"，保证源库与目标库最终一致。
   
   - DML同步：INSERT/UPDATE/DELETE默认全勾。
   
   - 流速模式：默认不限速，可按需限速（仅全量阶段生效）。
   
   - 对象同步范围：如需同步增量DDL，勾选"增量DDL同步"（需在源库预建事件触发器或rds_hwdrs_ddl插件，详见：[通过创建表、事件触发器和函数实现PostgreSQL增量DDL同步](https://support.huaweicloud.com/realtimesyn-drs/drs_03_0088.html)）。
     同步对象可选择库级同步或者表级同步。如果需要迁移单个数据库中的所有对象，选择库级同步，并将需要同步的数据库移至已选对象。如果仅需要同步指定的表，则选择表级同步，并在源库对象中选择待同步的向量表及依赖序列（如果有），移至已选对象。库级同步和表级同步支持的对象范围请参考[支持的同步对象范围](https://support.huaweicloud.com/realtimesyn-drs/drs_04_0107.html#section2)本文选择库级同步。
     图8设置同步   
     ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002724632862.png) 
   
   
   
   
7. 预检查：DRS自动校验源库、目标库的权限、版本、参数、对象、网络。未通过项根据提示修复后单击"重新校验"，直到通过率为100%。全部通过后单击"下一步"。
8. 任务确认：设置同步任务启动时间（立即启动或稍后启动，建议业务低峰期）、任务异常通知、SMN主题、时延阈值、任务异常自动结束时间等；检查所有配置项，单击"启动任务"，阅读并勾选"我已阅读启动前须知"，单击"启动任务"。 
   图9任务确认与启动   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002754232521.png)
   
   
9. 任务创建后，返回任务列表查看任务状态。
 
#### 同步后数据校验
当任务状态变为"增量同步"，说明全量同步已完成。此时可登录目标库查看迁移结果。
1. 等待任务状态变为"增量同步"。
2. 单击任务名称进入任务详情页。
3. 在"同步对比 \> 对象级对比"中单击"开始对比"，对比结束后查看表和索引的迁移结果。 
   图10对象对比   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002724792804.png)
   
   
4. 在"同步对比 \> 数据级对比"创建内容对比任务查看数据迁移结果。数据对比建议在源库业务低峰期进行；由于同步存在时延，数据持续写入时对比可能出现少量不一致而失去参考意义，请先在任务详情页确认"增量时延"趋于 0 后再启动对比。创建数据对比任务时，"对比类型"选择"内容对比"，"对比方式"选择"动态对比"，动态对比可在存量数据对比完成后，持续对比后续源库新增、修改和删除的数据。对比启动后，可在查看对比报表中查看最新对比结果。 
   图11创建内容对比   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002754352631.png)
   图12查看对比报表   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002724632864.png)
   
   
5. 结束任务：业务完全迁移至目标库后，单击任务"操作"列的"结束"，阅读提示后单击"是"结束任务。结束前请保持源库与目标库网络连通，并关注同步日志上报的状态；选择正常结束（**勿勾选强制结束** ）。
   
   图13结束任务   
   ![](https://support.huaweicloud.com/bestpractice-drs/zh-cn_image_0000002754232523.png)
   
   
 
#### 注意事项
同步前请关注以下事项：
- 启动任务前请确保源库未启动长事务，长事务会阻塞逻辑复制槽创建，导致任务启动失败。
- 同步期间请勿修改源库与目标库的端口、连接账号密码或权限，请勿在目标库直接写入数据；如启用增量DDL同步，源库执行的DDL须确保在目标库兼容，否则可能导致任务失败或数据不一致。
- 库级同步时，若源库新增无主键表，请先将其replica identity设为full再写入数据，否则可能导致数据不一致或任务失败。
- 表级同步时，若目标表已存在，其主键、向量列类型与维度须与源表一致；目标表可比源表多列，但多列须允许空或有默认值，否则可能导致同步失败。
- PostgreSQL→PostgreSQL同步默认允许级联拓扑，不允许回环拓扑（不支持实例A同步到B、再由B同步回A的循环），多实例级联须避免环路。
完整说明详见[注意事项](https://support.huaweicloud.com/realtimesyn-drs/drs_04_0107.html#section3)。
#### 计费说明
DRS计费规则要点如下：
- 计费模式：包年/包月与按需计费，规格类型对应不同性能上限，详见[实时同步链路规格说明](https://support.huaweicloud.com/productdesc-drs/drs_01_0314.html)。
- 公网网络类型的任务产生数据传输费用（弹性公网 IP），标准见弹性公网IP价格计算器。
- 异常状态的任务仍会计费，建议设置任务异常自动结束时间，避免产生不必要的费用。
- 更多计费规则详见[计费概述](https://support.huaweicloud.com/price-drs/drs_00_0002.html)。
 
#### 其他源库场景差异
以下两种场景与本地IDC自建PostgreSQL的差异集中在网络接入与配置方式：托管形态不开放postgresql.conf、pg_hba.conf的直接编辑，须按所在云的托管方式放开访问与参数；若为其他云 ECS自建，则与本地IDC自建一致。
- **源库为其他云 PostgreSQL**
  - 网络接入：跨云接入华为云，可选公网网络或VPN/专线网络。公网网络时源库须绑定弹性公网IP（EIP），DRS经公网访问源库；VPN/专线网络时源库不走公网，需先打通源库所在网络与华为云VPC的内网通道（通过VPN、专线、云连接或VPC对等连接等），DRS经该内网通道访问源库内网地址。
  
  - 源库信息：DRS源库信息页填写源库IP（或域名）、端口、账号与密码。
  
  - 逻辑复制参数：以源云的参数组或参数管理页设置wal_level=logical（对应自建库postgresql.conf）。
  
  - 访问放通：以源云的IP白名单或安全组放通DRS访问的IP与端口（对应自建库pg_hba.conf放通replication）。
  
  - 账号复制权限：以控制台或对应角色授予账号REPLICATION权限。
  
  - test_decoding：PostgreSQL原生插件之一，一般企业级PostgreSQL（含其他云托管实例）均支持；它是增量同步的逻辑解码插件，源库须确认其已启用。
   
- **源库为华为云 RDS for PostgreSQL**
  - 网络接入与源库信息：DRS源库信息页"数据库类型"选"RDS实例"（而非ECS自建库），选择源库实例，填账号密码（无VPC/子网/IP/端口/SSL，RDS通过项目内网自动连通）。
  
  - 逻辑复制参数：在RDS控制台"实例管理 → 实例 → 参数修改"页设置wal_level=logical（按"是否需要重启"提示，静态参数需重启）。
  
  - 访问放通：源实例"连接管理 → 安全组规则 → 添加入方向规则"放通DRS（端口5432）。
  
  - 账号复制权限：控制台创建账号时勾选REPLICATION，或由root成员执行select control_user_privilege('replication', '\<账号\>');。
  
  - test_decoding：PostgreSQL原生逻辑解码插件，华为云 RDS for PostgreSQL通常已支持；DRS要求源库已安装test_decoding，请在同步前确认其可用。
   
 
