oracle跨库之DBLink、synonym、view

文章目录

企业 Oracle 环境随业务拆分存在多套独立库实例,跨库数据查询、联表是测试高频操作。直接写完整远程表地址查询繁琐,还会泄露底层连接信息,维护麻烦。DBLink + 同义词是跨库访问标准配套方案。
本文站在测试视角,不深究底层创建语句,只梳理使用场景、理清工作逻辑。

讲个小故事

镇上有两家货仓,自家仓和邻村仓,中间隔道高墙,平日互不连通。管理员修了一道专属小门 DBLink,两边货物数据才能往来。

邻仓的货物登记册全名冗长,每次调取都要带上小门地址,十分繁琐。管理员给这份登记表起了个简单外号,也就是同义词,调取时只需喊简称。

登记册里混杂着残次品、过期货,查看起来杂乱。管理员做了一份筛选清单视图,只留存完好在售货品,不改动原始账本。

此后查询邻仓合格货物,走小门、喊简称、翻看精简清单,几步就能清晰获取所需信息,省时又省心

总结:

1、DBLink 是连通两个仓库的专属通道;

2、同义词是给通道那头的货物起本地好记的小名;

3、视图是只筛选出你需要的那部分货物清单。

介绍

  • 定义 Dblink是一个数据库对象,我们可以通过它访问其他数据库中的资源。可以理解为各个数据库之间的桥梁
  • 作用 没有DBLink 无法直接读远端库

    数据库内核替你保管"主机+端口+SID+账号+密码",并在运行时按这个信息建立到远程实例的会话,会话级资源。

synonym同义词

  • 定义

    是一个数据库对象,通过它可以对表、视图、序列等数据库对象起一个别名

  • 核心规则

    Oracle 一个同义词只能映射单个数据库对象(单表 / 单视图),不能绑定多条 SQL、多张表、多个 dblink。

    sql 复制代码
    // 需要整合两个源的表,实现方法:
    -- 1.视图整合多dblink数据
    CREATE VIEW v_all_emp AS
    SELECT * FROM emp@hq_db
    UNION ALL
    SELECT * FROM emp@center_db;
    
    -- 2.统一同义词对外访问
    CREATE SYNONYM syn_all_emp FOR v_all_emp;
    
    SELECT * FROM syn_all_emp;
  • 作用

    屏蔽 DBLink、IP、实例名,简化 SQL、隐藏底层信息

    数据字典里仅保存"别名 → 真实对象"的映射,纯元数据,不占用连接、不启动网络。

view视图

  • 定义 基于单 / 多表(含跨库 DBLink 同义词)封装查询逻辑的虚拟表,统一数据输出并实现脱敏、权限管控
  • 作用 封装关联逻辑、脱敏、屏蔽底层库信息、简化查询、做权限隔离

常见使用方法

sql 复制代码
SELECT * FROM emp@hq_db;   --hq_db 就是一个 dblink

使用场景:临时测试、一次性 SQL、不需要长期复用

synony同义词

sql 复制代码
CREATE SYNONYM emp_hq FOR emp@hq_db;  --先建 dblink 再建 synonym
SELECT * FROM emp_hq;                 --对应用完全透明

此时 emp_hq 看起来像本地表,实际语句在解析阶段被改写成 emp@hq_db,再按 dblink 规则远程执行。
使用场景:只查单张远程表,需要做增删改

view视图

sql 复制代码
--基于上面的同义词封装视图,统一业务查询、增加过滤/脱敏逻辑
CREATE VIEW v_emp_hq AS 
SELECT emp_id, name, department FROM emp_hq WHERE status = '有效';

--业务只访问视图,完全屏蔽底层dblink、同义词、过滤条件
SELECT * FROM v_emp_hq;
  • 上层使用者无需关心数据来自本地还是远端库,底层链路、表结构变更仅需维护视图下层,业务查询 SQL 不用修改。
  • 把多 dblink 关联、union、字段过滤全部封装在视图内,对外屏蔽底层跨库细节,权限管控更安全
    使用场景:多表合并、关联、过滤、脱敏、报表查询(仅读为主)

性能与可扩展性

1、每次执行都会伴随一次或多次网络往返,远程优化器无法感知本地上下文,容易出现"拉全表到本地再 JOIN"的执行计划;

2、高并发场景下还会耗尽远程进程/端口资源。

synonym同义词

零网络开销;如果指向的仍是远程对象,性能瓶颈仍在 dblink,但 synonym 本身不叠加新损耗

