dblink

来源:互联网 发布:vb颜色代码大全 编辑:程序博客网 时间:2024/05/16 01:24

需求:
要从146上能查询111的数据并将111的数据直接Insert进146.
方法:
1.在146上创建到111的dblink
2.不用在146本机的tnsnames.ora文件中,配置一个指向111的服务,直接146上(其中SERVICE_NAME要在111中select name from v$database;):
  create database link link146_111 connect to user_name identified by "pwd" using ' 
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.111)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = ORCLYXKJ)
    )
  )';

3.上面执行成功后,即可在146上查询111的数据了。

select * from table_name@link146_111;

 

 -------这个记录比较乱,可以不看。

 1、已经配置本地服务:
   CREATE DATABASE LINK 数据库链接名(即你要使用的名字) CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置的数据的实例名’(远程tnsnames.ora中的名字);

  --注意数字开头的密码要用英文双引号括起!!密码不用引号(字母开头)或者使用双引号(数字开头)。如:ydsoft_test密码是123,那么就是connect to ydsoft_test identified by "123" 。下面的link146_112是以后使用的link的名称,如,select * from dual@link146_112
   如(146连112,那么在146上创建dblink):

create database link link146_112   connect to ydsoft_test identified by "123"   using 'ORCL112';

这个orcl112是数据库连接服务名,每台机器可能都不一样,可以自己在client数据库本机net manager配置。

数据库连接字符串'BEJING'是当前客户端数据库中TNSNAMES.ORA文件里定义的别名名称.可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义.
2、未配置本地服务(人感觉还是第二种方法比较好,这样不受本地服务的影响,不受tnsnames.ora文件的限制。)

使用:

create database link link146_112_notns connect to ydsoft_test identified by "123" using '    (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))    )    (CONNECT_DATA =      (SERVICE_NAME = orclyxkj)    )  )';

这个其实就是把orcl112具体化了,具体化之后,不用到client数据本机库配置tns,比较简单。


修改host和service_name.
create database link centerdb connect to prowlan identified by prowlan using '
DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.32.54.198)(PORT = 1581)) )(CONNECT_DATA = (SERVICE_NAME =dev))'
这个一个很通用的方法,与tnsname.ora文件就无关了。不然使用create database link centerdb connect to prowlan identified by prowlan using 'ZJHC_134.98.1.19';需要读取tnsname.ora文件中'ZJHC_134.98.1.19'这条记录。

另外,开不开global_name都可以创建dblink。

如果global_names=true,那么db link的命名要和远程数据库的global_name相同;
如果global_names=false,那么你可以随便命名db link。

SQL>   SELECT * FROM GLOBAL_NAME;GLOBAL_NAME--------------------------------------------------------------------------------ORCLYXKJ.REGRESS.RDBMS.DEV.US.ORACLE.COMSQL> show parameter global_namesNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------global_names                         boolean     FALSESQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';OWNER                          OBJECT_NAME------------------------------ --------------------------------------------------------------------------------SQL> 


 

我的实例(不用看)(我的global_name是false,但是我在146上创建了2个dblink,实质是一个,但是两个link的名字不一样,一个名字使用的是112的global_name,另一个是我自己起的名字link146_112):

create database link ORCLYXKJ.REGRESS.RDBMS.DEV.US.ORACLE.COM   connect to ydsoft_test identified by "12345678"   using 'orclyxkj';

 

create database link link146_112   connect to ydsoft_test identified by "12345678"   using 'ORCLYXKJ';


然后,查询146上创建了哪些连其他数据库的link,会发现:

SQL> select owner,object_name from dba_objects where object_type='DATABASE LINK';OWNER                          OBJECT_NAME------------------------------ --------------------------------------------------------------------------------YDSOFT_TEST                    LINK146_112.REGRESS.RDBMS.DEV.US.ORACLE.COMYDSOFT_TEST                    ORCLYXKJ.REGRESS.RDBMS.DEV.US.ORACLE.COMSQL> 

发现,link146_112后面也跟了一大串的........所以,创建dblink写名字时,只写第一个点前面的就可以了,不用写那么长,它自己会加上。
然后,我测试dblink是否可用,在146上:

SQL> select * from dual@link146_112;select * from dual@link146_112ORA-12541: TNS: 无监听程序SQL> 


发现,报错了,无监听。由于146上的这个dblink是连接的112库,于是我远程上112看了一下112的状态:

c:\>lsnrctl status

发现它的监听是开启的,那,怎么办呢?一般人都用第二种创建dblink的方式,那么,我决定用第二种试一下:

