0%

12.2.0 RAC ORACLE_HOME chmod/chown惨案恢复一例

环境

操作系统 CentOS release 6.9 (Final)
数据库版本 Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production(2节点相同版本grid集群环境)

故障简介

*有个同事初装RAC,觉得参照文档不够,可能涉及个别参数计算吧,于是打开生产RAC集群cat查看配置,结果误操作,在生产RAC节点1上面执行: *

chown -R grid:asmadmin /u01

chmod -R 755 /u01

*然后给我说她好像操作错服务器了,我瞬间有点头疼,于是第二天果然没时间起来洗头了 ^ _^ *


​ 我首先查看集群状态:

1
crsctl stat res -t  # 使用root执行,2节点资源看起来都正常,主要是没重启服务,所以权限改了暂时还没蹦

​ 然后查看数据库alert日志,有很多权限错误报出来,我用oracle用户去ORACLE_HOME/bin下面一看,oracle文件也是755了,那新的服务器进程估计是起不来,估计会有问题,我为了不影响后面进来的服务,决定把vip先从node01转移到node02:

1
2
status vip -node node01        # 输出node01 vip地址信息
relocate vip -vip 192.168.1.212 -node node02

​ 由于在中午,出问题比较严重,也比较忙,所以决定等晚上下班后在修复node01问题,出事了影响也比较小。

​ 然后又怕集群node01启动新进程故障,导致影响服务,于是乎直接把node01节点停止了(其实这一步错了,应该先进性集群检查一下组件资源的,关闭就校验不了, 后面自己实验机上面试试,看看集群校验后能不能简单修复: cluvfy comp software -n all -verbose

1
crsctl stop crs        # 如果异常 加上 -f

​ 晚上开搞,原以为把grid和oracle用户的$ORACLE_HOME/bin给tar -cpf带权限打包和解压恢复过去,然后启动集群,结果和意料中一样,起不来,查看集群日志很少,就报错不能获取chm资源信息,好像是集群健康监控资源,可能是集群pmon进程有关,不太懂。

​ 于是只能Google和mos,找到2个itpub教程和mos教程。


正文:节点集群恢复

​ 如果没有mos账号不方便,可以使用下面脚本,我将权限收集脚本放于这里:

1
2
3
4
touch permission.pl    # 在 node02 正确权限的节点使用 root 执行
chmod +x permission.pl
vim permission.pl # 将下面代码贴入保存退出
./permission.pl /u01 # 收集所有/u01文件权限,生成2个文件 permission-时间戳 和 restore-perm-<timestamp>.cmd (一个是文件权限记录,一个是还原命令脚本)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#!/usr/bin/perl -w
#
# Captures file permissions and the owner of the files
# useage : perm1.pl <path to capture permission>
#
# MODIFIED
# uaswatha 12th March 2018 address filename with spaces (request from customer)

use strict;
use warnings;
use File::Find;
use POSIX();

my (@dir) = @ARGV;
my $linecount=0 ;

#print @ARGV, $#ARGV;

if ($#ARGV < 0) {
print "\n\nOpps....Invalid Syntax !!!!\n" ;
print "Usage : ./perm1.pl <path to capture permission>\n\n" ;
print "Example : ./perm1.pl /home/oralce\n\n" ;
exit ;
}
my $logdir=$dir[0] ;
#my ($sec, $min, $hr, $day, $mon, $year) = localtime;
##my ($dow,$mon,$date,$hr,$min,$sec,$year) = POSIX::strftime( '%a %b %d %H %M %S %Y', localtime);
my $date = POSIX::strftime( '%a-%b-%d-%H-%M-%S-%Y', localtime);
my $logfile="permission-".$date;
my $cmdfile="restore-perm-".$date.".cmd" ;

open LOGFILE, "> $logfile" or die $! ;
open CMDFILE, "> $cmdfile" or die $! ;
find(\&process_file,@dir);

print "Following log files are generated\n" ;
print "logfile : ".$logfile. "\n" ;
print "Command file : ".$cmdfile. "\n" ;
print "Linecount : ".$linecount."\n" ;
close (LOGFILE) ;
close (CMDFILE) ;


sub process_file {
my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks,$username,$user,$pass,$comment,$home,$shell,$group);
my %uiduname = () ;
my %gidgname = () ;
my $filename = $File::Find::name;


#### Building uid, username hash

open (PASSWDFILE, '/etc/passwd') ;

while ( <PASSWDFILE>) {
($user,$pass,$uid,$gid,$comment,$home,$shell)=split (/:/) ;
$uiduname{$uid}=$user ;
}
close (PASSWDFILE) ;


#### Building gid, groupname hash

open (GRPFILE, '/etc/group') ;

while ( <GRPFILE>) {
($group,$pass,$gid)=split (/:/) ;
$gidgname{$gid}=$group ;
}
close (GRPFILE) ;

($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat("$filename");
# printf "%o %s %s %s\n", $mode & 07777, $uiduname{$uid}, $gidgname{$gid}, $filename ;
printf LOGFILE "%o %s %s %s\n", $mode & 07777, $uiduname{$uid}, $gidgname{$gid}, "\"$filename\"" ;
printf CMDFILE "%s %s%s%s %s\n", "chown ",$uiduname{$uid}, ":", $gidgname{$gid}, "\"$filename\"" ;
printf CMDFILE "%s %o %s\n", "chmod ",$mode & 07777, "\"$filename\"" ;
# printf "%o %s %s %s\n", $mode & 07777, $uiduname{$uid}, $gidgname{$gid}, \",$filename,\" ;
$linecount++ ;
}
1
2
3
4
# 将 restore-perm-<timestamp>.cmd 脚本拷贝到 node01,使用root执行,恢复 node01 权限
# 注意需要讲node02的主机名和SID_NAME相应修改为node01的再执行
chmod +x restore-perm-<timestamp>.cmd
./restore-perm-<timestamp>.cmd # 到此,近百万文件,需要等一会,大概十几分钟

此时,大部分重要文件权限应该都恢复了,少部分日志或者其他文件,由于2节点不全部一致,所以没办法,这是一个小隐患(所以还是推荐删除节点,再把节点添加进来,只是相对麻烦一些)但启动集群还是报错,和之前无区别,报错日志很少,卡很久才提示还是集群资源chm无法获取,这时再重新初始化集群即可。

1
2
3
4
5
6
cd /u01/app/12.2.0/grid/crs/install
./rootcrs.sh -init

# 最后,再启动集群就正常不报错了(其实不改权限直接重新初始化集群应该也可以启动,不过保险还是建议使用permission脚本修改权限,Linux下面有个命令也可以收集和应用目录权限)
./bin/crsctl start crs
./bin/crsctl stat res -t

至此,本次RAC node01 chmod和chown误操作恢复!

因水平有限,如果有误,欢迎指正,不喜勿喷,希望能帮到大家 ^ · ^


参考大神博客和mos文档

http://blog.itpub.net/26736162/viewspace-2121470/

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=301737138237704&id=1515018.1&_adf.ctrl-state=z4x11tl1y_9