87-Oracle DBlink和透明网关的创建

各位小伙伴,有没有业务侧要求除了生产使用的实例还有其他的oracle实例需要链接,还有其他的业务的MSSQLerver,PG等数据库的连接要求,需要配置LISTENER的配置和对应的脚本设置。

此次安装现场要求给oracle 11g和sqlserver2016进行透明网关链接,同时整理dblink创建留个记录。不过通过透明网关的查询注定了不同架构上的链接性能会有丢失,如果出现业务大查询到异端数据库的历史数据将会拉低整个业务的速度,谨慎使用。

一、Oracle DBLink技术与建立方式

1. 技术原理
  • 跨数据库通信​:DBLink是Oracle的分布式数据库组件,通过在本地库创建链接对象(含远程库连接信息),实现SQL语句的透明转发。本地库解析SQL后,将远程对象查询通过Oracle Net协议转发至目标库,并将结果返回客户端
  • 连接类型​:
    • 私有DBLink​:仅创建者可使用。
    • 公有DBLink​:所有用户均可访问(需CREATE PUBLIC DATABASE LINK权限)
2. 创建方式
实操脚本:
-- 创建公共DBLink(支持所有用户访问)
CREATE PUBLIC DATABASE LINK dblink_2_LIS  
CONNECT TO remote_user IDENTIFIED BY "P@ssw0rd2025"  -- 密码含特殊字符需双引号  
USING 'remote_tns';  -- 确保已在tnsnames.ora定义该服务名  

-- 为特定用户lis_user授权  
GRANT CREATE DATABASE LINK TO lis_user;        -- 私有链接权限  
GRANT CREATE PUBLIC DATABASE LINK TO lis_user; -- 公有链接权限  

二、透明网关配置步骤(Oracle 11g 对接 SQL Server 2016)​​

​环境信息​

角色

IP

路径/版本

Oracle DB + 网关

192.168.1.218

Oracle 11.2, Gateway 11.2

SQL Server

192.168.1.217

SQL Server 2016

步骤1:安装透明网关​
# 创建网关用户和目录  
useradd -g oinstall -G dba,oper,asmdba gateway  
mkdir -p /home/gateway/gwhome  

# 设置环境变量(添加到 ~/.bashrc)  
export ORACLE_HOME=/home/gateway/gwhome  
export LD_LIBRARY_PATH=$ORACLE_HOME/lib  
export TNS_ADMIN=$ORACLE_HOME/network/admin  
export PATH=$ORACLE_HOME/bin:$PATH  
步骤2:配置网关参数​

​1. 编辑 $ORACLE_HOME/hs/admin/initdg4mssql.ora:

HS_FDS_CONNECT_INFO = "192.168.1.217:1433//MSSQLSERVER/AdventureWorks"
-- SQL Server地址+实例+库名  
HS_FDS_TRACE_LEVEL = OFF  
HS_FDS_RECOVERY_ACCOUNT = recover_user  
HS_FDS_RECOVERY_PWD = recover_pwd  

2. 配置 $ORACLE_HOME/network/admin/listener.ora​: 

SID_LIST_LISTENER =  
  (SID_LIST =  
    (SID_DESC =  
      (SID_NAME = dg4mssql)  
      (ORACLE_HOME = /home/gateway/gwhome)  
      (PROGRAM = dg4mssql)  -- 网关程序名  
    )  
  )  
ADR_BASE_LISTENER = /home/gateway/gwhome  

3. 配置 $ORACLE_HOME/network/admin/tnsnames.ora: 

MSSQL_LINK =  
  (DESCRIPTION =  
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.218)(PORT = 1521))  
    (CONNECT_DATA = (SID = dg4mssql))  
    (HS = OK)  -- 关键标识  
  )  

4. 重启监听​: 

lsnrctl stop  && lsnrctl start
步骤3:创建DBLink并验证​ 
-- 创建DBLink  
CREATE DATABASE LINK mssql_dblink  
CONNECT TO "sa" IDENTIFIED BY "P@ssw0rd2025"
USING 'MSSQL_LINK';  

