dbLink是简称,全称是databaselink。database link是定义一个数据库到另一个数据库的路径的对象,database link允许你查询远程表及执行远程程序。在任何分布式环境里,database都是必要的。另外要注意的是database link是单向的连接。在创建database link的时候,Oracle再数据字典中保存相关的database link的信息,在使用database link的时候,Oracle通过Oracle Net用用户预先定义好的连接信息访问相应的远程数据库以完成相应的工作。
1.赋值权限
例如为用户BOSS823赋值link相关的权限
sql
grant create public database link,create database link to BOSS823;
2.创建dblink
语法:
sql
CREATE [SHARED] [PUBLIC] database link link_name
[CONNECT TO [user] [current_user] IDENTIFIED BY [password]
[AUTHENTICATED BY user IDENTIFIED BY password]
[USING 'connect_string']
- 权限:创建数据库链接的帐号必须有CREATE DATABASE LINK或CREATE PUBLIC DATABASE LINK的系统权限,用来登录到远程数据库的帐号必须有CREATE SESSION权限。这两种权限都包含在CONNECT角色中(CREATE PUBLIC DATABASE LINK权限在DBA中)。一个公用数据库链接对于数据库中的所有用户都是可用的,而一个私有链接仅对创建它的用户可用。由一个用户给另外一个用户授权私 有数据库链接是不可能的,一个数据库链接要么是公用的,要么是私有的。
- link : 当source端的参数(parameter)GLOBAL_NAMES=TRUE时,link名必须与远程数据库的全局数据库名global_name)相同;否则,可以任意命名。
- current_user使用该选项是为了创建global类型的dblink。在分布式体系中存在多个数据库的话。如果想要在每一个数据库中都可以使用同样的名字来访问数据库a,那在每个数据库中都要创建一个到数据库a的db_link,太麻烦了。所以有这个选项的话你只要创建一次。所有的数据库都可以使用这个db_link来访问了。要使用这个特性,必须有oracle nameserver或者ORACLE目录服务器。并且数据库a的参数global_names=true.具体我也没有创建过,没有这个环境。
- connectstring:连接字符串,tnsnames.ora中定义远程数据库的连接串,也可以在创建dblink的时候直接指定。
- username、password:远程数据库的用户名,口令。如果不指定,则使用当前的用户名和口令登录到远程数据库,当创建connected user类型的dblink时,需要如果采用数据字典验证,则需要两边数据库的用户名密码一致
举例:创建名称为dblink821的dbLink, 链接访问10.0.192.36数据库的BOSS821T用户
sql
create database link dblink821
connect to BOSS821T identified by BOSS821
using '10.0.192.36_STARSMS';
或者使用图形界面创建
3.查询dblink
sql
SQL> select * from dba_db_links;
OWNER DB_LINK USERNAME HOST CREATED
------------------------------ -------------------------------------------------------------------------------- ------------------------------ -------------------------------------------------------------------------------- -----------
BOSS823 DBLINK821.REGRESS.RDBMS.DEV.US.ORACLE.COM BOSS821T 10.0.192.36_STARSMS 2024/3/6 17
SQL>
4.删除dblink
sql
DROP database link link_name;
5.使用dblink
1>访问链接数据库中的表
sql
select * from BOSS821T.CUSTOMEREN @dblink821
2>通过dblink复制表
通过dblink复制表性能很高,例如下面的测试,复制17W数据执行时间约3秒
sql
SQL> select COUNT(*) from BOSS821T.CUSTOMEREN @dblink821T;
COUNT(*)
----------
171736
SQL> create table CUSTOMER821T as select * from BOSS821T.CUSTOMEREN @dblink821T;
Table created
SQL>
执行时间:3.089秒
6.常见问题ORA-02063
如果出现ORA-02063可能是由于11开始支持字符大小写问题引起的
bash
--ORA-01017: invalid username/password; logon denied
--ORA-02063: preceding line from <link_name>
查看数据库信息
bash
--查看当前数据库的版本
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Prod
PL/SQL Release 10.2.0.3.0 - Production
CORE 10.2.0.3.0 Production
TNS for 32-bit Windows: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
--查看链接到数据库的版本
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production
被访问的数据库的版本是11g,因此修改dblink,使用双引号来设置密码
sql
-- Create database link
create database link dblink821T
connect to BOSS821T identified by "boss821T"
using '10.0.192.36_STARSMS';