Oracle ASM 翻译系列第二十六弹:ASM 高级知识 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”
相关文章
- Oracle数据库入门——初级系列教程
- Linux服务器下oracle数据库启动服务操作步骤
- Oracle VM VirtualBox 常用配置
- 关于SQL与ORACLE创建本地临时表和全局临时表的方法和区别
- Oracle数据库:创建和删除视图view,简单和复杂视图,内建视图,topN分析,oracle分页查询
- Oracle数据库:oracle函数嵌套,nvl函数,nvl2函数,nullif函数,coalesce合并函数
- Oracle数据库:oracle函数,单行函数,多行函数,upper,lower,initcap,字符串函数
- Oracle数据库:啥是oracle数据库?你为啥要学oracle?
- 关于查询工具介绍 | MySQL、Oracle、MariaDB、SQLsever、SQLite、PostgreSQL
- Oracle内核系列-揭秘ASM磁盘头信息
- Oracle ASM 翻译系列第三十弹:高级知识 Physical metadata replication
- Oracle官方并发教程之一个同步类的例子
- Oracle数据库备份恢复的概念:错误类型、实例恢复方法等
- [转]oracle学习入门系列之五内存结构、数据库结构、进程
- oracle创建表空间和用户
- oracle定时器执行一遍就不执行或本就不执行
- Oracle
- oracle union 用法
- ORACLE多表关联UPDATE 语句
- oracle函数 LENGTHC(c1).LENGTH2(c1).LENGTH4(c1)
- Oracle-oracle中union和union all的区别
- Oracle初学者入门指南-什么是 Metalink 或 MOS ?
- 【从翻译mos文章】在oracle db 11gR2版本号被启用 Oracle NUMA 支持
- Oracle实践--PL/SQL综合之分页存储过程
- Oracle 基础系列之1.2 oracle的基本使用
- MyBatis+Oracle时出现的错误: Method oracle/jdbc/driver/OracleResultSetImpl.isClosed()Z is abstract
- springboot配置druid多数据源(mysql、postgresql、oracle)