文章目录
- 讲个小故事
- 介绍
- 常见使用方法
- 性能与可扩展性
- 底层资源变更的兼容性表现
-
- [远程库 IP、实例地址变更](#远程库 IP、实例地址变更)
- [远端表名、Schema 名称调整](#远端表名、Schema 名称调整)
- 总结速览表
- 补充
企业 Oracle 环境随业务拆分存在多套独立库实例,跨库数据查询、联表是测试高频操作。直接写完整远程表地址查询繁琐,还会泄露底层连接信息,维护麻烦。DBLink + 同义词是跨库访问标准配套方案。
本文站在测试视角,不深究底层创建语句,只梳理使用场景、理清工作逻辑。
讲个小故事
镇上有两家货仓,自家仓和邻村仓,中间隔道高墙,平日互不连通。管理员修了一道专属小门 DBLink,两边货物数据才能往来。
邻仓的货物登记册全名冗长,每次调取都要带上小门地址,十分繁琐。管理员给这份登记表起了个简单外号,也就是同义词,调取时只需喊简称。
登记册里混杂着残次品、过期货,查看起来杂乱。管理员做了一份筛选清单视图,只留存完好在售货品,不改动原始账本。
此后查询邻仓合格货物,走小门、喊简称、翻看精简清单,几步就能清晰获取所需信息,省时又省心
总结:
1、DBLink 是连通两个仓库的专属通道;
2、同义词是给通道那头的货物起本地好记的小名;
3、视图是只筛选出你需要的那部分货物清单。
介绍
DBLink
- 定义 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 同义词)封装查询逻辑的虚拟表,统一数据输出并实现脱敏、权限管控
- 作用 封装关联逻辑、脱敏、屏蔽底层库信息、简化查询、做权限隔离
常见使用方法
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、字段过滤全部封装在视图内,对外屏蔽底层跨库细节,权限管控更安全
使用场景:多表合并、关联、过滤、脱敏、报表查询(仅读为主)
性能与可扩展性
DBLink
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 + 私有同义词 + 只读视图三层封装。