各位小伙伴,有没有业务侧要求除了生产使用的实例还有其他的oracle实例需要链接,还有其他的业务的MSSQLerver,PG等数据库的连接要求,需要配置LISTENER的配置和对应的脚本设置。
此次安装现场要求给oracle 11g和sqlserver2016进行透明网关链接,同时整理dblink创建留个记录。不过通过透明网关的查询注定了不同架构上的链接性能会有丢失,如果出现业务大查询到异端数据库的历史数据将会拉低整个业务的速度,谨慎使用。
-- 创建公共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; -- 公有链接权限
角色 |
IP |
路径/版本 |
Oracle DB + 网关 |
192.168.1.218 |
Oracle 11.2, Gateway 11.2 |
SQL Server |
192.168.1.217 |
SQL Server 2016 |
# 创建网关用户和目录
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
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
-- 创建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;
# 安装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
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;
请使用自己库和表验证,
-- 查询历史数据
SELECT TOP 5 * FROM "dbo"."LIS_history"@mssql_dblink;
-- 插入数据(注意表名大小写)
INSERT INTO "dbo"."LIS_history"@mssql_dblink (id, msg)
VALUES (1, 'test_from_oracle');
-- 检查表是否存在
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本质是跨数据库的虚拟通道,允许本地数据库通过一条预定义的链路(包含目标库的地址、认证信息)直接访问远程数据库对象。
现场工程师仅需编写标准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),中文数据可能出现乱码。