今天遇到了ORA-24777错误,通过METALINK
ORA-24777: use of non-migratable database link not allowed
Cause: The transaction, which needs to be migratable between sessions, tried to
access a remote database from a non-multi threaded server process.
Action: Perform. the work in the local database or open a connection to the re
mote database from the client. If multi threaded server option is installed, con
nect to the Oracle instance through the dispatcher
感觉有点不知所云,然后看了下BAIDU发现很多同学都是设置了shared dblink 来解决的然后看了shared DBLINK的概念:
http://www.eygle.com/archives/2007/11/howto_change_global_name.html
我们应该都很熟悉global_name这个词,在进行db link的创建时,通常都需要关注一下global_name.
注意,我这里说的不是初始化参数global_names。
通过视图global_name可以获得当前参数的设置:
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------
WAPDB.REGRESS.RDBMS.DEV.US.ORACLE.COM
那么这个global_name视图的数据来自何处呢?
通过global_name视图的创建语句我们可以获得如下信息:
create or replace view global_name
(global_name)
as
select value$ from sys.props$ where name = 'GLOBAL_DB_NAME'
我们看到global_name中的信息实际上是来自props$内部表的,取得的信息是其中的global_db_name字段。
SQL> select value$ from sys.props$ where name = 'GLOBAL_DB_NAME';
VALUE$
--------------------------------------------------
WAPDB.REGRESS.RDBMS.DEV.US.ORACLE.COM
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------
WAPDB.REGRESS.RDBMS.DEV.US.ORACLE.COM
这里得到的是通常数据库创建的缺省设置,在生产环境中,我们可以通过如下命令来修改Global_name:
SQL> alter database rename global_name to WAPDB.EYGLE.COM;
Database altered
SQL> select * from global_name;
GLOBAL_NAME
--------------------------------------------------
WAPDB.EYGLE.COM
这个global_name为什么很重要呢?
因为在创建db link的时候,db Link的最终格式与此相关,实际上global_name由两部分组成,DB_NAME和DB_DOMAIN。在创建db link的时候,Oracle会自动将db_domain作为后缀添加上去。而且一旦加入就很难变更。
所以在进行高级复制、Streams复制等配置时,最好首先将多个节点的global_name规划好。