sqlplus 消耗 99% CPU

sea*_*lea 6 oracle oracle-10g sqlplus

Oracle 安装在一台服务器上,我在sqlplus另一台(应用程序)服务器上运行。我最近遇到了sqlplus任何事情的问题;它只是旋转,即使被要求打印自己的帮助或版本信息,它也会消耗 99% 的 CPU。

sqlpluscronjob在过去的几年里,每天都在同一个盒子上运行良好。我还在需要时临时在命令行下直接运行它。sqlplus运行的盒子只包含 oracle 客户端文件,它从未安装过完整的数据库。

上周,cron 作业停止工作,ps输出显示几个sqlplus仍在运行的实例,但没有数据库活动。我尝试sqlplus从命令行运行,但它挂了。我杀死了所有旧sqlplus实例并sqlplus再次尝试,它似乎仍然挂起。没有错误信息,没有输出。如果我给它完全编造的参数、TNS 条目或任何东西,它甚至不会抱怨。

这些是我尝试过的命令,它们sqlplus只是挂起并且不会发出错误、故障代码或任何可见的生命迹象:

user@server:~ $ sqlplus
user@server:~ $ sqlplus -V
user@server:~ $ sqlplus -H
user@server:~ $ sqlplus /NOLOG
user@server:~ $ sqlplus -invalidoption
user@server:~ $ sqlplus -invalidoption /NOLOG
Run Code Online (Sandbox Code Playgroud)

而且当然:

user@server:~ $ sqlplus -s dbuser/dbpassword@tnsid /some/script.sql
Run Code Online (Sandbox Code Playgroud)

从下面可以看出,oracle文件已经很长时间没有变化了......

user@server:~ $ ls -ld $(which -a sqlplus)
-rwxr-xr-x  1 oracle oracle 12896 Apr 15  2008 /usr/oracle/product/10gClient/bin/sqlplus
user@server:~ $ sqlplus -H

user@server:~ $ env | grep ORACLE
ORACLE_BASE=/usr/oracle
ORACLE_HOME=/usr/oracle/product/10gClient
user@server:~ $ ls -ld $ORACLE_HOME/network/admin/*
drwxr-xr-x  2 oracle oracle   4096 Apr 15  2008 /usr/oracle/product/10gClient/network/admin/samples
-rwxr-xr-x  1 oracle oracle    172 Dec 26  2003 /usr/oracle/product/10gClient/network/admin/shrept.lst
-rwxr-xr-x  1 oracle oracle    289 Apr 16  2008 /usr/oracle/product/10gClient/network/admin/sqlnet.ora
-rw-rw-r--  1 oracle oracle 187931 Apr 22  2009 /usr/oracle/product/10gClient/network/admin/tnsnames.ora
user@server:~ $
Run Code Online (Sandbox Code Playgroud)

为了比较,这是我希望看到的输出,sqlplus在另一台服务器上使用:

user@server2:~ $ ls -ld $(which -a sqlplus)
-rwxr-xr-x  1 oracle oracle 12896 Apr 29  2008 /usr/oracle/product/10gClient/bin/sqlplus
user@server2:~ $ sqlplus -V

SQL*Plus: Release 10.2.0.1.0 - Production

user@server2:~ $
Run Code Online (Sandbox Code Playgroud)

物有所值,tnsping效果很好。此外,我们知道在同一台机器上运行的其他应用程序能够很好地建立数据库连接。但是正如我希望在上面显示的那样,即使我要求它在没有连接到数据库的情况下执行本地操作,sqlplus 也不起作用(即,如果我促使 sqlplus 输出帮助文本或它自己的版本信息,它仍然消耗 99% CPU 并且不退出。)

尚未尝试过的一件显而易见的事情是重新启动盒子。由于客户端服务器被公司中的多个应用程序和团队使用,我需要在请求重新启动之前用尽所有可用选项。

评论中要求的其他信息:

sqlplus 挂起时的 ps 输出:

user@server:~ $ ps aux | grep sqlplus
user 27319 99.2  0.0  20188  4628 pts/7    R+   17:04   1:13 sqlplus -H
user 27427  0.0  0.0   3600   744 pts/5    S+   17:05   0:00 grep sqlplus
Run Code Online (Sandbox Code Playgroud)

如果我尝试同时以不同用户的身份运行它:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      8089 88.7  0.0  20032  4628 pts/5    R+   08:13   0:57 sqlplus /NOLOG
user1     8103 89.8  0.0  19824  4632 pts/3    R+   08:13   0:53 sqlplus /NOLOG
user2     8125 91.0  0.0  19492  4628 pts/2    R+   08:13   0:47 sqlplus /NOLOG
oracle    8286 74.8  0.0  20212  4632 pts/6    R+   08:14   0:06 sqlplus /NOLOG
user3     8292  0.0  0.0   3444   748 pts/0    S+   08:14   0:00 grep sqlplus
Run Code Online (Sandbox Code Playgroud)

我没有whence,但是显示了which -a输出和以 exe 的完整路径运行的结果:

user@server:~ $ which -a sqlplus
/usr/oracle/product/10gClient/bin/sqlplus
user@server:~ $ /usr/oracle/product/10gClient/bin/sqlplus -H

user@server:~ $ sqlplus -H

user@server:~ $
Run Code Online (Sandbox Code Playgroud)

任何和所有运行都sqlplus需要 Ctrl+C 中止(但从未使用过。)

strace -p<pid> 挂起进程之一的输出:

....
times(NULL)                             = -2100628462
times(NULL)                             = -2100628462
times(NULL)                             = -2100628462
times(NULL)                             = -2100628462
times(NULL)                             = -2100628462
times(NULL)                             = -2100628462
times(NULL)                             = -2100628461
times(NULL)                             = -2100628461
times(NULL)                             = -2100628461
times(NULL)                             = -2100628461
.... ad infinitum ....
Run Code Online (Sandbox Code Playgroud)

sea*_*lea 4

Oracle 客户端版本、strace 输出和系统正常运行时间详细信息相结合表明这可能是Oracle bug 4612267,且已提供补丁。该问题应该可以通过重新启动或应用补丁来解决。

user@server:~ $ uptime
  9:54am  up 254 days  0:26,  5 users,  load average: 1.39, 1.56, 1.75
user@server:~ $ genezi -v
Client Shared Library 32-bit - 10.02.00.01.00
Run Code Online (Sandbox Code Playgroud)

我已请求将补丁应用于我们的服务器,以确认补丁是否解决了问题。不幸的是,有人在应用补丁之前随机重新启动了服务器 - 最终结果是 sqlplus 再次运行,这对我来说有好处,但意味着我无法确认补丁是否可以在不重新启动的情况下解决问题。