使用kfed运维兵器修复ASM磁盘和磁盘组

欢迎关注“数据库运维之道”公众号,一起学习数据库技术! 本期将为大家分享“使用kfed运维兵器修复ASM磁盘和磁盘组” 的运维技能。

关键词:ORA-15053、ORA-15027、ORA-15040、ORA-01187、kfed repair、kfed merge、kfed read、strace

数据库的ASM磁盘或ASM磁盘组不小心被人为误删除从而导致磁盘组无法挂载,DBA需要将磁盘组挂载起来。通过实验再次模拟故障环境,详细分解每个操作步骤,避免下次继续踩坑从而提升运维处置效率。

场景描述:假设ASM磁盘组被删除,我们将如何进行快速恢复呢?

模拟环境:两个节点的RAC集群、数据库名YWZD、ASM磁盘组名称YWZD、测试ASM磁盘名称YWZD1。

实验步骤:

1、查看ASM磁盘的名称、路径和状态信息;

col path for a50
set pagesize 100
set linesize 1000
select name,path,header_status from v$asm_disk 
where group_number = (select group_number from v$asm_diskgroup
where name='YWZD');-->输入ASM磁盘组名称
NAME                   PATH                          HEADER_STATU
------------------------------ -------------------------------------------------- ------------
YWZD_0000               /dev/oracleasm/disks/YWZD1              MEMBER
MEMBER表示ASM磁盘是磁盘组的成员。

2、创建测试表空间和测试表;

create tablespace ywzd datafile '+YWZD' size 100m;
create table ywzd as select * from dba_tables;
select count(*) from ywzd;
  COUNT(*)
----------
      1884

3、删除ASM磁盘组,会报ORA-15053错误,即磁盘组存在文件;

--删除ASM磁盘组
su - grid
$sqlplus / as sysasm

SQL> drop diskgroup ywzd;
drop diskgroup ywzd
*
ERROR at line 1:
ORA-15039: diskgroup not dropped
ORA-15053: diskgroup "YWZD" contains existing files

--错误码具体说明
$oerr ora 15053
15053, 00000, "diskgroup \"%s\" contains existing files"
// *Cause:  An attempt was made to drop a diskgroup that still contains
//          existing files.
// *Action: Specify the INCLUDING CONTENTS option to drop the diskgroup
//          and all of its existing files.
//

4、根据上述方案,再次删除ASM磁盘组并加INCLUDING CONTENTS参数。但是出现ORA-15027错误,即磁盘组被实例占用无法dismount。

--删除ASM磁盘组
SQL> drop diskgroup ywzd including contents;
drop diskgroup ywzd including contents
*
ERROR at line 1:
ORA-15039: diskgroup not dropped
ORA-15027: active use of diskgroup "YWZD" precludes its dismount

--错误码具体说明
$oerr ora 15027
15027, 00000, "active use of diskgroup \"%s\" precludes its dismount"
// *Cause:  An ALTER DISKGROUP ... DISMOUNT command specified a diskgroup 
//          which had clients with open files in the diskgroup. Diskgroups 
//          cannot be dismounted until all open files in the diskgroup 
//          are closed. 
// *Action: Stop all clients that are using this diskgroup and retry 
//          the ALTER DISKGROUP ... DISMOUNT command.  Query the V$ASM_CLIENT
//          fixed view in an ASM instance or use ASMCMD LSOF to list active
//          clients.
//

--查看占用磁盘组的实例名
select instance_name,db_name,status from GV$ASM_CLIENT 
where group_number = (select group_number from v$asm_diskgroup 
where name='YWZD');  -->>输入磁盘组名称
INSTANCE_NAME               DB_NAME    STATUS
------------------------------ -------- ------------
+ASM1                   ywzd CONNECTED
+ASM2                   ywzd CONNECTED

--或者使用lsof命令查看
$asmcmd
ASMCMD> lsof
DB_Name   Instance_Name  Path                                                   
      
ywzd  ywzd1      +YWZD/ywzd/DATAFILE/ywzd.257.1164789351            
ywzd  ywzd1      +YWZD/ywzd_block_track.log     

