有人知道ORACLE 12C DBLINK 9I 可以吗

有人知道ORACLE 12C DBLINK 9I 可以吗,第1张

create database link LINKTD connect to USER identified by passwd

using '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=1.8.1.61)(PORT=1521))(CONNECT_DATA=(SID=ORATD)))'

用这个格式创建即可,不存在版本兼容性,祝你好运!

expdp/impdp是10g推出的导入导出工具,9i下是没有该工具的,有人提议用10g的expdp,通过dblink导出9i的数据,乍一听感觉是那么回事,但究竟行不行,咱们实验说明。

1. 登录到一台10g/11g的服务器,首先创建连接到9i库TEST的一个链接tlink:

SQL>create database link tlink connect to test identified by test using 'TEST'Database link created.

2. 编辑expdp导出的配置文件:

userid=user/pwd- expdp使用的本机数据库用户directory=expdp_dir- directory路径

dumpfile=testtkt.dump

logfile=testtkt.log

tables=test.t_r- 要导出的9i库表t_r

network_link=tlink- 链接到的9i库dblink

3. 执行expdp:

[oracle11g@Node1 expdp_dir]$ expdp parfile=tlink.parExport: Release 11.2.0.1.0 - Production on Mon May 18 13:35:57 2015Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsORA-39006: internal error

ORA-39065: unexpected master process exception in DISPATCHORA-00904: "SYS"."KUPM$MCP"."GET_ENDIANNESS": invalid identifierORA-39097: Data Pump job encountered unexpected error -904提示一系列ORA错误。

expdp不像exp,他是将导出转变成一个Oracle内部的job任务,有一点可以证明,就是使用exp导出时用ctrl+c中断,此时导出过程整体中断,如果使用expdp导出时用ctrl+c中断,此时导出过程并未中断,因为其已经转变为Oracle的一个任务,和客户端无关,退出交互模式后,会进入export的命令行模式,有status、start、stop等命令可以用。

从上面的报错可以看到ORA-00904: "SYS"."KUPM$MCP"."GET_ENDIANNESS": invalid identifier,关于904的错误描述:

[oracle11g@Node1 expdp_dir]$ oerr ora 90400904, 00000, "%s: invalid identifier"

// *Cause:

// *Action:

说明是找不到对应的标识符,再看看SYS.KUPM$MCP大概是什么:

SQL>desc sys.KUPM$MCP

PROCEDURE CLOSE_JOB

FUNCTION DISPATCH RETURNS KUPC$_MESSAGE

Argument Name TypeIn/Out Default?

------------------------------ ----------------------- ------ --------REQUESTKUPC$_MESSAGE INPROCEDURE FILE_LOG_MESSAGE

Argument Name TypeIn/Out Default?

------------------------------ ----------------------- ------ --------ERRCODENUMBER INPARAMETER1 VARCHAR2IN DEFAULTPARAMETER2 VARCHAR2IN DEFAULTPARAMETER3 VARCHAR2IN DEFAULTPARAMETER4 VARCHAR2IN DEFAULTPARAMETER5 VARCHAR2IN DEFAULTPARAMETER6 VARCHAR2IN DEFAULTPARAMETER7 VARCHAR2IN DEFAULTPARAMETER8 VARCHAR2IN DEFAULTPROCEDURE FILE_TO_WORKER

Argument Name TypeIn/Out Default?

------------------------------ ----------------------- ------ --------MESSAGEKUPC$_MESSAGE IN FUNCTION GET_ENDIANNESS RETURNS NUMBER PROCEDURE MAINArgument Name TypeIn/Out Default?

------------------------------ ----------------------- ------ --------JOB_NAME VARCHAR2INJOB_OWNER VARCHAR2INRESTART_JOBBINARY_INTEGER INDEBUG_INFO BINARY_INTEGER INPROCEDURE MAINLOOP

PROCEDURE SET_DEBUG

Argument Name TypeIn/Out Default?

------------------------------ ----------------------- ------ --------DEBUG_FLAGSBINARY_INTEGER INFUNCTION VALIDATE_EXPRESSION RETURNS NUMBERArgument Name TypeIn/Out Default?

------------------------------ ----------------------- ------ --------EXPR_VALUE VARCHAR2IN其实他包含了若干函数,GET_ENDIANNESS是其中一个(从名称上看,貌似是获得“大小端信息”),显然是没找到对应函数,忘了从什么地方看到过关于这个函数的描述(如果哪位高人记得,可以回复下),他在9i中是不存在的,可以证明expdp导出过程是需要调用这个函数的,但这个函数在9i中是没有定义的,因此9i下是不能使用expdp。

