客户的Oracle生产环境数据库准备迁移到云服务器环境,于是先把新的云环境搭建好了dataguard后,准备到客户当前的生产环境做expdp备份,由于有一段时间没登录这个旧环境了,登上去发现一个很离奇的现象,su - oracle无法切换,也没有报错信息!

[root@db1]# pwd
/root
[root@db1]# ps -ef |grep pmon
oracle   11342     1  0 Oct19 ?        00:01:38 ora_pmon_orcl
root     12679 12528  0 16:15 pts/0    00:00:00 grep pmon

[root@db1]# su - oracle
[root@db1]# pwd
/root
[root@db1]#

从上面信息看出,oracle其实是运行正常的,只是无法切换过去,并且oracle用户信息也是存在的,查看/home/oracle,/etc/passwd,/etc/group里都还有oracle的信息。
同时查看secure log,如下

[root@db1]# tail -f /var/log/secure|grep su
Dec 26 22:11:14 18c su: pam_unix(su-l:session): session opened for user oracle by root(uid=0)
Dec 26 22:11:14 18c su: pam_unix(su-l:session): session closed for user oracle
Dec 26 22:12:22 18c su: pam_unix(su-l:session): session opened for user oracle by root(uid=0)
Dec 26 22:12:22 18c su: pam_unix(su-l:session): session closed for user oracle
Dec 26 22:12:30 18c su: pam_unix(su:session): session opened for user oracle by root(uid=0)
Dec 26 22:12:30 18c su: pam_unix(su:session): session closed for user oracle
Dec 26 22:12:45 18c su: pam_unix(su-l:session): session opened for user oracle by root(uid=0)
Dec 26 22:12:45 18c su: pam_unix(su-l:session): session closed for user oracle
Dec 26 22:15:44 18c su: pam_unix(su-l:session): session opened for user oracle by root(uid=0)
Dec 26 22:15:44 18c su: pam_unix(su-l:session): session closed for user oracle

于是进行百度排查,发现大多数说法是更改 /etc/security/limits.conf 里面的soft nofile和hard nofile连接上限值,因为连接数满了,于是尝试进行更改后,问题却依旧没有解决!

[root@db1]# vi /etc/security/limits.conf
oracle soft nproc 2047 
oracle hard nproc 16384 
oracle soft nofile 1024 
oracle hard nofile 65536 

这个时候,按照这个思路,如果是连接数太多,我重启系统总可以解决了吧?于是为了快速解决这个问题,尝试reboot重启linux,事后才觉得这个决定有点冲动冒失了!

那是因为重启后,不仅问题依旧没有解决,并且oracle数据库没自动起来(默认是没设置自动启动的),这个时候压力山大啊!因为客户在不断催促业务中断了,于是尝试用root去启动oracle,但最终是失败的,只能用oralce用户来操作!

绝望中想起能否通过重建oracle用户来试试?!
于是网上查过一些资料,的确是可以这么干!但前提是需要确认好旧oracle用户的id和所属用户组id那些信息,于是备份好这些信息后,删除oracle用户,再重新创建:

[root@db1]# userdel oracle
userdel: user oracle is currently used by process 2447
[root@db1]# kill -9 2447

这个时候提示有进程在使用oracle用户,于是kill掉后,使用-r来直接删除,然后再根据备份的信息重建:

[root@db1]# userdel -r oracle
[root@db1]# useradd -u 1101 -g oinstall -G dba  oracle
[root@db1]# su - oracle
[oracle@db1]$ pwd

最后看到成功切换到oracle用户的那一刻,终于长舒一口气,毕竟这个操作风险还是挺大的,就怕强行删除用户,会影响关联的oracle目录和数据,还好最终是解决了!以此记录一下,遇到的朋友可以作为参考!