Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1765158
  • 博文数量: 323
  • 博客积分: 5970
  • 博客等级: 大校
  • 技术积分: 2764
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-03 23:13
文章分类

全部博文(323)

文章存档

2018年(2)

2017年(11)

2016年(10)

2015年(27)

2014年(2)

2013年(30)

2012年(197)

2011年(44)

分类: Oracle

2012-09-18 16:57:24



     
ORACLE DBLINK 应用 


我用到的部分 

create database link xbzw_link 
      connect to xbzw identified by xbzw 
      using '(DESCRIPTION = 
       (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST =10.1.10.8)(PORT =1521)) 
       ) 
       (CONNECT_DATA = 
        (SERVICE_NAME = orcl) 
       ) 
      )'; 

红色部分为应该自己替换掉的部分 

访问的时候 如 SELECT * FROMTABLE@XBZW_LIKE; 

一下是一篇写的不叫不错的参考文档,附这里: 

1、用dblink链接oracle 

(1)与平台无关的写法: 

create public database 
link cdt connect to apps 
identified by apps using '(DESCRIPTION = 
(ADDRESS_LIST = 
(ADDRESS = (PROTOCOL = TCP)(HOST = 172.31.205.100)(PORT = 1541)) 

(CONNECT_DATA = 
(SERVICE_NAME = CDT) 

)' 

(2)可以将单引号内的内容用一个服务名代替。而将其内容写在tnsname.ora中,这种写法有时不成功。 
2、参考如下内容 

俩台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink。 
其实dblink和数据库中的view差不多,建dblink的时候需要知道待读取数据库的ip地址,ssid以及数据库用户名和密码。 
创建可以采用两种方式: 
1、已经配置本地服务 
create public database 
link fwq12 connect to fzept 
identified by neu using 'fjept' 
CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置的数据的实例名’; 
2、未配置本地服务 
create database link linkfwq 
connect to fzept identified by neu 
using '(DESCRIPTION = 
(ADDRESS_LIST = 
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521)) 

(CONNECT_DATA = 
(SERVICE_NAME = fjept) 

)'; 

host=数据库的ip地址,service_name=数据库的ssid。 
其实两种方法配置dblink是差不多的,我个人感觉还是第二种方法比较好,这样不受本地服务的影响。 

数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义. 

数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样 

数据库全局名称可以用以下命令查出 
SELECT * FROM GLOBAL_NAME; 

查询远端数据库里的表 
SELECT …… FROM 表名@数据库链接名; 
查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。 


附带说下同义词创建: 

CREATE SYNONYM同义词名FOR 表名; 
CREATE SYNONYM同义词名FOR 表名@数据库链接名; 

删除dblink:DROP PUBLIC DATABASE LINK linkfwq。 

如果创建全局dblink,必须使用systm或sys用户,在database前加public。 

3、用dblink链接sqlserver; 



参考1: 

通过dblink访问sqlserver数据库 

通用网关 
Oracle异构服务是包含在Oracle数据库中的一个模块,通过使用透明网关(Transparent Gateway)或通用连接(Generic Connectivity)来访问其它非Oracle系统的数据。 
异构服务的主要结构如下: 
各模块简要说明如下: 
异构服务模块:属于Oracle数据库的内核部分,负责大部分异构连接的处理; 
代理通用代码:对所有基于异构服务产品的通用代码; 
驱动:是与非Oracle系统直接交互的模块,实现从异构服务API到特定非Oracle系统API的映射。 
代理:是Oracle Server连接非Oracle系统的进程,包括两部分即代理通用代码和针对特定非Oracle系统的驱动。代理的位置可以与非Oracle系统在同一台机器上,或与Oracle Server在同一台机器上,或者单独在一台机器上。我这次实践的环境采用的是最后一种。 

