一、迁移需求的三原色场景

当我们需要把大象塞进新冰箱时,通常面临三类典型场景:

  1. 整体搬家:将生产数据库完整复制到测试环境(比如把50GB的用户表整体克隆)
  2. 跨库联姻:实时查询CRM系统里的客户画像(PostgreSQL查MySQL里的数据)
  3. 涡轮增压:每秒处理万级订单数据的批量导入(类似于双十一订单同步)

我们现场还原三种场景的实战示例:(技术栈:PostgreSQL 15 + Ubuntu 22.04)

二、pg_dump:老司机的搬家货车

基础操作示例

-- 导出整个数据库到sql文件(角色权限也会保留)
pg_dump -U postgres -h 192.168.1.100 -d sales_db -Fc -f /backup/sales.dump

-- 在新环境创建空白数据库
createdb -U postgres sales_test

-- 恢复数据库对象+数据
pg_restore -U postgres -d sales_test /backup/sales.dump

输出日志会显示每个表的创建顺序,遇到大表时会看到明显的进度停顿。

进阶技巧示例

# 并行导出加速(-j参数是CPU核心数的75%为佳)
pg_dump -j 8 -d sales_db | gzip > sales.sql.gz

# 分片恢复策略(针对超大型表)
pg_restore -l sales.dump | grep 'TABLE orders' > orders.list
pg_restore -L orders.list sales.dump -d sales_test

血泪教训:曾有个金融客户用单线程恢复200GB交易表,结果花了18小时,改成8线程后缩短到3.2小时。

三、pg_load:闪电侠的独门秘籍

CSV格式加载示例

准备数据文件(customers.csv):

id,name,reg_date
1,淘宝店,2023-01-01
2,京东店,2023-02-15
3,拼多多店,2023-03-20

执行装载命令:

-- 创建装载中间表
CREATE TABLE tmp_customers (LIKE customers INCLUDING ALL);

-- 使用COPY协议高速导入
\copy tmp_customers FROM 'customers.csv' WITH (FORMAT csv, HEADER true)

-- 数据验证后正式切换
BEGIN;
TRUNCATE customers;
INSERT INTO customers SELECT * FROM tmp_customers;
COMMIT;

性能实测:单机环境导入1000万行用户数据耗时从pg_dump的42分钟缩短到9分钟。

四、FDW:变形金刚的跨界连接

MySQL联邦查询示例

-- 安装扩展包
CREATE EXTENSION mysql_fdw;

-- 创建外部服务器
CREATE SERVER mysql_server 
  FOREIGN DATA WRAPPER mysql_fdw
  OPTIONS (host '10.0.0.5', port '3306');

-- 用户映射
CREATE USER MAPPING FOR postgres
  SERVER mysql_server
  OPTIONS (username 'dba', password 'SafePass123');

-- 创建外部表(对应MySQL的orders表)
CREATE FOREIGN TABLE mysql_orders (
  order_id BIGINT,
  user_id INT,
  amount DECIMAL(10,2)
) SERVER mysql_server 
  OPTIONS (dbname 'crm', table_name 'orders');

-- 跨库关联查询(PostgreSQL用户表和MySQL订单表)
SELECT u.*, o.total 
FROM local_users u
JOIN mysql_orders o ON u.id = o.user_id
WHERE u.vip_level > 3;

真实案例:某跨境电商凌晨跑报表时,FDW查询导致MySQL主库IOPS飙到5000+,后来改用物化视图定时刷新解决。

五、对比表格:工具间的三棱镜分析

维度 pg_dump pg_load FDW
传输速度 ★★☆ (20MB/s) ★★★ (120MB/s) ★★★☆ (实时)
资源消耗
断点续传 支持 不支持 自动重试
版本兼容 严格 宽松 依赖驱动
复杂数据结构 完美支持 需预先处理 类型转换挑战

六、选择武器的黄金法则

  1. 小型数据库搬家首选pg_dump的-Fc格式
  2. 定期批量同步用pg_load配合gzip压缩
  3. 实时联邦查询用FDW但要注意缓存机制
  4. 混合使用案例:先用pg_dump迁移基础数据,再用FDW连接动态表

七、三大雷区警示录

  1. 字符集陷阱:迁移后出现?乱码?记得加上--encoding=UTF8参数
  2. 时区惨案:将Asia/Shanghai时间存成UTC导致报表错误
  3. 权限黑洞:FDW连接外部库必须配置白名单和只读账号

八、终极拷问:你的场景适合哪种?

  • 数据湖归档:pg_dump + S3分段存储
  • 实时BI看板:FDW + 物化视图自动刷新
  • 支付流水同步:pg_load管道模式 + 预写日志验证