将.dmp文件从Oracle 11g导入到10g会返回错误“无法打开日志文件”

时间:2013-08-01 07:41:55

标签: linux windows oracle11g oracle10g

在Stack Overflow的帮助下,我已经能够从本地计算机导出数据库的转储文件。我使用的命令如下:

host expdp tkcsowner/tkcsowner@xe version=10.2 schemas=tkcsowner dumpfile=tnrg.dmp logfile=tnrg.log

现在,我的本地计算机的操作系统Windows 7,32位。几乎没有服务器。它有Oracle 11g。我想把它转移到运行Linux的另一台机器,即测试服务器。它有Oracle 10g。

我绝不是Linux / Unix的专家,但我确实有一些指示由前一个处理这个问题的人留给我。

首先,我通过'su - '将权限更改为root用户 - 没有问题。

以'sqlplus / nolog'身份登录,然后'连接sys / sys @ xe为dba' - 也没有问题。

我创建了一个逻辑转储目录(不确定是否需要此步骤,但无论如何我都这样做了):

create or replace directory dumpdir as 'usr/lib/oracle/xe/app/oracle/admin/XE/dpdump';

完成,没问题。

所以我认为TNRG.dmp和tnrg.log应该在该目录中。不幸的是,由于某种原因,它无法复制。拒绝访问。我想我应该注销,以root身份登录,然后从那里复制内容。它工作正常,但为了安全起见,我退出root用户,以普通用户身份重新登录,并再次执行上述操作。 D'哦。

最后,有了所有的东西,现在是时候导入.dmp和.log了。好哇!

impdp tkcsowner/tkcsowner@xe schemas=tkcsowner dumpfile=TNRG.dmp logfile=tnrg.log

瞧,它要求输入用户名和密码。是因为10g数据库中不存在tkcsowners?无论如何,我为两者都加入了“系统”。它继续,但警告已经在我的脑海中出现了。

突然:

  • 已连接至:Oracle数据库10g快捷版10.2.0.1.0版 - 生产
  • ORA-39002:无效操作
  • ORA-39070:无法打开日志文件。
  • ORA-29283:文件操作无效
  • ORA-06512:at“SYS.UTL_FILE”,第475行
  • ORA-29283:文件操作无效

此时,我不知道该怎么办。我通过命令行进入目录,并且ls -l'ed内容,显示.dmp和.log都有三个rwx,用于root。我还没有尝试的是以root身份登录时运行整个操作,但我不确定这会如何改变。

2 个答案:

答案 0 :(得分:1)

您的dumpdir数据库目录对象指向的目录需要是有效的现有目录 - 至少在您使用它时,它不会在您创建对象时检查或抱怨 - 并且它需要由Oracle运行的用户可读写,通常为oracle

您的初始目录创建时间为'usr/lib/oracle/...而不是'/usr/lib/oracle/...,但即使更正了该目录,oracle帐户也可能无法使用该目录。由于您已将目录创建为root,因此它可能仍归root:root所有,并且拥有权限700(如果您ls -ld /usr/lib/oracle/xe/app/oracle/admin/XE/dpdump显示为drwx------)。

您需要使用正确的所有者和组(可能是oracle:dbaoracle:oinstall)将其更改为Oracle所有,但请检查XE目录的所有者。然后更改目录的所有权以及复制到其中的文件:

chown -R oracle:dba /usr/lib/oracle/xe/app/oracle/admin/XE/dpdump

并将目录权限设置为合适的级别;如果你不想让其他人创建或修改文件,但你不介意他们看到那里有什么,那么就像:

chmod 755 /usr/lib/oracle/xe/app/oracle/admin/XE/dpdump

如果您希望能够自己复制.dmp文件(不是rootoracle)并且您不在dba群组中,那么请777.你说你复制的文件是777,这有点奇怪,因为它们不可执行,现在可以被任何人删除;再次使它们只是可读:

chmod 644 /usr/lib/oracle/xe/app/oracle/admin/XE/dpdump/*

您不需要来自其他系统的导出日志,只需要转储文件本身。 logfile的{​​{1}}参数将创建导入过程的日志;由于您使用了相同的文件名,因此它将覆盖您复制的导出日志。这可能无关紧要,因为你仍然拥有原版,但将来需要注意的事项。它确实意味着现有的日志文件必须由impdp写入。

您还需要确保Oracle所有者对整个目录树具有适当的访问权限,但似乎他们已经拥有oracle,所以我不认为这是一个问题。你不应该真的需要做XE这样的任何事情。如果您没有root密码,则无论如何都可以从oracle su加入该帐户,这样就无需在以后手动更改所有权。

答案 1 :(得分:1)

impdp 命令是从Oracle外部启动的(在您的情况下可能带有 root ),但主要由Oracle服务器进程执行。特别是,转储和日志文件可由Oracle服务器进程直接访问(而不是由启动命令)。因此,需要设置文件保护,以便 oracle 用户可以访问它们。

所以执行以下操作(以root身份)并再试一次:

chown -R oracle:oinstall /usr/lib/oracle/xe/app/oracle/admin/XE/dpdump