求PostgreSQL跨服务器特定数据导出恢复SQL脚本(同架构)
实现PostgreSQL指定表条件数据迁移的脚本方案
由于服务器A与B架构完全一致,无需导出表结构,仅需迁移符合条件的数据,以下是两种实用方案:
方法一:pg_dump条件导出+psql导入
1. 从服务器A导出过滤后的数据
在可连接服务器A的机器上,执行pg_dump命令导出指定表的条件数据:
# 导出user表中年龄23岁以上的数据 pg_dump -h <A服务器IP/域名> -U <数据库用户名> -d <目标数据库名> -t user --data-only --where="age > 23" -f user_filtered.sql # 导出address表中城市为Boston的数据 pg_dump -h <A服务器IP/域名> -U <数据库用户名> -d <目标数据库名> -t address --data-only --where="city = 'Boston'" -f address_filtered.sql
参数说明:
-t:指定要导出的目标表--data-only:仅导出数据(跳过表结构,因架构一致)--where:设置数据过滤条件-f:将导出内容写入指定文件
2. 将数据导入服务器B
将导出的.sql文件传输至可连接服务器B的机器,执行导入命令:
# 导入user表数据 psql -h <B服务器IP/域名> -U <数据库用户名> -d <目标数据库名> -f user_filtered.sql # 导入address表数据 psql -h <B服务器IP/域名> -U <数据库用户名> -d <目标数据库名> -f address_filtered.sql
方法二:跨服务器直接复制(使用dblink扩展)
若服务器A与B网络互通,可在服务器B上直接执行跨库数据插入:
1. 启用dblink扩展
在服务器B的目标数据库中执行:
CREATE EXTENSION IF NOT EXISTS dblink;
2. 跨库插入条件数据
-- 插入user表符合条件的数据 INSERT INTO user SELECT * FROM dblink( 'dbname=<A数据库名> host=<A服务器IP/域名> user=<用户名> password=<密码>', 'SELECT * FROM user WHERE age > 23' ) AS t(user_id INT, name VARCHAR, age INT, email VARCHAR); -- 需与user表结构完全匹配列名、类型 -- 插入address表符合条件的数据 INSERT INTO address SELECT * FROM dblink( 'dbname=<A数据库名> host=<A服务器IP/域名> user=<用户名> password=<密码>', 'SELECT * FROM address WHERE city = ''Boston''' ) AS t(address_id INT, user_id INT, city VARCHAR, street VARCHAR); -- 需与address表结构完全匹配
注意:
- 确保服务器B能访问A的PostgreSQL默认端口(5432)
- 连接字符串需替换为实际的服务器A数据库信息
- 列定义部分必须与目标表结构完全一致,避免插入失败
注意事项
- 操作前建议备份服务器B的目标表数据,防止数据覆盖
- 数据量较大时优先选择
pg_dump方法,稳定性更高;dblink更适合小批量数据迁移 - 确保执行命令的用户拥有对应权限:服务器A的读权限、服务器B的写权限
内容的提问来源于stack exchange,提问作者Sunny
相关产品推荐
相关产品推荐