SQL> create database link link146_112_1 connect to ydsoft_test identified by "123" using '  2  DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521)) )(CONNECT_DATA = (SERVICE_NAME =ORCLYXKJ))';Database link createdSQL> SELECT * FROM DUAL@LINK146_112_1;  --测试dblinkSELECT * FROM DUAL@LINK146_112_1ORA-12154: TNS: 无法解析指定的连接标识符

找了点资料:

“假设你的DB_LINK是想从DB1连接到DB2,你需要配置DB1机器上的tnsnames正确指向DB2。如果你确认DB1上的tnsnames中配置正确;那么再确认你正确的tnsnames被使用了,也就是说DB1机器上系统的环境变量指向哪个oracle的bin目录,使用的是不是你配置正确的那个tnsnames文件。”

确信你在A数据库中建的dblink使用的服务名是A机器上的,不是非数据库服务器的client上的。如果是在某个client登陆上A数据库创建的,千万别使用该client上的服务名。

我又在112上创建了一个dblink(112):

SQL> create database link link146_to112_at112  2     connect to ydsoft_test identified by "123"  3     using 'ORCLYXKJ';Database link created

然后还是试图从146上访问112的表(146):

SQL> select * from dual@link146_to112_at112;select * from dual@link146_to112_at112ORA-02019: 未找到远程数据库的连接说明

146无法访问112,然而我在112上使用这个dblink又可以访问112(112,下面查出的count确实是112的count而不是146的):

SQL> select count(1) from t_busi_main_presend2@link146_to112_at112;  COUNT(1)----------    170079SQL> 

那,为什么在112上执行连接到112的dblink又可以连接了呢?(其实就是112访问112,但是后面加了@link146_to112_at112,我想实质还是不一样的。)

然后,我又删掉了112上的dblink,重新用第二种方式在112上创建了dblink:

SQL> DROP  DATABASE LINK link146_to112_at112;Database link droppedSQL> SQL> create database link link146_112_at112 connect to ydsoft_test identified by "123" using '  2    DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521)) )(CONNECT_DATA = (SERVICE_NAME =ORCLYXKJ))';Database link createdSQL> 


再次上146试图查询112(146):

SQL> select * from dual@link146_112_at112;select * from dual@link146_112_at112ORA-02019: 未找到远程数据库的连接说明SQL> 


……各种尝试……终于:

结论(重要):

1.146连124的话,dblink要创建在146上,如果使用方法2创建,那么不用在146本机去修改tnsnames.ora文件,直接在146上操作即可(最简单):

create database link link146_112_notns connect to ydsoft_test identified by "123" using '    (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))    )    (CONNECT_DATA =      (SERVICE_NAME = orclyxkj)    )  )';


如果用方法1创建:

146本机的tnsnames.ora文件中,要配置一个指向112的服务(即要在146本机配置指向112的net manager,也可以手动更改tnsnames.ora)。建好之后,在146的tnsnames.ora文件中,应该有这样一段:

观点:A数据库要连B数据库,首先在A数据库的tnsnames.ora文件里面应该配有B数据库的host,port,service_name等等,这样A数据库连的时候才知道连的谁

ORCL112 =  (DESCRIPTION =    (ADDRESS_LIST =      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.112)(PORT = 1521))    )    (CONNECT_DATA =      (SERVICE_NAME = orclyxkj)    )  )

其中:

ORCL112是146本机连接112使用的名字(如果我的136要连112,名字可以随便取),orclyxkj是112的数据库名(如果我的136要连112,这里也应该是orclyxkj。查看数据库名:select name from v$database;)

  1>.查看112数据库名:

SQL> select name from v$database;NAME---------ORCLYXKJSQL> 

  2>.146上配好112的tns之后,就可以在146创建dblink连接112了(146):

SQL> create database link link146_112  2     connect to ydsoft_test identified by "123"  3     using 'ORCL112';   --112数据库名Database link createdSQL> select count(1) from t_busi_main_presend2@link146_112;  COUNT(1)----------    170749    --这是查询的112上的表SQL> 


所以,针对第一种创建方法(第二种不受这种限制):

1.查看client客户本机tnsnames.ora文件中是否配置了server服务器的各种。要自己在server db查dbname。

在A数据库创建连接到B库的dblink,首先要在A库本机的tnsnames.ora文件中配置B库(可以手动更改文件,也可以在A上net manager),然后再建。至于dblink的名字,不用带那很多点的,删除时也一样。