-- 验证查询(注意表名大小写)  
SELECT TOP 5 * FROM "dbo"."lis_history"@mssql_dblink;  

三、Oracle对接PostgreSQL配置(ODBC方式)​​

​1. 前置条件​
# 安装ODBC驱动(Linux)  
yum install -y unixODBC postgresql-odbc  

配置 /etc/odbc.ini: 

[PG_DSN]  
Driver      = PostgreSQL Unicode  
Servername  = 192.168.1.200  
Port        = 5432  
Database    = pacs_db  
Username    = postgres  
Password    = P@ssw0rd2025
2. 透明网关配置​

​1. 创建 $ORACLE_HOME/hs/admin/initpg.ora​:

HS_FDS_CONNECT_INFO = PG_DSN          -- 指向ODBC数据源  
HS_FDS_SHAREABLE_NAME = /usr/lib64/libodbc.so  
HS_NLS_NCHAR = UCS2                   -- 字符集配置  

2. 创建DBLink​: 

CREATE DATABASE LINK pg_link  
CONNECT TO "postgres" IDENTIFIED BY "P@ssw0rd2025"
USING 'PG_TNS';  

-- 跨库联合查询--请使用自己的库校验
SELECT o.omr_id, c.name  
FROM "public"."orders"@pg_link o  
JOIN local_omrs c ON o.omr_id = c.id;  

四、实操脚本汇总​

请使用自己库和表验证, 

SQL Server验证​
-- 查询历史数据  
SELECT TOP 5 * FROM "dbo"."LIS_history"@mssql_dblink;  

-- 插入数据(注意表名大小写)  
INSERT INTO "dbo"."LIS_history"@mssql_dblink (id, msg)  
VALUES (1, 'test_from_oracle');  
PostgreSQL验证 
-- 检查表是否存在  
SELECT * FROM "public"."orders"@pg_link WHERE 1=0;  

-- 数据同步示例  
INSERT INTO "public"."backup_orders"@pg_link  
SELECT * FROM local_orders WHERE order_date > SYSDATE - 30;  

五、使用体验:DBlink和透明网关便携性和局限

​DBLink的核心作用​

DBLink本质是跨数据库的虚拟通道,允许本地数据库通过一条预定义的链路(包含目标库的地址、认证信息)直接访问远程数据库对象。

现场工程师仅需编写标准SQL即可实现跨库数据查询、关联分析甚至数据推送,无需开发额外的API或ETL脚本。这种语法透明性大幅降低了跨系统集成的编码复杂度。

​透明网关的核心作用​

透明网关是异构数据库协议的转换层。当访问非原生数据库(如Oracle到SQL Server)时,网关自动完成以下关键转换:

​SQL方言翻译​:将Oracle的SQL语法转换为目标库支持的语法(如T-SQL for SQL Server);

​数据类型映射​:处理类型差异(如Oracle的VARCHAR2转SQL Server的VARCHAR,Oracle的DATE转PostgreSQL的TIMESTAMP);

​连接路由​:通过HS(Heterogeneous Services)组件管理连接池,优化资源复用。

其结果是将异构数据库伪装成“同构”数据源,使DBLink能无缝工作

技术差异和局限性​
​性能瓶颈​

​网络开销​:数据需经多层转发,大结果集传输时延迟显著;

​协议转换损耗​:SQL翻译和类型转换增加CPU开销,复杂查询(如多表JOIN)性能可能下降。

​功能兼容性局限​

​数据类型不匹配​:Oracle的CLOB/BLOB、SQL Server的IMAGE类型可能不被支持;

​方言限制​:目标库专有函数(如SQL Server的GETDATE())需重写为通用语法;

​事务隔离​:跨库事务通常仅支持自动提交,分布式事务(如XA)需额外协调。

​运维复杂度​

​配置敏感​:一个参数错误(如HS_FDS_CONNECT_INFO的IP格式错误)即导致ORA-28545(无效链接);

​字符集陷阱​:若两端字符集不兼容(如GBK与UTF-8),中文数据可能出现乱码。

你可能感兴趣的:(oracle,数据库,database,sql,大数据)