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

原作者:Bane Radulovic

译者: 邱大龙

审核: 魏兴华

DBGeeK社群联合出品

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

关于译者

邱大龙,沃趣科技数据库技术专家,主要参与公司产品实施、测试、维护以及优化。对SQL优化、数据迁移、备份容灾等有深入的研究,对大数据量数据迁移、故障恢复、高并发下数据库性能调优有丰富的经验。

原文发布于微信公众号 - 沃趣科技(woqutech)

原文发表时间:2016-08-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Netkiller

数据库进程间通信解决方案

数据库进程间通信解决方案 数据库与其他第三方应用程序进程间通信解决方案 摘要 你是否想过当数据库中的数据发生变化的时候出发某种操作?但因数据无法与其他进程通信(...

40060
来自专栏恒恒的专栏

swoole+php搭建高性能脚本服务

后台服务的业务逻辑中,或多或少需要一些异步去处理的脚本逻辑,例如业务的统计、上报、数据运算,定时监控等等。实现的方法也有很多,用linux自带的c...

32110
来自专栏杨建荣的学习笔记

并行查询缓慢的问题分析(r5笔记第86天)

今天,数据迁移组的同事问我一个问题,说他们现在需要在迁移库中查看一些数据,但是查看的时候速度很慢,想让我们看看是不是数据库端出了什么问题。因为数据迁移的一些准备...

28960
来自专栏idba

漫谈死锁

一 前言 死锁是每个MySQL DBA 都会遇到的技术问题,本文是自己针对死锁学习的一个总结,了解死锁是什么,MySQL如何检测死锁,处理死锁,死锁的案例,...

18040
来自专栏Java架构师历程

MySQL的三大引擎

InnoDB和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定。基本 的差别为:

2K20
来自专栏杂烩

mycat安装使用 原

    github地址:https://github.com/MyCATApache/Mycat-Server/wiki

15820
来自专栏Java进阶架构师

「mysql优化专题」单表查询优化的一些小总结,非索引设计(3)

(0)可以先使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮我们分析是查询语句或是表结构的性能瓶颈。

7520
来自专栏工科狗和生物喵

【计算机本科补全计划】Mysql 学习小计(3)

正文之前 想到自己每天中午还要玩一小时手机,就自责不已,今天看成甲的好好学习一书,颇有收获,晚上写给大伙看,现在还是谢谢 Mysql,到了后面感觉越来越难了呢!...

29640
来自专栏吴伟祥

mysql水平拆分与垂直拆分的详细介绍 原

垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表 通常我们按以下原则进行垂直拆分:

18430
来自专栏思考的代码世界

Python网络数据采集之存储数据|第04天

14740

扫码关注云+社区

领取腾讯云代金券