5、备份ASM磁盘头数据后,再执行删除,方便后面对比分析及恢复。

--备份磁盘头信息
kfed read /dev/oracleasm/disks/YWZD1        >/tmp/YWZD1-0-0-B  磁盘头信息备份
kfed read /dev/oracleasm/disks/YWZD1 blkn=1 >/tmp/YWZD1-0-1-B  对块号为1备份
kfed read /dev/oracleasm/disks/YWZD1 aun=1  >/tmp/YWZD1-1-0-B  对aun为1备份

--关闭数据库实例
$srvctl stop database -d ywzd

 --切换到grid用户,先把其中一个节点的磁盘组DISMOUNT,否则会出现以下错误。
SQL> drop diskgroup ywzd including contents;
drop diskgroup ywzd including contents
*
ERROR at line 1:
ORA-15039: diskgroup not dropped
ORA-15073: diskgroup YWZD is mounted by another ASM instance

--成功删除
SQL> drop diskgroup ywzd including contents;

Diskgroup dropped.

6、手动再拉起磁盘组,出现ORA-15040错误,即磁盘组不完整错误。

--Mount磁盘组,提示磁盘组不完整
SQL> alter diskgroup ywzd mount;
alter diskgroup ywzd mount
*
ERROR at line 1:
ORA-15032: not all alterations performed
ORA-15017: diskgroup "YWZD" cannot be mounted
ORA-15040: diskgroup is incomplete

--ASM实例日志,显示挂载失败
2024-03-28T12:44:58.456141+08:00
SQL> alter diskgroup ywzd mount 
2024-03-28T12:44:58.461584+08:00
NOTE: cache registered group YWZD 8/0x4C149EB9
NOTE: cache began mount (first) of group YWZD 8/0x4C149EB9
2024-03-28T12:44:58.518360+08:00
ERROR: no read quorum in group: required 2, found 0 disks
2024-03-28T12:44:58.518657+08:00
NOTE: cache dismounting (clean) group 8/0x4C149EB9 (YWZD)
NOTE: messaging CKPT to quiesce pins Unix process pid: 29396, image: oracle@hlw3-db11 (TNS V1-V3)
NOTE: dbwr not being msg'd to dismount
NOTE: LGWR not being messaged to dismount
NOTE: cache dismounted group 8/0x4C149EB9 (YWZD)
NOTE: cache ending mount (fail) of group YWZD number=8 incarn=0x4c149eb9
NOTE: cache deleting context for group YWZD 8/0x4c149eb9
2024-03-28T12:44:58.534982+08:00
GMON dismounting group 8 at 26996 for pid 34, osid 29396
2024-03-28T12:44:58.536694+08:00
ERROR: diskgroup YWZD was not mounted
ORA-15032: not all alterations performed
ORA-15017: diskgroup "YWZD" cannot be mounted
ORA-15040: diskgroup is incomplete

2024-03-28T12:44:58.543094+08:00
ERROR: alter diskgroup ywzd mount

--错误码具体信息
$oerr ora 15040
15040, 00000, "diskgroup is incomplete"
// *Cause:  Some of the disks comprising a diskgroup were not present.
// *Action: Check the hardware to ensure that all disks are functional. Also
//          check that the setting of the ASM_DISKSTRING initialization 
//          parameter has not changed.  Alternatively, for normal or high
//          redundancy diskgroups, use MOUNT FORCE to offline missing disks
//          as part of mounting the diskgroup.
//

7、使用fked再次备份下磁盘头数据,然后再进行删除前后对比。

--备份磁盘头数据
kfed read /dev/oracleasm/disks/YWZD1        >/tmp/YWZD1-0-0-A
kfed read /dev/oracleasm/disks/YWZD1 blkn=1 >/tmp/YWZD1-0-1-A
kfed read /dev/oracleasm/disks/YWZD1 aun=1  >/tmp/YWZD1-1-0-A

--通过diff命令进行对比
diff /tmp/YWZD1-0-0-B /tmp/YWZD1-0-0-A

