http://hi.baidu.com/lichangzai/blog/item/e3f7404efeb497d4d0c86aa3.html
问题:
今天遇到oracle10.2.0.3 impdp 数据到oracle11.2.0.3 后,导过去的dblink不可用。
导致出现好多无效过程和包等。
原因是,原库db_domain参数设置了值,在创建的dblink都有域后缀,即在创建dblink时会自动把域名加上:而且目标库没设置这个参数。
具体如下:
源库:
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string MYZ
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string billora.myz
SQL> show parameter global_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
BILLORA.MYZ
SQL> Select * From dual@LINK_123.myz;
DUMMY
-----
X
SQL> Select * From dual@LINK_123;
DUMMY
-----
X
目标库:
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string
SQL> show parameter service
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string billora
SQL> show parameter global_names
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
global_names boolean FALSE
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------------------------------------
BILLORA.MYZ
SQL> Select * From dual@LINK_123.myz;
DUMMY
-----
X
SQL> Select * From dual@LINK_123;
ORA-02019: 未找到远程数据库的连接说明
而存储过程里面的dblink都是使用的不带域后缀的名字,所以在导入到目标库后过程会失效。
解决办法:
--修改目标库的db_domain、global_name值
SQL> alter system set db_domain='MYZ' scope=spfile;
系统已更改。
SQL> alter database rename global_name to BILLORA.MYZ;
数据库已更改。
SQL> startup force;
ORACLE 例程已经启动。
Total System Global Area 5344731136 bytes
Fixed Size 2237776 bytes
Variable Size 3019901616 bytes
Database Buffers 2315255808 bytes
Redo Buffers 7335936 bytes
数据库装载完毕。
数据库已经打开
QL> Select * From dual@LINK_123.myz;
DUMMY
-----
X
SQL> Select * From dual@LINK_123;
DUMMY
-----
X
--最后再重新编译无效对象
--在tns里使用SERVICE_NAME连接数据库
bill_240 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.4.240)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = billora.myz)
)
)
此时如果再使用billora连接tns时会报ora-12514
总结:
下面是对这几个相关的参数概念的理解:
Db_name:对一个数据库(Oracle database)的唯一标识,该数据库为第一章讲到的Oracle database。这种表示对于单个数据库是足够的,但是随着由多个数据库构成的分布式数据库的普及,这种命令数据库的方法给数据库的管理造成一定的负担,因为各个数据库的名字可能一样,造成管理上的混乱。为了解决这种情况,引入了Db_domain参数,这样在数据库的标识是由Db_name和Db_domain两个参数共同决定的,避免了因为数据库重名而造成管理上的混乱。这类似于互连网上的机器名的管理。我们将Db_name和Db_domain两个参数用’.’连接起来,表示一个数据库,并将该数据库的名称称为Global_name,即它扩展了Db_name。Db_name参数只能由字母、数字、’_’、’#’、’$’组成,而且最多8个字符。
Db_domain:定义一个数据库所在的域,该域的命名同互联网的’域’没有任何关系,只是数据库管理员为了更好的管理分布式数据库而根据实际情况决定的。当然为了管理方便,可以将其等于互联网的域。
Global_name:对一个数据库(Oracle database)的唯一标识,oracle建议用此种方法命令数据库。该值是在创建数据库是决定的,缺省值为Db_name. Db_domain。在以后对参数文件中Db_name与Db_domain参数的任何修改不影响Global_name的值,如果要修改Global_name,只能用ALTER DATABASE RENAME GLOBAL_NAME TO 命令进行修改,然后修改相应参数。
Service_name:该参数是oracle8i新引进的。在8i以前,我们用SID来表示标识数据库的一个实例,但是在Oracle的并行环境中,一个数据库对应多个实例,这样就需要多个网络服务名,设置繁琐。为了方便并行环境中的设置,引进了Service_name参数,该参数对应一个数据库,而不是一个实例,而且该参数有许多其它的好处。该参数的缺省值为Db_name. Db_domain,即等于Global_name。一个数据库可以对应多个Service_name,以便实现更灵活的配置。该参数与SID没有直接关系,即不必Service name 必须与SID一样。
Net service name:网络服务名,又可以称为数据库别名(database alias)。是客户端程序访问数据库时所需要,屏蔽了客户端如何连接到服务器端的细节,实现了数据库的位置透明的特性
参考:
去掉DB_DOMAIN的方法
http://yangtingkun.itpub.net/post/468/279105
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/7922095/viewspace-721647/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/7922095/viewspace-721647/