当前位置:首页 > 问答 > 正文

db2里头要怎么才能强制断开那些数据库连接呢,有没有什么简单点的办法?

IBM官方DB2知识中心、DB2数据库管理员常用操作手册以及一些技术社区如Stack Overflow上的常见问答)

在DB2数据库里,当你需要做一些像备份、恢复或者某些重要的结构变更(比如给表增加一个字段但不想让任何人动它)时,最理想的情况是让所有用户都自己退出登录,你可以礼貌地通知大家:“系统需要维护,请各位在10分钟内保存好手头工作并退出数据库。”但现实往往是,总会有那么一两个连接挂着,可能是某个被遗忘的长期运行查询,也可能是一个已经僵死的应用程序进程,这时候,你就需要采取强制手段来断开这些“顽固”的连接了。

一个比较直接和常用的办法是使用DB2的命令行处理器,你首先需要以拥有足够权限的用户(比如实例所有者或者有SYSADM、SYSCTRL权限的用户)登录到数据库所在的服务器上,打开一个命令行窗口。

第一步,你得先看清楚现在到底有哪些连接,可以输入命令:db2 list applications,这个命令会列出一个清单,就像看谁在线上一样,清单里会显示每个连接的一些关键信息,比如连接对应的“应用程序句柄”(这相当于每个连接的唯一身份证号码),是哪个用户连的,从哪台电脑连过来的,以及它正在执行什么操作。

db2里头要怎么才能强制断开那些数据库连接呢,有没有什么简单点的办法?

找到你想断开的连接后,第二步就是执行强制断开操作,命令很简单:db2 force application (应用程序句柄),你看到某个讨厌的连接它的句柄是123,那么你就输入 db2 force application 123,然后回车,DB2就会立刻终止这个连接,它正在做的事情也会被中断。

但有时候,连接可能非常多,你不想一个一个去处理,而是想“一锅端”,你想断开所有连接到某个特定数据库的连接(假设数据库名叫SAMPLE),这时候,你可以用一个更强大的命令:db2 force application all使用这个命令要极其小心! 因为它会不分青红皂白地断开所有当前连接到这个DB2实例的所有数据库的所有连接,这可能会导致一大片正在运行的业务系统突然中断,造成严重影响,除非你非常确定这就是你想要的效果,并且已经做好了全面中断的准备,否则尽量不要在生产环境轻易使用 force application all

db2里头要怎么才能强制断开那些数据库连接呢,有没有什么简单点的办法?

有没有更精准一点“一锅端”的办法呢?有的,一个更安全的做法是,你先连接到那个特定的数据库(比如SAMPLE),然后再执行强制操作,步骤是这样的:先输入 db2 connect to SAMPLE 连接到目标数据库,然后输入 db2 force application all,但需要注意的是,根据一些DB2版本和配置,即使你这样做了,可能仍然会断开实例级别的一些关键后台进程,所以风险依然存在,最稳妥的“批量”操作,还是建议通过编写简单的脚本,先通过 list applications 命令筛选出目标数据库的连接(通过grep命令过滤数据库名),然后循环对每个筛选出的应用程序句柄执行 force application 命令,这样虽然多几步操作,但可控性高得多。

除了强制命令,还有一个“温和”一点的前置步骤可以考虑,就是先让数据库进入“静默”模式,你可以使用命令:db2 quiesce database immediate force connections,这个命令会尝试让数据库静默,并强制转换所有现有连接的状态,阻止新的连接进来,这为你后续执行维护操作清理了场地,完成维护后,记得用 db2 unquiesce database 命令来解除静默状态,恢复正常服务。

必须强调一下,强制断开连接是一种“暴力”操作,它不会给应用程序任何保存数据或优雅退出的机会,相当于直接拔掉电源线,可能会造成数据不一致或应用程序报错,在执行之前,务必确保:

  1. 已经尽可能通知了相关用户。
  2. 确认强制断开不会对关键业务造成不可接受的损失。
  3. 最好在业务低峰期进行操作。 来源综合自:DB2官方文档中关于“force application”和“quiesce”命令的说明,以及DBA在实践中的经验总结和社区讨论案例。)