♣
题目部分
在Oracle中,如果$GRID_HOME或$GRID_BASE或/u01目录下的所有文件权限被人为误操作修改了,那么如何来修复该权限问题?
♣
答案部分
如果使用chown -R误操作将整个$GRID_HOME或$GRID_BASE或/u01目录下的所有文件权限修改了,或者删除了Oracle 11g rac中$GRID_HOME/log文件夹下的所有内容,那么将导致集群不能正常启动。
误操作的命令如下所示:
1chown -R oracle.oinstall /u01 2chmod -R 444 /u01
可以通过命令“cluvfy comp software -n all -verbose”来校验集群的权限是否正确。
大致可以通过如下几种方法来修复权限问题:
1、根据MOS文档1931142.1提供的建议,可以通过root用户执行命令$GRID_HOME/crs/install/rootcrs.pl -init(11gR2 PSU>11.2.0.3.6的集群)或roothas.pl -init(11gR2 PSU>11.2.0.3.6的单实例)进行解决。对于Oracle 12c版本,需要将rootcrs.pl或roothas.pl修改为rootcrs.sh和roothas.sh。该方法可以用来解决删除了Oracle 11g rac中$GRID_HOME/log文件夹下的所有内容,导致集群不能启动的情况,但是,对于chown -R误操作将整个$GRID_HOME或$GRID_BASE或/u01目录的权限修改了的情况不一定能恢复。
需要注意的是,rootcrs.pl –init是在PSU>11.2.0.3.6下执行的,如果PSU<11.2.0.3.6,那么可以执行如下两条命令来实现同样的效果。
1<GRID_HOME>/crs/install/rootcrs.pl -unlock 2<GRID_HOME>/crs/install/rootcrs.pl -patch
2、采用MOS文档1515018.1上提供的脚本permission.pl在权限正常的节点上生成修复脚本,然后将生成的修复脚本在异常节点上执行来修复权限问题。可以用来修复chown -R误操作将整个$GRID_HOME或$GRID_BASE或/u01目录的权限修改了的情况。
permission.pl脚本的内容如下所示:
1#!/usr/bin/perl -w 2# 3# Captures file permissions and the owner of the files 4# useage : perm1.pl <path to capture permission> 5# 6# MODIFIED 7# uaswatha 12th March 2018 address filename with spaces (request from customer) 8 9use strict; 10use warnings; 11use File::Find; 12use POSIX(); 13 14my (@dir) = @ARGV; 15my $linecount=0 ; 16 17#print @ARGV, $#ARGV; 18 19if ($#ARGV < 0) { 20 print "\n\nOpps....Invalid Syntax !!!!\n" ; 21 print "Usage : ./perm1.pl <path to capture permission>\n\n" ; 22 print "Example : ./perm1.pl /home/oralce\n\n" ; 23 exit ; 24} 25my $logdir=$dir[0] ; 26#my ($sec, $min, $hr, $day, $mon, $year) = localtime; 27##my ($dow,$mon,$date,$hr,$min,$sec,$year) = POSIX::strftime( '%a %b %d %H %M %S %Y', localtime); 28my $date = POSIX::strftime( '%a-%b-%d-%H-%M-%S-%Y', localtime); 29my $logfile="permission-".$date; 30my $cmdfile="restore-perm-".$date.".cmd" ; 31 32open LOGFILE, "> $logfile" or die $! ; 33open CMDFILE, "> $cmdfile" or die $! ; 34find(\&process_file,@dir); 35 36print "Following log files are generated\n" ; 37print "logfile : ".$logfile. "\n" ; 38print "Command file : ".$cmdfile. "\n" ; 39print "Linecount : ".$linecount."\n" ; 40close (LOGFILE) ; 41close (CMDFILE) ; 42 43 44sub process_file { 45 my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks,$username,$user,$pass,$comment,$home,$shell,$group); 46 my %uiduname = () ; 47 my %gidgname = () ; 48 my $filename = $File::Find::name; 49 50 51#### Building uid, username hash 52 53 open (PASSWDFILE, '/etc/passwd') ; 54 55 while ( <PASSWDFILE>) { 56 ($user,$pass,$uid,$gid,$comment,$home,$shell)=split (/:/) ; 57 $uiduname{$uid}=$user ; 58 } 59 close (PASSWDFILE) ; 60 61 62#### Building gid, groupname hash 63 64 open (GRPFILE, '/etc/group') ; 65 66 while ( <GRPFILE>) { 67 ($group,$pass,$gid)=split (/:/) ; 68 $gidgname{$gid}=$group ; 69 } 70 close (GRPFILE) ; 71 72 ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size, $atime,$mtime,$ctime,$blksize,$blocks) = stat("$filename"); 73# printf "%o %s %s %s\n", $mode & 07777, $uiduname{$uid}, $gidgname{$gid}, $filename ; 74 printf LOGFILE "%o %s %s %s\n", $mode & 07777, $uiduname{$uid}, $gidgname{$gid}, "\"$filename\"" ; 75 printf CMDFILE "%s %s%s%s %s\n", "chown ",$uiduname{$uid}, ":", $gidgname{$gid}, "\"$filename\"" ; 76 printf CMDFILE "%s %o %s\n", "chmod ",$mode & 07777, "\"$filename\"" ; 77 # printf "%o %s %s %s\n", $mode & 07777, $uiduname{$uid}, $gidgname{$gid}, \",$filename,\" ; 78 $linecount++ ; 79}
需要注意的是,该脚本会产生2个文件:
1a. permission-<time stamp> - This contains file permission in octal value, owner and group information of the files captured 2b. restore-perm-<time stamp>.cmd - This contains command to change the permission, owner, and group of the captured files
修复时只需要执行restore-perm-<time stamp>.cmd文件即可。在执行脚本之前,需要将脚本中的节点名称替换成异常节点名。在vi下的替换命令可以为:
1:%s/raclhr-11gr2-n2/raclhr-11gr2-n1/g # 替换每一行中所有 raclhr-11gr2-n2 为 raclhr-11gr2-n1
修复目录/u01/app的过程如下所示:
1--备份 2./permission.pl /u01/app 3--恢复 4chmod -R 775 /u01 #取决于误操作是否有chmod操作 5./restore-perm-<time stamp>.cmd
该方法也是作者推荐的一种方法。
3、Linux环境中还可以通过getfacl和setfacl来恢复。getfacl在权限正常的节点上获取权限,然后修改脚本中的主机名,最后使用setfacl恢复权限,如下所示:
1--备份 2getfacl -pR /u01/app > /tmp/bk_lhr_perm_u01_rac1.txt 3--恢复 4chmod -R 775 /u01 #取决于误操作是否有chmod操作 5setfacl --restore=/tmp/bk_lhr_perm_u01_rac1.txt 6 7---替换脚本中的主机名,注意大小写 8:%s/raclhr-11gr2-n1/raclhr-11gr2-n2/g 9:%s/raclhr-11gR2-N1/raclhr-11gR2-N2/g
该方法也是作者推荐的一种方法。
4、直接恢复重要文件夹的权限,执行如下命令可以让集群先启动起来,但是,可能会隐藏一些未知的权限问题。如下所示:
1chown -R grid:oinstall /u01 2chown -R oracle:oinstall /u01/app/oracle 3chmod -R 775 /u01/ 4chown -R grid:oinstall /u01/app/oraInventory 5chmod -R 775 /u01/app/oraInventory 6chmod 6751 /u01/app/11.2.0/grid/bin/oracle 7chmod 6751 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle 8$ORACLE_HOME/crs/install/rootcrs.pl -init 9#$ORACLE_HOME/crs/install/rootcrs.pl -unlock 10#$ORACLE_HOME/crs/install/rootcrs.pl -patch
需要注意的是,多数以pl结尾的脚本从12.1.0.2开始都变为了sh脚本,例如:rootcrs.pl需要修改为rootcrs.sh。
5、通过delete node,然后add node来恢复,但是这个过程相对过于复杂,但是或许是最保险的一种方式,Oracle也推荐这样。
6、根据MOS文档:Tips for checking file permissions on GRID environment(ID 1931142.1)来修复该问题。在该文档中描述到,在$GRID_HOME/crs/utl(Oracle 11.2及12.1.0.1)或<GRID_HOME>/crs/utl/<hostname>(Oracle 12.1.0.2)下面的crsconfig_dirs和crsconfig_fileperms文件中记录了整个$GRID_HOME下面的文件和目录的相关权限。文件crsconfig_dirs记录了目录的权限,而文件crsconfig_fileperms记录了相关文件的权限。所以,可以使用crsconfig_fileperms和crsconfig_dirs文件中的信息手动更改权限。
7、可以删除CRS的配置,然后重新运行root.sh即可。如果OCR和数据库不再同一个磁盘组里,那么重新运行root.sh脚本并不影响数据库,所以无需担心。可以用来修复OCR、OLR或表决磁盘损坏的情况,或ASM节点号和主机节点号不一致的情况。在deconfig之前,可以先将OCR的内容导出备份,然后等到root.sh执行成功后再将OCR的内容导入即可。常用命令如下所示:
1# 日志地址:$ORACLE_HOME/cfgtoollogs/crsconfig/ 2# 18c的日志地址:$ORACLE_HOME/install/ 3# 重置的日志文件:hadelete.log 4 5# asm 磁盘获取 11g 6$ORACLE_HOME/bin/kfod disk=asm s=true ds=true c=true 7/grid/stage/ext/bin/kfod disk=asm s=true ds=true c=true 8# 18c 9kfod disks=asm st=true ds=true cluster=true 10 11#root用户重新执行root.sh 12kill -9 `ps -ef|grep d.bin| grep -v grep | awk '{print $2}'` 13export GRID_HOME=$ORACLE_HOME 14$GRID_HOME/crs/install/rootcrs.pl -deconfig -force -verbose 15#$GRID_HOME/crs/install/rootcrs.pl -deconfig -force -verbose -lastnode -keepdg 16dd if=/dev/zero of=/dev/rhdiskN bs=1024k count=1024 --清理磁盘头 17$GRID_HOME/root.sh 18 19--CRS关闭情况下可操作,备份恢复OCR内容 20ocrconfig -export /tmp/export_asm_lhr.bak #备份 21crsctl stop crs 22crsctl start crs -excl -nocrs 23ocrconfig -import /tmp/export_asm_lhr.bak #恢复 24crsctl stop crs 25crsctl start crs
在root.sh脚本执行完毕后,如无OCR备份,则可以将数据库、监听和SERVICE等其它资源添加进集群中,例如:
1srvctl add db -d lhrrac1 -r PRIMARY -o $ORACLE_HOME 2srvctl add instance -d lhrrac1 -i lhrrac11 -n raclhr-11gR2-N1 3srvctl add instance -d lhrrac1 -i lhrrac12 -n raclhr-11gR2-N2 4srvctl add listener -l LISTENER -o $ORACLE_HOME
在安装有GI的环境下,权限、属主是严格被设定的,任何对于它们的错误修改容易引发一系列的问题,而且这些问题往往都很诡异很难按照常规的思路去诊断。一旦出现权限的问题,个人建议第1、2、3、4种方式来修改。
& 说明:
有关修复权限的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2157665/、http://blog.itpub.net/26736162/viewspace-2121470/
如果oracle用户下的$ORACLE_HOME/bin/oracle文件的属主或权限出了问题,那么该如何修复呢?
答案:如果可执行文件$ORACLE_HOME/bin/oracle的属主或权限设定出了问题,那么可能会造成很多问题。例如:无法登陆到数据库、ora-600错误、“TNS-12518: TNS:listener could not hand off client connection”、“Linux Error: 32: Broken pipe”、“ORA-12537: TNS:connection closed”、访问ASM磁盘出错等。解决办法很简单,可以在grid用户下运行setasmgidwrap命令重新配置$ORACLE_HOME/bin/oracle可执行文件的权限和属主或者直接将oracle文件的权限修改为6751。$ORACLE_HOME/bin/oracle可执行文件正确属主应该是oracle:asmadmin,并且权限必须有s共享才可以,如下所示:
1[root@orclalhr ~]$ which setasmgidwrap 2/u01/app/11.2.0/grid/bin/setasmgidwrap 3[root@orclalhr ~]$ setasmgidwrap -o /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle 4[root@orclalhr ~]$ ll /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle 5-rwsr-s--x 1 oracle asmadmin 232399083 Apr 21 2015 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle 6[root@orclalhr ~]# ll /u01/app/11.2.0/grid/bin/oracle 7-rwsr-s--x. 1 grid oinstall 203972117 Jan 5 2015 /u01/app/11.2.0/grid/bin/oracle 8[root@orclalhr ~]# chmod 6751 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle 9[root@orclalhr ~]# ll /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle 10-rwsr-s--x 1 oracle asmadmin 232399083 Apr 21 2015 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle 11[root@orclalhr bin]# cd /u01/app/oracle/product/11.2.0/dbhome_1/bin/ 12[root@orclalhr bin]# which stat 13/usr/bin/stat 14[root@orclalhr bin]# stat oracle 15 File: `oracle' 16 Size: 210823844 Blocks: 411776 IO Block: 4096 regular file 17Device: 802h/2050d Inode: 1717737 Links: 1 18Access: (6751/-rwsr-s--x) Uid: ( 501/ oracle) Gid: ( 504/asmadmin) 19Access: 2017-03-16 12:33:44.809363974 +0800 20Modify: 2014-05-18 17:09:50.508549983 +0800 21Change: 2017-03-16 11:05:15.733816820 +0800