透明网关和通用连接实际是异构服务中代理的两种类型。其中透明网关是功能较强的,它通过代理进程从Oracle Server访问各地的异构分布式数据库,而提供给用户的感觉是这些数据库仍然是Oracle数据库,Oracle公司提供对大多数商业数据库的透明网关。通用连接则有较多限制,它使用用户自己提供的ODBC或OLE DB驱动程序作为异构服务的代理驱动,并且要求这些驱动必须要安装在Oracle Server的$ORACLE_HOME目录下。 

配置过程: 
从SQLDB开始: 
1. 在SQLDB上创建将要从Oracle数据库访问SQL Server的用户testuser/testuser,并授予可访问CDR的权限; 
接下来是GATEWAY: 
1.安装好Oracle 9.0.1 Database for Windows后,会发现在%ORACLE_HOME%下有目录tg4msql,以及网关程序$ORACLE_HOME\BIN\tg4msql; 
2. 确保在c:\winnt\system32下有ntwdblib.dll,若没有则安装SQL Server2000(安装类型选择“仅连接”)。此文件是访问SQL Server的DB-Library; 
3. ping SQLDB看是否通,若不通则在\winnt\system32\drivers\etc\hosts文件中增加一行,用来解析SQLDB的IP地址,很简单不多说了。 
4. 修改%ORACLE_HOME%\tg4msql\inittg4msql.ora,这是网关进程启动时需要的初始化文件。只需改下面这一行即可: 
HS_FDS_CONNECT_INFO=SQLDB.CDR 
5.修改%ORACLE_HOME%\network\admin\listener.ora如下: 
LISTENER = 
(ADDRESS_LIST= 
(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521)) 

