首页 > 数据库 >block中真实存储的数据oracle

block中真实存储的数据oracle

时间:2023-09-14 21:32:36浏览次数:43  
标签:存储 rowid dump 16 block dual oracle ascii select

概念描述

通常数据库的一张表会存储number、char等等类型的数据,这些数据通过select查询就能被人所识别,但是Oracle数据库存储这些数据的时候却不会“明文”存储。如果我们能把表对应的dbf表空间文件下载下来,再通过一些转换手段将dbf中的数据块内容转换成人能识别的“明文”,但首先必须知道它的“转换机制”。

测试验证

首先我们要能定位到我们找的数据所在的物理位置在哪里,然后再查看Oracle存储的真实数据。

  1. 找到一行数据的物理位置

方法1、
如果找到一行数据的物理位置?可以通过rowid来定位。但是rowid又是一串字符,这就需要将它转换一下。(注意 rowid不是真实存在于块中的物理数据,它只是一个“拼接”而成的列)

set linesize 1000 pagesize 1000
col OTHER_COL for a20
select id,name,OTHER_COL,rowid from test;

block中真实存储的数据oracle_块

select id,name,rowid,
        dbms_rowid.ROWID_RELATIVE_FNO(rowid) file_no,
        dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block_no,
        dbms_rowid.ROWID_ROW_NUMBER(rowid) row_no
from test;

block中真实存储的数据oracle_block_02

至此,定位到这一行数据所在的位置就是第8号文件 第#140号块 第0行。

方法2、

请dump出L1 BMB,自行观察内容。

找到这个表的“段头块”再找到“L2 BMB”再找到“L1 BMB”:

block中真实存储的数据oracle_rowid_03


如上图,0x0200080转换成8号文件128号块,通过L1 BMB可以看到,插入的那一行数据是在第8号文件的第140号块(128 + 12 = 140)。

  1. 查看块真实数据

现在dump出这个第8号文件 第#140号块的所有内容:

alter system dump datafile 8 block 140;
select * from v$diag_info where name='Default Trace File';

block中真实存储的数据oracle_块_04


如上图解释;关于值的大小解释如下:

col 0: [ 2] c1 02 id(number),值:1
col 1: [ 3] 31 5f 61 name(varchar2)值:1_a
col 2: [2000] 63 72 77 20 other_col(char(2000))值:crw

所以原始SQL:
insert into test values(1,‘1_a’,‘crw’);
实际SQL:
insert into test values(dump(1,16),
dump(‘1_a’,16),
dump(‘crw’,16)
);

select dump(1,16) from dual;
select dump('1_a',16) from dual;
select dump('crw',16) from dual;

block中真实存储的数据oracle_rowid_05

  1. 转换机制
    通过上述的介绍,其实数据的存储是被转换过的。接下来就看看字符和数值是如何转换的。
    3.1、字符转换
    实际上是 string --> ASCII(十进制 )–> 十六进制
    转回来是:十六进制–>ASCII(十进制 )–>string
select ascii('1') ,ascii('_'),ascii('a') from dual;  --将字符装换成10进制

block中真实存储的数据oracle_block_06

select to_char(ascii('1'),'xxxxxxxxxxxxx') from dual  --再将10进制转换成16进制
union
select to_char(ascii('_'),'xxxxxxxxxxxxx') from dual
union
select to_char(ascii('a'),'xxxxxxxxxxxxx') from dual;

block中真实存储的数据oracle_ancii_07


转换回来:

select CHR(to_number('31','xxxxxxxxxxx')) from dual
union
select CHR(to_number('5f','xxxxxxxxxxx')) from dual
union
select CHR(to_number('61','xxxxxxxxxxx')) from dual;

block中真实存储的数据oracle_16进制_08

3.2、数值转换机制

直接可以看到,真实的数据 0 ,1 ,2 存在块中的存储值为 “80” ,“c1,2” ,“c1,3” 。 它们是如何得到的呢?

block中真实存储的数据oracle_block_09

正数举例1如下:
1 = 1 x power(100,0) 取得最高指数就是0,取得所有基数1 ; 指数0+193=193,基数1+1=2 ,最后逐个转换为16进制:c1,2

block中真实存储的数据oracle_16进制_10

验证如下:

block中真实存储的数据oracle_block_11

