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”

目录
相关文章
|
5天前
|
Oracle 关系型数据库
oracle asm 磁盘显示offline
oracle asm 磁盘显示offline
55 2
|
5天前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作
94 0
|
5天前
|
存储 Oracle 关系型数据库
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
oracle数据库ASM磁盘组掉线,ASM实例不能挂载。数据库管理员尝试修复数据库,但是没有成功。
【数据库数据恢复】Oracle数据库ASM磁盘组掉线的数据恢复案例
|
6月前
Oracle-高级子查询
Oracle-高级子查询
27 0
|
6月前
|
Oracle 关系型数据库
Oracle 中data与timstamp互转
Oracle 中data与timstamp互转
|
8月前
|
存储 Oracle Java
[亲测可用]hibernate调用Oracle存储过程|Spring Data JPA调用Oracle存储过程方法
[亲测可用]hibernate调用Oracle存储过程|Spring Data JPA调用Oracle存储过程方法
|
12月前
|
SQL XML Oracle
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作(下)
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作(下)
|
12月前
|
SQL XML Oracle
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作(中)
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作(中)
|
12月前
|
SQL Oracle 关系型数据库
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作(上)
整合Mybatis-Plus高级,Oracle 主键Sequence,Sql 注入器实现自定义全局操作(上)
|
存储 运维 Oracle
【大数据开发运维解决方案】Oracle Data Redaction数据加密测试
最近有个做Java开发的网友问我,怎么在Oracle进行数据加密呢?我给他推荐了Data Redaction。Oracle Database 12c中加入了Data Redaction这个新的安全特性。当然在11g的Database Advanced Security Administrator’s Guide官方文档中就介绍了。
【大数据开发运维解决方案】Oracle Data Redaction数据加密测试