zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

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

Oracle 系列 is 知识 my 高级 Data 翻译
2023-09-11 14:16:10 时间
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冗余模式下,将会有多副本数据。但是定位数据块的方法是相同的。


本文来自云栖社区合作伙伴“DBGEEK”