1. 【Maclean Liu 技术分
享】深入了解 Oracle
ASM(一)基础概念
by Maclean.liu
liu.maclean@gmail.com
www.askmaclean.com
2. About Me
l Email:liu.maclean@gmail.com
l Blog:www.askmaclean.com
l Oracle Employee
l Oracle Certified Database Administrator Master 10g
and 11g
l Over 7 years experience with Oracle DBA technology
l Over 8 years experience with Linux technology
l Member Independent Oracle Users Group
l Member All China Users Group
l Presents for advanced Oracle topics: RAC,
DataGuard, Performance Tuning and Oracle Internal.
5. •ASM 提供数据镜像以便从磁盘失败中恢复
•用户可以选择 EXTERNAL、NORMAL、HIGH 三种冗余镜像
•EXTERNAL 即 ASM 本身不做镜像,而依赖于底层存储阵列资深实现镜像;在 External 下任何的写
错误都会导致 Disk Group 被强制 dismount。在此模式下所有的 ASM DISK 必须都存在健康,否则
Disk Group 将无法 MOUNT
•NORMAL 即 ASM 将为每一个 extent 创建一个额外的拷贝以便实现冗余;默认情况下所有的文件都
会被镜像,这样每一个 file extent 都有 2 份拷贝。若写错误发生在 2 个 Disk 上且这 2 个 Disk 是
partners 时将导致 disk Disk Group 被强制 dismount。若发生失败的磁盘不是 partners 则不会引起数
据丢失和不可用。
•HIGH 即 ASM 为每一个 extent 创建两个额外的拷贝以便实现更高的冗余。2 个互为 partners 的
Disk 的失败不会引起数据丢失,当然不能有更多的 partners Disk 失败了。
•数据镜像依赖于 failure group 和 extent partnering 实现。ASM 在 NORMAL 或 HIGH 冗余度下可以
容许丢失一个 failure group 中所有的磁盘。
Failure Group 镜像的使用
•ASM 的镜像并不像 RAID 1 那样
•ASM 的镜像基于文件 extent 的粒度,extent 分布在多个磁盘之间,称为 partner
•Partner disk 会存放在一个或者多个分离的 failure group 上
•ASM 自动选择 partner 并限制其数量小于 10 个
•若磁盘失败,则 ASM 更新其 extent map 使今后的读取操作指向剩余的健康 partner
•在 11g 中,若某个 disk 处于 offline 状态,则对于文件的变更会被追踪记录这样当 disk 被重现 online
时则这些变化得以重新应用,前提是 offline 的时间不超过 DISK_REPAIR_TIME 所指定的时间(默认
为 3.6 个小时). 这种情况常发生在存储控制器故障或者类似的短期磁盘故障:
•这种对于文件变更的追踪基于一个发生变化的 file extent 的位图,该位图告诉 ASM 哪些 extents 需
要从健康的 partner 哪里拷贝至需要修复的 disk,该特性称之为 fast mirror resync
•在 10g 中没有 fast mirror resync 特性,若 disk 出现 offline 则直接自动被 drop 掉,不存在允许修复
的周期
•对于无法再 online 的 disk,则必须被 drop 掉; 一个新的 disk 会被 ASM 选择并通过 rebalancing 操
作拷贝数据,这些工作是后台自动完成的。
重新平衡 Rebalancing
•Rebalancing 是在磁盘之间移动文件 extent 以实现 diskgroup 上的 IO 负载均衡的过程
•Rebalancing 在后台异步发生,是可监控的
•在集群环境中,一个 diskgroup 的重平衡只能在一个 ASM instance 上发生,不能通过集群多节点同
时处理以加速
•当 disk 被加入或移除时,ASM 会自动在后台开始数据重新平衡工作
•重平衡的速度和力度可以通过 asm_power_limit 参数控制
•asm_power_limit 参数默认为 1,其范围为 0~11(从 11.2.0.2 开始是 0-1024),该参数控制实施重平
衡后台进程的数量;Level 0 表示不实施重新平衡
•在重新平衡过程中 IO 性能(主要是吞吐量和响应时间)可能受到影响,其影响程度取决于存储本身的
能力和重新平衡的力度,默认的 asm_powner_limit=1 不会造成过度的影响
性能方面
6. •ASM 会通过在 DG 中条带化文件 extent 分布以最大化可用的 IO 带宽
•有 2 种可用条带化宽度:coarse 粗糙条带化大小为 1 个 AU,fine 精细条带化为 128K
•即便是 fine 精细条带化仍采用普通大小的 file extent,但是条带化以更小的片形式循环式地分布在
多个 extent 上
•ASM 默认不让 RDBMS 去读备用的镜像拷贝 extent,即使这样请放心 IO 还是均衡的
•默认情况下 RDBMS 总是去读取主 primary extent,从 11.1 开始可以通过
PREFERRED_READ_FAILURE_GROUP 参数设置让本地节点优先读取某个 failure group 中的
extent; 该特性主要为 extended distance RAC 设计,不建议在常规 ASM 中使用
其他知识
•并非 RAC 才能使用 ASM,单节点同样可以从 ASM 哪里获得好处
•节点上的一个 ASM instance 实例可以为多个 RDBMS DB 实例服务
•RAC 环境中的 ASM 必须也是集群化的,以便能够协调更新元数据
•从 11.2 开始,ASM 从 RDBMS HOME 分离出来,而和 clusterware 一起安装在 GRID HOME 下。
Disk Group:
Disk Group”磁盘组” 是 ASM 管理的逻辑概念对象,一个 Disk Group 由多个 ASM disk 组成。每一个 Disk
Group 都是子描述的,如同一个标准的文件系统一样。所有关于该 Diskgroup 空间使用信息的元数据均
完整地包含在这个磁盘组中。 若 ASM 可以找到所有属于该 ASM diskgroup 的 DISK 则他不需要任何其他
额外的元数据。
文件空间从 Disk Group 中分配。任何一个 ASM 文件总是完整地包含在一个单独的 Disk Group 中。但
是,一个 Disk Group 可能包含了属于多个数据库的文件,一个单独的数据库的文件也可以存放在多个不
同的 Disk Group 中。 在大多数实际的部署中,不会创建太多数量的 Disk Groups,一般在 3~4 个。
Disk Group 提供三种不同的 redundancy 冗余度,详见上文。
ASM Disk
一个 ASM Disk 是组成 Disk Group 的基本的持久的存储。 当一个 ASM Disk 加入到 Disk Group 中时,它
要么采用管理员指定的 ASM Disk Name 要么采用系统自动分配的 Disk Name。 这不同于 OS 给用于访
问该设备的”艺名”。 在一个 Cluster 集群中, 同一个 Disk 可能在不同的节点上显示不同的 Device Name
设备名,例如在 Node1 上的 /dev/sdc ,对应于 Node2 上的/dev/sdd。 ASM Disk 必须在所有使用该 Disk
Group 的实例上可用直接磁盘 I/O 访问。
实际上对于 RDBMS Oracle 而言访问 ASM disk 和访问普通的文件并没有什么不同,除非使用了
ASMLIB(ASMLIB 不是 ASM 必须的,再次强调!)。常规情况下 ASM Disk 是 OS 上可见的 LUN 的
partition,该分区覆盖了所有不被操作系统所保留的磁盘的空间。 大多数操作系统需要保留 LUN 的第一
个 block 作为分区表(partition table); 由于 ASM 总是会写 ASM Disk 的第一个块,所以要保证 ASM 不会
去覆盖前几个 block 上的分区表(partition table),例如在 Solaris 上分区时不要把前几个柱面划给
partition。LUN 可以是简单的物理 JBOD,或者是由高级存储阵列管理的虚拟 LUN。既可以是直连的设备
也可以是 SAN。ASM Disk 可以是任何被开发系统调用所访问的东西,除了本地文件系统。 甚至于 NFS
上的文件都可以被当做一个 ASM Disk 来用,这样便于喜欢 NAS 的用户使用 ASM,当然比起 NFS 来我
更建议干脆用 ISCSI。
7. 注意虽然可以使用普通 logical Volume Manager LVM 管理的 logical volume 作为 ASM Disk,但是这并不
是推荐组合,除非你想不到其他更好的办法。 即便你一定要这样用,但是注意也不要在 LVM 级别做镜像
和条带化。
ASM 将任何文件以 AU 大小均匀分布在 Disk Group 的所有 Disk 上。每一个 ASM Disk 均被维护以保持同
样的使用比率。这保证同一个 Disk Group 中的所有 Disk 的 IO 负载基本一致。由于 ASM 在一个 Disk
Group 中的磁盘上的负载均衡,所以为同一个物理磁盘的不同区域划分为 2 个 ASM Disk 不会对性能有所
影响;而同一个物理磁盘上划分 2 个不同分区置于不同的 2 个 Disk Group 则有效。
当 ASM Disk Group 启用冗余时单个 ASM Disk 仅是一个失败单元。对于该 ASM Disk 的写失败在 10g 会
自动从该 Disk Group drop 掉该 Disk,前提是该 Disk 的丢失被容许。
Allocation Unit
每一个 ASM Disk 都被划分为许多个 AU allocation units(单个 AU 的大小在 1MB ~64MB,注意总是 2 的
次方 MB)。而且 AU allocation unit 也是 Disk Group 的基本分配单元。一个 ASM Disk 上的可用空间总是
整数倍个 AU。在每一个 ASM Disk 的头部均有一个表,该表的每一条记录代表该 ASM Disk 上的一个
AU。文件的 extent 指针(pointer)给出了 ASM Disk Number 磁盘号和 AU 号,这就描述了该 extent 的物理
位置。由于所有的空间操作都以 AU 为单位,所以不存在所谓 ASM 碎片这样的概念和问题。
一个 AU(1M~64M)足够小,以便一个文件总是要包含很多个 AU,这样就可以分布在很多磁盘上,也不会
造成热点。一个 AU 又足够大以便能够在一个 IO 操作中访问它,以获得更加的吞吐量,也能提供高效的
顺序访问。访问一个 AU 的时间将更多的消耗在磁盘传输速率上而非花在寻找 AU 头上。对于 Disk Group
的重新平衡也是对每一个 AU 逐次做的。
了解 ASM 后台进程的作用:
GMON: ASM Diskgroup 监控进程
ASMB: ASM 后台网络进程
RBAL: ASM reblance master process 重新平衡主进程
ARBx: reblance slave process 实际实施 reblance 的后台进程
MARK: AU resync AU 重新同步的指挥家进程
了解 ASM 前台进程的作用:
ASM 的 client(主要是 RDBMS DB 和 CRSD))在连接 ASM 实例时会产生前台进程,前天进程的名字一般
为 oracle+ASM_<process>_<product> (例如: oracle+ASM_DBW0_DB1)。
OCR 特有的前台进程 foreground: oracle+ASM1_ocr
8. ASM 相关的 V$和 X$视图
视图名 X$基表名 描述
V$ASM_DISKGROUP X$KFGRP 实施磁盘发现 disk discovery 和列出磁
V$ASM_DISKGROUP_STAT X$KFGRP_STAT 显示 disk group 状态
实施磁盘发现 disk discovery 和列出磁
V$ASM_DISK X$KFDSK, X$KFKID
些磁盘的使用度量信息
V$ASM_DISK_STAT X$KFDSK_STAT,X$KFKID 列出磁盘和其使用度量信息
V$ASM_FILE X$KFFIL 列出 ASM 文件也包括了元数据信息
V$ASM_ALIAS X$KFALS 列出了 ASM 的别名,文件和目录
V$ASM_TEMPLATE X$KFTMTA 列出可用的模板和其属性
V$ASM_CLIENT X$KFNCL 列出链接到 ASM 的 DB 实例
V$ASM_OPERATION X$KFGMG 列出 rebalancing 重平衡操作
N/A X$KFKLIB 可用的 ASMLIB 路径
N/A X$KFDPARTNER 列出 Disk-partners 关系
N/A X$KFFXP 所有 ASM 文件的 extent map
N/A X$KFDAT 所有 ASM Disk 的 extent 列表
N/A X$KFBH 描述 ASM cache
N/A X$KFCCE ASM block 的链表
V$ASM_ATTRIBUTE(new in 11g) X$KFENV(new in 11g) Asm 属性,该 X$基表还显示一些隐
V$ASM_DISK_IOSTAT(new in
X$KFNSDSKIOST(new in 11g) I/O 统计信息
11g)
N/A X$KFDFS(new in 11g)
N/A X$KFDDD(new in 11g)
N/A X$KFGBRB(new in 11g)
N/A X$KFMDGRP(new in 11g)
N/A X$KFCLLE(new in 11g)
N/A X$KFVOL(new in 11g)
N/A X$KFVOLSTAT(new in 11g)
N/A X$KFVOFS(new in 11g)
N/A X$KFVOFSV(new in 11g)
9. X$KFFXP 包含了文件、extent 和 AU 之间的映射关系。 从该 X$视图可以追踪给定文件的 extent 的条带
化和镜像情况。注意对于 primary au 和 mirror au 读操作的负载是均衡的, 而写操作要求同时写 2 者到磁
盘。以下是 X$KFFXP 视图列的含义
X$KFFXP Column Name Description
ADDR x$ table address/identifier
INDX row unique identifier
INST_ID instance number (RAC)
NUMBER_KFFXP ASM file number. Join with v$asm_file and v$asm_alias
COMPOUND_KFFXP File identifier. Join with compound_index in v$asm_file
INCARN_KFFXP File incarnation id. Join with incarnation in v$asm_file
PXN_KFFXP Progressive file extent number
XNUM_KFFXP ASM file extent number (mirrored extent pairs have the same extent value)
GROUP_KFFXP ASM disk group number. Join with v$asm_disk and v$asm_diskgroup
DISK_KFFXP Disk number where the extent is allocated. Join with v$asm_disk
Relative position of the allocation unit from the beginning of the disk. The
AU_KFFXP allocation unit size
(1 MB) in v$asm_diskgroup
0->primary extent, ->mirror extent, 2->2nd mirror copy (high redundancy and
LXN_KFFXP
metadata)
FLAGS_KFFXP N.K.
CHK_KFFXP N.K.
X$KFDAT 该 X$视图包含了所有 allocation unit AU 的细节,不管是 FREE 的还是 USED。
X$KFDAT Column Name Description
ADDR x$ table address/identifier
INDX row unique identifier
INST_ID instance number (RAC)
10. GROUP_KFDAT diskgroup number, join with v$asm_diskgroup
NUMBER_KFDAT disk number, join with v$asm_disk
COMPOUND_KFDAT disk compund_index, join with v$asm_disk
Disk allocation unit (relative position from the beginning of the disk), join with
AUNUM_KFDAT
x$kffxp.au_kffxp
V_KFDAT V=this Allocation Unit is used; F=AU is free
FNUM_KFDAT file number, join with v$asm_file
I_KFDAT N/K
XNUM_KFDAT Progressive file extent number join with x$kffxp.pxn_kffxp
RAW_KFDAT raw format encoding of the disk,and file extent information
X$KFDPARTNER 这个 X$视图包含了 disk-partner(1-N)的映射关系,在一个给定 ASM Diskgroup,若 2
个 Disk 存有同一个 extent 的镜像拷贝,则将 2 个 disk 视作 partners。因此 partners 必须属于同一个
diskgroup 下的不同的 failgroup。
X$KFDPARTNER Column
Description
Name
ADDR x$ table address/identifier
INDX row unique identifier
INST_ID instance number (RAC)
GRP diskgroup number, join with v$asm_diskgroup
DISK disk number, join with v$asm_disk
COMPOUND disk identifier. Join with compound_index in v$asm_disk
NUMBER_KFDPARTNER partner disk number, i.e. disk-to-partner (1-N) relationship
MIRROR_KFDPARNER if=1 in a healthy normal redundancy config
PARITY_KFDPARNER if=1 in a healthy normal redundancy config
ACTIVE_KFDPARNER if=1 in a healthy normal redundancy config
研究 ASM 必要的技巧
1)找出 ASM 的镜像 mirror extent,在例子中是 ASM 的 spfile
11. [grid@localhost ~]$ sqlplus / as sysasm
SQL*Plus: Release 11.2.0.3.0 Production on Wed Feb 13 11:13:39 2013
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Automatic Storage Management option
INSTANCE_NAME
----------------
+ASM
SQL>
SQL> show parameter spfile
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +SYSTEMDG/asm/asmparameterfile
/registry.253.805993079
select GROUP_KFFXP, DISK_KFFXP, AU_KFFXP
from x$kffxp
where number_kffxp =
(select file_number
from v$asm_alias
where name = 'REGISTRY.253.805993079');
GROUP_KFFXP DISK_KFFXP AU_KFFXP
----------- ---------- ----------
3 2 38
3 1 39
3 0 44
12. 也可以这样定位
select GROUP_KFDAT, NUMBER_KFDAT, AUNUM_KFDAT
from x$kfdat
where fnum_kfdat = (select file_number
from v$asm_alias
where name = 'REGISTRY.253.805993079')
GROUP_KFDAT NUMBER_KFDAT AUNUM_KFDAT
----------- ------------ -----------
3 0 44
3 1 39
3 2 38
==> 找到该 DISK 对应的路径
SQL> select path,DISK_NUMBER from v$asm_disk where GROUP_NUMBER=3 and disk_number
in (0,1,2);
PATH DISK_NUMBER
-------------------- -----------
/dev/asm-diski 2
/dev/asm-diskh 1
/dev/asm-diskg 0
SQL> create pfile='/home/grid/pfile' from spfile;
File created.
SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.3.0
- 64bit Production
With the Automatic Storage Management option
[grid@localhost ~]$ cat pfile
+ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount
*.asm_diskstring='/dev/asm*'
13. *.asm_power_limit=1
*.diagnostic_dest='/g01/app/grid'
*.instance_type='asm'
*.large_pool_size=12M
*.local_listener='LISTENER_+ASM'
*.remote_login_passwordfile='EXCLUSIVE'
通过 dd 读取该 AU
[grid@localhost ~]$ dd if=/dev/asm-diski of=/tmp/spfile.dmp skip=38 bs=1024k
count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.00328614 seconds, 319 MB/s
[grid@localhost ~]$ strings /tmp/spfile.dmp
+ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount
*.asm_diskstring='/dev/asm*'
*.asm_power_limit=1
*.diagnostic_dest='/g01/app/grid'
*.instance_type='asm'
*.large_pool_size=12M
*.local_listener='LISTENER_+ASM'
*.remote_login_passwordfile='EXCLUSIVE'
[grid@localhost ~]$ dd if=/dev/asm-diskh of=/tmp/spfile1.dmp skip=39 bs=1024k
count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0325114 seconds, 32.3 MB/s
[grid@localhost ~]$ strings /tmp/spfile1.dmp
+ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount
*.asm_diskstring='/dev/asm*'
*.asm_power_limit=1
*.diagnostic_dest='/g01/app/grid'
14. *.instance_type='asm'
*.large_pool_size=12M
*.local_listener='LISTENER_+ASM'
*.remote_login_passwordfile='EXCLUSIVE'
[grid@localhost ~]$ dd if=/dev/asm-diskg of=/tmp/spfile2.dmp skip=44 bs=1024k
count=1
1+0 records in
1+0 records out
1048576 bytes (1.0 MB) copied, 0.0298287 seconds, 35.2 MB/s
[grid@localhost ~]$ strings /tmp/spfile2.dmp
+ASM.asm_diskgroups='EXTDG','NORDG'#Manual Mount
*.asm_diskstring='/dev/asm*'
*.asm_power_limit=1
*.diagnostic_dest='/g01/app/grid'
*.instance_type='asm'
*.large_pool_size=12M
*.local_listener='LISTENER_+ASM'
*.remote_login_passwordfile='EXCLUSIVE'
2) 显示 asm disk failure group 和 disk partners 的映射关系:
1* select DISK_NUMBER,FAILGROUP,path from v$asm_disk where group_number=3
SQL> /
DISK_NUMBER FAILGROUP PATH
----------- ------------------------------ --------------------
3 SYSTEMDG_0003 /dev/asm-diskj
2 SYSTEMDG_0002 /dev/asm-diski
1 SYSTEMDG_0001 /dev/asm-diskh
0 SYSTEMDG_0000 /dev/asm-diskg
SQL> select disk,NUMBER_KFDPARTNER,DISKFGNUM from X$KFDPARTNER where grp=3;