柴宗南,现就职于北京海天起点,oracle维护工程师,服务于电信,政府,银行等行业,具有6年核心系统oracle数据库运维经验。获得Redhat Enterprise 5 RHCE认证、oracle 10g ocp、oracle 11g ocp认证,拥有丰富的系统集成经验,擅长oracle数据库相关问题处理。
通常情况下,由于补丁升级或误操作导致oracle部分文件或文件夹权限变更,引发很多奇奇怪怪的问题。比如在安装过程中遇到的可能与权限相关的问题:
-
创建磁盘组时,asmca找不到asm磁盘
-
RAC环境dbca建库时,找不到节点信息
-
补丁更新成功后启动数据库过程找不到对应的磁盘组
该案例主要演示目录一级权限被更改后如何修复。
修改节点1的11.2.0目录权限为700
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[root@prodb1 app]#crsctl stop has [root@prodb1 app]# pwd /u01/app [root@prodb1 app]# ls -l total 16 drwxr-xr-x. 3 root oinstall 4096 May 14 14:20 11.2.0 drwxrwxr-x. 9 grid oinstall 4096 May 16 09:38 grid drwxrwxr-x. 6 oracle oinstall 4096 May 16 09:57 oracle drwxrwx--- 5 grid oinstall 4096 May 15 06:20 oraInventory [root@prodb1 app]# chmod -R 600 11.2.0 [root@prodb1 app]# ls -l total 16 drw-------. 3 root oinstall 4096 May 14 14:20 11.2.0 drwxrwxr-x. 9 grid oinstall 4096 May 16 09:38 grid drwxrwxr-x. 6 oracle oinstall 4096 May 16 09:57 oracle drwxrwx--- 5 grid oinstall 4096 May 15 06:20 oraInventory |
修复权限
我们可以通过permission.pl(文档 ID 1515018.1)脚本对目录进行权限修复,该脚本通过提取正常节点的权限生成对应的执行脚本,然后在问题节点通过执行该脚本实现权限修复。
-
上传脚本
-
在正常节点生成权限列表
123456[root@prodb2 ~]# cd /home/grid/[root@prodb2 grid]# ./permission.pl /u01/app/11.2.0/Following log files are generatedlogfile : permission-Thu-Apr-11-11-20-30-2018Command file : restore-perm-Thu-Apr-11-11-20-30-2018.cmdLinecount : 25835cmd文件为我们需要的脚本,内容大致如下:
12345678chown root:oinstall "/u01/app/11.2.0"chmod 755 "/u01/app/11.2.0"chown root:oinstall "/u01/app/11.2.0/grid"chmod 755 "/u01/app/11.2.0/grid"chown grid:oinstall "/u01/app/11.2.0/grid/rootupgrade.sh"chmod 755 "/u01/app/11.2.0/grid/rootupgrade.sh"chown grid:oinstall "/u01/app/11.2.0/grid/root.sh"… -
拷贝restore-perm-Thu-Apr-11-11-20-30-2018.cmd至节点1
123[root@prodb2 grid]# scp restore-perm-Thu-Apr-11-11-20-30-2018.cmd prodb1:/home/grid/root@prodb1's password:restore-perm-Thu-Apr-11-11-20-30-2018.cmd 100% 4290KB 4.2MB/s 00:00
-
替换cmd脚本中节点2的信息为节点1
12345[root@prodb1 ~]# cd /home/grid/[root@prodb1 grid]# sed -i 's#prodb2#prodb1#g' restore-perm-Thu-Apr-11-11-20-30-2018.cmd[root@prodb1 grid]# sed -i 's#ASM2#ASM1#g' restore-perm-Thu-Apr-11-11-20-30-2018.cmd[root@prodb1 grid]# sed -i 's#asm2#asm1#g' restore-perm-Thu-Apr-11-11-20-30-2018.cmd[root@prodb1 grid]# egrep -i 'prodb2|asm2' restore-perm-Thu-Apr-11-11-20-30-2018.cmd确保更新后的内容无prodb2相关内容
-
执行脚本
由于目录来自于2节点,部分目录在1节点不存在,可能报错也可能不会被更新,先将11.2.0权限更新至755。
123[root@prodb2 grid]# cd /u01/app/[root@prodb2 app]# chmod -R 755 11.2.0/[root@prodb1 grid]# sh restore-perm-Thu-Apr-11-11-20-30-2018.cmd
启动集群
1 2 |
[root@prodb1 grid]# crsctl start has CRS-4123: Oracle High Availability Services has been started. |
验证集群
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 |
[root@prodb1 grid]# crsctl status res -t -------------------------------------------------------------------------------- NAME TARGET STATE SERVER STATE_DETAILS -------------------------------------------------------------------------------- Local Resources -------------------------------------------------------------------------------- ora.DATA.dg ONLINE ONLINE prodb1 ONLINE ONLINE prodb2 ora.FRG.dg ONLINE ONLINE prodb1 ONLINE ONLINE prodb2 ora.LISTENER.lsnr ONLINE ONLINE prodb1 ONLINE ONLINE prodb2 ora.OCR_VOTE.dg ONLINE ONLINE prodb1 ONLINE ONLINE prodb2 ora.asm ONLINE ONLINE prodb1 Started ONLINE ONLINE prodb2 Started ora.gsd OFFLINE OFFLINE prodb1 OFFLINE OFFLINE prodb2 ora.net1.network ONLINE ONLINE prodb1 ONLINE ONLINE prodb2 ora.ons ONLINE ONLINE prodb1 ONLINE ONLINE prodb2 ora.registry.acfs ONLINE ONLINE prodb1 ONLINE ONLINE prodb2 -------------------------------------------------------------------------------- Cluster Resources -------------------------------------------------------------------------------- ora.LISTENER_SCAN1.lsnr 1 ONLINE ONLINE prodb2 ora.cvu 1 ONLINE ONLINE prodb2 ora.oc4j 1 ONLINE ONLINE prodb2 ora.prodb.db 1 ONLINE ONLINE prodb1 Open 2 ONLINE ONLINE prodb2 Open ora.prodb1.vip 1 ONLINE ONLINE prodb1 ora.prodb2.vip 1 ONLINE ONLINE prodb2 ora.scan1.vip 1 ONLINE ONLINE prodb2 |
[root@prodb1 ~]#crsctl stop has -f
1 2 3 4 5 6 7 |
[root@prodb1 ~]#crsctl stop has -f [root@prodb1 ~]# cd /u01/app/11.2.0/grid/crs/install/ [root@prodb1 install]# ./rootcrs.pl -nocrsstop Using configuration parameter file: ./crsconfig_params User ignored Prerequisites during installation Installing Trace File Analyzer Configure Oracle Grid Infrastructure for a Cluster ... succeeded |
集群启动成功。
脚本permission.pl内容如下:
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 80 |
[root@prodb2 grid]# cat permission.pl #!/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++ ; } |
未经允许不得转载:Oracle一体机用户组 » oracle数据库软件目录权限恢复