?
1 背景说明
正常情况下,我们在安装Oracle数据库的时候,都会创建一个oracle的用户。 其根目录就是/home/oracle.
并且根据Oracle 的OFA的架构,也是建议使用/u01 这样的目录来单独安装oracle的软件,包括存放数据文件。
但实际上,总会存在那么一些不按照官网的建议来创建和管理的数据库,这些年见过太多。Dave 是一直建议严格按照Oracle 的标准来,因为这个是通用的标准,如果每家公司都有自己的标准,那每次换人管理,都会是很麻烦的,也是容易出问题的。
俗话说:铁打的营盘,流水的兵,DBA的岗位总会有波动,规则不一样,就会埋下坑,至于最后是谁踩上,就是人品了。
昨晚一朋友就出现这个问题,单实例的数据库,非归档,无备份。删除了整个/home/oracle 目录,如果是按照OFA来的,这个倒也不是很严重的事情,关键是/home/oracle 下还有几个数据文件,折腾了很久,把数据还原出来了。
马上就过年了,防火,防盗,防宕库,居然还犯下这么低级的错误,这是不想要年终奖的节奏啊,这个就不多说,DBA 就是一个心细的活,需要慢慢历练。
2 linux用户创建说明
?
在安装oracle 数据库的时候,我们都会创建用户和组。
?
Oracle 安装参考:
64位 linux 平台下Oracle 安装文档
groupadd oinstall
groupadd dba
groupadd oper
useradd -g oinstall -G dba oracle
这里是用linux的命令来创建的。 和数据库创建一样,我们一般都是通过OUI来创建实例,其实也是可以通过静默的方式来创建。
?
所以我们在讲这个故障的处理之前,需要了解linux 手工创建用户和组的方法。
?
?
每个用户的创建,都会涉及到如下几个文件:
/etc/passwd (用户)
/etc/group (用户组)
/etc/shadow (密钥文件)
/home/username (家目录)
/etc/skel/.* (骨架文件)
在创建用户的时候,会在/etc/passwd,/etc/group,/etc/shadow三个文件中添加用户的信息,创建一个/home 下的用户根目录,然后把所有的骨架文件复制到用户的根目录下。
[oracle@dg1 ~]$ cat /etc/passwd|grep oracle
oracle:x:502:507::/home/oracle:/bin/bash
[oracle@dg1 ~]$
[oracle@dg1 ~]$ cat /etc/group |grepoinstall
oinstall:x:507:
[oracle@dg1 ~]$ cat /etc/group |grep dba
dba:x:502:oracle
asmdba:x:506:oracle
[oracle@dg1 ~]$
[root@dg1 ~]# cat /etc/shadow |grep oracle
oracle:$6$7xDE3ZWD$jOnuSzTwfdWoR9JMVr33IIJhDJ/vGnCL5XGpCEMBx3XPiov0NnxRBvDIhflBTWPzXSNZ.HbqEoIt7PAxuF9R70:15595:0:99999:7:::
[root@dg1 ~]#
当我们删除/home/oracle这个用户的根目录之后,用户的配置信息还存在系统的配置文件中,所以只需要还原骨架文件,在修改一下环境变量的信息,就可以了。
?
?
3 示例
--数据库正常运行:
[oracle@dg1 ~]$ ps -ef|grep ora
root 1388 1347 0 Aug26 ? 00:00:37 hald-addon-storage: polling/dev/sr0 (every 2 sec)
oracle 9946 1 0 00:49 ? 00:00:05 ora_pmon_dave
oracle 9948 1 0 00:49 ? 00:00:11 ora_psp0_dave
oracle 9950 1 2 00:49 ? 00:16:17 ora_vktm_dave
oracle 9954 1 0 00:49 ? 00:00:01 ora_gen0_dave
oracle 9956 1 0 00:49 ? 00:00:01 ora_diag_dave
oracle 9958 1 0 00:49 ? 00:00:01 ora_dbrm_dave
oracle 9960 1 0 00:49 ? 00:00:14 ora_dia0_dave
oracle 9962 1 0 00:49 ? 00:00:01 ora_mman_dave
oracle 9964 1 0 00:49 ? 00:00:02 ora_dbw0_dave
直接把/home/oracle 目录删掉,我这里直接move。
[root@dg1 ~]# cd /home
[root@dg1 home]# ls
oracle
[root@dg1 home]# mv oracle oracle.bak
[root@dg1 home]# ls
oracle.bak
[root@dg1 home]#
[root@dg1 home]# su - oracle
su: warning: cannot change directory to/home/oracle: No such file or directory
-bash-4.1$
-bash-4.1$ sqlplus / as sysdba
-bash: sqlplus: command not found
-bash-4.1$
-bash-4.1$ whoami
oracle
-bash-4.1$ pwd
/home
-bash-4.1$
?
开始恢复:
--创建目录:
[root@dg1 home]# pwd
/home
[root@dg1 home]# mkdir oracle
[root@dg1 home]# chown oracle:oinstalloracle
[root@dg1 home]# ll
total 8
drwxr-xr-x 2 oracle oinstall 4096 Aug 27 14:17 oracle
drwx------. 25 oracle oinstall 4096 Aug 2623:08 oracle.bak
[root@dg1 home]#
--复制骨架文件:
[root@dg1 ~]# cp /etc/skel/.* /home/oracle/
cp: omitting directory `/etc/skel/.'
cp: omitting directory `/etc/skel/..'
cp: omitting directory `/etc/skel/.gnome2'
cp: omitting directory `/etc/skel/.mozil