作者:bytehouse
Oracle ACE Pro、PostgreSQL ACE
10+年数据库架构与运维实战经验
公众号:bytehouse
墨天轮专栏:bytehouse
CSDN:Young DBA
ASM 密码文件orapwasm丢失、误删、覆盖损坏,重启 CRS 后集群认证异常,出现以下标准化故障现象:
ora.storage资源卡在STARTING状态无法流转;ORA-01017: invalid username/password; logon denied;crsctl stat res -t 报错:CRS-4535: Cannot communicate with Cluster Ready Services;sqlplus / as sysasm执行startup可强行拉起ASM实例,集群临时恢复,但重启集群后故障百分百复现。[grid@rac1 ~]$ asmcmd lspwusr
Username sysdba sysoper sysasm
SYS TRUE TRUE TRUE
CRSUSER__ASM_004 TRUE FALSE TRUE
ASMSNMP TRUE FALSE FALSE
ORACLE_148 TRUE FALSE FALSE集群全资源ONLINE,双节点ASM、磁盘组、数据库、VIP、SCAN监听均可随CRS自动启动,无任何认证报错。
直接覆盖原有密码文件,破坏SYS管理员核心权限
[grid@rac1 ~]$ orapwdfile='+dg_ocr/orapwasm'asm=y force=y password=Password123*校验损坏后权限:SYS丢失sysasm集群核心权限(故障核心特征)
[grid@rac1 ~]$ asmcmd lspwusr
Username sysdba sysoper sysasm
SYS TRUE TRUE FALSE两节点分别执行
# 关闭集群
crsctl stop crs
# 启动集群
crsctl start crs[grid@rac1 ~]$ crsctl stat res -t
ora.asm(ora.asmgroup)
1 ONLINE ONLINE rac1 Started,STABLE
2 ONLINE OFFLINE STABLE[grid@rac2 ~]$ crsctl stat res -t
CRS-4535: Cannot communicate with Cluster Ready Services
CRS-4000: Command Status failed, or completed with errors.[grid@rac2 ~]$ crsctl stat res -t-init
ora.crsd
1 ONLINE OFFLINE STABLE
ora.storage
1 ONLINE OFFLINE rac2 STARTINGORA-01017: invalid username/password; logon denied[grid@rac2 ~]$ sqlplus / as sysasm
SQL> startup
ASM instance started
Total System Global Area 1137173320 bytes
Fixed Size 8905544 bytes
Variable Size1103101952 bytes
ASM Cache 25165824 bytes
ASM diskgroups mounted说明:手动启动后集群临时恢复,但底层OCR/OLR凭证依旧异常,重启集群故障必然复现。
[grid@rac1 ~]$ asmcmd--nocp credverify
credverify: No credentials in password file, please run 'credfix' to fix the credentials.配置两节点root用户SSH免密互信(必须前置,否则credfix报错KFOD-00610)
[root@rac1 ~]$ /u01/app/19.3.0/grid/oui/prov/resources/scripts/sshUserSetup.sh -user root -hosts"rac1 rac2 "-advanced-noPromptPassphrasegrid用户执行该命令会直接报错KFOD-00610,必须使用root执行
[root@rac1 ~]$ asmcmd--nocp credfix
# 完整无删减实测输出
credfix: Credentials for CRSUSER__ASM_004 not in password file, trying next credential.
op=addcrscreds wrap=/tmp/creds0.xml
op=credstoxml wrap=/tmp/new_creds.xml
op=credimport wrap=/tmp/new_creds.xml olr=trueforce=true
credfix: OLR for rac1 has been fixed if credentials were created incorrectly.
credfix: Starting SSH session on node rac2.
credfix: OLR for rac2 has been fixed if credentials were created incorrectly. Exiting SSH session.
op=delcrscreds crs_user=CRSUSER__ASM_004
credfix: Deleted CRSUSER__ASM_004 from OCR.
credverify: Credentials created correctly on rac1.
credverify: Starting SSH session on node rac2
credverify: Credentials created correctly on rac2. Exiting SSH session.
credfix: Credentials have been fixed if they were created incorrectly.修复说明:自动删除旧失效集群认证账号CRSUSER__ASM_004,生成全新账号CRSUSER__ASM_005,同步修复双节点OLR本地注册表与OCR集群注册表。 每次账号 CRSUSER__ASM_00X 都会+ 1。
(credfix不会自动重建业务用户)
# 给SYS补回缺失的sysasm核心权限
asmcmd orapwusr --grant sysasm SYS
# 重建监控用户ASMSNMP并赋权
asmcmd orapwusr --add ASMSNMP
asmcmd orapwusr --grant sysdba ASMSNMP
# 重建业务用户ORACLE_148并赋权
asmcmd orapwusr --add ORACLE_148
asmcmd orapwusr --grant sysdba ORACLE_148权限校验,确认和初始状态一致:
[grid@rac1 ~]$ asmcmd lspwusr
Username sysdba sysoper sysasm
SYS TRUE TRUE TRUE
CRSUSER__ASM_005 TRUE FALSE TRUE
ASMSNMP TRUE FALSE FALSE
ORACLE_148 TRUE FALSE FALSEcrsctl stop crs
crsctl start crscrsctl stat res -t双节点所有资源全部自动ONLINE,无离线、无中间态资源;[grid@rac1 ~]$ asmcmd--nocp credverify
credverify: Credentials created correctly on rac1.
credverify: Starting SSH session on node rac2
credverify: Credentials created correctly on rac2. Exiting SSH session.无任何报错,集群ASM密码文件凭证完全修复,重启无故障复现。
将ASM磁盘组内密码文件备份至本地文件系统
[grid@rac1 ~]$ mkdir-p /home/grid/backup
[grid@rac1 ~]$ asmcmd pwcopy +DG_OCR/orapwasm /home/grid/backup/orapwasm.bak
# 校验备份文件完整性
[grid@rac1 ~]$ ll /home/grid/backup/orapwasm.bak
-rw-r-----1 grid oinstall 21504 Dec 215:16 orapwasm.bak[grid@rac1 ~]$ asmcmd
ASMCMD> rm-rf+DG_OCR/orapwasm
ASMCMD> exit故障现象和实验一完全一致:rac2节点crsd离线、ora.storage卡死STARTING、日志ORA-01017,手动startup可临时拉起ASM。
[grid@rac1 ~]$ asmcmd
ASMCMD> cp /home/grid/backup/orapwasm.bak +dg_ocr/orapwasm
copying /home/grid/backup/orapwasm.bak -> +dg_ocr/orapwasm
ASMCMD> exit[grid@rac1 ~]$ asmcmd lspwusr输出内容和故障发生前基准状态完全一致,所有用户、权限完整无丢失,无需额外授权。
# root两节点执行
crsctl stop crs
crsctl start crs集群所有资源自动启动,无需任何凭证修复、无需手动启动ASM,恢复速度最快,生产环境首选方案。
[grid@rac1 ~]$ asmcmd--nocp credverify
ASMCMD-8022: unknown command 'credverify' specifiedasmcmd rm -rf +DG_OCR/orapwasm提前关闭数据库减少补丁冲突
[grid@rac1 ~]$ srvctlstop database -d orcl
[root@rac1 ~]$ /u01/app/19.3.0/grid/OPatch/opatchauto apply /soft/34130714 -oh /u01/app/19.3.0/grid/u01/app/19.3.0/grid/OPatch/opatchauto resumeGI内核版本升级至19.30,credverify、credfix命令正常可用。
asmcmd orapwusr --grant sysasm SYS
asmcmd orapwusr --add ASMSNMP
asmcmd orapwusr --grant sysdba ASMSNMPcrsctl stop crs
crsctl start crs
srvctl start database -d orcl集群、数据库、监听资源全部正常上线,故障彻底修复。
asmcmd rm -rf +DG_OCR/orapwasmorapwd file='+dg_ocr/orapwasm'asm=y force=y password=Password123*执行身份:grid@rac1
/u01/app/19.3.0/grid/bin/ocrdump /tmp/ocr.dmp
vi /tmp/ocr.dmp检索关键字:CRSUSER__ASM,获取32位密钥串:
[SYSTEM.ASM.CREDENTIALS,USERS.CRSUSER_ASM_007 ORATEXT : 94fe808e905aef90bf335f143d8fa6f5]crsctl get credmaint -path /ASM/Self/94fe808e905aef90bf335f143d8fa6f5 -credtype userpass -id0-attr passwd -local
# 输出明文密码(现场实测结果)
q19CaqwsMFZV1rW2kx3bTRWuazidD# 补齐SYS核心权限
asmcmd orapwusr --grant sysasm SYS
# 新增监控用户
asmcmd orapwusr --add ASMSNMP
asmcmd orapwusr --grant sysdba ASMSNMP
# 新增集群内部认证账号,填入OCR获取的明文密码
asmcmd orapwusr --add CRSUSER__ASM_007
asmcmd orapwusr --grant sysdba CRSUSER__ASM_007
asmcmd orapwusr --grant sysasm CRSUSER__ASM_007[grid@rac1 ~]$ asmcmd lspwusr
Username sysdba sysoper sysasm
SYS TRUE TRUE TRUE
ASMSNMP TRUE FALSE FALSE
CRSUSER__ASM_007 TRUE FALSE TRUEcrsctl stop crs
crsctl start crs集群所有资源自动上线,无需人工干预ASM启动,故障永久修复。