view视图

1、视图本身仅存储查询逻辑,解析阶段无额外性能损耗,性能完全取决于底层数据源(本地表 / 同义词 / DBLink);底层依赖 DBLink 时,跨库查询的网络、全表拉取等性能问题会原样继承;

2、视图内置过滤、关联、聚合逻辑,可提前限定数据范围,相比直接查远端表 / 同义词能减少远程传输数据量,间接优化耗时;

3、扩展性优势:底层 DBLink、同义词、表结构变更只需修改视图底层逻辑,上层业务查询语句无需改动,大幅降低脚本维护成本。

底层资源变更的兼容性表现

远程库 IP、实例地址变更

  • 仅直写 DBLink(表@link):只需修改 DBLink 的 USING 连接串,SQL 无需改动;
  • DBLink + 同义词:仅更新 DBLink 配置,同义词指向不变,上层查询脚本完全不用修改;
  • DBLink + 同义词 + 视图:仅更新 DBLink 即可,同义词、视图定义无需调整,业务访问视图无感知。

远端表名、Schema 名称调整

  • 仅直写 DBLink:全部业务 SQL 里的Schema.表@link都要批量修改,改造成本高;
  • DBLink + 同义词:仅重建 / 修改同义词映射关系,所有业务查询语句无需变动;
  • DBLink + 同义词 + 视图:仅修改底层同义词映射,视图、上层业务查询完全不受影响,改动最小。

总结速览表

维度 dblink 同义词 view 视图
到底是什么 一条"远程连接+会话"通道 一张"别名登记卡" 封装好的预定义查询 SQL 集合,虚拟表
能否单独存在 可以单独用,也可被 synonym 引用 必须指向某个真实对象(表、视图、序列、包...) 依赖底层物理表 / 同义词 / 远程 dblink 对象,不能脱离数据源独立存在
跨库能力 本身自带跨库/跨实例 本身不带跨库,若指向远程对象需先建 dblink 自身无跨库能力,底层数据源可绑定本地表或带 dblink 的远程同义词
能否隐藏 schema/位置 只能隐藏"连接串",schema 仍需写 连 schema 也能隐藏,实现"完全透明" 可多层封装,彻底屏蔽底层库、schema、链路信息,对外只暴露统一字段
性能损耗 有网络往返 + 远程 SQL 解析,高并发需慎用 0 额外成本,解析阶段就替换成真实对象 首次解析生成执行计划,无网络损耗;底层跨 dblink 时损耗跟随 dblink
安全粒度 可以按 link 做库级/用户级授权 可以按 synonym 做列级/对象级授权 支持字段脱敏、行数据过滤,可实现列级、行级精细化权限隔离
失效场景 网络中断、远端库停机、链路账号过期直接报错连接失败 底层表 / 链路删除后,查询提示对象不存在 底层同义词、dblink、表结构变更后,视图失效 / 字段错位 / 查询报错
一句话记忆 "电话线"------先打通,再说话 "名片"------只改名,不改人 "预制查询模板"------ 封装复杂关联、脱敏过滤,对外统一接口
对象 DML 修改数据 修改对象 多表场景 DML 支持度
dblink(表 @dblink 写法) 完整支持增删改 远程真实物理表 单表支持,多表要分开写
synonym(映射单远程表) 完整支持增删改 远程真实物理表 不支持多表合并,只能单表
view(单简单远程表) 支持增删改 底层远程表 -
view(union 多远程表) 仅查询,不能 DML 无写入能力 只能查,不可更新

补充

  • 多数国产库视图内不允许直接嵌套 dblink,必须先同义词中转;

    • 直接在视图嵌套 dblink(国产库大多报错,不允许)

      sql 复制代码
      -- 远端表:user_info@remote_dblink
      CREATE VIEW v_user AS
      SELECT id,name FROM user_info@remote_dblink;

      Oracle 原生支持这种写法,但达梦、金仓、GBase 等国产兼容库解析视图时识别不了 @dblink,创建视图直接失败

    • 同义词中转(国产库通用合规写法)

      sql 复制代码
      --  1:给 dblink 表创建本地同义词
      CREATE SYNONYM syn_user FOR user_info@remote_dblink;
      -- 2:视图只引用同义词(无 dblink,能正常创建)
      CREATE VIEW v_user AS 
      SELECT id,name FROM syn_user;
  • 安全合规要求:禁止业务直写表@dblink,标准规范:dblink + 私有同义词 + 只读视图三层封装。