Oracle ASM 翻译系列第二十六弹:ASM 高级知识 Where is my data

Where is my data

有时候我们想要知道一个特定的database block位于ASM的哪个磁盘,磁盘的哪个AU以及AU的哪一个块。本篇文章将向大家展示如何解决这个问题。

Database Instance

首先在数据库里创建测试表空间:

SQL> create tablespace T1 datafile '+DATA';

Tablespace created.

SQL> select f.FILE#, f.NAME "File", t.NAME "Tablespace"

from V$DATAFILE f, V$TABLESPACE t

where t.NAME='T1' and f.TS# = t.TS#;

FILE# File                               Tablespace

----- ---------------------------------- ----------

   6  +DATA/br/datafile/t1.272.797809075 T1

SQL>

注意到ASM file number是272。

现在创建一张测试表并插入数据:

SQL> create table TAB1 (n number, name varchar2(16))

tablespace T1;

Table created.

SQL> insert into TAB1 values (1, 'CAT');

1 row created.

SQL> commit;

Commit complete.

查询块号:

SQL> select ROWID, NAME from TAB1;

ROWID NAME

------------------ ----

AAASxxAAGAAAACHAAA CAT

SQL> select

DBMS_ROWID.ROWID_BLOCK_NUMBER('AAASxxAAGAAAACHAAA')

"Block number" from DUAL;

Block number

------------

135

查询数据文件的块大小:

SQL> select BLOCK_SIZE from V$DATAFILE where FILE#=6;

BLOCK_SIZE

----------

8192

可以看到插入的数据位于135号块,数据文件块大小为8K。

ASM Instance

连接ASM实例,查询272号文件的区分布:

SQL> select GROUP_NUMBER from V$ASM_DISKGROUP where NAME='DATA';

GROUP_NUMBER

------------

           1

SQL> select PXN_KFFXP, -- physical extent number

XNUM_KFFXP,            -- virtual extent number

DISK_KFFXP,            -- disk number

AU_KFFXP               -- allocation unit number

from X$KFFXP

where NUMBER_KFFXP=272 -- ASM file 272

AND GROUP_KFFXP=1      -- group number 1

order by 1;

PXN_KFFXP  XNUM_KFFXP DISK_KFFXP   AU_KFFXP

---------- ---------- ---------- ----------

         0          0          0       1175

         1          0          3       1170

         2          1          3       1175

         3          1          2       1179

         4          2          1       1175

...

SQL>

可以看到文件的区分布在所有磁盘,由于数据文件为Normal冗余,每个区都是两副本。注意我说的是数据文件为Normal冗余。默认情况下,文件会继承磁盘组的冗余策略。控制文件是个例外:即使在Normal冗余的磁盘组,如果磁盘组包含至少3个failgroup,控制文件也会被创建为high冗余。

查询磁盘组的AU大小:

SQL> select VALUE from V$ASM_ATTRIBUTE where

NAME='au_size' and GROUP_NUMBER=1;

VALUE

-------

1048576

AU大小为1MB。注意每个磁盘组可以有不同的AU大小。

Where is my block

现在已知测试数据在272号ASM file的135号块。数据块为8K的情况下,每个AU可以包含128个块。这就意味着135号块位于第二个virtual extent的第7个块。第二个virtual extent包含3号磁盘的1175号au和2号磁盘的1179号au.

查询磁盘2和3的名字:

SQL> select DISK_NUMBER, NAME

from V$ASM_DISK

where DISK_NUMBER in (2,3);

DISK_NUMBER NAME

----------- ------------------------------

         2 ASMDISK3

         3 ASMDISK4

SQL>

我使用了ASMLIB,所以在OS层面,对应的磁盘名为:

/dev/oracleasm/disks/ASMDISK3和/dev/oracleasm/disks/ASMDISK4

Show me the money

测试数据位于1175号AU的第7个块。我们首先将这个AU的数据dd出来:

$ dd if=/dev/oracleasm/disks/ASMDISK4 bs=1024k count=1 skip=1175 of=AU1175.dd

1+0 records in

1+0 records out

1048576 bytes (1.0 MB) copied, 0.057577 seconds, 18.2 MB/s

$ ls -l AU1175.dd

-rw-r--r-- 1 grid oinstall 1048576 Oct 27 22:45 AU1175.dd

$

注意几个参数的含义:

· bs=1024k -- AU的大小

· skip=1175 -- 我们需要导出的AU

· count=1 -- 只需要导出一个AU

然后将7号块的数据从AU中导出:

$ dd if=AU1175.dd bs=8k count=1 skip=7 of=block135.dd

注意bs指定为8k(数据块大小),skip指定为7(要导出的块号)。

查看数据块内容:

$ od -c block135.dd

...

0017760 \0 \0 , 001 002 002 301 002 003 C A T 001 006 332 217

0020000

$

在内容的最后可以看到插入的数据 -- CAT.注意Oracle数据块从下向上填充。如果去查看磁盘/dev/oracleasm/disks/ASMDISK3的1179号AU,结果是一样的。

Conclusion

要定位ASM中数据块的位置,需要知道数据块位于哪个数据文件。然后通过X$KFFXP视图查看数据文件的区分布。还需要数据块大小和ASM AU大小去定位数据块位于哪个AU。 以上操作和ASM或者RDBMS的版本无关。(V$ASM_ATTRIBUTE视图除外,因为在10g中没有该视图)在Normal和high冗余模式下,将会有多副本数据。但是定位数据块的方法是相同的。

时间: 2024-08-03 21:18:47

Oracle ASM 翻译系列第二十六弹:ASM 高级知识 Where is my data的相关文章

Oracle ASM 翻译系列第二十五弹:ASM 高级知识 When will my rebalance complete

