【DB笔试面试195】在Oracle中,如果$GRID_HOME或/u01目录下的权限被人为修改过,那么如何来修复该权限问题?...

640?wx_fmt=gif

题目部分

在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 -init11gR2 PSU>11.2.0.3.6的集群roothas.pl -init11gR2 PSU>11.2.0.3.6的单实例进行解决。对于Oracle 12c版本,需要将rootcrs.plroothas.pl修改为rootcrs.shroothas.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-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环境中还可以通过getfaclsetfacl来恢复。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/utlOracle 11.212.1.0.1)或/crs/utl/Oracle 12.1.0.2)下面的crsconfig_dirscrsconfig_fileperms文件中记录了整个$GRID_HOME下面的文件和目录的相关权限。文件crsconfig_dirs记录了目录的权限,而文件crsconfig_fileperms记录了相关文件的权限。所以,可以使用crsconfig_filepermscrsconfig_dirs文件中的信息手动更改权限。

7、可以删除CRS的配置,然后重新运行root.sh即可。如果OCR和数据库不再同一个磁盘组里,那么重新运行root.sh脚本并不影响数据库,所以无需担心。可以用来修复OCROLR或表决磁盘损坏的情况,或ASM节点号和主机节点号不一致的情况。deconfig之前,可以先将OCR的内容导出备份,然后等到root.sh执行成功后再将OCR的内容导入即可。常用命令如下所示:

 1===================================rac中重新运行root.sh脚本===================================================
 2需要注意的是,多数以pl结尾的脚本从12.1.0.2开始都变为了sh脚本,例如:rootcrs.pl需要修改为rootcrs.sh
 3In 12.1.0.2, rootcrs.sh/roothas.sh should be used instead of rootcrs.pl/roothas.pl
 4
 5# OCR备份,物理和逻辑都进行备份
 6ocrconfig -export /tmp/export_asm_lhr_logical.bak
 7ocrconfig -manualbackup
 8ocrconfig -showbackup
 9ocrconfig -copy +MGMT:/raclhr-cluster/OCRBACKUP/backup_20190822_085506.ocr.285.1016960109 /tmp/export_asm_lhr_physical.bak #从12.2开始的OCR物理备份默认放在MGMT磁盘组,建议单独cp到FS中
