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冗余模式下,将会有多副本数据。但是定位数据块的方法是相同的。


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

目录
相关文章
|
6月前
|
Oracle 关系型数据库
oracle asm 磁盘显示offline
oracle asm 磁盘显示offline
316 2
|
18天前
|
存储 Oracle 关系型数据库
数据库数据恢复—Oracle ASM磁盘组故障数据恢复案例
Oracle数据库数据恢复环境&故障: Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 ,ASM实例不能mount。 Oracle数据库故障分析&恢复方案: 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储元数据损坏,导致磁盘组无法挂载。
|
6月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
138 0
|
6月前
|
存储 Oracle 关系型数据库
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
|
21天前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
139 64
|
11天前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
23 7
|
11天前
|
Oracle 关系型数据库 数据库
oracle数据库技巧
【10月更文挑战第25天】oracle数据库技巧
15 6
|
11天前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
15 5
|
20天前
|
监控 Oracle 关系型数据库
Oracle数据库性能优化
【10月更文挑战第16天】Oracle数据库性能优化是
21 1
|
2月前
|
Oracle 关系型数据库 数据库
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例
打开oracle数据库报错“system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。 数据库没有备份,无法通过备份去恢复数据库。用户方联系北亚企安数据恢复中心并提供Oracle_Home目录中的所有文件,急需恢复zxfg用户下的数据。 出现“system01.dbf需要更多的恢复来保持一致性”这个报错的原因可能是控制文件损坏、数据文件损坏,数据文件与控制文件的SCN不一致等。数据库恢复工程师对数据库文件进一步检测、分析后,发现sysaux01.dbf文件损坏,有坏块。 修复并启动数据库后仍然有许多查询报错,export和data pump工具使用报错。从数据库层面无法修复数据库。
数据库数据恢复—Oracle数据库文件出现坏块的数据恢复案例