情景再现:在无人触碰和操作 服务器的情况下,用户反应系统频繁请求超时,导致无法正常使用。
1. 接到电话后,在回家的路上 初步怀疑是系统数据连接池被全部占用(之前出现过数据库连接未被关闭资源的情况导致数据库连接超出阈值,后解决过此问题,可能未被完全解决),重新启动,结果系统启动失败,异常依然存在, 排除掉数据库连接不够的情况。查看日志后发现数据库连接异常。进而继续猜想和验证问题出现在数据库方面。
2. 再次怀疑是系统部署服务器和数据库服务器之间的网络故障,导致无法正常连接,通过DOS窗口Ping网络后发现通信正常,排除网络问题情况。
3. 再度怀疑是oracle的session数量可能超限制(曾在测试环境中出现过此问题),查询后当前连接数远不到最大连接数。排除session数量不够的情况。
-- 当前的连接数
select count(*) from v$session
--数据库允许的最大连接数
select value from v$parameter where name = 'processes'
--查看不同用户的连接数
select username,count(username) from v$session where username is not null group by username;
-- 修改最大连接数 注意:修改后需要重启数据库才能生效
alter system set processes = 300 scope = spfile;
-- 在sqlplus下输入命令或在任务管理器中重启oracle服务生效
sqlplus / as sysdba
shutdown immediate;
startup;
最后在日志中发现了一个关键性的异常信息 Caused by: java.sql.SQLException: ORA-28001: the password has expired 发现是密码失效了,查询后发现在Oracle11用户密码默认为180天,此时距离系统正式上线的日期正为六个月,结果查询后果然如此。
-- 查询密码失效时间,默认180天
SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';
-- 修改用户密码(会将账号锁定) username和password对应相应的连接信息
ALTER USER username IDENTIFIED BY password;
-- 用户解锁
alter user MASODB account unlock;
-- 设置密码永不失效
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
具体步骤为:先查询验证密码失效是否为180天,结果正如所料,重置密码为原密码(猜测不修改密码直接解锁用户应该也可以),最后设置密码永不失效后再此查询,发现密码失效配置已修改。(无需重启oracle服务)
操作完后系统正常重启,问题解决,历时半小时左右。因问题第二天记录,某些情况的截图无法再现,仅用文字描述。
复盘发现的问题:
第一:遇到紧急情况后应该先查询日志,再根据异常信息进行分析处理,排查出问题(代码、服务器、网络、数据库)所在,既而快速解决。
第二:遇到问题后存在侥幸心理,认为重启能够解决大部分问题,然而实际上问题很少是重启能够解决的,重启只是将异常信息再此重复,意义不大,尽管重启能够解决的问题也不过是暂时的解决,后续还是会遇到。应该保证线上运行正常后记录问题并及时解决,治标更要治本。
第三:再次体现到了单台机和数据库的弊端。应该考虑一种符合小型项目的多服务器备选方案(希望大神们多多指点)。