大家好,这里是公众号 DBA学习之路,分享一些学习国产数据库路上的知识和经验。
目录
前言
今天突然有个客户找我,说 /home/oracle 家目录不见了:

好家伙,我咋一看猜测是 oracle 用户被删了,这是个大动作啊,赶忙连上远程看看,好在最后 5 分钟解决战斗。本文分享一下问题处理过程。
问题分析
一套 Oracle 11GR2 两节点的 rac 数据库,客户说节点 2 的 /home/oracle 目录没了,连上主机一看先看看用户在不在:

还好,用户还在,那应该就是目录被删了,切换一下用户试试:

可以看到可以成功切换用户,只不过家目录没了,那还好办。所以,为什么家目录没了呢?
首先想到的是看 history 记录,入眼只看到一个删除用户 tony 的命令:

这也没啥关系啊,再往上看了一会儿,突然看到创建 tony 的命令:

好家伙,是个人才,这下就理顺了嘛。
可以看到,tony 在创建 tony 用户的时候,将家目录指定到了 /home/oracle 目录,也就是说,tony 和 oracle 这两个用户共用同一个家目录:/home/oracle,这虽然违反了规范,但是其实没什么大的影响。
这里我先插播一下 userdel 这个命令的语法:
- -f:强制删除用户,即使用户当前已登录;
- -r:删除用户的同时,删除与用户相关的所有文件。
可以看到当我们使用
userdel命令时,如果不加任何参数,则只会删除用户本身,不会级联删除用户相关的文件。而如果加上-r选项,则会删除与用户相关的所有文件。
接着看,问题出在 tony 把 tony 用户删掉的时候加了 -rf,众所周知(当然不包括 tony),那么自然 tony 用户在被删除时,也就级联删除了 /home/oracle 目录。
关于本文说的这个问题,大家感兴趣的可以做一个实验去重现验证一下:
useradd -u 54321 -g oinstall -G dba,oper oracle
echo oracle | passwd --stdin oracle
useradd -d /home/oracle -g dba tony
userdel -rf tony
记得一定要在测试环境执行啊!
问题分析到这,基本就清楚了,那剩下就是如何还原 /home/oracle 目录咯。
解决方案
重建家目录
首先,需要重建一下家目录:
# root 用户下
mkdir /home/oracle
chown -R oracle:oinstall /home/oracle
恢复环境变量
从节点 1 把 .bash 开头的隐藏文件都拷贝过来:
# oracle 用户下
scp .bash* <节点2 IP>:/home/oracle/
修改拷贝后的 .bash_profile 文件中的 ORACLE_SID 变量值。
恢复互信
由于是 RAC,所以 oracle 用户是需要互信的,所以需要从节点 1 将 .ssh 文件夹也拷贝到节点 2 :
# oracle 用户下
scp -R .ssh <节点2 IP>:/home/oracle/
拷贝完之后,测试互信:
# oracle 用户下
ssh <节点2 IP>
互信成功说明没有问题。
恢复计划任务
查看 crontab 是否存在计划任务:
# oracle 用户下
crontab -l
如果存在计划任务,需要根据节点 1 或者客户提供对应脚本进行重建。
写在最后
可以看到虽然 tony 本身是删除 tony 用户,但是对 Linux 知识的了解不够全面,所以导致了 oracle 用户家目录被删除的惨案,好在问题不是很严重。
但是如果执行的是下面这些命令:
## 切忌在生产环境执行
mv /soft/1.sh /oradata
mv /oradata/* /dev/null
rm -rf / 1.sh
chmod -R 777 /
会有什么结果呢?




