如果$GRID_HOME或$GRID_BASE或u01目录下的所有文件权限被人为误操作修改了,那么如何来修复该权限问题?

本文涉及的产品
OCR统一识别,每月200次
文档理解,结构化解析 100页
自定义KV模板,自定义KV模板 500次/账号
简介: 如果$GRID_HOME或$GRID_BASE或u01目录下的所有文件权限被人为误操作修改了,那么如何来修复该权限问题?

权限被修改

如果使用chown -R误操作将整个$GRID_HOME或$GRID_BASE或/u01目录下的所有文件权限修改了,或者删除了Oracle 11g rac中$GRID_HOME/log文件夹下的所有内容,那么将导致集群不能正常启动。

误操作的命令如下所示:

chown -R oracle.oinstall /u01
chmod -R 444 /u01

可以通过命令“cluvfy comp software -n all -verbose”来校验集群的权限是否正确。

修复方法

大致可以通过如下几种方法来修复权限问题:

方法1:rootcrs.pl -init

根据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,那么可以执行如下两条命令来实现同样的效果。

<GRID_HOME>/crs/install/rootcrs.pl -unlock
<GRID_HOME>/crs/install/rootcrs.pl -patch

方法2:脚本permission.pl

采用MOS文档1515018.1上提供的脚本permission.pl在权限正常的节点上生成修复脚本,然后将生成的修复脚本在异常节点上执行来修复权限问题。可以用来修复chown -R误操作将整个$GRID_HOME或$GRID_BASE或/u01目录的权限修改了的情况。

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++ ;
}

需要注意的是,该脚本会产生2个文件:

a. permission-<time stamp> - This contains file permission in octal value, owner and group information of the files captured
b. restore-perm-<time stamp>.cmd - This contains command to change the permission, owner, and group of the captured files

修复时只需要执行restore-perm-.cmd文件即可。在执行脚本之前,需要将脚本中的节点名称替换成异常节点名。在vi下的替换命令可以为:

:%s/raclhr-11gr2-n2/raclhr-11gr2-n1/g    # 替换每一行中所有 raclhr-11gr2-n2 为 raclhr-11gr2-n1

修复目录/u01/app的过程如下所示:

--备份
./permission.pl /u01/app
--恢复
chmod -R 775 /u01  #取决于误操作是否有chmod操作
./restore-perm-<time stamp>.cmd

该方法也是作者推荐的一种方法。

方法3:getfacl和setfacl

Linux环境中还可以通过getfacl和setfacl来恢复。

getfacl在权限正常的节点上获取权限,然后修改脚本中的主机名,最后使用setfacl恢复权限,如下所示:

--备份
getfacl -pR /u01/app  > /tmp/bk_lhr_perm_u01_rac1.txt
--恢复
chmod -R 775 /u01  #取决于误操作是否有chmod操作
setfacl --restore=/tmp/bk_lhr_perm_u01_rac1.txt

---替换脚本中的主机名,注意大小写
:%s/raclhr-11gr2-n1/raclhr-11gr2-n2/g
:%s/raclhr-11gR2-N1/raclhr-11gR2-N2/g

该方法也是作者推荐的一种方法。

方法4:直接恢复重要文件夹的权限

直接恢复重要文件夹的权限,执行如下命令可以让集群先启动起来,但是,可能会隐藏一些未知的权限问题。如下所示:

chown -R grid:oinstall /u01
chown -R oracle:oinstall /u01/app/oracle
chmod -R 775 /u01/
chown -R grid:oinstall /u01/app/oraInventory
chmod -R 775 /u01/app/oraInventory
chmod 6751 /u01/app/11.2.0/grid/bin/oracle
chmod 6751 /u01/app/oracle/product/11.2.0/dbhome_1/bin/oracle
$ORACLE_HOME/crs/install/rootcrs.pl -init
#$ORACLE_HOME/crs/install/rootcrs.pl -unlock
#$ORACLE_HOME/crs/install/rootcrs.pl -patch

需要注意的是,多数以pl结尾的脚本从12.1.0.2开始都变为了sh脚本,例如:rootcrs.pl需要修改为rootcrs.sh。

方法5:删除再添加节点

通过delete node,然后add node来恢复,但是这个过程相对过于复杂,但是或许是最保险的一种方式,Oracle也推荐这样。

方法6:使用crsconfig_fileperms和crsconfig_dirs

根据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:root.sh

可以删除CRS的配置,然后重新运行root.sh即可。如果OCR和数据库不再同一个磁盘组里,那么重新运行root.sh脚本并不影响数据库,所以无需担心。可以用来修复OCR、OLR或表决磁盘损坏的情况,或ASM节点号和主机节点号不一致的情况。在deconfig之前,可以先将OCR的内容导出备份,然后等到root.sh执行成功后再将OCR的内容导入即可。常用的root.sh脚本执行过程参考:https://www.xmmup.com/oracle-raczhongxinzhixingroot-shjiaoben.html

方法8:重新安装

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

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

卸载rac请参考:https://www.xmmup.com/ruheshougongxiezaioracle-racjiqun.html

总结

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

目录
相关文章
|
4月前
|
Linux 数据安全/隐私保护 iOS开发
Linux的root用户,普通用户无法在根录中创建文件,一般在其HOME目录里是不受限的,一旦出了HOME目录,大多数地方,仅有读和执行的权限,ctrl + d回到上一个用户,Exit,su - ro
Linux的root用户,普通用户无法在根录中创建文件,一般在其HOME目录里是不受限的,一旦出了HOME目录,大多数地方,仅有读和执行的权限,ctrl + d回到上一个用户,Exit,su - ro
|
4月前
|
存储 Linux 数据安全/隐私保护
Linux用户和用户组,useradd test2 -g itcast -d /home/test222 设置分组和存放路径
Linux用户和用户组,useradd test2 -g itcast -d /home/test222 设置分组和存放路径
|
6月前
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。 【5月更文挑战第2天】
305 0
|
搜索推荐
更改目录
写完了一篇文章,进行对标题实现一个自动更改的目的,通过word对文章标题实现一个自动更改目录的功能,在更改的过程中遇到了出现了很多不明白的地方的,也是让自己陷入了两难的境界。
56 0
|
Oracle 关系型数据库 Linux
如果oracle用户下的$ORACLE_HOME bin oracle文件的属主或权限出了问题,那么该如何修复呢?
如果oracle用户下的$ORACLE_HOME bin oracle文件的属主或权限出了问题,那么该如何修复呢?
394 1
|
Java
给JDK设置tmp目录的办法
给JDK设置tmp目录的办法
141 0
|
存储 Linux 自然语言处理
Confluence 6 修改 Home 目录的位置
当 Confluence 第一次启动的时候,Confluence 将会读取 confluence-init.properties 文件并从这个文件中确定如何去查找 Home 目录。
1198 0
|
前端开发 Oracle 关系型数据库
[20180612]删除bootstrap$记录无法启动.txt
[20180612]删除bootstrap$记录无法启动.txt --//前几天看链接http://www.xifenfei.com/2018/05/willfully-delete-bootstrap.
1345 0
|
Oracle 关系型数据库 数据库管理
[20171223]grid用户的环境变量问题.txt
[20171223]grid用户的环境变量问题.txt --//oracle 11G 安装RAC,一般需要建立grid用户,使用这个用户管理asm,群集信息. --//在安装过程中,同事的疑问实际上也是我以前的疑问.
889 0