过度使用DBLINK带来的问题

本文探讨了在Oracle数据库中使用DBLink进行远程数据访问所遇到的问题,包括ORA错误、资源消耗、网络带宽占用及潜在bug。文章强调了大量使用DBLink可能导致的性能下降和稳定性问题,并提供了关闭DBLink的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过创建DBLINK和同义词把一个数据库拆成两个数据库,所带来的问题如下:

 

ORA-02068: following severe error from EDUSMS

ORA-03113: end-of-file on communication channel

原因:

由于大量使用dblink远程连接未正常释放所致,也可能是bug所致。

那么解决办法就是自然而然想到手动关闭本地数据库session的中DBlink。

使用ALTER SESSION CLOSE DATABASE LINK dblink_name或者DBMS_SESSION.CLOSE_DATABASE_LINK('dblink_name')语句来手动关闭远程dblink session.,

并且关闭的时候:需要先commit或者rollback,即使是select语句也需要的。

但是又衍生出来一些问题

 

-2080 PROC_1 ORA-02080: database link is in use

-2054 PROC_2 ORA-02054: transaction 19.5.1746719 in-doubt ORA-01013: user requested cancel of current operationORA-06512: at "EDU.PROC_2", line 421

-2050 ****ora-02050: transaction 29.16.354514 rolled back, some remote DBs may be in-doubt ORA-01013: user requested cancel of current operationORA-06512: at "EDU.PROC_CS_REC_INFO", line 407

-1591 PROC_MSGBOARD_SAVE:ORA-01591: lock held by in-doubt distributed transaction 11.18.2527897ORA-06512: at "EDU.PROC_MSGBOARD_SAVE", line 576

还没查出来具体的业务上实现的原因,

 

总而言之

最好不要大量使用dblink方式实时远程取数据。

频繁对远程数据库创建连接,释放连接会有较大开销,特别是OLTP类数据库。

此类远程dblink连接session,如本地session不退出或手动释放,此类session是不会及时自动释放的。大量耗用远程数据库资源。

占用网络带宽。

触发bug,此类bug很多。

使用dblink嵌套dblink的访问方式,更是离谱。性能会非常糟糕,而且不稳定。

 


 

 


 

 

转载于:https://www.cnblogs.com/gracejiang/archive/2010/12/28/5890440.html

### MySQL 中使用 DBLink 进行跨数据库连接 尽管 MySQL 官方并未提供内置的 `DBLink` 功能,但可以通过一些第三方工具或插件实现类似的跨数据库查询功能。以下是几种常见的方法: #### 方法一:通过 FEDERATED 存储引擎 MySQL 提供了一种名为 **FEDERATED** 的存储引擎,允许创建指向远程 MySQL 数据库表的本地表。这使得可以从一个 MySQL 数据库中查询另一个 MySQL 数据库的数据。 ##### 创建 FEDERATED 表 假设有一个远程 MySQL 数据库,其中有一张名为 `remote_table` 的表。可以在本地 MySQL 数据库中创建一张对应的 FEDERATED 表来进行跨库查询。 ```sql CREATE TABLE federated_table ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) ) ENGINE=FEDERATED CONNECTION='mysql://username:password@remote_host:port/database_name/remote_table'; ``` 上述 SQL 语句会创建一个名为 `federated_table` 的本地表,该表实际上映射到远程 MySQL 数据库中的 `remote_table` 表[^1]。 ##### 查询远程数据 一旦创建了 FEDERATED 表,就可以像查询本地表一样查询远程数据: ```sql SELECT * FROM federated_table; ``` --- #### 方法二:通过 ODBC 或 JDBC 驱动程序 如果需要从 MySQL 跨库查询其他类型的数据库(如 Oracle、PostgreSQL 或 MSSQL),可以借助外部工具或中间层解决方案。例如,使用 ETL 工具(如 Talend、Pentaho)、编程语言(如 Python、Java)或者专用的桥接器软件。 以下是一个基于 Python 和 pymysql 库的简单示例,展示如何从 MySQL 查询另一数据库的数据并将其插入当前数据库中: ```python import pymysql # 连接到源数据库 source_conn = pymysql.connect(host="source_db_host", user="user", password="pass", database="source_db") source_cursor = source_conn.cursor() source_cursor.execute("SELECT column1, column2 FROM source_table;") source_data = source_cursor.fetchall() # 连接到目标数据库 target_conn = pymysql.connect(host="target_db_host", user="user", password="pass", database="target_db") target_cursor = target_conn.cursor() # 插入数据到目标数据库 for row in source_data: target_cursor.execute("INSERT INTO target_table (column1, column2) VALUES (%s, %s)", row) target_conn.commit() source_conn.close() target_conn.close() ``` 这种方法虽然不是真正的 `DBLink`,但它实现了类似的效果,并且适用于多种异构数据库环境[^2]。 --- #### 方法三:通过 MariaDB 的 CONNECT 存储引擎 MariaDB 是 MySQL 的分支版本,提供了更强大的功能支持,其中包括一种名为 **CONNECT** 的存储引擎。它能够直接访问各种文件和数据库系统,从而实现跨数据库查询。 ##### 示例配置 假设要从 MariaDB 查询 MySQL 数据库中的数据,可以按照如下方式设置: ```sql CREATE SERVER my_mysql_server FOREIGN DATA WRAPPER mysql OPTIONS ( HOST 'remote_host', PORT 3306, DATABASE 'database_name', USER 'username', PASSWORD 'password' ); CREATE TABLE remote_table ( id INT NOT NULL AUTO_INCREMENT, data_column VARCHAR(255), PRIMARY KEY (id) ) ENGINE=CONNECT TABLE_TYPE=mysql CONNECTION='my_mysql_server'; ``` 完成以上步骤后,可以直接查询 `remote_table` 来获取来自远程 MySQL 数据库的数据[^3]。 --- ### 总结 由于 MySQL 自身缺乏原生的 `DBLink` 支持,因此通常依赖于特定场景下的替代方案。对于同构数据库之间的交互,推荐使用 **FEDERATED** 存储引擎;而对于复杂的多数据库环境,则建议采用编程语言或其他高级工具来构建桥梁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值