SQL Server转PostgreSQL仅导100条数据,求高效批量迁移方案
SQL Server 转 PostgreSQL 大数据量迁移解决方案
先解决你当前遇到的「SSIS导出提示成功但仅100行」问题
大概率是PostgreSQL驱动的默认配置限制了数据获取量:
- 打开SSIS的目标PostgreSQL连接管理器,进入高级设置,找到
Fetch Size参数,把默认的100改成更大的值(比如10000); - 检查迁移任务的错误处理规则,是否设置了「忽略错误」——部分行可能因数据类型不兼容被丢弃,但SSIS仍提示整体成功;
- 查看迁移任务的详细日志,确认是否有隐性的行过滤或截断逻辑。
大数据量迁移的高效方案
1. 用pgLoader(推荐,专为异构数据库迁移设计)
pgLoader是PostgreSQL官方生态的迁移工具,对SQL Server支持完善,能自动处理数据类型映射、约束、索引,性能远超SSIS。
- 操作步骤:
- 安装pgLoader(Linux用包管理器,Windows可下载预编译包);
- 创建配置文件
migration.conf:LOAD DATABASE FROM mssql://sql_user:sql_pass@sql_server_ip/sql_db INTO pgsql://pg_user:pg_pass@pg_server_ip/pg_db WITH include drop, create tables, create indexes, reset sequences SET work_mem to '64MB', maintenance_work_mem to '512MB'; - 执行迁移命令:
pgloader migration.conf
- 优势:无需手动处理数据类型转换,支持增量迁移,全程日志可追溯,适合TB级数据。
2. SQL Server导出CSV + PostgreSQL COPY命令(性能最优)
COPY是PostgreSQL原生批量加载命令,速度比任何ETL工具都快,适合超大数据量场景。
- 操作步骤:
- 用SQL Server的
bcp命令导出数据(比SSIS导出更稳定):
参数说明:bcp "SELECT * FROM dbo.target_table" queryout "target_table.csv" -S sql_server_host -U sql_user -P sql_pass -c -t ',' -r '\n'-c=字符模式,-t=列分隔符,-r=行结束符 - 将CSV文件传到PostgreSQL服务器(或本地通过psql连接);
- 执行PostgreSQL导入命令:
-- 服务器本地文件用COPY COPY target_table FROM '/data/target_table.csv' WITH (FORMAT csv, HEADER, DELIMITER ',', ENCODING 'UTF8'); -- 本地文件用psql的\copy psql -U pg_user -d pg_db -c "\copy target_table FROM 'C:/data/target_table.csv' WITH (FORMAT csv, HEADER, DELIMITER ',')"
- 用SQL Server的
- 优势:速度最快,灵活控制数据格式,避免驱动层的限制。
3. 云环境用Azure Data Factory(可视化ETL)
如果你的数据库在云平台(比如Azure SQL Server → Azure PostgreSQL),ADF提供可视化的迁移管道,支持并行复制、错误重试、进度监控。
- 核心设置:创建复制活动时,将批量提交大小设为10000+,开启并行复制,提升迁移效率。
内容的提问来源于stack exchange,提问作者TheSun
相关产品推荐
相关产品推荐