8、比较两个文件的差异信息,其中带有“!”符号的记录表示前后有差异。可以看到磁盘头状态从KFDHDR_MEMBER变成KFDHDR_FORMER。

命令一:$ diff -C 1 /tmp/YWZD1-0-0-B /tmp/YWZD1-0-0-A|grep "kfdhdb.hdrsts"
*** /tmp/YWZD1-0-0-B    2024-03-28 12:23:29.022209374 +0800
--- /tmp/YWZD1-0-0-A    2024-03-28 12:56:31.268409902 +0800
***************

*** 21,23 ****
  kfdhdb.grptyp:                        1 ; 0x026: KFDGTP_EXTERNAL
! kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBER
  kfdhdb.dskname:               YWZD_0000 ; 0x028: length=9
--- 21,23 ----
  kfdhdb.grptyp:                        1 ; 0x026: KFDGTP_EXTERNAL
! kfdhdb.hdrsts:                        4 ; 0x027: KFDHDR_FORMER
  kfdhdb.dskname:               YWZD_0000 ; 0x028: length=9
***************

  

命令二:$diff -y /tmp/YWZD1-0-0-B /tmp/YWZD1-0-0-A|grep "|"
kfdhdb.hdrsts:                        3 ; 0x027: KFDHDR_MEMBE |    kfdhdb.hdrsts:                        4 ; 0x027: KFDHDR_FORME

9、核实上述的对比信息后,修改备份文件中的磁盘头状态参数kfdhdb.hdrsts,并将修改的内容合并到磁盘头。

--修改/tmp/YWZD1-0-0-A文件
kfdhdb.hdrsts:即状态值从4改为3,状态名称从KFDHDR_FORMER改为KFDHDR_MEMBER

--合并修改结果
kfed merge /dev/oracleasm/disks/YWZD1 text=/tmp/YWZD1-0-0-A

10、最后把磁盘组挂载起来,并进行数据验证。

--核实磁盘状态是否为MEMBER
select name,path,header_status from v$asm_disk 
where group_number = (select group_number from v$asm_diskgroup
where name='YWZD');-->输入ASM磁盘组名称

--挂载磁盘组
SQL> alter diskgroup ywzd mount;

Diskgroup altered.

--启动数据库,并验证数据
select count(*) from ywzd;

ASM磁盘组挂载成功!

实验证明:当磁盘组被误删除后,立即停止进一步损坏,可以通过kfed进行完美恢复。

场景描述:假设执行oracleasm deletedisks 命令删除ASM磁盘,我们将如何进行快速恢复呢?

模拟环境:两个节点的RAC集群、数据库名YWZD、ASM磁盘组名称YWZD、测试ASM磁盘名称YWZD1。

实验步骤:

1、确认数据文件状态信息;

--数据文件状态可用
col file_name for a60
set linesize 1000
select file_name ,status from dba_data_files where file_name like '+YWZD%';
FILE_NAME                             STATUS
------------------------------------------------------------ ---------
+YWZD/ywzd/DATAFILE/ywzd.257.1164789351             AVAILABLE

--ASM磁盘可识别
$ oracleasm listdisks | grep YWZD
YWZD1

2、先备份ASM磁盘头数据,再执行删除ASM盘,方便后面对比分析或恢复使用。

--备份磁盘头信息
kfed read /dev/oracleasm/disks/YWZD1        >/tmp/YWZD11-0-0-B
kfed read /dev/oracleasm/disks/YWZD1 blkn=1 >/tmp/YWZD11-0-1-B
kfed read /dev/oracleasm/disks/YWZD1 aun=1  >/tmp/YWZD11-1-0-B

3、在节点1的root用户下执行deletedisk删除ASM磁盘

--删除磁盘
# oracleasm deletedisk YWZD1
Clearing disk header: done
Dropping disk: done

# oracleasm listdisks | grep YWZD-->无记录

# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...

4、在节点2检查ASM的状态,磁盘状态从MEMBER变成为CANDIDATE。

