SSMA迁移Oracle至SQL Server未全量迁移且无报错
Oracle到SQL Server迁移部分行未迁移排查方案
一、先核对基础信息
- 确认SSMA中选择的迁移表是否和你实际的
myschema.users一致:日志里显示的是"sch"."my_USERS",存在表名/schema不一致的可能,先验证Oracle中两个表的实际行数:-- Oracle端执行 SELECT COUNT(*) FROM myschema.users; SELECT COUNT(*) FROM sch.my_USERS; - 同时在SQL Server中确认迁移后的行数:
-- SQL Server端执行 SELECT COUNT(*) FROM [DB].[sch].[my_USERS];
二、定位未迁移的行及原因
SSMA标记部分迁移但无错误日志,通常是数据兼容性问题导致静默跳过,按以下步骤排查:
找出缺失行
假设表有主键user_id,通过主键关联对比源表和目标表:-- Oracle端执行(需先创建SQL Server链接服务器) SELECT user_id FROM myschema.users MINUS SELECT user_id FROM [DB].[sch].[my_USERS]@SQLServer_Link;也可导出两个表的主键列表,用Excel对比差异。
检查数据类型兼容性
- 在SSMA中右键目标表,选择Report Type Mapping,查看字段类型转换规则,重点排查:
- Oracle
CLOB/NCLOB转SQL ServerVARCHAR(MAX)/NVARCHAR(MAX)时的超长数据截断 DATE/TIMESTAMP类型的特殊值(如Oracle的DATE包含时分秒,SQL Server旧版本映射是否匹配)
- Oracle
- 检查源表中是否存在含不可见字符、换行符的字符串字段,这类数据可能导致插入失败但无明显报错。
- 在SSMA中右键目标表,选择Report Type Mapping,查看字段类型转换规则,重点排查:
开启SSMA详细日志
- 打开SSMA,点击工具 > 设置
- 选择日志记录,将日志级别设为详细
- 重新执行迁移,查看生成的详细日志,里面会记录每一行的处理状态,可定位被跳过行的具体原因。
手动测试缺失行
定位到缺失行后,手动编写SQL插入到SQL Server,观察是否触发具体错误(如违反约束、数据类型不兼容),这是最快定位根因的方法。
三、常见问题解决
- 重复主键/唯一约束:源表存在重复键,SQL Server插入失败但被SSMA静默跳过,需清理源表重复数据后重新迁移
- 字符集不兼容:Oracle字符集(如AL32UTF8)与SQL Server字符集(如SQL_Latin1_General_CP1_CI_AS)冲突,导致部分字符无法插入,可将SQL Server目标表字符集改为UTF-8(2019及以上版本支持),或清理源表特殊字符
- SSMA配置问题:检查SSMA迁移设置是否开启了跳过错误行选项,关闭该选项后重新迁移,会抛出具体错误信息
内容的提问来源于stack exchange,提问作者synccm2012
相关产品推荐
相关产品推荐