10cp /u01/app/11.2.0/grid/cdata/raclhr-cluster/backup_20190822_111554.ocr /tmp/export_asm_lhr_physical.bak
11#手动对集群相关资源进行备份,包括新增的db、监听、service等
12
13
14
15----------------- 日志地址
16---11g、12.1.0.2、
17日志地址:$ORACLE_HOME/cfgtoollogs/crsconfig/
18重置的日志文件:hadelete.log
19root.sh脚本日志:rootcrs_rac2.log
20
21---18c
2218c的日志地址:$ORACLE_HOME/install/
2318c的详细日志地址:/u01/app/grid/crsdata/raclhr-18c-n1/crsconfig/
24重置的日志文件:crsdeconfig_raclhr-18c-n1_2019-08-21_11-21-45AM.log
25root.sh脚本日志:rootcrs_raclhr-18c-n1_2019-08-21_11-15-48AM.log
26
27
28export GRID_HOME=$ORACLE_HOME
29# 查询ASM磁盘
30$GRID_HOME/bin/kfod disks=asm  st=true ds=true cluster=true
31# /grid/stage/ext/bin/kfod disks=asm  st=true ds=true cluster=true
32
33
34#root用户重新执行root.sh,配置文件:$ORACLE_HOME/crs/install/crsconfig_params
35crsctl stop crs -f
36#kill -9 `ps -ef|grep d.bin| grep -v grep | awk '{print $2}'`
37export GRID_HOME=$ORACLE_HOME
38$GRID_HOME/crs/install/rootcrs.pl -deconfig -force -verbose
39$GRID_HOME/crs/install/rootcrs.pl -deconfig -force -verbose -lastnode -keepdg
40dd if=/dev/zero of=/dev/rhdiskN bs=1024k count=100  --清理磁盘头
41find $ORACLE_HOME/gpnp/* -type f -exec rm -rf {} \;
42dd if=/dev/zero of=/dev/rhdiskN bs=1024k count=100  --清理磁盘头
43#查看磁盘是否有内容
44#AIX用:lquerypv -h  /dev/rhdisk5
45#linux用:hexdump /dev/sdb ,例如:hexdump -n 1024 -C /dev/sdb1
46
47#保证集群完全关闭,最好重启OS,检查网络情况,是否有cvuqdisk
48#find /u01 -name cvuqdisk*
49#rpm -qa cvuqdisk
50#rpm -ivh $GRID_HOME/cv/rpm/cvuqdisk-*.rpm
51#检查配置文件($ORACLE_HOME/crs/install/crsconfig_params)是否需要修改,18c可以去掉MGMTDB
52$GRID_HOME/root.sh  #若出现错误,则在解决错误后可以重复执行,不需要先deconfig
53
54#也可以图形化界面使用GRID配置 
55#export DISPLAY=192.168.59.1:0.0
56#$ORACLE_HOME/crs/config/config.sh
57
58
59-----------------------------------------------------
60--- 对于18c,需要注意:
61#若MGMTDB不需要重复创建,则可以修改配置文件
62#配置文件($ORACLE_HOME/crs/install/crsconfig_params)修改以下内容的值为空:
63
64MGMT_DB=
65GIMR_CONFIG=
66
67CDATA_BACKUP_DISK_GROUP=
68CDATA_BACKUP_FAILURE_GROUPS=
69CDATA_BACKUP_QUORUM_GROUPS=
70CDATA_BACKUP_DISKS=
71CDATA_BACKUP_REDUNDANCY= 
72CDATA_BACKUP_AUSIZE=
73CDATA_BACKUP_SITES=
74CDATA_BACKUP_SIZE=
75-----------------------------------------------------
76
77# OCR恢复
78crsctl stop crs
79crsctl start crs -excl -nocrs
80#crsctl stop resource ora.crsd -init
81ocrconfig -import /tmp/export_asm_lhr_logical.bak  #逻辑备份恢复
82#ocrconfig -restore /tmp/export_asm_lhr_physical.bak  #物理备份恢复
83crsctl stop crs
84crsctl start crs
85===============================================================================================================
86

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

8、如果集群所有节点都遭到了破坏,那么也可以删除集群软件,通过重新安装集群软件的办法来解决,这也是最彻底修复问题的办法。当然,如果OCRMGMT在单独的磁盘组中,那么重新安装软件并不会导致DATAFRA磁盘组的数据丢失。在重新安装完集群软件后,只需要MOUNT磁盘组DATAFRA即可。常用命令如下所示:

 1① rm -rf /etc/ora*
 2② rm -rf /var/tmp/.oracle
 3③ 修改/etc/inittab文件,若是Oracle 10g则删除以下3行:
 4h1:2:respawn:/etc/init.evmd run >/dev/null 2>&1 </dev/null
 5h2:2:respawn:/etc/init.cssd fatal >/dev/null 2>&1 </dev/null
 6h3:2:respawn:/etc/init.crsd run >/dev/null 2>&1 </dev/null
 7若是Oracle 11g则删除以下1行:
 8h1:35:respawn:/etc/init.d/init.ohasd run >/dev/null 2>&1 </dev/null
 9④ rm -rf /tmp/*
10⑤ rm -rf /u01/app/grid/*    --删除GRID目录
11⑥ rm -rf /u01/app/oracle/*  --删除Oracle目录
12⑦ rm -rf /u01/app/oraInventory/*
13⑧ 清除OCR、Voting使用过的磁盘
14dd if=/dev/zero of=/dev/raw/raw1 bs=104857600 count=1
15dd if=/dev/zero of=/dev/raw/raw2 bs=104857600 count=1
16

在安装有GI的环境下,权限、属主是严格被设定的,任何对于它们的错误修改容易引发一系列的问题,而且这些问题往往都很诡异很难按照常规的思路去诊断。一旦出现权限的问题,个人建议第1、23、4种方式来修改。

& 说明:

有关修复权限的更多内容可以参考我的BLOGhttp://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

全文请参考:http://blog.itpub.net/26736162/viewspace-2157665/


& 说明:

有关修复权限的更多内容可以参考我的BLOGhttp://blog.itpub.net/26736162/viewspace-2157665/、http://blog.itpub.net/26736162/viewspace-2121470/

   注意:本文所有方法均已在11.2.0.3、12.1.0.2和18.3.0版本上经过测试成功。

本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗

640?wx_fmt=gif

---------------优质麦课------------

640?wx_fmt=png

详细内容可以添加麦老师微信或QQ私聊。


640?wx_fmt=gif

About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

 提供OCP、OCM和高可用部分最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

640?wx_fmt=gifDBA宝典

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

640?wx_fmt=gif

640?wx_fmt=png

你可能感兴趣的:(【DB笔试面试195】在Oracle中,如果$GRID_HOME或/u01目录下的权限被人为修改过,那么如何来修复该权限问题?...)