Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >寻找锁定数据库用户的真凶

寻找锁定数据库用户的真凶

作者头像
bisal
发布于 2019-01-29 07:17:51
发布于 2019-01-29 07:17:51
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

前几天,一位兄弟部门的同事,提过来一个问题,有一台开发Oracle数据库服务器,修改了一个应用用户的密码,然后就发现这个账户隔几分钟就会被锁,需要手工unlock解锁才行,但没过一会又被锁了,问了一圈开发人员,基本都说使用这个账户的应用要么停了,要么跟着改了密码。很是挠人。

从现象看,推测可能还是有未修改用户密码的应用仍在运行中,接下来就按照当时探究的过程复盘。

1.首先看下这个环境。 11.2.0.4版本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> select * from v$version where rownum=1;
BANNER
---------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

双节点的RAC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[oracle@db1 ~]$ cat /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1       localhost
#Public
x.x.x.11   db1
x.x.x.12   db2
#Private
x.x.x.1   db1-priv
x.x.x.2   db2-priv
#Virtual
x.x.x.13   db1-vip
x.x.x.14   db2-vip
#SCAN
x.x.x.15   db-cluster

2.现象是用户隔几分钟就会被锁定,从用户profile的角度确认是否设置了密码尝试错误次数的参数。

假设这用户名是USER,首先查询到其使用的profile是默认的DEFAULT

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> select username, profile from dba_users where username='USER';

USERNAME                   PROFILE
------------------------- --------------------------
USER                       DEFAULT

再查询出DEFAULT这个profile的FAILED_LOGIN_ATTEMPTS参数值是10:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SQL> select resource_name, limit from dba_profiles where profile='DEFAULT';

RESOURCE_NAME                    LIMIT
-------------------------------- ------------------------
COMPOSITE_LIMIT                  UNLIMITED
SESSIONS_PER_USER                UNLIMITED
CPU_PER_SESSION                  UNLIMITED
CPU_PER_CALL                     UNLIMITED
LOGICAL_READS_PER_SESSION        UNLIMITED
LOGICAL_READS_PER_CALL           UNLIMITED
IDLE_TIME                        UNLIMITED
CONNECT_TIME                     UNLIMITED
PRIVATE_SGA                      UNLIMITED
FAILED_LOGIN_ATTEMPTS            10
PASSWORD_LIFE_TIME               180
PASSWORD_REUSE_TIME              UNLIMITED
PASSWORD_REUSE_MAX               UNLIMITED
PASSWORD_VERIFY_FUNCTION         NULL
PASSWORD_LOCK_TIME               1
PASSWORD_GRACE_TIME              7

16 rows selected.

首先,这就能解释为什么USER用户unlock解锁后,隔几分钟就又会被锁,就是由这个参数决定的,至于Oracle如何统计登录失败次数,可以参考eygle很久前写过的一篇短文,介绍的很清楚: http://www.eygle.com/archives/2009/07/profile_failed_login_attempts.html

3.从以上现象来推断,还是有未修改用户密码的应用在运行,接下来看看监听的信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[oracle@db1 ~]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 25-MAR-2016 18:38:31

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                04-FEB-2015 10:05:52
Uptime                    415 days 8 hr. 32 min. 39 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /oracle/app/11.2.0/grid/network/admin/listener.ora
Listener Log File         /oracle/app/grid/diag/tnslsnr/db1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.11)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.13)(PORT=1521)))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM1", status READY, has 1 handler(s) for this service...
Service "DB" has 1 instance(s).
  Instance "DB1", status READY, has 1 handler(s) for this service...
Service "DBXDB" has 1 instance(s).
  Instance "DB1", status READY, has 1 handler(s) for this service...
The command completed successfully

我们得知监听日志位置: /oracle/app/grid/diag/tnslsnr/db1/listener/alert/log.xml

看到有一些令人兴奋的记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<msg time='2016-03-10T13:11:17.467+08:00' org_id='oracle' comp_id='tnslsnr'
 type='UNKNOWN' level='16' host_id='db2'
 host_addr='x.x.x.12'>
 <txt>10-MAR-2016 13:11:17 * (CONNECT_DATA=(SID=db2)(CID=(PROGRAM=)(HOST=__jdbc__)(USER=))) 
 * (ADDRESS=(PROTOCOL=tcp)(HOST=x.x.x.24)(PORT=43428)) * establish * db2 * 0
 </txt>
</msg>

我们可以清楚的看到有一个x.x.x.24的IP,使用jdbc连接方式连接到这台数据库服务器,准确的说是db2,即RAC的第二个节点。而且这个信息是有时几乎1秒钟就会记录一次。

