如何在asm上定位数据块
转自 https://blogs.oracle.com/database4cn/%e5%a6%82%e4%bd%95%e5%9c%a8asm%e4%b8%8a%e5%ae%9a%e4%bd%8d%e6%95%b0%e6%8d%ae%e5%9d%97
我们都知道当db使用传统的文件系统时,定位block是就是通过dba_extents 中的blockid即可,然后通过bbed或dd 直接操作对应数据文件的相应block即可,从10g开始,oracle使用ASM来管理磁盘,因为所有数据文件都在ASM上,所以传统的bbed,dd都不能直接访问新型"文件系统"上的某个数据文件了。
当我们需要在特殊场景下修改某个block的内存的时候该怎么办呢?下面给您演示一下:
首先我在这里先普及一下ASM的一点基础知识,需要知道的是ASM在磁盘上存储数据,分配的时候都是AU(allocation unit)为单位的,默认情况AU是1M,所以一个2G的数据文件需要至少分配2×1024=2048个AU,当然存储这些AU的相关信息(如编号)也是需要存储空间的,这种元数据也是需要占用AU的,所以实际上从ASM层面来看分配给某个数据文件的au数量要高于它的需求数量。对于ASM来讲,数据库的所有文件,如控制文件,spfile,数据文件都是作为一种叫文件目录(file directory)类型的数据进行管理的。每一条这种类型的数据就是一个ASM管理的文件,其中ASM为了管理方便会给每个文件目录分配一个唯一的编号,并且会在第一个文件目录的AU里面为其分配一个4k的block来存放它分配的AU情况。而这个block编号就是分配给文件目录的编号。因为au默认是1M,所以一个au能分配出来256个block,也就是文件目录编号前255(oracle 里面编号都是从0开始的)都在第一个AU里面,大于255小于512的都在第一个文件目录第二个au里面某个4kblock里面,那么如何知道某个数据文件的编号呢,实际上oracle在创建文件的时候就已经告诉我们了。例如我们在往users表空间添加数据文件名为user2.dbf的文件后,oracle在ASM上创建数据文件的名字类似如下:
user2.dbf => +DATA/R11204/DATAFILE/USERS.328.944473935
其中328就是表明这个数据文件的ASM 文件目录的编号。所以我们就通过它来入手。
介绍完如上的知识,我们看看如何定位一个数据文件的某个block:
首先创建一个表,为了好验证,我插入的数据都是a,
create table test_t ( a number, b varchar2(100));
insert into test_t values(1,'abcdefg');
insert into test_t select * from test_t;
insert into test_t select * from test_t;
insert into test_t select * from test_t;
commit;
查询这个表的block情况
select * from dba_extents where segment_name='TEST_T'; OWNER SEGMENT_NAME SEGMENT_TYPE TABLESPACE_NAME EXTENT_ID FILE_ID BLOCK_ID BYTES BLOCKS RELATIVE_FNO
------- --------------- -------------- ---------------- ---------- --------- --------- ------ ------- ------------
MAOB TEST_T TABLE USERS 0 4 168 65536 8 4 select file_id,file_name from dba_data_files; FILE_ID FILE_NAME
------- ------------------------------------------
4 +DATA/r11204/datafile/users.300.908780493 <<file_number=300
我们可以看到这个表在 file_id=4 的数据文件里只分配了一个 8个block 的extent,第一个 blockid 是168,根据oracle ASSM表空间的存储相关的知识,extent0 的前三个block分别是L1,L2,L3的metadata,所以第一个data block是171,那么我们就找blockid=171这个block的ASM上存储位置:
首先我们根据file_id=4 blockid=171信息计算出这个数据文件在文件目录里面AU信息和block信息
AU信息:因为oracle数据块默认是8k的,所以171个block会占用多少个1M的au呢?
select 171*8/1024 from dual
1.3359375
是1.3个Au,所以这个171的block一定放在第二个au里面的某个block上
au里的block信息:
select (171*8-1*1024)/8 from dual
43
这个blockid=171的block放在第二个au里面的第43个block位置,然后我们就需要找到这个数据文件的第二个au相对于磁盘的位置,根据之前介绍的知识,
我们用kfed来读取磁盘头信息:我们要得到第一个文件目录的au信息
[grid@rac1 disks]$ kfed read /dev/oracleasm/disks/VOL1 |grep f1b1
kfdhdb.f1b1locn: 10 ; 0x0d4: 0x0000000a file1的第一个au
磁盘头里面的f1b1locn存放 就是目录文件1的第一个au,之前介绍了,第一个au里面只能存放文件编号小于256的文件目录,我们的数据文件4的名字是 users.300.908780493,所以这个文件编号是300-256=44,也就是说会放在au=2的第44个block里面
查看文件目录1里面的au分配信息
[oracle@rac1 ~]$ kfed read /dev/oracleasm/disks/VOL1 aun=10 blkn=1 |grep au
kfffde[0].xptr.au: 10 ; 0x4a0: 0x0000000a
kfffde[1].xptr.au: 61 ; 0x4a8: 0x0000003d <<第二个au的编号
kfffde[2].xptr.au: 4294967295 ; 0x4b0: 0xffffffff
查看文件目录44的au分配信息
[grid@rac1 ~]$ kfed read /dev/oracleasm/disks/VOL1 aun=61 blkn=44 | grep au
kfffde[0].xptr.au: 9931 ; 0x4a0: 0x000026cb
kfffde[1].xptr.au: 9932 ; 0x4a8: 0x000026cc <<file 300的第二个au编号
kfffde[2].xptr.au: 9933 ; 0x4b0: 0x000026cd
kfffde[3].xptr.au: 9934 ; 0x4b8: 0x000026ce
得到file 300的第二个au编号之后,我们就可以直接copy他的信息进行验证
dd if=/dev/oracleasm/disks/VOL1 skip=9932 of=/tmp/users.300 bs=1024k count=1 BBED> set blocksize 8192
BBED> set block 0
BBED-00309: out of range block number (0) 说明blockid是从1开始的,那么block43对应44
BBED> set block 44
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x010000ab <<file4 block 171
ub4 bas_kcbh @8 0x0080737b
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x04 (KCBHFCKV)
ub2 chkval_kcbh @16 0xffc6
ub2 spare3_kcbh @18 0x0000 BBED> set offset 8100
OFFSET 8100
BBED> dump /v
File: users.300 (1)
Block: 44 Offsets: 8100 to 8191 Dba:0x0040002C
-------------------------------------------------------
64656667 2c010202 c1020761 62636465 l defg,......abcde
66672c01 0202c102 07616263 64656667 l fg,......abcdefg
2c010202 c1020761 62636465 66672c01 l ,......abcdefg,.
0202c102 07616263 64656667 2c010202 l .....abcdefg,...
c1020761 62636465 66672c01 0202c102 l ...abcdefg,.....
其中在定位文件目录300的au编号的时候也可以通过如下简单办法:
select disk_kffxp, AU_kffxp, xnum_kffxp from x$kffxp
where group_kffxp=1
and number_kffxp=300 ;
DISK_KFFXP AU_KFFXP XNUM_KFFXP
---------- ---------- ----------
0 9931 0
0 9932 1
如何在asm上定位数据块的更多相关文章
- hdfs 如何实现退役节点快速下线(也就是退役节点上的数据块快速迁移)speed up decommission blocks removal
以下是选择复制源节点的代码 代码总结: A=datanode上要复制block的Queue size与 target datanode没被选出之前待处理复制工作数之和. 1. 优先选择退役中的节点,因 ...
- 分布式文件系统 之 数据块(Block)
众所周知,HDFS中以数据块(block)为单位进行存储管理.本文简单介绍一下HDFS中数据块(block)的概念,以及众多分布式存储系统(不止是HDFS)使用block作为存储管理基本单位的意义. ...
- HDFS中的数据块(Block)
我们在分布式存储原理总结中了解了分布式存储的三大特点: 数据分块,分布式的存储在多台机器上 数据块冗余存储在多台机器以提高数据块的高可用性 遵从主/从(master/slave)结构的分布式存储集群 ...
- Hadoop hbase集群断电数据块被破坏无法启动
集群机器意外断电重启,导致hbase 无法正常启动,抛出reflect invocation异常,可能是正在执行的插入或合并等操作进行到一半时中断,导致部分数据文件不完整格式不正确或在hdfs上blo ...
- Hadoop源码分析之数据节点的握手,注册,上报数据块和心跳
转自:http://www.it165.net/admin/html/201402/2382.html 在上一篇文章Hadoop源码分析之DataNode的启动与停止中分析了DataNode节点的启动 ...
- HDFS各个进程存储在磁盘上的数据含义和注意事项
本文地址:http://www.cnblogs.com/qiaoyihang/p/6293402.html (一)Namenode的目录结构 HDFS进行初次格式化之后将会在$dfs.namenode ...
- HDFS源码分析数据块复制选取复制源节点
数据块的复制当然需要一个源数据节点,从其上拷贝数据块至目标数据节点.那么数据块复制是如何选取复制源节点的呢?本文我们将针对这一问题进行研究. 在BlockManager中,chooseSourceDa ...
- HDFS源码分析数据块汇报之损坏数据块检测checkReplicaCorrupt()
无论是第一次,还是之后的每次数据块汇报,名字名字节点都会对汇报上来的数据块进行检测,看看其是否为损坏的数据块.那么,损坏数据块是如何被检测的呢?本文,我们将研究下损坏数据块检测的checkReplic ...
- HDFS源码分析之数据块及副本状态BlockUCState、ReplicaState
关于数据块.副本的介绍,请参考文章<HDFS源码分析之数据块Block.副本Replica>. 一.数据块状态BlockUCState 数据块状态用枚举类BlockUCState来表示,代 ...
随机推荐
- 🔥🔥🔥Spring Cloud进阶篇之Eureka原理分析
前言 之前写了几篇Spring Cloud的小白教程,相信看过的朋友对Spring Cloud中的一些应用有了简单的了解,写小白篇的目的就是为初学者建立一个基本概念,让初学者在学习的道路上建立一定的基 ...
- 从RTL视图到Verilog语言-转可乐豆原创
从RTL视图到Verilog语言 曾经听过某位大牛都说:“当你的学习FPGA到一个境界的时候,你看到的硬件描述语言,将不再是单纯的语言,而是由一个个逻辑门组成的电路图,一旦达到这个境界,方能把代码写到 ...
- 基于Pact的契约测试
背景 如今,契约测试已经逐渐成为测试圈中一个炙手可热的话题,特别是在微服务大行其道的行业背景下,越来越多的团队开始关注服务之间的契约及其契约测试. 什么是契约测试 关于什么是契约测试这个问题, ...
- 布隆过滤器的demo
/** * 缓存击穿 * @author * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = ...
- 8种经常被忽视的SQL错误用法,你有没有踩过坑?
1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引 ...
- windows10查看电脑已经保存的wifi密码
1,打开windows的命令窗口,输入 netsh wlan show profiles,如下图,这个命令仅仅只是查看一下电脑保存的所有的wifi名字 2,需要查看密码的话,则需要输入这个命令, ...
- 记一次 Kafka 集群线上扩容
前段时间收到某个 Kafka 集群的生产客户端反馈发送消息耗时很高,于是花了一段时间去排查这个问题,最后该集群进行扩容,由于某些主题的当前数据量实在太大,在对这些主题迁移过程中话费了很长一段时间,不过 ...
- Django聚合查询 orm字段及属性
目录 一 聚合查询 1. 级联 级联删除 级联更新 2. 聚合函数 使用 aggregate 使用场景 3. 分组查询 语法 使用 annotate 代码 4. F与Q查询 F查询 Q查询 二 ORM ...
- 《Java基础知识》Java数据类型以及变量的定义
Java 是一种强类型的语言,声明变量时必须指明数据类型.变量(variable)的值占据一定的内存空间.不同类型的变量占据不同的大小. Java中共有8种基本数据类型,包括4 种整型.2 种浮点型. ...
- Linux下修改MySQL数据库数据文件路径
使用rpm安装方式安装完MySQL数据库后,数据文件的默认路径为/var/lib/mysql,然而根目录并不适合用于存储数据文件. 原路径:/var/lib/mysql 目标路径:/home/mysq ...