--检查磁盘状态为CANDIDATE
col path for a40
col name for a20
set linesize 1000
select path,name,state ,header_status from v$asm_disk where path like '%YWZD%';
PATH                     NAME              STATE    HEADER_STATU
---------------------------------------- -------------------- -------- ------------
/dev/oracleasm/disks/YWZD1                      NORMAL   CANDIDATE

--ASM磁盘扫描
# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Cleaning disk "YWZD1"
Scanning system for ASM disks...

# oracleasm listdisks | grep YWZD-->无记录

select path,name,state ,header_status from v$asm_disk where path like '%YWZD%'; 

no rows selected

5、检查数据库文件的状态,已经无法识别到数据文件。

--查看数据文件状态为AVAILABLE
col file_name for a60
select file_name ,status from dba_data_files where file_name like '+YWZD%'; 
FILE_NAME                             STATUS
------------------------------------------------------------ ---------
+YWZD/ywzd/DATAFILE/ywzd.257.1164789351             AVAILABLE

--手动触发检查点
alter system checkpoint;
alter system checkpoint;

--物理磁盘检测异常,触发磁盘组dismounted
select file_name ,status from dba_data_files where file_name like '+YWZD%'
*
ERROR at line 1:
ORA-01187: cannot read from file  because it failed verification tests
ORA-01110: data file 10: '+YWZD/ywzd/DATAFILE/ywzd.257.1164789351'

