The views expressed on this blog are my own and do not necessarily reflect the views of Oracle

April 25, 2010

About ASM Allocation Units, Extents, Mirroring and Failgroups



ASM Allocation Units

An ASM allocation unit (AU) is the fundamental space unit within an ASM disk group. Every ASM disk is divided into allocation units.

When a disk group is created, the allocation unit size can be set with the  disk group attribute AU_SIZE (in ASM versions 11.1 and later). The AU size can be 1, 2, 4, 8, 16, 32 or 64 MB. If not explicitly set, the AU size defaults to 1 MB (4MB in Exadata).

AU size is a disk group attribute, so each disk group can have a different AU size.

ASM Extents

An ASM extent consists of one or more allocation units. An ASM file consists of one or more ASM extents.

We distinguish between physical and virtual extents. A virtual extent, or an extent set, consists of one physical extent in an external redundancy disk group, at least two physical extents in a normal redundancy disk group and at least three physical extents in a high redundancy disk group.

Before ASM version 11.1 we had uniform extent size. ASM version 11.1 introduced the variable sized extents that enable support for larger data files, reduce (ASM and database) SGA memory requirements for very large databases, and improve performance for file create and open operations. The initial extent size equals the disk group AU_SIZE and it increases by a factor of 4 or 16 at predefined thresholds. This feature is automatic for newly created and resized data files with disk group compatibility attributes COMPATIBLE.ASM and COMPATIBLE.RDBMS set to 11.1 or higher.

The extent size of a file varies as follows:

  • Extent size always equals the disk group AU_SIZE for the first 20,000 extent sets
  • Extent size equals 4*AU_SIZE for the next 20,000 extent sets
  • Extent size equals 16*AU_SIZE for the next 20,000 and higher extent sets

There is nasty bug 8898852 to do with this feature. See more on that in MOS Doc ID 965751.1.

ASM Mirroring

ASM mirroring protects data integrity by storing multiple copies of the same data on different disks. When a disk group is created, ASM administrator can specify the disk group redundancy as follows:

  • External – no ASM mirroring
  • Normal – 2-way mirroring
  • High – 3-way mirroring

ASM mirrors extents – it does not mirror disks or blocks. ASM file mirroring is the result of mirroring of the extents that constitute the file. In ASM we can specify the redundancy level per file. For example, one file in a normal redundancy disk group, can have its extents mirrored once (default behavior). Another file, in the same disk group, can be triple mirrored – provided there are at least three failgroups in the disk group.  In fact all ASM metadata files are triple mirrored in a normal redundancy disk group – provided there are at least three failgroups.

ASM Failgroups

ASM disks within a disk group are partitioned into failgroups (also referred to as failure groups or fail groups). The failgroups are defined at the time the disk group is created.  If we omit the failgroup specification, then ASM automatically places each disk into its own failgroup. The only exception is Exadata, where all disks from the same storage cell are automatically placed in the same failgroup.

Normal redundancy disk groups require at least two failgroups. High redundancy disk groups require at least three failgroups. Disk groups with external redundancy do not have failgroups.

When an extent is allocated for a mirrored file, ASM allocates a primary copy and a mirror copy. Primary copy is store on one disk and the mirror copy on some other disk in a different failgroup.

When adding disks to an ASM disk group for which failgroups are manually specified, it is imperative to add the disks to the correct failgroup.

5 comments:

  1. Bane Radulović

    Thanks for your nice post

    I am clear enough about relationship between asm allocation unit and asm extent after reading this post. but plz can you go further i need the know the relationship between traditional oracle datablock, extents and asm allocation units and asm extents

    ReplyDelete
    Replies
    1. Thanks Sadock,

      This question comes up every now and then, so I should write a separate post on that. Short answer to your question is as follows.

      To find out where a particular oracle data block is, you first use something like DBMS_ROWID.ROWID_BLOCK_NUMBER to locate the block within a data file. Say you do that and determine your data is in block 10 (of a particular file).

      An oracle datafile will have a structure like this:

      |File header||--||--||...||---||...
      B0 B1 B2 B10

      You then query X$KFFXP (in ASM) to find the allocation units for that file. How many data blocks fit in one allocation unit will depend on data block size and AU size. As our data is in block 10, it will always be in the first AU for that data file. Say the first AU for that file as AU 100 (of a particular disk).

      An ASM disk will have a structure like this:

      |Disk header||---||---||...||-----||...
      AU0 AU1 AU2 AU100
      / \
      / \
      / \
      / \
      |--||...||---||...
      B0 B10

      So our data block is 10 blocks into AU100.

      As I said, I will write a detailed post on this with an actual examples and queries.

      Cheers,
      Bane

      Delete
    2. Bane

      Once again thanks for your fast response.

      I wish i could be the first one to read the post you have to write on this frequently asked question. However the explanations you have given also very helpful, at large i have idea now. I am putting this blog in my favorite list

      Regards

      Sadock

      Delete
    3. No worries,
      This is yet another incentive to write it.
      Cheers,
      Bane

      Delete
    4. Check this out: http://asmsupportguy.blogspot.com.au/2012/10/where-is-my-data.html

      Delete