说到这,有个细节,就是dbsnake提醒,由于这是一套RAC环境,因此监听日志不是一份,而是每一个节点都有,开始我碰巧看的是没有x.x.x.24连接记录节点的日志,还怀疑自己之前的判断,后来到另外一个节点就发现了这个IP。

这里端口PORT是43428,会发现每次记录的端口是变化的,即应用连接监听listener经历的两次握手过程。

4.找到了这个IP,是不是就完事儿了?反馈给同事,广播开发人员,但无人有印象在这台机器上有部署过应用。。。

没办法,就自己来呗。

登录这台x.x.x.24机器,root的home目录下就有一个晃眼的dataSync.jar文件。数据同步? 解压这文件,搜索数据库IP,幸运的发现com/xxx/xxx/xxx/datasync/config/jdbc.properties这个文件,打开看看,有一段正是连接这个RAC节点的配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
jdbc.jdbcUrl=jdbc:oracle:thin:@x.x.x.14:1521:db2

再看看,这个目录下还有一个go的脚本,内容是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -Xms1024m -Xmx1024m -XX:MaxPermSize=256m -jar dataSync.jar xx  10 &

感觉越来越接近真相,从这推测,是后台调用dataSync.jar,而且有一个参数10,有可能就是时间间隔。

再找一找,发现有log文件夹,里面有日志,打开看:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
2016-03-11 00:04:07,881 - ... While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.sql.SQLException: ORA-28000: the account is locked

at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)

(1).这个日志当前还在不停滚动。 (2).日志中已经明确写出ORA-28000,提示当前用户被锁定了。

基于以上所有线索,百分百确认x.x.x.24的dataSync.jar应用就是因库用户密码变更,其未改变,导致用户频繁被锁的真凶!

5.接下来的工作,就是“找到部署这个应用的人,打一顿”(开玩笑:))。可能有几种方法:

(1) 后台kill这个进程,删除go脚本的可执行权限,或移动位置。

(2) 修改dataSync配置中用户错误的密码。

6.在上面监听日志中,除了x.x.x.24的IP外,还有一条记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<msg time='2016-03-10T13:11:17.467+08:00' org_id='oracle' comp_id='tnslsnr'
 type='UNKNOWN' level='16' host_id='db2'
 host_addr='x.x.x.12'>

这条记录也是频繁出现,他是做什么用?dbsnake指点,“这个应该是OHASD定期(每隔1分钟)去连一下本机的listener,目的可能是为了监控本机 listener的健康状况—— Oracle11gR2 Grid Control Oracle High Availability Services OHASD Oracle Agent, (ora_agent) manages the TNS Listener(s) when the ‘ENABLE_GLOBAL_DYNAMIC_ENDPOINT_LISTENER = ON’ parameter is set in the listener.ora file for the Grid Control configuration. ”

7.lsnrctl status:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Trace Level   off
Security  ON: Local OS Authentication
SNMP  OFF
Listener Parameter File   /oracle/app/11.2.0/grid/network/admin/listener.ora
Listener Log File /oracle/app/grid/diag/tnslsnr/db1/listener/alert/log.xml

这块显示的Listener Log File是默认开启的更宏观的连接信息,使用log_status。

另外的Trace Level=off应该表示的是更细粒度的信息,默认关闭,可以在sqlnet.ora配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TRACE_LEVEL_CLIENT=16
TRACE_FILE_CLIENT=CLIENT
TRACE_TIMESTAMP_CLIENT=OFF
trace_directory_client=/u01/app/oracle/11.2.0.4/dbhome_1/network/admin

总结

1.无论应用大小,都应该有比较完善的维护机制,至少有一个简易文档,不至于移交工作之后,这个应用成为黑洞,造成不必要的麻烦。

2.Oracle中每个现象是都会有其相应的原因,正所谓因果联系,更不要轻易放过任何一个细节,比如之前要找两个节点的监听日志,比如检索dataSync中有没有文件制定了数据库IP信息。

