首页 » ORACLE 9i-23ai, 系统相关 » AIX系统上的ASM Disk 上有PVID(物理卷 ID)有什么影响?

AIX系统上的ASM Disk 上有PVID(物理卷 ID)有什么影响?

巡检一套AIX lvm的主机上的oracle环境时,发现ASM disk的PV存在PVID, 根据ORACLE的最佳实践,这很可能会导致后期ASM DISK header corrupted ,而出现ASM disk无法识别,造成数据灾难, 这里记录一下如果有PVID和ASM DISK混淆时的风险和修复方案。

ORACLE 的最佳实践中有提到:

    不要为用于 ASM 磁盘组的磁盘或卷分配 PVID(物理卷 ID)。在添加至 ASM 磁盘组之前,必须清除所有候选磁盘或卷在所有节点上的 PVID。磁盘或卷一旦添加至 ASM 磁盘组,就不应再从集群中的任何节点分配 PVID,包括正添加至现有集群的节点。请参阅 Document 353761.1 了解关于此问题的更多详细信息。

注意:  为 ASM 磁盘分配 PVID 将损坏磁盘头,从而导致灾难性的数据丢失!!

什么是PVID

Pvid是aix系统中的ODM LVM用于识别PV的序列号,操作系统通过pvid来识别pv, 使用lspv(来自ODM)和lquerypv(来自Disk header) 命令查看当前PV是否存在PVid,  可以使用chdev 或cfgmgr生成PVID, 使用chdev -l hdisk1 -a pv=clear 清除pv 磁盘头的pvid。
PVID一旦生成会记录在ODM和DISK Header中, 如果分配了VG会在VGDA中。 如果使用LVM管理,已经加入VG就不建议在修改PVID,会导致VG无法确认PV而无法正常挂载。

PVID 位于磁盘头部的第一个 Block中(这里 Block 或者叫 Sector 为 512 字节,第一个Block/Sector 被记作为 sector 0,为 IPL record),地址位为0x080, 长度16bytes。

#define PSN_IPL_REC 0 /* PSN of the IPL record */
#define PSN_CFG_REC 1 /* PSN of the configuration record */
#define PSN_MWC_REC0 2 /* PSN of the first MWC cache record */
#define PSN_MWC_REC1 3 /* PSN of the second MWC cache record */
#define PSN_LVM_REC 7 /* PSN of LVM information record */

