使用impdp跨服务器导入Schema遇ORA-31693等错误,仅NVARCHAR2表异常
当使用impdp导入Schema时,所有含NVARCHAR2类型的表触发如下错误,无NVARCHAR2的表可正常导入:
ORA-31693: Table data object "XXXXX"."AuditLogActions" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-24329: invalid character set identifier
ORA-31693: Table data object "XXXXX"."AuditLogs" failed to load/unload and is being skipped due to error:
ORA-02354: error in exporting/importing data
ORA-24329: invalid character set identifier
原因
NVARCHAR2类型依赖Oracle的国家字符集(NLS_NCHAR_CHARACTERSET),源数据库与目标数据库的国家字符集不匹配,或导入/导出时字符集参数配置错误,导致无法识别字符集标识。
解决方案
检查源库与目标库的国家字符集
在源库和目标库分别执行以下SQL,确认NLS_NCHAR_CHARACTERSET参数是否一致:SELECT PARAMETER, VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');若参数不一致,优先调整目标库国家字符集(需停机操作,风险较高,需备份后执行),或重新导出时指定匹配目标库的字符集。
导出时指定国家字符集参数
若源库与目标库国家字符集不同,导出Schema时显式指定目标库的国家字符集:expdp 用户名/密码@源库地址 schemas=XXXXX dumpfile=schema_exp.dmp logfile=exp.log NLS_NCHAR_CHARACTERSET=目标库国家字符集例如目标库国家字符集为
AL16UTF16,则参数设为NLS_NCHAR_CHARACTERSET=AL16UTF16。导入前设置环境变量
在导入服务器上设置环境变量,强制使用目标库的国家字符集:export NLS_NCHAR_CHARACTERSET=目标库国家字符集再执行导入命令:
impdp 用户名/密码@目标库地址 schemas=XXXXX dumpfile=schema_exp.dmp logfile=imp.log验证导出文件的字符集定义
使用impdp生成DDL文件,查看NVARCHAR2字段的字符集配置:impdp 用户名/密码@目标库地址 schemas=XXXXX dumpfile=schema_exp.dmp sqlfile=schema_ddl.sql打开
schema_ddl.sql,检查表中NVARCHAR2字段的字符集是否与目标库兼容,若存在不匹配的定义,可手动修改DDL后重新导入表结构,再导入数据。
内容的提问来源于stack exchange,提问作者Lê Mạnh Hùng