--ASM日志
2024-03-28T22:21:01.941213+08:00
Errors in file /u01/app/oracle/diag/rdbms/ywzd/ywzd1/trace/ywzd1_ckpt_16646.trc:
ORA-01110: data file 10: '+YWZD/ywzd/DATAFILE/ywzd.257.1164789351'
ORA-01115: IO error reading block from file 10 (block # 1)
ORA-15078: ASM diskgroup was forcibly dismounted
ORA-15078: ASM diskgroup was forcibly dismounted

6、asm磁盘头的元数据在0号数据块,其备份的元数据在510号数据块,因此可以通过kfed repair来修复。

-- 执行修复命令触发KFED-00303
# su - grid
$ kfed repair /dev/oracleasm/disks/YWZD1
KFED-00303: unable to open file '/dev/oracleasm/disks/YWZD1'

 --通过命令把原先的ASM磁盘状态写入磁盘头(renamedisk -f)
$oracleasm createdisk YWZD1 /dev/mapper/YW-YWZD 
Unable to open device "/dev/mapper/YW-YWZD": Permission denied

--root用户下创建
# oracleasm createdisk YWZD1 /dev/mapper/YW-YWZD
Writing disk header: done
Instantiating disk: done

--检查ASM磁盘状态为PROVISIONED
 PATH                     NAME              STATE    HEADER_STATU
---------------------------------------- -------------------- -------- ------------
/dev/oracleasm/disks/YWZD1                      NORMAL   PROVISIONED

--再次执行kfed repair进行修复,并通过strace把日志记录下来。
strace -o asm_learn.log 
kfed repair /dev/oracleasm/disks/YWZD1

--再次检查磁盘状态,已变成MEMBER
PATH                     NAME              STATE    HEADER_STATU
---------------------------------------- -------------------- -------- ------------
/dev/oracleasm/disks/YWZD1                      NORMAL   MEMBER

--另一个节点扫描磁盘
# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "YWZD1"

--手动挂载两个节点的磁盘组
SQL> select name,state from v$asm_diskgroup; 

NAME                   STATE
------------------------------ -----------
YWZD                   DISMOUNTED


SQL> alter diskgroup ywzd mount;

Diskgroup altered.

7、检查数据文件状态及验证数据。

--数据文件读取异常
select file_name ,status from dba_data_files where file_name like '+YWZD%'
*
ERROR at line 1:
ORA-01187: cannot read from file  because it failed verification tests
ORA-01110: data file 10: '+YWZD/ywzd/DATAFILE/ywzd.257.1164789351'

--错误码信息
!oerr ora 01187
01187, 00000, "cannot read from file %s because it failed verification tests"
// *Cause:  The data file did not pass the checks to insure it is part of the
//         database. Reads are not allowed until it is verified.
// *Action: Make the correct file available to the database. Then, either open
//         the database, or execute ALTER SYSTEM CHECK DATAFILES. 

--手动进行数据文件校验 
alter database datafile 10 online;

Database altered.

ALTER SYSTEM CHECK DATAFILES; 

Database altered.

--数据文件状态恢复正常
select file_name ,status from dba_data_files where file_name like '+YWZD%';

FILE_NAME                             STATUS
------------------------------------------------------------ ---------
+YWZD/ywzd/DATAFILE/ywzd.257.1164789351             AVAILABLE

--数据成功恢复
SYS@ywzd1> select count(*) from ywzd;

  COUNT(*)
----------
      1884

根据以上步骤成功将ASM磁盘、ASM磁盘组和数据文件成功恢复出来。

虽然整个恢复过程步骤简单,但是还是要理解其中的原理。数据库底层未实际删除数据,而修改ASM磁盘头状态信息。可使用kfed工具手动调整磁盘头状态或将元数据备份直接恢复。

1、ASM磁盘头HEADER_STATUS的状态,常见有以下4种。

CANDIDATE\PROVISIONED:磁盘不是磁盘组的一部分,可以通过以下ALTER DISKGROUP语句添加到磁盘组中
MEMBER:磁盘是现有磁盘组的成员。请勿尝试将磁盘添加到其他磁盘组
FORMER:磁盘曾经是磁盘组的一部分,但已从该组中彻底删除。可以使用以下ALTER DISKGROUP语句将其添加到新的磁盘组中

2、正常情况下,可通过kfed read检查以下关键指标

kfbh.type 值为 KFBTYP_DISKHEAD
kfdhdb.hdrsts 值为 KFDHDR_MEMBER

  • ASM tools used by Support : KFOD, KFED, AMDU (Doc ID 1485597.1)
  • V$ASM_DISK_STAT和V$ASM_DISK_v$asm_disk字段说明-CSDN博客

以上就是本期关于“使用kfed运维兵器修复ASM磁盘和磁盘组”。希望能给大家带来帮助!

欢迎关注“数据库运维之道”公众号,一起学习数据库技术!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/499931.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录训练营Day36:● 435. 无重叠区间 ● 763.划分字母区间 ● 56. 合并区间

435. 无重叠区间 题目链接 https://leetcode.cn/problems/non-overlapping-intervals/description/ 题目描述 思路 直接统计重叠区间的个数,就是需要删除的个数 public int eraseOverlapIntervals(int[][] intervals) {Arrays.sort(intervals,(a,b)-> Intege…

SpringBoot分布式锁自定义注解处理幂等性

SpringBoot分布式锁自定义注解处理幂等性 注解简介 注解(Annotation)是Java SE 5.0 版本开始引入的概念,它是对 Java 源代码的说明,是一种元数据(描述数据的数据)。 Java中的注解主要分为以下三类: JDK…

01_安装VMwareWorkstation虚拟机

环境:Win10 19045 软件版本:VMware-workstation-17.5.1 一、下载链接 Download VMware Workstation Pro 二、安装(无脑下一步) 安装位置自选,最好非系统盘。 增强型键盘驱动自选。 更新自选。 快捷方式自选。 三、…

MySQL学习笔记------DCL

DCL Data Control Language(数据控制语言),用来管理数据库用户、控制数据库的访问权限 一、管理用户 1、查询用户 USE mysql; select *from user; 2、创建用户 create user 用户名主机名 identified by 密码&a…

flume配置文件后不能跟注释!!

先总结:Flume配置文件后面,不能跟注释,可以单起一行写注释 报错代码: [ERROR - org.apache.flume.SinkRunner$PollingRunner.run(SinkRunner.java:158)] Unable to deliver event. Exception follows. org.apache.flume.EventDel…

计算机基础系列 —— 虚拟机代码翻译器(1)

“Most good programmers do programming not because they expect to get paid or get adulation by the public, but because it is fun to program.” ―Linus Torvalds 文中提到的所有实现都可以参考:nand2tetris_sol,但是最好还是自己学习课程实现一…

小程序中使用less

在vscode中安装插件 找到左下角齿轮的设置,点击右边图标,进入“settings.json” 加上以下代码配置 "less.compile":{"outExt": ".wxss"}

Charles抓包配置代理手机连接

Charles下载地址: Charles_100519.zip官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供Charles_100519.zip最新版正式版官方版绿色版下载,Charles_100519.zip安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123pan.com…

js用鼠标控制图片旋转任意角度-luckySheet

需求描述 最近有用户在使用luckySheet时,希望能够任意角度旋转图片,就像wps那样,wps如下图 wps的图片旋转 在网上只找到在canvas中进行旋转的库,没找到直接操作图片dom的库,决定直接写。 实现思路 1、点击时记录图片坐…

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机(server) 路由匹配(location) 代理(proxy_pass) 正向代理 反向代理 负载均衡(upstream) 负载均衡策略 动静分…

数据分析之POWER Piovt的KPI设置

内容总结: 1.两个表格关联不上:需要添加辅助列,建立关联 2.添加辅助列后还关联不上:将虚线变为实线 3.根据需求要增加一些度量值 4.设置KPI后,绝对值选1后设定百分比 5.在透视表里面加入KPI状态 导入所关联的数据后建立…

关于Linux中的history命令

前言:本文内容为实操学习记录,不具有调研价值,仅供参考! 正文: 接触过Linux操作系统的朋友一般都知道history命令,直接输入history命令,会显示当前用户的历史输入记录。这个原理是linux会记录我…

python--os和os.path模块

>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…

深入理解指针(7)函数指针变量及函数数组(文章最后放置本文所有原码)

一、函数指针变量 什么是函数指针变量呢? 既然是指针变量,那么它指向的一定是地址,而且我们可以通过地址来调用函数的。 函数是否有地址呢?地址是什么? 经过上面的测试可以看到函数也是有地址的,而且其地…

如何准备科学海报

科学会议上的海报展示可以为早期职业研究人员提供宝贵的机会来练习他们的沟通技巧,获得有关他们研究的反馈,并扩大他们的网络。“通过与其他研究人员一对一地讨论我的工作,[我发现]我可以确定哪些工作做得好,哪些需要改进&#xf…

dnf手游:如何利用副本和任务快速积累泰拉财富?

DNF手游中,搬砖赚钱的方式多种多样,其中利用副本和任务是一种快速赚取泰拉的有效途径。本攻略将介绍如何通过参与副本和任务来获取泰拉,帮助玩家在游戏中获得更多的经济收益。 一、认识游戏中的泰拉 在DNF手游中,泰拉是一种主要的…

HarmonyOS 开发之应用/组件级配置

在开发应用时,需要配置应用的一些标签,例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。 应用包名配置 应用需要在工程的AppScope目录下的 app.json5配置文件 中配置bundleName标签,该标签用于标识应用…

Containerd 介绍、安装和使用

Containerd介绍、安装和使用 文章目录 Containerd介绍、安装和使用1.containerd是什么?2.Containerd安装2.1 主机初始化2.1.1 设置ip地址2.1.2 配置镜像源2.1.3 关闭防火墙2.1.4 禁用SELinux2.1.5 禁用swap2.1.6 设置时区 2.2 安装 containerd2.2.1 内核参数调整2.2…

基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。

演示视频: 基于SSM的高校普法系统(有报告)。Javaee项目。ssm项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring Spri…

每天五分钟深度学习:使用神经网络完成人脸的特征点检测

本文重点 我们上一节课程中学习了如何利用神经网络对图片中的对象进行定位,也就是通过输出四个参数值bx、by、bℎ和bw给出图片中对象的边界框。 本节课程我们学习特征点的检测,神经网络可以通过输出图片中对象的特征点的(x,y)坐标来实现对目标特征的识别,我们看几个例子。…