正数举例2如下:

12345 = 1 x power(100,2) + 23 x power(100,1) + 45* power(100,0) 取得最高指数是2,取得所有基数1,23,45 ;指数2+193=195,基数+1=2,24,46 ;最后逐个转换为16进制:c3,2,18,2e

block中真实存储的数据oracle_块_12

标签:存储,rowid,dump,16,block,dual,oracle,ascii,select
From: https://blog.51cto.com/u_13482808/7474215

相关文章

  • 天翼云存储资源盘活系统HBlock,全面释放企业数据价值
    9月6日,天翼云与科技媒体InfoQ联合举办的以“存储难题新解法,揭秘极/致易用的HBlock”为主题的线上技术分享会圆满落幕。天翼云国际业务事业部研发专家武志民与存储产品线总监魏玮以“天翼云存储资源盘活系统HBlock,深挖独创技术亮点与实战演练”为主题,分享了HBlock在安装部署、数据......
  • 二维数组的存储顺序、表示方法
    二维数组的存储顺序、表示方法先说一维数组:1.数组首地址也是第一个元素的首地址1#include<iostream>2usingnamespacestd;34intmain(){5intarr[5]={};6cout<<"arr="<<arr<<endl;7cout<<"&arr[0]=&q......
  • 天翼云存储资源盘活系统HBlock,全面释放企业数据价值
    9月6日,天翼云与科技媒体InfoQ联合举办的以“存储难题新解法,揭秘极致易用的HBlock”为主题的线上技术分享会圆满落幕。天翼云国际业务事业部研发专家武志民与存储产品线总监魏玮以“天翼云存储资源盘活系统HBlock,深挖独创技术亮点与实战演练”为主题,分享了HBlock在安装部署、数据可......
  • Mysql存储引擎,你了解几个?
    引言MySQL是一种流行的关系型数据库管理系统(RDBMS),它支持多种不同的数据库引擎。数据库引擎是用于存储、管理和检索数据的核心组件,它们直接影响着数据库的性能、可靠性和功能,接下来本文介绍下一些常见的MySQL数据库引擎。存储引擎InnoDB引擎InnoDB是MySQL默认的事务性数据库引......
  • oracle获取xml节点数据
    1.新增获取节点函数CREATEORREPLACEFUNCTIONget_xml_nodeValue(xmlStrCLOB,nodeNameVARCHAR2)RETURNVARCHAR2ISxmlParxmlparser.Parser:=xmlparser.newParser;xDocxmldom.DOMDocument;lenItme......
  • YashanDB混合存储大揭秘:行式存储设计如何为高效TP业务保驾护航(上)
    上一篇文章《揭秘YashanDB融合存储引擎》https://mp.weixin.qq.com/s/yipJcEAH3fVA-_hnUvOiKA从存储结构、事务引擎、高可用等方面介绍了YashanDB存储引擎的整体架构。本篇为大家详细解读YashanDB行式存储技术。背景数据库底层组织数据的方式主要分为行式存储和列式存储两大类。Yas......
  • YashanDB混合存储大揭秘:行式存储设计如何为高效TP业务保驾护航
    接上篇内容插入性能优化YashanDB行式存储主要从提供并发度、批量化处理以及减少日志产生三方面对事务处理过程中的插入性能进行了优化:1提高并发度单线程插入的速度是有限的,在资源充足的场景下,我们希望通过增加线程来提高导入数据的速度。由于数据块不能同时写入,如果两个线程要在同......
  • nacos服务多级存储模型
       ......
  • oracle 分页 sql
    select*from(select*from(selectt.*,rownumlinenumfromgal_messagest)rwherer.linenum<200)awherea.linenum>100Note:一定要给rownum一个别名linenum,否则r.rownum或a.rownum会出错.OracleConnectBy用法参照:[url]http://www.cublog.cn/u1/54706/showart......
  • 7、数据库在磁盘上的存储
    数据库在磁盘上的存储首先弄清楚磁盘的几个概念磁盘面:磁盘一般会由多个磁盘片组成,一般都控制在5片以内,每个磁盘片包含两个面。磁盘片从下向上从0开始,比如最下边的磁盘块是0面和1面,依次往上走。磁头:通过磁性原理读取磁盘数据的部件,每个磁盘面都对应有个读/写磁头。3.内存......