广告位 · 页头(后台-模块管理-新建模块后替换此区域)

Oracle 7中的数据库链接新特性如何让跨库查询更加高效?

在一个多实例的Oracle环境中,数据往往分散在不同的数据库里。应用系统时常需要在一个查询中同时访问本地表和远程表,比如订单表在中心库,客户信息在区域库,生成报表时要将两者关联起来。Oracle 7提供的数据库链接功能正是为了解决这类跨库数据访问需求。数据库链接可以理解为一个存储在本地数据字典中的连接描述符,它记录了远程数据库的网络位置、登录凭证等信息。当SQL语句中通过链接名引用远程表时,Oracle会自动建立会话并发送SQL到远程节点执行,然后将结果集返回本地参与后续运算。相比早期的透明网关或手工数据同步,这种方式更加直接和高效。

Oracle 7中的数据库链接新特性如何让跨库查询更加高效?

本文会先梳理数据库链接的类型和Oracle 7中的改进点,再通过实际SQL示例演示创建与使用过程,最后讨论安全与性能方面需要注意的问题。

数据库链接的类型与Oracle 7带来的变化

数据库链接的本质是一个命名对象,指向远程数据库实例,并携带连接所需的认证信息。在Oracle 7中,数据库链接主要分为两类:私有链接和公共链接。私有链接仅对创建它的用户可见,其他用户无法使用;公共链接则对整个数据库的所有用户开放,只要这些用户具备相应的远程对象权限。使用公共链接可以避免每个用户各自维护一份链接定义,但也会带来更广泛的安全暴露面。

Oracle 7对数据库链接的增强还体现在认证模式的细化上。创建链接时可以指定固定用户方式,此时链接中保存远程数据库的用户名和密码,任何使用该链接的本地用户都会以这个远程用户身份执行操作。另一种是当前用户方式,通过CONNECT TO CURRENT_USER来创建,使用链接的本地用户会以其自身在远程数据库中的同名账号进行认证。后者在权限控制上更加严格,避免了固定用户链接可能造成的权限放大问题。

此外,Oracle 7完善了数据字典对链接对象的管理。管理员可以通过DBA_DB_LINKS视图查看所有数据库链接的定义信息,包括链接名、主机字符串、创建用户、认证类型等。这为后续的审计和问题排查提供了很大便利。下面是创建数据库链接的基础语法。

CREATE [PUBLIC] DATABASE LINK link_name
CONNECT TO user_name IDENTIFIED BY password
USING 'tns_alias';

其中PUBLIC关键字表示创建公共链接,省略则表示私有链接。USING子句中的字符串是一个TNS别名,需要在本地网络配置文件中提前定义。

在Oracle 7中创建与使用数据库链接的完整步骤

创建数据库链接之前,需要确保本地数据库能够通过SQL*Net访问远程实例。通常会在tnsnames.ora文件中增加一个网络服务名,指定远程主机、端口和实例名。例如远程销售库的服务名为sales_tns,配置完成后可以先使用tnsping sales_tns测试连通性。确认网络层正常后,就可以在本地数据库中创建链接。

假设远程数据库中有一个用户scott,密码为tiger,我们需要从本地访问该用户下的dept表。首先创建一个私有固定用户链接:

CREATE DATABASE LINK remote_sales
CONNECT TO scott IDENTIFIED BY tiger
USING 'sales_tns';

链接创建成功后,便可以在SQL语句中通过@remote_sales后缀引用远程对象。例如查询远程的部门表:

SELECT deptno, dname, loc
FROM dept@remote_sales;

如果本地也有一张员工表emp,其中deptno列与远程部门表相关联,可以直接在一个查询中完成本地与远程表的连接:

SELECT e.empno, e.ename, d.dname, d.loc
FROM emp e
JOIN dept@remote_sales d
  ON e.deptno = d.deptno
WHERE e.sal > 3000;

这里需要注意,远程表返回的结果集在本地参与连接,因此如果远程表很大,网络传输的开销会非常明显。为了简化应用代码并隐藏远程对象的具体位置,可以创建同义词:

CREATE SYNONYM remote_dept
FOR scott.dept@remote_sales;

之后应用只需查询remote_dept,无需关心它来自哪个链接。如果不再需要某个链接,可以使用DROP DATABASE LINK remote_sales;将其删除。对于公共链接,则需要使用DROP PUBLIC DATABASE LINK remote_sales;。需要注意的是,删除链接不会影响远程数据库中的实际对象,它只是移除了本地到远程的访问通道。

数据库链接的安全风险与性能优化

数据库链接虽然方便,但安全风险不容忽视。固定用户链接在创建时会把远程用户的密码以加密形式保存在本地数据字典中。虽然Oracle会进行加密,但任何能查看USER_DB_LINKS视图的用户都可以看到链接名称和远程用户名,若本地权限管理不当,可能被恶意利用。更严重的是,使用固定用户链接的本地用户会以远程固定用户的身份执行所有操作,这意味着本地权限较低的用户可能通过链接获得远程库中的较高权限。为降低风险,建议为远程访问创建专用的最小权限账户,只授予必要的对象查询权限,不要在链接中使用生产环境的高权限用户。

当前用户链接提供了一种更安全的选择。通过CREATE DATABASE LINK remote_current CONNECT TO CURRENT_USER USING 'sales_tns';建立的链接,本地用户连接到远程库时会使用自己的用户名和密码进行认证。如果远程库中没有同名用户,或者密码不一致,连接就会失败。这种方式将权限边界收回到用户自身,避免了权限放大,但要求所有使用链接的用户在远程库中都要有对应的账号,维护成本会有所增加。DBA需要根据实际安全政策在便利性和安全性之间做出权衡。

性能方面,跨库查询的主要瓶颈在于网络往返和数据传输。Oracle 7执行远程查询时,通常会先将远程表的数据传输到本地,再与本地表进行连接等运算。如果远程表数据量巨大,这种方式会非常低效。优化手段之一是尽量在远程端完成过滤,例如在WHERE子句中增加针对远程表的条件,并确保远程端有合适的索引。另一种有效的方法是使用优化器提示来改变驱动表位置。下面的示例通过DRIVING_SITE提示让连接在远程库执行,从而减少网络传输的数据量:

SELECT /*+ DRIVING_SITE(d) */ e.empno, d.dname
FROM emp e, dept@remote_sales d
WHERE e.deptno = d.deptno;

Oracle 7还提供了动态性能视图V$DBLINK来监控当前打开的数据库链接及其状态。管理员可以通过查询该视图观察链接的活动情况、事务状态和错误信息,帮助判断远程查询是否出现异常。综合来看,合理设计链接类型、控制远程权限、减少不必要的数据搬运,是发挥Oracle 7数据库链接价值的关键。

广告位 · 文章底部(后台-模块管理替换此区域)