SID_LIST_LISTENER= 
(SID_LIST= 
(SID_DESC= 
(SID_NAME=tg4msql) 
(ORACLE_HOME=e:\Oracle\OraHome_9I) #用你的%ORACLE_HOME% 
(PROGRAM=tg4msql) 


最后是ORADB: 
1.修改tnsnames.ora 
CDR = #CDR是我起的,你可以选用其它 
(DESCRIPTION = 
(ADDRESS = 
(PROTOCOL = TCP) 
(HOST= GATEWAY) 
(PORT = 1521) 

(CONNECT_DATA = 
(SID = tg4msql) #tg4msql必须要和GATEWAY上listener.ora中的SID一致 

(HS = OK) #这很重要,告诉Oracle Server要调用异构服务模块来处理 

2.修改initora9i.ora(数据库初始化文件) 
global_names=true,重启数据库。 
否则会在执行sql时报错:ORA-02085: 数据库链接CDR与HO.WORLD相连结 
原因如下:The GLOBAL_NAMES parameter when set to TRUE implies that database link name should be similar to the Global database name to which you are trying to connect. 
3.创建访问SQLDB.CDR的数据库链接 
SQL>create public database link cdr connect to testuser identified by testuser using ‘CDR’; 
4. OK!最后执行SQL测试看是否能正常访问SQL Server 
SQL>select count(*) from all_tables@cdr; 

参考2 

连接SQLSERVER的WABAO2数据库 帐号sa 密码sa 

1。检查ORACLE的透明网关(Oracle Transparent Gateway)是否安装,如果安装了在HOME目录下有个tg4msql文件夹存在。如果没有,就运行安装文件自定义安装 

2。在HOME\tg4msql\admin下新写initwabao2.ora #注意这个文件名字 第3步的 SID_NAME 值是这个文件名去掉init 
HS_FDS_CONNECT_INFO="SERVER=zhanghuajie;DATABASE=wabao2" #设置SQLSERVER的地址 要访问的数据库名称 
HS_FDS_TRACE_LEVEL=OFF 
HS_FDS_RECOVERY_ACCOUNT=RECOVER 
HS_FDS_RECOVERY_PWD=RECOVER 

3。HOME\network\admin 下listener.ora部分内容如下: 
SID_LIST_LISTENER = 
(SID_LIST = 
(SID_DESC = 
(SID_NAME = PL***tProc) 
(ORACLE_HOME = D:\oracle) 
(PROGRAM = extproc) 

(SID_DESC = #添加了这一段 
(SID_NAME = wabao2) #注意这个地方,在第4步要用 
(ORACLE_HOME = D:\oracle) 
(PROGRAM = tg4msql) #固定 
) #结束 
(SID_DESC = 
(GLOBAL_DBNAME = zhj) 
(ORACLE_HOME = D:\oracle) 
(SID_NAME = zhj) 


重启动这台做gateway的TNSListener服务. 

4。tnsnames.ora, 添加下面的内容: 
wabao2 = 
(DESCRIPTION = 
(ADDRESS_LIST = 
(ADDRESS = (PROTOCOL = TCP)(HOST = zhanghuajie)(PORT = 1521)) 

(CONNECT_DATA = 
(SID = wabao2) #第3步的SID_NAME 

(HS = ok) #固定值 


5。 tnsping wabao2 
出现类似如下表示正确: 
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) 
(HOST = zhanghuajie)(PORT = 1521))) (CONNECT_DATA = (SID = wabao2)) (HS = ok)) 
OK(20毫秒) 

6。设置数据库参数global_names=false。 
设置global_names=false不要求建立的数据库链接和目的数据库的全局名称一致。 
global_names=true则要求, 多少有些不方便。 
oracle9i和oracle8i都可以在DBA用户下用SQL命令改变global_names参数 
alter system set global_names=false; 

7。建立公有的数据库链接: 
create public database link wabao2 connect to sa identified by sa using 'wabao2'; 

8。测试 
select * from test@wabao2; 
select "ID" from test@wabao2; #注意双引号 和大小写 

================================== 
两台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink。 
      其实dblink和数据库中的view差不多,建dblink的时候需要知道待读取数据库的ip地址,ssid以及数据库用户名和密码。 
        创建可以采用两种方式: 
         1、已经配置本地服务 
        
[点击图片可在新窗口打开] createpublicdatabase 
[点击图片可在新窗口打开] link fwq12 connecttofzept 
[点击图片可在新窗口打开] identifiedbyneu using'fjept' 
        CREATE DATABASE LINK数据库链接名CONNECT TO 用户名 IDENTIFIED BY 密码 USING ‘本地配置的数据的实例名’; 
      2、未配置本地服务 
[点击图片可在新窗口打开] createdatabaselink linkfwq 
[点击图片可在新窗口打开]    connecttofzept identifiedbyneu 
[点击图片可在新窗口打开]    using'(DESCRIPTION = 
[点击图片可在新窗口打开]      (ADDRESS_LIST = 
[点击图片可在新窗口打开]        (ADDRESS = (PROTOCOL = TCP)(HOST = 10.142.202.12)(PORT = 1521)) 
[点击图片可在新窗口打开]      ) 
[点击图片可在新窗口打开]      (CONNECT_DATA = 
[点击图片可在新窗口打开]        (SERVICE_NAME = fjept) 
[点击图片可在新窗口打开]      ) 
[点击图片可在新窗口打开]    )'; 

host=数据库的ip地址,service_name=数据库的ssid。 
        其实两种方法配置dblink是差不多的,我个人感觉还是第二种方法比较好,这样不受本地服务的影响。 

        数据库连接字符串可以用NET8 EASY CONFIG或者直接修改TNSNAMES.ORA里定义. 

        数据库参数global_name=true时要求数据库链接名称跟远端数据库名称一样 

        数据库全局名称可以用以下命令查出 
        SELECT * FROM GLOBAL_NAME; 

        查询远端数据库里的表 
        SELECT …… FROM 表名@数据库链接名; 
        查询、删除和插入数据和操作本地的数据库是一样的,只不过表名需要写成“表名@dblink服务器”而已。 


         附带说下同义词创建: 

       CREATE SYNONYM同义词名FOR 表名; 
      CREATE SYNONYM同义词名FOR 表名@数据库链接名; 

      删除dblink:DROP   PUBLIC   DATABASE   LINK linkfwq。 

       如果创建全局dblink,必须使用systm或sys用户,在database前加public。
阅读(1215) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~