3.Oracle很多知识点都是相互串联的,监听、监听日志、监听trace日志、profile等等,很多的小点汇聚为了一个庞大的系统,同样,对于这么个问题也是,需要抽丝拨茧般排查每个问题,研究每一个现象后,才能得出最后的结论,往往是更有说服力的。Oracle的魅力就在于此。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2016年03月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一次ORA-28000: the account is locked用户锁定的问题排查
今天同事反映一个问题,某个测试库修改了密码,并改了相关应用使用的密码后,仍出现一会账户就被锁住,报ORA-28000: the account is locked的错误。 检查过程: 1. 查看资源限制生效参数 SQL> show parameter resource NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------------ resource_limit                       boolean     FALSE FALSE表示未启动资源限制。 2. 查看该用户所用的PROFILE SQL> select resource_name, limit from dba_profiles where profile='DEFAULT'; RESOURCE_NAME                    LIMIT -------------------------------- ---------------------------------------- COMPOSITE_LIMIT                  UNLIMITED SESSIONS_PER_USER                UNLIMITED CPU_PER_SESSION                  UNLIMITED CPU_PER_CALL                     UNLIMITED LOGICAL_READS_PER_SESSION        UNLIMITED LOGICAL_READS_PER_CALL           UNLIMITED IDLE_TIME                        UNLIMITED CONNECT_TIME                     UNLIMITED PRIVATE_SGA                      UNLIMITED FAILED_LOGIN_ATTEMPTS            10 PASSWORD_LIFE_TIME               UNLIMITED PASSWORD_REUSE_TIME              UNLIMITED PASSWORD_REUSE_MAX               UNLIMITED PASSWORD_VERIFY_FUNCTION         NULL PASSWORD_LOCK_TIME               1 PASSWORD_GRACE_TIME              7 其中FAILED_LOGIN_ATTEMPTS表示连续登陆失败的次数,这里表示连续登陆10次失败则锁定用户。 3. 解除用户锁定ALTER USER pss3 ACCOUNT UNLOCK;后观察现象 SQL> select name, lcount from user$ where name='PSS3'; NAME                               LCOUNT ------------------------------ ---------- PSS3                                   10 不到一分钟,登陆失败次数就到10次了。 初步结论: 可能有应用仍使用旧的密码登陆,登陆失败后重复尝试,直到10次为止。 但问题就来了: 1. FAILED_LOGIN_ATTEMPTS设置为10次,但未启动resource_limit,为什么还受到10次的限制呢? 2. 怎么知道还有哪些应用由于未修改密码导致ORA错误呢? 问题1:FAILED_LOGIN_ATTEMPTS设置为10次,但未启动resource_limit,为什么还受到10次的限制呢? 这篇MOS文章160528.1(Profile Limits (Resource Parameter(s)) Are Not Enforced / Do Not Work)文章说了一些: After creating a new profile or altering an old one to limit the following profile resources there is no change:  SESSIONS_PER_USER CPU_PER_SESSION CPU_PER_CALL CONNECT_TIME IDLE_TIME L
bisal
2019/01/29
2.2K0
关于UR=A的测试
当数据库在nomount,mount或者restricted这类特殊状态下,同时动态监听显示状态为BLOCKED,客户端无法直接连接到实例,此时可通过配置UR=A进行连接。最常见的场景就是10g版本的RAC,配置OGG时需要访问ASM实例的情况(实测11.2版本的RAC ASM实例动态监听的显示状态为Ready,无需添加UR=A配置即可连接)。下面是测试过程:
Alfred Zhao
2019/05/24
9890
【DB笔试面试837】在Oracle中,动态注册和静态注册有什么区别?
Oracle的注册就是将数据库作为一个服务注册到监听程序,而客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务,根据注册方式的不同,目前Oracle支持动态注册和静态注册这两种注册方式。
AiDBA宝典
2020/07/14
1.1K0
关于数据库中的一些name(r3笔记第64天)
如果接触数据库有些时间了,可能会碰到很多关于数据库相关的名字,比如ORACLE_SID,db_name,instance_name,db_unique_name等等。可能一下子都有些糊涂了,就一股脑儿认为都应该是一致的,其实不然。如果你接触的环境比较单一,可能会有这种错觉。 我们来简单对比一下单实例和多实例下的数据库中的这些名词。 首先来看看单实例的。 [ora11g@rac1 ~]$ echo $ORACLE_SID TEST01 [ora11g@rac1 ~]$ sqlplus / as sys
jeanron100
2018/03/15
6570
ADG无法同步:TT00进程报错 Error 12514
环境: Oracle 19.16 ADG (Single Instance -> RAC) 在配置ADG的场景,发现ADG不能同步。
Alfred Zhao
2023/02/10
9560
【DB宝30】使用Docker测试Oracle 11g高可用DG功能
Oracle 11g DG搭建方法参考:【DB宝29】使用Docker搭建Oracle 11g的DG环境
AiDBA宝典
2021/05/06
6080
【DB宝30】使用Docker测试Oracle 11g高可用DG功能
[Centos7]oracle监听问题处理
因UPS意外跳闸导致服务器宕机,将各服务恢复后,发现LIMS系统无法正常访问,通过报错提示发现监听有问题,处理方法见下文:
贰叁壹小窝
2021/03/01
1.4K0
RAC 增加SCAN IP
对新配置的oracle RAC环境增配2个SCAN IP地址,192.168.59.175以及192.168.59.176。
AiDBA宝典
2019/09/29
1.1K0
Oracle11g监听器(Listener)的一些基础知识
用于建立客户端与服务器之间的网络连接。 监听器运行在服务器端,属于一种网络服务,用于监听客户端向数据库发出的连接请求。
甚至熊熊
2021/04/22
1.9K0
Oracle11g监听器(Listener)的一些基础知识
RAC 10.2.0.5,客户端登陆间断遭遇ORA-12545
网络没有丢包(实验过程遇到的网络是有丢包的是路由问题,已经事先将网络问题解决,但还报错)
Alfred Zhao
2019/05/24
9180
【DB宝14】在Docker中只需2步即可拥有Oracle 11g企业版环境(11.2.0.4)
一、从Docker Hub或阿里云镜像下载小麦苗上传的镜像文件 二、创建容器并启动数据库 三、尽情使用吧 3.1 数据库使用 3.2 创建数据库(可选) 3.3 EMDC的使用 3.4 使用ssh连接到容器内 3.5 外部客户端连接容器内的数据库
AiDBA宝典
2020/08/04
2.3K2
【DB宝14】在Docker中只需2步即可拥有Oracle 11g企业版环境(11.2.0.4)
linux centos7环境下修改oracle19c监听IP并重启
在linux服务器centos7上新安装的oracle 19c,结果发现客户端怎么都连不上。检查了下,发现原来是监听的端口采用默认配置为了LOCALHOST:
冬天里的懒猫
2022/09/16
3K0
linux centos7环境下修改oracle19c监听IP并重启
案例:使用scan IP无法连接数据库
环境:Oracle RAC(11.2.0.3) 现象:通过scanIP连接数据库报错ORA-12514: ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
Alfred Zhao
2019/05/24
2.2K0
RAC 某节点不可用时,对应VIP是否可用
实验环境:RHEL 6.5 + GI 11.2.0.4 + Oracle 11.2.0.4 验证:RAC 某节点不可用时,其对应VIP是否可用?是否可用于连接数据库?
Alfred Zhao
2019/05/24
8810
【DB笔试面试733】在Oracle中,RAC中REMOTE_LISTENER的作用是什么?
REMOTE_LISTENER参数主要用于RAC环境中监听器的远程注册,监听器的远程注册主要用于实现负载均衡。通常情况下,客户端发出的连接请求会首先被LOCAL_LISTENER接收,然后由Master Instance来决定当前的连接请求应该由哪个目标Instance发出Server Process响应这个连接请求。在启用了负载均衡的情形下,Master Instance会将请求转发到负载较小的实例。如果此时Remote_Listener中指定的实例负载较小,那么当前的请求会被重定向到负载较小的Instance中来建立连接,派生服务器进程进行相应连接。
AiDBA宝典
2020/01/20
1.9K0
【DB笔试面试733】在Oracle中,RAC中REMOTE_LISTENER的作用是什么?
奕新集团GG环境搭建(无图)
D:\Oracle官方文档\E11882_01\install.112\e24326\toc.htm
全栈程序员站长
2021/12/23
1.9K0
【DB宝13】在Docker中只需2步即可拥有Oracle 12cR1(12.1.0.2)企业版环境
镜像大概4.05G左右,解压后大约16G左右,所以请保留充足的空间。执行过程如下:
AiDBA宝典
2021/05/06
8910
【DB宝13】在Docker中只需2步即可拥有Oracle 12cR1(12.1.0.2)企业版环境
SQL Developer 连接 oracle数据库 报错 Io 异常 The Network Adapter could not establish the connection的三种解决方法
Io 异常: The Network Adapter could not establish the connection 这个异常的出现一般与数据库和你的PC的设置有关
猫头虎
2024/04/07
3.7K0
SQL Developer 连接 oracle数据库 报错 Io 异常 The Network Adapter could not establish the connection的三种解决方法
RHEL装完oracle 11g后遇到的问题
编辑/etc/sysconfig/selinux配置文件, 把SELINUX=enforcing 改为 SELINUX=disabled。
明年我18
2019/09/18
6740
RHEL装完oracle 11g后遇到的问题
Oracle SQLPlus 客户端使用指南
登录 SQLPlus 是最基础也是最关键的步骤。需要ORACLE_SID 和ORACLE_HOME环境变量,如果这些变量没有被设置或设置不正确,请为其设置正确的值。
运维开发王义杰
2023/08/15
2.2K0
Oracle SQLPlus 客户端使用指南
推荐阅读
相关推荐
一次ORA-28000: the account is locked用户锁定的问题排查
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验