Oracle数据库重启后密码失效的问题(r12笔记第91天)
从应用服务启动的日志来看,错误信息是连接池的地方有了问题。
Error: 2017-06-09 10:04:59 init connpool:one or more conn open error.
Error: 2017-06-09 10:12:50 init connpool:one or more conn open error.
带着疑问我根据他提供的基本信息定位到了数据库服务端的端口,查看监听器的日志,发现下面的一段内容:
09-JUN-2017 10:06:46 * <unknown connect data> * 12537
TNS-12537: TNS:connection closed
TNS-12560: TNS:protocol adapter error
TNS-00507: Connection closed
Linux Error: 115: Operation now in progress
09-JUN-2017 10:06:54 * <unknown connect data> * 12537
TNS-12537: TNS:connection closed
TNS-12560: TNS:protocol adapter error
TNS-00507: Connection closed
Linux Error: 115: Operation now in progress
这是一个12c的环境,这个CDB里面有大概8个PDB,所以我得定位到具体的PDB继续测试。
如果说是CDB级别的数据库层面有问题,我可以看到有几个PDB的连接数大概有300多个。而出问题的PDB连接数确实为0,这一点也确实有些怪异。
是这个PDB有问题吗,我看PDB的状态是READ WRITE,连接没有任何限制,而且我使用已有的一个用户名和密码做连接测试是没有问题的。况且在这位同事范酷IDE那个时间点,我们也没有做什么操作,这样想来就很奇怪了。
而问题的分析一下子陷入了僵局,系统运维的同学找不到更多的信息,而我也得不到很多明确的信息。当然问题既然反馈,还是可能存在的,于是我开始逐个梳理这些信息,当查到这个关联用户的状态时,我感觉应该是哪里出了问题。SQL> SELECT USERNAME,ACCOUNT_STATUS FROM CDB_USERS WHERE USERNAME LIKE 'SH_USER';
USERNAME ACCOUNT_STATUS
SH_USER EXPIRED(GRACE)
这个用户的状态竟然是expired(grace),这样一个状态该怎么理解呢。这个用户为什么会失效呢,如果这样想来,这个问题就有了一个基本的思路。
为什么会失效,默认11g的数据库中的profile为DEFAULT时,其中一个属性PASSWORD_LIFE_TIME 是 180,也就是半年的样子,密码就会失效。
那么问题来了,这个业务是个长连接的场景,哪怕失效了,在当前的会话里面还是能够保持连接的,这个问题我就可以回答了,因为前一天晚上碰到了一个PGA的报警,我做了重启,而应用层面有了重连机制,所以大部分的会话连接都没有问题,而这个PDB的profile设置保持了默认值,在断开连接之后重连就会碰到账户失效的问题。
这样一来解决方法就相对简单,因为应用端是加密的密码,我也无从得知原来的明文密码,所以我们就可以重置密码,有个小技巧。
SQL> select name,password from user$ where name='USER_SH';
NAME PASSWORD
------------------------------ ---------------------------
USER_SH E2E9010EA87D283F
然后直接重置即可。
alter user USER_SH identified by values 'E2E9010EA87D283F';
这样密码没有改变,账户的状态就为open了,这样一来问题就引刃而解了。
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- 电子邮件服务器DKIM配置
- 自相矛盾:一个进程可以自成死锁么?
- 数据库安全·开发加密插件
- wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:WINDOWSTEMP/wordpress-4.
- 数据库安全·数据加密
- Medium网友开发了一款应用程序 让学习算法和数据结构变得更有趣
- 数据库安全·Token 认证
- 数据库安全·用户/角色认证
- 防止在训练模型时信息丢失 用于TensorFlow、Keras和PyTorch的检查点教程
- 帝国cms如何调用栏目别名作为分类标题?[!--classname--]标签不能用
- 高级软件工程师(面试题)
- 高级软件工程师 2016-9月更新
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法