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

    xiaoxiao2024-03-23  130

    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”

    最新回复(0)