SQL Server 到 PostgreSQL 数据库迁移全攻略:从准备到实战
准备篇:迁移前的关键决策与环境搭建
在开始前建议您先问自己:我的数据库属于哪种规模?不同体量的数据库需要差异化的迁移策略。小型数据库(<10GB)可采用全量迁移,中型数据库(10-100GB)建议分批次迁移,大型数据库(>100GB)则需要增量迁移方案配合停机窗口规划。
如何评估数据库迁移复杂度?
检查您的 SQL Server 数据库是否包含以下特性,这些将直接影响迁移难度:
- 存储过程和自定义函数的数量
- 特殊数据类型(如 geography、hierarchyid)的使用情况
- 触发器和业务规则的复杂度
- 并发访问模式和数据更新频率
⚠️ 注意:包含大量 T-SQL 存储过程的数据库需要额外的手动转换工作,工具无法自动完成这部分迁移。
🔧 环境准备步骤
- 安装 Perl 运行环境(Windows 用户推荐 Strawberry Perl)
- 获取迁移工具:
git clone https://gitcode.com/gh_mirrors/sq/sqlserver2pgsql - 安装 Kettle (Pentaho Data Integrator) 用于数据传输
- 下载 JTDS SQL Server 驱动并放入 Kettle 的 lib 目录
💡 实用技巧:在开始迁移前,创建一个数据库对象清单文档,记录所有表、视图、索引和约束。这将成为后续验证的依据,建议使用数据库文档工具自动生成。
核心功能篇:工具如何解决迁移难题
数据类型转换的自动化处理
工具的核心能力在于将 SQL Server 数据类型映射为兼容的 PostgreSQL 类型。例如:
- 将
nvarchar转换为varchar或text datetime映射为timestamp with time zone- 数值类型根据精度自动选择
smallint/integer/bigint
⚠️ 注意:uniqueidentifier 类型会转换为 uuid,需要确保目标 PostgreSQL 已安装 uuid-ossp 扩展。
增量迁移如何实现?
工具通过两种机制支持增量数据同步:
- 生成基础迁移作业(
migration.kjb)用于首次全量迁移 - 创建增量作业(
incremental.kjb)跟踪后续数据变更
实现原理是通过比较源和目标数据库的记录,仅传输新增或修改的数据行。这种方式特别适合需要最小化停机时间的生产环境。
💡 实用技巧:对于增量迁移,建议先在测试环境验证至少三次。关注大表的同步性能,可通过调整 Kettle 的 sort_size 参数优化内存使用。
配置实战篇:从参数到执行的完整流程
如何编写高效的配置文件?
配置文件是控制迁移行为的核心。创建自定义配置文件时应包含:
# 基础文件设置
sql server dump filename = /path/to/sqlserver_dump.sql
before file = ./output/before.sql
after file = ./output/after.sql
unsure file = ./output/unsure.sql
kettle directory = ./kettle_jobs
# 数据库连接参数
sql server host = 192.168.1.100
sql server port = 1433
sql server database = source_db
sql server username = migration_user
sql server password = secure_password
postgresql host = localhost
postgresql port = 5432
postgresql database = target_db
postgresql username = pg_admin
⚠️ 注意:密码会明文存储在 Kettle 配置文件中,迁移完成后应立即删除这些文件或限制访问权限。
🔧 完整迁移执行步骤
-
生成迁移脚本和作业:
./sqlserver2pgsql.pl -conf my_config.conf -
创建目标数据库结构:
psql -U pg_admin -d target_db -f ./output/before.sql -
执行数据迁移作业:
cd /path/to/kettle ./kitchen.sh -file=/path/to/kettle_jobs/migration.kjb -level=detailed -
完成数据库对象创建:
psql -U pg_admin -d target_db -f ./output/after.sql
迁移后验证要点有哪些?
迁移完成后需从以下维度验证:
- 表行数匹配度(允许少量因类型转换导致的差异)
- 关键业务查询在两个数据库中的执行结果对比
- 索引和约束的完整性检查
- 应用程序连接测试
💡 实用技巧:使用 kettle_report.pl 分析迁移性能报告,识别耗时最长的表迁移过程。对于大型表,可考虑在非高峰时段单独迁移以提高效率。
高级场景篇:应对复杂迁移挑战
大规模数据库的迁移策略
当处理超过 100GB 的数据库时:
- 按业务模块拆分迁移顺序
- 利用
-relabel_schemas参数实现分批次迁移 - 调整 Kettle 并行度(
-po参数)控制资源占用 - 考虑使用数据库链接直接查询源数据库,避免生成大型 SQL 转储文件
如何处理大小写敏感问题?
SQL Server 默认不区分大小写,而 PostgreSQL 区分。解决方法有两种:
- 使用
-i参数生成 citext 类型字段(简单但性能较差) - 手动调整应用查询,添加
ILIKE和LOWER()函数(复杂但性能更好)
💡 实用技巧:对于遗留系统,建议先使用 citext 快速迁移,再逐步优化为原生 PostgreSQL 语法。可通过配置文件中的 case insensitive = 1 启用此功能。
常见问题解决篇:避开迁移陷阱
迁移失败如何排查?
当迁移过程出错时:
- 检查 Kettle 日志文件(通常在
.kettle/logs) - 验证
unsure.sql中的警告内容 - 确认数据库用户权限是否完整
- 检查 Java 堆内存设置(通过
JAVAMAXMEM环境变量调整)
存储过程迁移替代方案
由于 T-SQL 与 PL/pgSQL 语法差异大,建议:
- 识别核心业务逻辑存储过程,优先迁移
- 考虑将简单逻辑迁移为 PostgreSQL 函数
- 复杂业务逻辑可重构为应用层代码
- 评估第三方工具辅助转换(如 pgTSQL)
💡 实用技巧:创建一个迁移状态跟踪表,记录每个对象的迁移进度:未开始、已转换、已测试、已部署。这在团队协作迁移时尤为重要。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



