8

另一支球队给了我们一个转储文件,他们在今年剩下的时间里都离开了。当我们尝试将转储导入我们自己的数据库时,我们收到以下错误:

IMP-00038:无法转换为环境字符集的句柄

经过一些研究,我们的猜测是源机器的 NLS_LANG 设置与我们的本地机器不匹配。我们目前没有任何方法可以检查源机器上 NLS_LANG 的值。

那么,我们手中只有一个转储文件,有没有办法找出导出完成的 NLS_LANG 值?从外观上看,我们应该能够在运行导入客户端 (imp) 之前覆盖 NLS_LANG 环境变量。

另一件事是,转储是从 11g 实例完成的,我们的 imp 版本是 10。我读到 imp 不向前兼容。这可能是这里的问题(而不是 NLS_LANG 不匹配)吗?

4

5 回答 5

11

吃,尝试 impdp - 有时这可能会有所帮助:-)

于 2010-11-26T16:59:29.197 回答
6

在 unix 上最简单的方法是:

#>imp username/password file=test.dmp show=y

Import: Release 10.2.0.3.0 - Production on Fri Nov 26 08:38:47 2010

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options

Export file created by EXPORT:V10.02.01 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses WE8ISO8859P1 character set (possible charset conversion)

版本exp/imp是个问题:我一般用V10导出程序,让它连接V11数据库。确保在 dev10 的 oracle_home 中的 tnsnames.ora 中有 dev11 的别名。

hostname{oracle}# . oraenv
ORACLE_SID = [oracle] ? dev10
hostname{oracle}#
hostname{oracle}#>exp username/password@dev11 full=y dumpfile=dump.exp
于 2010-11-26T07:34:20.473 回答
3

即使该文件是二进制乱码,也有一些人类可读的文本摘录。我在那里看到了以下字符串,我认为这回答了我的问题:

<CHARSET>AL32UTF8</CHARSET><NCHARSET>AL16UTF16</NCHARSET>
...
NLS_LANGUAGE='美国' NLS_TERRITORY='美国'
于 2010-11-25T18:40:59.193 回答
1

另一件事是,转储是从 11g 实例完成的,我们的 imp 版本是 10。我读到 imp 不向前兼容。这可能是这里的问题(而不是 NLS_LANG 不匹配)吗?

答:你是对的;您无法导入使用给定 Oracle 客户端创建的转储文件,因为您的目标 Oracle 数据库的 Oracle 客户端较旧。

尽管不建议这样做,但您可以使用较旧的Oracle 客户端(即 10g)导出较新的源 Oracle 数据库(即 10g+),因为您使用相同的 Oracle 客户端版本导入较旧的目标 Oracle 数据库(即 10g)。

假设:源数据库的 Oracle 客户端版本与目标 Oracle 数据库版本相同或更新。请注意,混合工具Datapump (11g) 和imp (-10g) 导入实用程序不起作用。

使用不同版本和版本的导出的有趣链接

于 2011-03-09T17:46:46.587 回答
1

也许它是使用expdp....try impdp ....导出的。这是我在搜索 google 时看到的,对于同样的问题,它确实对我有用。

于 2013-03-17T09:40:54.360 回答