← 返回首页

学习使用PG经历怎么把测试库中的表和数据复制到正式环境

服务器运维 亲身经历 公开
内容简要
在将PostgreSQL数据库表结构和数据从本地服务器复制到腾讯云轻服务器时,由于Windows管道传输问题导致直接命令执行失败,需要改为先导出备份文件,然后进行校验和恢复。
坑点
直接使用管道命令进行pg_dump和pg_restore操作时,由于Windows管道传输问题导致无法完成。
注意事项

1. 将导出备份操作改为先导出为本地文件:

  • 使用命令:pg_dump -h 172.26.1.99 -p 5432 -U chen -d aikb -Fc -f D:/aikb_backup.dump

2. 校验备份文件合法性:

  • 使用命令:pg_restore -l D:/aikb/backup.dump

3. 恢复到目标库:

  • 使用命令:pg_restore -h 124.223.XX.XXX -p 5432 -U chen -d aikb --no-owner --no-acl D:/aikb_backup.dump

4. 如果需要清除目标库所有表和数据,使用命令:

  • pg_restore -h 124.223.XX.XXX -p 5432 -U chen -d aikb --no-owner --no-acl --clean D:/aikb_backup.dump

风险提示:--clean 会删掉目标 aikb 库里面所有表和数据!目标库原有数据会全部丢失,确认不需要旧数据再执行。

5. 确保目标库已安装pgvector扩展:

  • 执行命令:CREATE EXTENSION IF NOT EXISTS vector; CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

6. 恢复完成后,校验表数量和行数:

  • select count(*) from kb_document;
  • select count(*) from vector_store;

7. 如果执行 --clean 后依然报部分对象残留,手动清库:

  • DROP SCHEMA public CASCADE;
  • CREATE SCHEMA public;
  • GRANT ALL ON SCHEMA public TO public;

我的测试在一台linux服务器,我的正式库是腾讯云轻服务器,使用docker上配置的PG

image.png

因为我的测试环境在172这台服务器上,现在我想把表结构和数据复制到云服务器上

测试导入整个库:

pg\dump -h 172.26.1.XXX -p 5432 -U chen -d aikb -Fc | pg\restore -h 124.223.XXX.XXX -p 5432 -U chen -d aikb --no-owner --no-acl

发生以下问题

PS C:\\Users\\mis> pg\dump -h 172.26.1.XXX -p 5432 -U chen -d aikb -Fc | pg\restore -h 124.223.XXX.XXX -p 5432 -U chen -d aikb --no-owner --no-acl

口令:

pg\_restore: 错误: 无法从输入文件中读取:文件的结尾

看来直接使用一个命令无法完成了,很大可能是wondows的管道直传有问题

第一步:导出备份到本地文件

改为:

pg_dump -h 172.26.1.99 -p 5432 -U chen -d aikb -Fc -f D:\aikb_backup.dump

先导出为备份文件,在恢复到目标库前我们一般要校验合法性,使用命令:pg\restore -l D:\\aikb\backup.dump

这条命令列出归档内容,如果正常输出 toc 列表,代表备份完好;如果这里直接报 EOF,说明导出本身就失败了。

第二步:恢复到目标库

pg_restore -h 124.223.XX.XXX -p 5432 -U chen -d aikb --no-owner --no-acl D:\aikb_backup.dump

image.png
在导入时出现了错误,大概意思是正式库中已有相同的表,不能直接创建,因为我们的正式库目前还没有重要的数据,因此我可以先清除所有的表和数据再重新导入,当然也可以忽略掉这些已存在表,不去操作它,因为我没有什么重要的数据,因此我就先全部清除,然后再重新导入

PS C:\\Users\\mis> pg\restore -h 124.223.XX.XXX -p 5432 -U chen -d aikb --no-owner --no-acl --clean D:\\aikb\backup.dump

风险提示:--clean 会删掉目标 aikb 库里面所有表和数据!目标库原有数据会全部丢失,确认不需要旧数据再执行。

额外重点(pgvector 必须注意)

目标库要提前确认pgvector 扩展已经安装并创建,否则恢复完向量字段会报错:

-- 在目标库执行
CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
如果没装扩展,就算表建成功,vector(512)、uuidgeneratev4() 会报错。

执行完之后校验命令

恢复完成后,连接目标库执行,核对表数量、行数:

select count(*) from kb_document;
select count(*) from vector_store;

补充小提示

如果执行 --clean 后依然报部分对象残留,可以先手动清库:

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO public;
这条会清空 public schema 全部表,谨慎!
本文内容仅代表作者个人观点、经历或转述,不代表任何官方立场,仅供参考,不构成任何专业建议。据此操作产生的风险由读者自行承担。
发布于 2026-10-12 13:45:00 ID: 15