You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用pg_restore将数据迁移至结构不同的feed_items表?

用pg_dump+SQL适配完成feed_items表数据迁移

由于源表和目标表存在列名映射差异、冗余列(源表title_vector/summary_vector目标表无)、唯一约束区别,直接用pg_restore全量还原会报错,需按以下步骤处理:

步骤1:导出源表纯数据(不含结构)

使用pg_dump导出源数据库中feed_items的仅数据,并生成INSERT语句(便于后续修改列对应关系):

pg_dump -d 源数据库名称 -t public.feed_items --data-only --inserts --no-owner > feed_items_data_raw.sql

参数说明:

  • --data-only:仅导出数据,不包含表结构定义
  • --inserts:生成INSERT语句而非COPY命令,方便调整列映射
  • --no-owner:不导出表所属用户信息,避免目标库权限冲突

步骤2:修改SQL适配目标表结构

需要调整INSERT语句的列映射、移除无用列、添加冲突处理:

2.1 替换列名映射

将源表列名替换为目标表对应列:

sed -i 's/INSERT INTO public.feed_items(feed_item_id, pubdate, link, guid, title, summary, content, author, feed_id, tags, title_vector, summary_vector)/INSERT INTO public.feed_items(id, pubdate, link, guid, title, summary, content, author, feed, tags)/' feed_items_data_raw.sql

核心映射关系:

  • 源表feed_item_id → 目标表id(主键列)
  • 源表feed_id → 目标表feed(外键列)
  • 移除源表的title_vector、summary_vector(目标表无此列)

2.2 移除VALUES中的无用列值

源表导出的VALUES包含title_vector和summary_vector的值,需删除这两个冗余值:

# 适配tsvector类型导出格式,删除末尾两个向量值
sed -i 's/, to_tsvector[^)]*, to_tsvector[^)]*)//' feed_items_data_raw.sql

如果导出的向量是字符串形式,可改用:

sed -i 's/, '\''[^'\'']*'\'', '\''[^'\'']*'\''\)/)/' feed_items_data_raw.sql

2.3 添加冲突规避(可选)

目标表对link字段有唯一约束,为避免重复链接导致导入失败,给每个INSERT添加冲突忽略逻辑:

sed -i 's/);/ ON CONFLICT (link) DO NOTHING;/' feed_items_data_raw.sql

步骤3:导入处理后的数据到目标库

使用psql将修改后的SQL导入目标数据库:

psql -d 目标数据库名称 -U ch_api_user -f feed_items_data_raw.sql

注意:确保ch_api_user拥有目标库feed_items表的插入权限。

可选优化:批量导入提速

若250k数据导入较慢,可临时关闭目标表的索引和约束(导入完成后恢复):

-- 导入前在目标库执行
ALTER TABLE public.feed_items DISABLE TRIGGER ALL;
DROP INDEX IF EXISTS feed_items_searchable, feed_items_tags, feed_items_pubdate_id;

导入完成后恢复:

-- 导入后在目标库执行
CREATE INDEX IF NOT EXISTS feed_items_pubdate_id ON public.feed_items USING btree (pubdate DESC NULLS FIRST, id DESC NULLS FIRST);
CREATE INDEX IF NOT EXISTS feed_items_searchable ON public.feed_items USING gin (searchable);
CREATE INDEX IF NOT EXISTS feed_items_tags ON public.feed_items USING gin (tags);
ALTER TABLE public.feed_items ENABLE TRIGGER ALL;

内容的提问来源于stack exchange,提问作者PirateApp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:01:16