When will my rebalance complete "磁盘组的rebalance什么时候能完成?",这个问题我经常被问到,但是如果你期望我给出一个具体的数值,那么你会失望,毕竟ASM本身已经给你提供了一个估算值(GV$ASM_OPERATION.EST_MINUTES),其实你想知道的是rebalance完成的精确的时间.虽然我不能给你一个精确的时间,但是我可以给你一些rebalance的操作细节,让你知道当前rebalance是否正在进行中,进行到哪个阶段,以及这个阶段是

Oracle ASM 翻译系列第二十八弹:ASM INTERNAL Partnership and Status Table

Partnership and Status Table Partnership and Status Table简称PST表包含了一个磁盘组中所有磁盘的相关信息-磁盘号,磁盘状态,partner的磁盘号,心跳信息和failgroup的信息(11G及以上版本). 每个磁盘的AU 1是为PST表预留的,但是并不是每一个磁盘都有PST表的信息. PST count 在external冗余的磁盘组中只有一份PST表. 在normal冗余的磁盘组中,至少有两份PST表.如果磁盘组中有三个或更多的fail

Oracle ASM 翻译系列第二十九弹:ASM INTERNAL Free Space Table

Free Space Table 在进行创建文件或者文件resize过程中,需要有一个快捷入口,可以迅速的知道当前磁盘有哪些可用的(free状态的)AU,ASM Free Space Table 简称FST表就是提供一个这样的功能,通过它可以快速的知道哪些allocation table(AT表)元数据块中有空闲的AU,它存储的是一个个的AT表元数据块的号码,FST表用来加速AU的分配,避免读取已经完全被占用殆尽的AT块,造成分配空间效率的低下. FST表技术上说其实是属于AT表的一部分,位于A

Oracle ASM 翻译系列第十六弹:ASM Internal ASM Active Change Directory

ASM Active Change Directory 当ASM实例要对多个元信息block进行原子修改时,ASM的active change directory 简称ACD会记录相应的日志,ACD是ASM元信息的3号文件.对应的日志记录会以单次IO的方式写入,来确保操作原子性. ACD被分成多个chunk或者thread,每个运行中的ASM实例都有它自己的42MB大小的chunk.当一个磁盘组被创建时,会分配一个独立的chunk给ACD.随着更多的实例挂载了该磁盘组,ACD的chunk数也会同

Oracle ASM 翻译系列第二十二弹:ASM Internal ASM file number 8

ASM file number 8 ASM元信息8号文件是磁盘空间使用目录Used Space Directory,简称USD,它记录了每个ASM磁盘组中每个磁盘的每个zone上被使用的AU数.一个磁盘的zone包含hot zone-热区(磁盘外圈,译者注)和cold zone-冷区(磁盘内圈,译者注).USD目录为每个磁盘提供了一个条目,条目信息记录了2个zone(COLD和HOT)的AU使用数. USD结构是在11.2版本中引入的,并且与智能数据存放特性有关.USD元数据文件在ASM兼容性参

Oracle ASM 翻译系列第二十弹:ASM Internal ASM file number 7

ASM file number 7 ASM元信息7号文件,是ASM的逻辑卷目录,用于跟踪与ADVM有关的文件. ASM动态逻辑卷设备是由ASM动态逻辑卷构建的.一个磁盘组中可以配置一个或多个ASM动态逻辑卷设备.ASM集群文件系统通过ADVM接口构建在ASM磁盘组之上.ADVM像数据库一样,也是ASM的一个客户端.当一个逻辑卷被访问时,相应的ASM文件会被打开并且ASM extent的信息会被发送到ADVM驱动. 有两种与ADVM逻辑卷相关的文件类型: · ASMVOL:逻辑卷文件,作为逻辑卷存

Oracle ASM 翻译系列第十四弹:ASM Internal Rebalancing act

在ASM中,每一个文件的extent都均匀的分布在它所在磁盘组的所有磁盘上,无论是在文件第一次创建或是文件创建之后的重新resize都是如此,这也意味着我们始终能保持磁盘组中的每一个磁盘上都有一个平衡的空间分配. Rebalance operation 虽然文件在新建或是resize过程中都能保证空间的均匀分配,但是磁盘组在某些情况下会自动触发重平衡的操作,例如添加.删除和resize磁盘的操作(这些操作显然会让磁盘组变得不再平衡),再如,移动一个文件从磁盘的hot区到cold区.我们还可以通过

Oracle ASM 翻译系列第十五弹:ASM Internal ASM File Directory

本篇主要介绍ASM的1号文件,ASM的1号文件是ASM的文件目录,它记录了磁盘组中的所有文件信息,由于在ASM中,每一个磁盘组都是独立的存储单元,所以每一个磁盘组都会有属于它自己的文件目录. 虽然这是一个内部的文件,但ASM实例会把它当做其它ASM文件一样管理,在ASM的文件目录中也会有它自己的条目(指向了它自己),在一个normal和high冗余的磁盘组中,它也会做镜像,随着新文件的产生,文件目录的大小也会相应地增长. 每一个ASM文件目录的条目都会包含如下的信息: · 文件大小 · 文件块大

Oracle ASM 翻译系列第十二弹:ASM Internal amdu - ASM Metadata Dump Utility

amdu - ASM Metadata Dump Utility ASM Metadata Dump Utility,即ASM元数据导出工具,它的简写amdu更被人所熟知,常被Oracle技术支持人员和Oracle开发人员用来诊断和解决ASM故障.它能输出ASM的元数据信息并且从ASM磁盘组中抽取元数据和数据文件. amdu工具不依赖于ASM实例或者ASM磁盘组的状态,所以它能在ASM实例关闭和磁盘组未挂载的情况下正常使用,它甚至能在ASM磁盘出现故障或者不可见的场景下使用. Use amdu