背景:
当数据库连接数爆满,无法登录到数据库进行操作时,这时候该怎么办?
解决方案 1:使用操作系统级别的 sqlplus
强制登录
即使连接数满了,作为 DBA 用户仍然可以通过以下方式登录:
sqlplus -prelim / as sysdba
增大进程数、或者连接数:
-
-prelim
:启动抢救模式登录数据库,不创建会话,跳过大部分初始化流程。 -
登录后可以执行以下操作:
SQL> ALTER SYSTEM SET processes=2000 SCOPE=SPFILE; SQL> ALTER SYSTEM SET sessions=2000 SCOPE=SPFILE; SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP;
注意:限制模式下无法清理会话
解决方案 2:kill外部连接
步骤 1:获取监听端口号
Oracle 默认监听端口是 1521,但建议通过 lsnrctl status
确认实际的监听端口。
执行:
lsnrctl status
示例输出:
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=your_host)(PORT=1521)))
此处确认监听端口为 1521。
步骤 2:列出所有外部连接
使用 netstat
找出所有与监听端口相关的外部连接:
netstat -anp | grep :1521 | grep ESTABLISHED
示例输出:
tcp 0 0 192.168.1.1:1521 192.168.1.100:54321 ESTABLISHED 12345/oracle
tcp 0 0 192.168.1.1:1521 192.168.1.101:54322 ESTABLISHED 12346/oracle
tcp 0 0 192.168.1.1:1521 192.168.1.102:54323 ESTABLISHED 12347/oracle
...
此命令将列出所有连接到 Oracle 数据库的外部会话。
步骤 3:筛选前100个连接的进程号
使用 awk
和 cut
提取前 100 个与 Oracle 数据库外部连接相关的进程号(PID):
netstat -anp | grep :1521 | grep ESTABLISHED | awk '{print $7}' | cut -d'/' -f1 | head -100
示例输出:
12345
12346
12347
...
步骤 4:清理前 100 个外部连接
通过 kill
命令终止这些外部连接:
for pid in $(netstat -anp | grep :1521 | grep ESTABLISHED | awk '{print $7}' | cut -d'/' -f1 | head -100); do
echo "Killing PID $pid"
kill -9 $pid
done
执行后,你将清理掉前 100 个外部连接。