Oracle ASM 翻译系列第三十弹:高级知识 Physical metadata replication
从版本12.1开始,ASM会对某些物理元数据做一份复制,具体的说是每个磁盘的第一个AU(0号AU)上元数据。这意味着,ASM同时维护着两份磁盘头、FST(Free Space Table)表、AT(Allocation table)表的数据。需要注意的是ASM对这些数据采用的是复制(replicate),而不是镜像(mirror)。ASM镜像(mirror)意味着把一份数据,拷贝到不同磁盘上;而物理元数据的副本位于相同的磁盘,因此使用的术语复制(replicate)。这意味着在external冗余的磁盘组中,物理元数据也会被复制。
PST也是物理元数据,但是ASM是通过镜像,而不是复制来提供数据保护。因此只有在normal和high冗余的磁盘组中,PST表存在数据的冗余。
Where is the replicated metadata物理元数据位于每块ASM磁盘的0号AU。元数据复制的特性打开后,ASM会把0号AU的内容拷贝到11号AU,然后同时维护这两份副本。创建磁盘组时如果指定或修改了一个已经存在的磁盘组的compatibility属性为12.1及以上,该特性会自动被打开。
当提升ASM compatibility属性值为12.1及以上时,如果11号AU有数据,ASM将把这些数据移动到别处,然后将物理元数据复制到11号AU。
从版本11.1.0.7开始,ASM在1号AU的倒数第二个块维护了一份磁盘头的副本。在版本12.1中,ASM仍然维护着这个副本数据。也就是说,现在每个ASM磁盘,有磁盘头的三个副本。
Disk group attribute PHYS_META_REPLICATED通过查询磁盘组的属性PHYS_META_REPLICATED可以确认物理元数据复制的状态。比如下面这个例子:
$ asmcmd lsattr -G DATA -l phys_meta_replicated
Name Value
phys_meta_replicated true
phys_meta_replicated值为true意味着磁盘组DATA的物理元数据已经做了复制。
ASM磁盘头的fdhdb.flags条目指代了物理元数据的复制状态:
· kfdhdb.flags = 0 -- 元数据没有复制
· kfdhdb.flags = 1 -- 元数据已经复制完毕
· kfdhdb.flags = 2 -- 元数据在复制过程中
一旦kfdhdb.flags被设置为1,就再也不会回到0.
Metadata replication in action如前面所述,在ASM兼容性设置为12.1或更高的磁盘组中,物理元数据会做复制。 下面通过两个例子来验证前面的结论:
1. 磁盘组的ASM兼容性设置为12.1:
$ asmcmd lsattr -G DATA -l compatible.asm
Name Value
compatible.asm 12.1.0.0.0
$ asmcmd lsattr -G DATA -l phys_meta_replicated
Name Value
phys_meta_replicated true
这里显示物理元数据已经被复制。下面确认该磁盘组里的所有磁盘kfdhdb.flags被设为1:
$ for disk in `asmcmd lsdsk -G DATA --suppressheader`; do kfed read $disk | egrep
"dskname|flags"; done
kfdhdb.dskname: DATA_0000 ; 0x028: length=9
kfdhdb.flags: 1 ; 0x0fc: 0x00000001
kfdhdb.dskname: DATA_0001 ; 0x028: length=9
kfdhdb.flags: 1 ; 0x0fc: 0x00000001
kfdhdb.dskname: DATA_0002 ; 0x028: length=9
kfdhdb.flags: 1 ; 0x0fc: 0x00000001
kfdhdb.dskname: DATA_0003 ; 0x028: length=9
kfdhdb.flags: 1 ; 0x0fc: 0x00000001
可以看到所有磁盘的kfdhdb.flags都被设为1,也就是该磁盘组里所有的磁盘都做了物理元数据复制。
1. 我们来看下磁盘组的ASM compatibility为11.2,然后提升至12.1会是什么情况:
SQL create diskgroup DG1 external redundancy
2 disk /dev/sdi1
3 attribute COMPATIBLE.ASM=11.2;
Diskgroup created.
看一下复制的状态:
$ asmcmd lsattr -G DG1 -l phys_meta_replicated
Name Value
可以看到,由于ASM兼容性低于12.1,没有physmetareplicated特性。下面通过kfed查看kfdhdb.flags参数,按照之前的结论,值应该为0:
$ kfed read /dev/sdi1 | egrep "type|dskname|grpname|flags"
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
kfdhdb.dskname: DG1_0000 ; 0x028: length=8
kfdhdb.grpname: DG1 ; 0x048: length=3
kfdhdb.flags: 0 ; 0x0fc: 0x00000000
现在把ASM兼容性修改到12.1:
$ asmcmd setattr -G DG1 compatible.asm 12.1.0.0.0
确认下复制的状态:
$ asmcmd lsattr -G DG1 -l phys_meta_replicated
Name Value
phys_meta_replicated true
物理元数据做了复制,所以kfdhdb.flags应该设置为1:
$ kfed read /dev/sdi1 | egrep "dskname|flags"
kfdhdb.dskname: DG1_0000 ; 0x028: length=8
kfdhdb.flags: 1 ; 0x0fc: 0x00000001
物理元数据应该被复制到11号AU:
$ kfed read /dev/sdi1 aun=11 | egrep "type|dskname|flags"
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
kfdhdb.dskname: DG1_0000 ; 0x028: length=8
kfdhdb.flags: 1 ; 0x0fc: 0x00000001
$ kfed read /dev/sdi1 aun=11 blkn=1 | grep type
kfbh.type: 2 ; 0x002: KFBTYP_FREESPC
$ kfed read /dev/sdi1 aun=11 blkn=2 | grep type
kfbh.type: 3 ; 0x002: KFBTYP_ALLOCTBL
这里显示11号AU中有了一份0号AU的数据副本。
最后确认下1号AU中的磁盘头副本:
$ kfed read /dev/sdi1 aun=1 blkn=254 | grep type
kfbh.type: 1 ; 0x002: KFBTYP_DISKHEAD
结果显示在1号AU的倒数第二个块中存在一份磁盘头副本。
Conclusion12版本的ASM会把0号AU的数据在相同磁盘的11号AU做一份复制。这种特性可以让ASM在磁盘的0号AU发生数据损坏时,自动恢复数据。需要注意的是,在external冗余的磁盘组中,如果是物理元数据以外的数据发生丢失,ASM都不能做恢复。在normal冗余的磁盘组中,一个failgroup中的一块或多块磁盘有任何的数据丢失,ASM都可以做恢复。在high冗余的磁盘组中,任意两个failgroup中的一块或多块磁盘有任何数据丢失,ASM都可以做恢复。
本文来自云栖社区合作伙伴“DBGEEK”
相关文章
- oracle 在C# 中调用oracle的数据库时,出现引用库和当前客户端不兼容的问题解决方案
- Oracle-查看oracle是否有表被锁
- 【Oracle】修改oracle监听端口
- 《oracle每日一练》Oracle DBLink连接数过多的问题(Ora-02020)
- 《oracle每天一练》Oracle冷备份与数据恢复
- 导出服务器Oracle数据库为dmp文件
- ORACLE 12C新特性——CDB与PDB
- oracle update left join查询
- 【Oracle 集群】ORACLE DATABASE 11G RAC 知识图文详细教程之RAC 特殊问题和实战经验(五)
- 连接ORACLE数据库,是不是必须要安装oracle客户端的运行时
- Oracle to MySQL Goldengate实现增量迁移
- Oracle中添加虚拟列(emp是oracle自带表)
- 《卸甲笔记》-PostgreSQL和Oracle的数据类型的对比系列四:大数据类型
- 6. oracle学习入门系列之六 模式
- oracle 性能优化--索引总结
- Oracle建立表空间和用户
- 【SQL开发实战技巧】系列(四十四):Oracle12C常用新特性☞你知道吗Oracle新增了类似Mysql的自增列(Identity Columns)功能
- DISPLAY not set. Please set the DISPLAY and try again 的处理方法(Oracle安装比较常出现)