ASM 翻译系列第二十弹:ASM Internal ASM file number 7
译者: 郭旭瑞
审核: 魏兴华
DBGeeK社群联合出品
ASM file number 7
ASM元信息7号文件,是ASM的逻辑卷目录,用于跟踪与ADVM有关的文件。
ASM动态逻辑卷设备是由ASM动态逻辑卷构建的。一个磁盘组中可以配置一个或多个ASM动态逻辑卷设备。ASM集群文件系统通过ADVM接口构建在ASM磁盘组之上。ADVM像数据库一样,也是ASM的一个客户端。当一个逻辑卷被访问时,相应的ASM文件会被打开并且ASM extent的信息会被发送到ADVM驱动。
有两种与ADVM逻辑卷相关的文件类型:
● ASMVOL:逻辑卷文件,作为逻辑卷存储的容器。
● ASMVDRL:包含脏数据记录区域信息的文件;重新同步镜像数据时会用到此文件。
Turn up the ADVM volume
为ADVM创建一个单独的磁盘组并不是必须的,但这样做确实是有意义的,通过这种方式,可以把数据库文件与ACFS文件隔离开。看几个例子:
SQL> create diskgroup ACFS
disk 'ORCL:ASMDISK5', 'ORCL:ASMDISK6'
attribute 'COMPATIBLE.ASM' = '11.2', 'COMPATIBLE.ADVM' = '11.2';
Diskgroup created.
要创建逻辑卷,首先需要有一个磁盘组,上面创建了一个名称为acfs的磁盘组。为了能在磁盘组中创建逻辑卷,磁盘组的COMPATIBLE.ASM与COMPATIBLE.ADVM必须设置为11.2或以上,同时ADVM/ACFS驱动要被加载(在集群环境中,已经默认加载,而在单实例环境中,需要手动加载)。
做到以上要求后,就可以在磁盘组中创建逻辑卷了:
$ asmcmd volcreate -G ACFS -s 2G ACFS_VOL1
$ asmcmd volcreate -G ACFS -s 2G ACFS_VOL2
$ asmcmd volinfo -a
Diskgroup Name: ACFS
Volume Name: ACFS_VOL1
Volume Device: /dev/asm/acfs_vol1-159
State: ENABLED
Size (MB): 2048
Resize Unit (MB): 32
Redundancy: MIRROR
Stripe Columns: 4
Stripe Width (K): 128
Usage:
Mountpath:
Volume Name: ACFS_VOL2
Volume Device: /dev/asm/acfs_vol2-159
State: ENABLED
Size (MB): 2048
Resize Unit (MB): 32
Redundancy: MIRROR
Stripe Columns: 4
Stripe Width (K): 128
Usage:
Mountpath:
$
到现在,还没有相应的挂载目录与逻辑卷相关联,所以还不能使用它们。这时,我们可以先看看ADVM逻辑卷元信息,我们先从逻辑卷目录获取其所在的分配单元:
SQL> SELECT x.xnum_kffxp "Extent",
x.au_kffxp "AU",
x.disk_kffxp "Disk #",
d.name "Disk name"
FROM x$kffxp x, v$asm_disk_stat d
WHERE x.group_kffxp=d.group_number
and x.disk_kffxp=d.disk_number
and x.group_kffxp=2
and x.number_kffxp=7
ORDER BY 1, 2;
Extent AU Disk # Disk name
---------- ---------- ---------- ------------------------------
0 53 1 ASMDISK6
0 53 0 ASMDISK5
接下来,使用kfed工具查看真实的元信息:
$ kfed read /dev/oracleasm/disks/ASMDISK5 aun=53 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 22 ; 0x002: KFBTYP_VOLUMEDIR
...
kfvvde.entry.incarn: 1 ; 0x024: A=1 NUMM=0x0
kfvvde.entry.hash: 0 ; 0x028: 0x00000000
kfvvde.entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfvvde.entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0
kfvvde.volnm: ++AVD_DG_NUMBER ; 0x034: length=15
kfvvde.usage: ; 0x054: length=0
kfvvde.dgname: ; 0x074: length=0
kfvvde.clname: ; 0x094: length=0
kfvvde.mountpath: ; 0x0b4: length=0
kfvvde.drlinit: 0 ; 0x4b5: 0x00
kfvvde.pad1: 0 ; 0x4b6: 0x0000
kfvvde.volfnum.number: 0 ; 0x4b8: 0x00000000
kfvvde.volfnum.incarn: 0 ; 0x4bc: 0x00000000
kfvvde.drlfnum.number: 0 ; 0x4c0: 0x00000000
kfvvde.drlfnum.incarn: 0 ; 0x4c4: 0x00000000
kfvvde.volnum: 0 ; 0x4c8: 0x0000
kfvvde.avddgnum: 159 ; 0x4ca: 0x009f
kfvvde.extentsz: 0 ; 0x4cc: 0x00000000
kfvvde.volstate: 4 ; 0x4d0: D=0 C=0 R=1
...
上面的输出信息显示了53号AU的block 0.它只包含了ADVM逻辑卷的标记(++AVD_DG_NUMBER),而真正的逻辑卷的信息其实位于block 1及以后:
$ kfed read /dev/oracleasm/disks/ASMDISK5 aun=53 blkn=1 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 22 ; 0x002: KFBTYP_VOLUMEDIR
...
kfvvde.entry.incarn: 1 ; 0x024: A=1 NUMM=0x0
kfvvde.entry.hash: 0 ; 0x028: 0x00000000
kfvvde.entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfvvde.entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0
kfvvde.volnm: ACFS_VOL1 ; 0x034: length=9
kfvvde.usage: ; 0x054: length=0
kfvvde.dgname: ; 0x074: length=0
kfvvde.clname: ; 0x094: length=0
kfvvde.mountpath: ; 0x0b4: length=0
kfvvde.drlinit: 0 ; 0x4b5: 0x00
kfvvde.pad1: 0 ; 0x4b6: 0x0000
kfvvde.volfnum.number: 257 ; 0x4b8: 0x00000101
kfvvde.volfnum.incarn: 771971291 ; 0x4bc: 0x2e0358db
kfvvde.drlfnum.number: 256 ; 0x4c0: 0x00000100
kfvvde.drlfnum.incarn: 771971289 ; 0x4c4: 0x2e0358d9
kfvvde.volnum: 1 ; 0x4c8: 0x0001
kfvvde.avddgnum: 159 ; 0x4ca: 0x009f
kfvvde.extentsz: 8 ; 0x4cc: 0x00000008
kfvvde.volstate: 2 ; 0x4d0: D=0 C=1 R=0
...
$ kfed read /dev/oracleasm/disks/ASMDISK5 aun=53 blkn=2 | more
kfbh.endian: 1 ; 0x000: 0x01
kfbh.hard: 130 ; 0x001: 0x82
kfbh.type: 22 ; 0x002: KFBTYP_VOLUMEDIR
...
kfvvde.entry.incarn: 1 ; 0x024: A=1 NUMM=0x0
kfvvde.entry.hash: 0 ; 0x028: 0x00000000
kfvvde.entry.refer.number: 4294967295 ; 0x02c: 0xffffffff
kfvvde.entry.refer.incarn: 0 ; 0x030: A=0 NUMM=0x0
kfvvde.volnm: ACFS_VOL2 ; 0x034: length=9
kfvvde.usage: ; 0x054: length=0
kfvvde.dgname: ; 0x074: length=0
kfvvde.clname: ; 0x094: length=0
kfvvde.mountpath: ; 0x0b4: length=0
kfvvde.drlinit: 0 ; 0x4b5: 0x00
kfvvde.pad1: 0 ; 0x4b6: 0x0000
kfvvde.volfnum.number: 259 ; 0x4b8: 0x00000103
kfvvde.volfnum.incarn: 771971303 ; 0x4bc: 0x2e0358e7
kfvvde.drlfnum.number: 258 ; 0x4c0: 0x00000102
kfvvde.drlfnum.incarn: 771971301 ; 0x4c4: 0x2e0358e5
kfvvde.volnum: 2 ; 0x4c8: 0x0002
kfvvde.avddgnum: 159 ; 0x4ca: 0x009f
kfvvde.extentsz: 8 ; 0x4cc: 0x00000008
kfvvde.volstate: 2 ; 0x4d0: D=0 C=1 R=0
...
ASM元信息7号文件block 1包含的是第一个逻辑卷的信息(kfvvde.volnm: ACFS_VOL1),并且有两个文件关联到这个逻辑卷:
● DRL脏数据记录区域文件(kfvvde.drlfnum.number: 256)
● 逻辑卷文件(kfvvde.volfnum.number: 257)
block 2包含第二个逻辑卷的信息(kfvvde.volnm: ACFS_VOL2),并且有两个文件关联到这个逻辑卷:
● DRL脏数据记录区域文件(kfvvde.drlfnum.number: 258)
● 逻辑卷文件(kfvvde.volfnum.number: 259)
这些都是特殊文件,所以不会显示在asmcmd ls命令的输出和v$asm_alias视图中。但是,你可以到v$asm_file中找到他们:
SQL> SELECT file_number "File #", bytes/1024/1024 "Size (MB)", type
FROM v$asm_file
WHERE group_number=2;
File # Size (MB) TYPE
---------- ---------- ----------
256 17 ASMVDRL
257 2048 ASMVOL
258 17 ASMVDRL
259 2048 ASMVOL
Create ASM cluster file system
这时,可以在逻辑卷设备上创建ASM集群文件系统(ACFS):
# /sbin/mkfs -t acfs /dev/asm/acfs_vol1-159
mkfs.acfs: version = 11.2.0.3.0
mkfs.acfs: on-disk version = 39.0
mkfs.acfs: volume = /dev/asm/acfs_vol1-159
mkfs.acfs: volume size = 2147483648
mkfs.acfs: Format complete.
# mkdir /acfs1
# mount -t acfs /dev/asm/acfs_vol1-159 /acfs1
# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
...
oracleasmfs on /dev/oracleasm type oracleasmfs (rw)
/dev/asm/acfs_vol1-159 on /acfs1 type acfs (rw)
$ asmcmd volinfo -G ACFS ACFS_VOL1
Diskgroup Name: ACFS
Volume Name: ACFS_VOL1
Volume Device: /dev/asm/acfs_vol1-159
State: ENABLED
Size (MB): 2048
Resize Unit (MB): 32
Redundancy: MIRROR
Stripe Columns: 4
Stripe Width (K): 128
Usage: ACFS
Mountpath: /acfs1
$
这时候再看看逻辑卷目录中是否包含挂载目录:
$ kfed read /dev/oracleasm/disks/ASMDISK6 aun=53 blkn=1 | grep mountpath
kfvvde.mountpath: /acfs1 ; 0x0b4: length=6
确实如此。
Conclusion
一个磁盘组中可以配置一个或多个ASM动态逻辑卷设备。ASM集群文件系统通过ADVM接口构建于ASM磁盘组之上。ADVM跟数据库一样,也是ASM的一个客户端。
有两种与ADVM逻辑卷相关的文件类型:
● ASMVOL:逻辑卷文件,作为逻辑卷存储设备的容器
● ASMVDRL:包含脏数据记录区域信息的文件。恢复镜像数据时会用到此文件。
关于译者
郭旭瑞,沃趣科技产品交付部经理,负责QData Cloud高性能数据库云平台、QBackup数据库秒级备份恢复云平台等产品的整体交付管理与技术支持、维保服务工作。个人网站:www.dbalex.com
- MySQL错误修复:Table xx is marked as crashed and last (automatic?) repair failed
- PHP跨站脚本攻击(XSS)漏洞修复方法(一)
- Windows下获取网络连线实际名称,加强IP类设置脚本的兼容性
- Android APP 快速 Pad 化实现
- PHP彩蛋还是漏洞?expose_php彩蛋的触发和屏蔽方法
- 深入源码探索 ReactNative 通信机制
- PHP跨站脚本攻击(XSS)漏洞修复思路(二)
- WordPress发布文章自动同步到新浪微博(带特色图片)
- go http 服务器编程(1)
- Linux系统内存监控、性能诊断工具vmstat命令详解
- go http 服务器编程(2)
- 利用placeholder属性来添加输入框默认文字提示,提高用户体验
- Linux系统监控、诊断工具之top命令详解
- 【Dev Club分享】iOS黑客技术大揭秘
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter 标签类控件大全Chip
- 【Flutter实战】六大布局组件
- 【Flutter实战】定位装饰权重组件及柱状图案例
- Flutter为什么使用Dart?
- Flutter中如何使用WillPopScope
- 谈谈我对 Flutter 发展前景 和 “嵌套地狱” 的浅显看法
- 超过百万的StackOverflow Flutter 问题-第二期
- Flutter Flow实现半圆弹出菜单
- 【Flutter实战】自定义滚动条
- vue.config.js的优化配置(element-ui, echarts, lodash按需加载 )
- Flutter “孔雀开屏”动画效果
- Flutter 使用Navigator进行局部跳转页面
- Flutter 动画鼻祖之CustomPaint
- 【Flutter实战】Flutter 中那么多组件,难道要都学一遍?
- 【Flutter组件终结篇】332个组件 658页PDF