4. 我们接着看dblink导出10g以上版本的库

SQL>create database link ldplink connect to puser identified by puser_pwd using 'link_10g'Database link created.

5. 编辑expdp配置文件:

[oracle11g@Node1 expdp_dir]$ vi link_10g.paruserid=user/pwd

directory=expdp_dir

dumpfile=link_10g.dump

logfile=link_10g.log

tables=puser.l_r

network_link=link_10g

6. 执行expdp:

[oracle11g@Node1 expdp_dir]$ expdp parfile=link_10g.parExport: Release 11.2.0.1.0 - Production on Mon May 18 13:40:45 2015Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsORA-31631: privileges are required

ORA-39149: cannot link privileged user to non-privileged user这回又提示ORA-31631和ORA-39149两个错误。

[oracle11g@Node1 expdp_dir]$ oerr ora 3163131631, 00000, "privileges are required"

// *Cause: The necessary privileges are not available for operations such// as: restarting a job on behalf of another owner, using a device// as a member of the dump file set, or ommiting a directory// object associated with any of the various output files.

// Refer to any following error messages for additional information.

// *Action: Select a different job to restart, try a different operation, or// contact a database administrator to acquire the needed privileges.

提示是缺少权限。

[oracle11g@Node1 expdp_dir]$ oerr ora 3914939149, 00000, "cannot link privileged user to non-privileged user"// *Cause: A Data Pump job initiated be a user with// EXPORT_FULL_DATABASE/IMPORT_FULL_DATABASE roles specified a// network link that did not correspond to a user with// equivalent roles on the remote database.

// *Action: Specify a network link that maps users to identically privileged// users in the remote database.

这个错误提示的更加明确,提示使用dblink并且具有EXPORT_FULL_DATABASE/IMPORT_FULL_DATABASE角色的执行用户,对应远端的用户并没有相应的角色权限。有点绕,简单讲,就是我这里使用expdp的数据库用户user,是有DBA权限的,因此具有EXPORT_FULL_DATABASE/IMPORT_FULL_DATABASE角色权限,但远端数据库用户puser只是普通用户,没有此权限,因此有这个提示错误。

解决方案1:

远端库中设置:

SQL>grant exp_full_database to puser

Grant succeeded.

再次执行expdp:

[oracle11g@Node1 expdp_dir]$ expdp parfile=link_10g.parExport: Release 11.2.0.1.0 - Production on Mon May 18 13:51:37 2015Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionWith the Partitioning, OLAP, Data Mining and Real Application Testing optionsStarting "USER"."SYS_EXPORT_TABLE_01": user/******** parfile=link_10g.parEstimate in progress using BLOCKS method...

Processing object type TABLE_EXPORT/TABLE/TABLE_DATATotal estimation using BLOCKS method: 64 KBProcessing object type TABLE_EXPORT/TABLE/TABLEProcessing object type TABLE_EXPORT/TABLE/INDEX/INDEXProcessing object type TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINTProcessing object type TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSProcessing object type TABLE_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS. . exported "PUSER"."L_R" 20.49 KB 28 rowsMaster table "BISAL"."SYS_EXPORT_TABLE_01" successfully loaded/unloaded******************************************************************************Dump file set for USER.SYS_EXPORT_TABLE_01 is:

/home/oracle11g/expdp_dir/link_10g.dump

Job "USER"."SYS_EXPORT_TABLE_01" successfully completed at 13:51:56解决方案2:

杨长老的这篇博文(http//blog.itpub.net/4227/viewspace-448665/)说明了此问题。对于这个问题,还有种方法,就是新建一个本地用户,不授予EXPORT_FULL_DATABASE/IMPORT_FULL_DATABASE角色。

总结:

1. 9i是不支持expdp的,即使从10g的expdp使用dblink连到9i,也是不行的,从上述实验可以看到,有些expdp使用的函数是在9i中没有定义的。

2. 使用dblink方式的expdp导出,要求要么本地用户没有EXPORT_FULL_DATABASE/IMPORT_FULL_DATABASE角色,要么本地用户有这两个角色,但此时要求远端用户有EXPORT_FULL_DATABASE角色,否则就会提示ORA-31631和ORA-39149这两个错误。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/6698340.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存