一、迁移需求的三原色场景
当我们需要把大象塞进新冰箱时,通常面临三类典型场景:
- 整体搬家:将生产数据库完整复制到测试环境(比如把50GB的用户表整体克隆)
- 跨库联姻:实时查询CRM系统里的客户画像(PostgreSQL查MySQL里的数据)
- 涡轮增压:每秒处理万级订单数据的批量导入(类似于双十一订单同步)
我们现场还原三种场景的实战示例:(技术栈: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) | ★★★☆ (实时) |
| 资源消耗 | 低 | 中 | 高 |
| 断点续传 | 支持 | 不支持 | 自动重试 |
| 版本兼容 | 严格 | 宽松 | 依赖驱动 |
| 复杂数据结构 | 完美支持 | 需预先处理 | 类型转换挑战 |
六、选择武器的黄金法则
- 小型数据库搬家首选pg_dump的
-Fc格式 - 定期批量同步用pg_load配合gzip压缩
- 实时联邦查询用FDW但要注意缓存机制
- 混合使用案例:先用pg_dump迁移基础数据,再用FDW连接动态表
七、三大雷区警示录
- 字符集陷阱:迁移后出现?乱码?记得加上
--encoding=UTF8参数 - 时区惨案:将
Asia/Shanghai时间存成UTC导致报表错误 - 权限黑洞:FDW连接外部库必须配置白名单和只读账号
八、终极拷问:你的场景适合哪种?
- 数据湖归档:pg_dump + S3分段存储
- 实时BI看板:FDW + 物化视图自动刷新
- 支付流水同步:pg_load管道模式 + 预写日志验证
评论