在 Sector 0 中,除了 PVID之外,还有一个重要字段是磁盘头最开始的“C9C2D4C1”,这是IPLRECID,有了它,才标示该磁盘是可被Power ROS (Read Only Storage) 识别并引导系统的。
typedef struct ipl_rec_area
{
unsigned int IPL_record_id; /* This physical volume contains a */
/* valid IPL record if and only if */
/* this field contains IPLRECID */
#define IPLRECID 0xc9c2d4c1 /* Value is EBCIDIC ‘IBMA’ 这样,通常 AIX 中 PV 的起始 512 字节显示如下:
# lquerypv -h /dev/hdisk0 0 200
00000000 C9C2D4C1 00000000 00000000 00000000 |…………….|
00000010 00000000 00000000 00000000 00000000 |…………….|
00000020 00000000 00000000 00000000 00000000 |…………….|
00000030 00000000 00000000 00000000 00000000 |…………….|
00000040 00000000 00000000 00000000 00000000 |…………….|
00000050 00000000 00000000 00000000 00000000 |…………….|
00000060 00000000 00000000 00000000 00000000 |…………….|
00000070 00000000 00000000 00000000 00000000 |…………….|
00000080 00F8FDEC 060A9FE5 00000000 00000000 |…………….|
00000090 00000000 00000000 00000000 00000000 |…………….|
000000A0 00000000 00000000 00000000 00000000 |…………….|
000000B0 00000000 00000000 00000000 00000000 |…………….|
000000C0 00000000 00000000 00000000 00000000 |…………….|
000000D0 00000000 00000000 00000000 00000000 |…………….|
000000E0 00000000 00000000 00000000 00000000 |…………….|
000000F0 00000000 00000000 00000000 00000000 |…………….|
00000100 00000000 00000000 00000000 00000000 |…………….|
00000110 00000000 00000000 00000000 00000000 |…………….|
00000120 00000000 00000000 00000000 00000000 |…………….|
00000130 00000000 00000000 00000000 00000000 |…………….|
00000140 00000000 00000000 00000000 00000000 |…………….|
00000150 00000000 00000000 00000000 00000000 |…………….|
00000160 00000000 00000000 00000000 00000000 |…………….|
00000170 00000000 00000000 00000000 00000000 |…………….|
00000180 00000000 00000000 00000000 00000000 |…………….|
00000190 00000000 00000000 00000000 00000000 |…………….|
000001A0 00000000 00000000 00000000 00000000 |…………….|
000001B0 00000000 00000000 00000000 000000FF |…………….|
000001C0 FFFF41FF FFFF0211 00001900 000080FF |..A………….|
000001D0 FFFF41FF FFFF1B11 000000D1 00000000 |..A………….|
000001E0 00000000 00000000 00000000 00000000 |…………….|
000001F0 00000000 00000000 00000000 000055AA |…………..U.|

命令 “chdev -l hdiskX -a pv=clear” 和 “chdev -l hdiskX -a pv=yes”只会对 sector  0 进行操作,不涉及其它 sector。 “chdev -l hdiskX -a pv=yes”会对盘头写入“C9C2D4C1”,并检查 0x80地址是否为零,如果为零则计算并写入 PVID,同时更新 ODM 库。 命令”lspv”显示的 pvid 是从 ODM 库 CuAt 中读取的。

  PVID 和 ASM disk冲突

ASM DISK也在在磁盘disk header(4k bytes)记录ASH元数据, 而PVID也要记录在disk header(512 bytes), 那这两个就无法并存, 先后顺序直接决定了后果,前者被后者破坏。

下面是三种情景:

1,先有ASM后给PVID

2,  先有PVID 无VG, 后给ASM

3,  先有PVID 有VG,后给ASM

对于#1 情景,很明显ASM DISK HEADER的数据直接被PVID等信息冲掉,ASM会因为ASM DISK header corrupte而无法识别该ASM DISK。

提示ORA-15063 “diskgroup \”%s\” lacks quorum of %s PST disks; %s found”
or
ORA-15063: ASM discovered an insufficient number of disks for diskgroup s%
ORA-15040: diskgroup is incomplete
ORA-15042: ASM disk “%” is missing

对于#2和#3 区别就在划了PVID有没有给VG。

Assigning a Physical Volume ID (PVID) To An Existing ASM Disk Corrupts the ASM Disk Header (Doc ID 353761.1)

 

Corrective Action for ASM Diskgroup with Disks Having  PVIDs on AIX (Doc ID 750016.1)

When the PVID is set to a disk in a volume group, the PVID is stored in two locations. In Physical disk header ( within first 4K )and in AIX’s system object database, called ODM ( Object Data Manager ).

When the diskgroup is created, the disk header information of PVID is overwritten. However, with reboot the OS, from ODM, AIX might try to restore the PVID information onto the disk header,
there by destroying the ASM metadata.

从上面的MOS文档中看到这是一个很严重的问题,是说如果先有PVID 后面分给了ASM , ASM 把DISK HEADER上的PVID给覆盖了, 因为PVID除了DISK HEADER还有在ODM中,如果下次操作系统重启 后发现disk header上的PVID和ODM中的不一致, 会使用ODM 覆盖修复disk header.   这样就存在一种因为修复PVID而破坏当前ASM disk header, 导致ORACLE ASM 因disk header corrupted 而无法识别磁盘、磁盘组无法挂载影响数据库使用。

下面是一种先有PVID 后加ASM disk的现象。

[oracle@anbob1:/home/oracle> lspv
hdisk1          00f636f4953ce6c2                    rootvg          active      
hdisk0          00f636f41cb35f92                    rootvg          active      
hdisk2          00f73c719db481c2                    localvg         active      
hdisk3          00f636eca0406ef3                    localvg         active      
hdisk4          00f636f510ec6aaa                    None                        
hdisk5          00f636f510ecdc9a                    None                        
hdisk6          00f636f510ecf742                    None                        
...                     
hdisk15         00f636f515f230d8                    None    --ASM DISK                    

# ADD /dev/rhdisk15 TO ASM DISKGROUP 

[oracle@anbob1:/home/oracle> lquerypv -H /dev/hdisk15
00000000000000000000000000000000
[oracle@anbob1:/home/oracle>  lquerypv -H /dev/hdisk0
00f636f41cb35f920000000000000000

[oracle@anbob1:/home/oracle> kfed read /dev/rhdisk15|head
kfbh.endian:                          0 ; 0x000: 0x00
kfbh.hard:                          130 ; 0x001: 0x82
kfbh.type:                            1 ; 0x002: KFBTYP_DISKHEAD
kfbh.datfmt:                          1 ; 0x003: 0x01
kfbh.block.blk:                       0 ; 0x004: blk=0
kfbh.block.obj:              2147483651 ; 0x008: disk=3
kfbh.check:                  2700758848 ; 0x00c: 0xa0fa4f40
kfbh.fcn.base:                        0 ; 0x010: 0x00000000
kfbh.fcn.wrap:                        0 ; 0x014: 0x00000000
kfbh.spare1:                          0 ; 0x018: 0x00000000

注意lquerypv查询磁盘头上的pvid已经为0,但是ODM 中还存在,所以使用lspv还是可以看到,按照上面的MOS中描述这种是有可能操作系统重启后ODM修复disk header上的pvid而破坏了ASM disk header, 属于#2 号场景, 但是客户反映之前已经操作系统重启过,为什么ASM 还好好的呢? 区别就是有没有把PV分配给VG, 如果PV分配给了VG, 操作系统重启后在激活读取vg信息时才会尝试修复disk header上的PVID, 而导致ASM Header被破坏(I Just  guess), 所以有PVID 但没有给VG ,OS重启后也不会出现ODM修复 DISK header上的PVID。

只清理ODM中的PVID

如果当前 ASM 磁盘头为 AIX PV 信息和 ASM metadata 混杂的,不建议使用 chdev 命令清除.使用odmdelete删除PVid:

清除 ODM 库:
1. 备份ODM目录 /etc/objrepos, /usr/lib/objrepos, /usr/share/lib/objrepos;
2.定义环境变量
# export ODMDIR=/etc/objrepos

3.用’odmget’查找需删除的条目,以hdisk15为例:

# odmget CuAt|grep -n 00f636f515f230d8
8780:   value = "00f636f515f230d80000000000000000"

# odmget CuAt|sed -n '8770,8785'p 
        attribute = "pvid"
        value = "00f636f511a999230000000000000000"
        type = "R"
        generic = "D"
        rep = "s"
        nls_index = 2

CuAt:
        name = "hdisk15"
        attribute = "pvid"
        value = "00f636f515f230d80000000000000000"
        type = "R"
        generic = "D"
        rep = "s"
        nls_index = 2


4.删除ODM中pvid信息
# odmdelete -q value=00f636f515f230d80000000000000000 -o CuAt
0518-307 odmdelete: 1 objects deleted.

# lspv |grep hdisk15
hdisk14 none None

5. #savebase -v (同步 bootlv, 很重要!)

Related Posts:

打赏

, ,

对不起,这篇文章暂时关闭评论。