文档章节

分析drop col对于数据存储块做了什么

我就叫你女王吧
 我就叫你女王吧
发布于 2016/06/07 14:51
字数 1536
阅读 8
收藏 0
点赞 0
评论 0

oracle 的alter table drop col具体内部是对于数据存储块操作的,如果drop col之后dul之类的工具是否可以恢复,这里我通过具体测试,结合bbed,dump block等方法来说明该问题
 

1.创建测试表,并写入硬盘

 

SQL> create table xff.t_xifenfei as select object_id,owner,object_name from dba_objects;

 

Table created.

 

SQL> desc xff.t_xifenfei

 

Name                                      Null?    Type

 

----------------------------------------- -------- ----------------------------

 

OBJECT_ID                                          NUMBER

 

OWNER                                              VARCHAR2(30)

 

OBJECT_NAME                                        VARCHAR2(128)



 

SQL> alter system checkpoint;

 

System altered.

 

SQL> alter system checkpoint;

 

System altered.

 

 

 

2.找出来测试表一个block分析drop col对于存储的影响

 

SQL> select   rowid,

 

  2  dbms_rowid.rowid_relative_fno(rowid)rel_fno,

 

  3  dbms_rowid.rowid_block_number(rowid)blockno,

 

dbms_rowid.rowid_row_number(rowid) rowno,object_id

 

  4    5  from xff.t_xifenfei where rownum<5;

 

ROWID                 REL_FNO    BLOCKNO      ROWNO  OBJECT_ID

 

------------------ ---------- ---------- ---------- ----------

 

AAAZ9wAAEAAAJojAAA          4      39459          0         20

 

AAAZ9wAAEAAAJojAAB          4      39459          1         46

 

AAAZ9wAAEAAAJojAAC          4      39459          2         28

 

AAAZ9wAAEAAAJojAAD          4      39459          3         15

 

 

 

3. dump block,并且记录该block 1,2,和最后一条记录

 

SQL> oradebug setmypid

 

Statement processed.

 

SQL> alter system dump datafile 4 block 39459;

 

System altered.

 

SQL> oradebug TRACEFILE_NAME

 

/home/u01/diag/rdbms/orcl/orcl/trace/orcl_ora_14069.trc



 

block_row_dump:

 

tab 0, row 0, @0x1f70

 

tl: 16 fb: --H-FL-- lb: 0x0  cc: 3

 

col  0: [ 2]  c1 15

 

col  1: [ 3]  53 59 53

 

col  2: [ 5]  49 43 4f 4c 24

 

tab 0, row 1, @0x1f5e

 

tl: 18 fb: --H-FL-- lb: 0x0  cc: 3

 

col  0: [ 2]  c1 2f

 

col  1: [ 3]  53 59 53

 

col  2: [ 7]  49 5f 55 53 45 52 31

 

…………

 

tab 0, row 288, @0x589

 

tl: 22 fb: --H-FL-- lb: 0x0  cc: 3

 

col  0: [ 3]  c2 03 5b

 

col  1: [ 3]  53 59 53

 

col  2: [10]  49 5f 4a 4f 42 5f 4e 45 58 54

 

 

 

4. 使用bbed查看该block 1,2,和最后一条记录

 

[oracle@localhost ~]$ bbed password=blockedit blocksize=8192 filename=/usr/local/oradata/qsng/users01.dbf

 

BBED: Release 2.0.0.0.0 - Limited Production on Sun Apr 3 22:25:28 2016

 

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED> set block 39459

 

        BLOCK#          39459

 

BBED> map

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459                                 Dba:0x00000000

 

------------------------------------------------------------

 

KTB Data Block (Table/Cluster)

 

struct kcbh, 20 bytes                      @0      

 

struct ktbbh, 96 bytes                     @20     

 

struct kdbh, 14 bytes                      @124   

 

struct kdbt[1], 4 bytes                    @138   

 

sb2 kdbr[289]                              @142   

 

ub1 freespace[821]                         @720   

 

ub1 rowdata[6647]                          @1541   

 

ub4 tailchk                                @8188   



 

BBED> p *kdbr[0]

 

rowdata[6631]

 

-------------

 

ub1 rowdata[6631]                           @8172     0x2c

 

BBED> x /rncc

 

rowdata[6631]                               @8172   

 

-------------

 

flag@8172: 0x2c (KDRHFL, KDRHFF, KDRHFH)

 

lock@8173: 0x00

 

cols@8174:    3

 

col    0[2] @8175: 20

 

col    1[3] @8178: SYS

 

col    2[5] @8182: ICOL$



 

BBED> d

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459            Offsets: 8172 to 8191           Dba:0x00000000

 

------------------------------------------------------------------------

 

2c000302 c1150353 59530549 434f4c24 02067576

 

<32 bytes per line>

 

BBED> p *kdbr[1]

 

rowdata[6613]

 

-------------

 

ub1 rowdata[6613]                           @8154     0x2c

 

BBED> x /rncc

 

rowdata[6613]                               @8154   

 

-------------

 

flag@8154: 0x2c (KDRHFL, KDRHFF, KDRHFH)

 

lock@8155: 0x00

 

cols@8156:    3

 

col    0[2] @8157: 46

 

col    1[3] @8160: SYS

 

col    2[7] @8164: I_USER1



 

BBED> d

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459            Offsets: 8154 to 8191           Dba:0x00000000

 

------------------------------------------------------------------------

 

2c000302 c12f0353 59530749 5f555345 52312c00 0302c115 03535953 0549434f

 

4c240206 7576

 

<32 bytes per line>

 

BBED> p *kdbr[288]

 

rowdata[0]

 

----------

 

ub1 rowdata[0]                              @1541     0x2c

 

BBED> x /rncc

 

rowdata[0]                                  @1541   

 

----------

 

flag@1541: 0x2c (KDRHFL, KDRHFF, KDRHFH)

 

lock@1542: 0x00

 

cols@1543:    3

 

col    0[3] @1544: 290

 

col    1[3] @1548: SYS

 

col   2[10] @1552: I_JOB_NEXT



 

BBED> set count 32

 

        COUNT           32

 

BBED> d

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459            Offsets: 1541 to 1572           Dba:0x00000000

 

------------------------------------------------------------------------

 

2c000303 c2035b03 5359530a 495f4a4f 425f4e45 58542c00 0303c203 5a035359

 

<32 bytes per line>

 

 

 

5. 删除中间列,并且写入硬盘

 

SQL> ALTER TABLE XFF.T_XIFENFEI DROP COLUMN owner;

 

Table altered.

 

SQL> alter system checkpoint;

 

System altered.

 

SQL> /

 

System altered.

 

 

 

6. 查询确定相同行所在block没有发生改变

 

SQL> select   rowid,

 

  2  dbms_rowid.rowid_relative_fno(rowid)rel_fno,

 

  3  dbms_rowid.rowid_block_number(rowid)blockno,

 

dbms_rowid.rowid_row_number(rowid) rowno,object_id

 

  4    5  from xff.t_xifenfei where rownum<5;

 

ROWID                 REL_FNO    BLOCKNO      ROWNO  OBJECT_ID

 

------------------ ---------- ---------- ---------- ----------

 

AAAZ9wAAEAAAJojAAA          4      39459          0         20

 

AAAZ9wAAEAAAJojAAB          4      39459          1         46

 

AAAZ9wAAEAAAJojAAC          4      39459          2         28

 

AAAZ9wAAEAAAJojAAD          4      39459          3         15

 

 

 

7. drop col之后dump block继续分析

 

SQL> alter system dump datafile 4 block 39459;

 

System altered.

 

SQL>  select value from v$diag_info where name='Default Trace File';

 

VALUE

 

--------------------------------------------------------------------------------

 

/home/u01/diag/rdbms/orcl/orcl/trace/orcl_ora_14784.trc

 

SQL>

 

tab 0, row 0, @0x1f70

 

tl: 12 fb: --H-FL-- lb: 0x2  cc: 2

 

col  0: [ 2]  c1 15

 

col  1: [ 5]  49 43 4f 4c 24

 

tab 0, row 1, @0x1f5e

 

tl: 14 fb: --H-FL-- lb: 0x2  cc: 2

 

col  0: [ 2]  c1 2f

 

col  1: [ 7]  49 5f 55 53 45 52 31

 

…………

 

tab 0, row 288, @0x589

 

tl: 18 fb: --H-FL-- lb: 0x2  cc: 2

 

col  0: [ 3]  c2 03 5b

 

col  1: [10]  49 5f 4a 4f 42 5f 4e 45 58 54

 

 

 

8. 使用bbed查看drop col后的数据存储情况

 

$ bbed password=blockedit blocksize=8192 filename=/usr/local/oradata/qsng/users01.dbf

 

BBED: Release 2.0.0.0.0 - Limited Production on Sun Apr 3 22:31:37 2016

 

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

 

************* !!! For Oracle Internal Use only !!! ***************

 

BBED> set block 39459

 

        BLOCK#          39459

 

BBED> map

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459                                 Dba:0x00000000

 

------------------------------------------------------------

 

KTB Data Block (Table/Cluster)

 

struct kcbh, 20 bytes                      @0      

 

struct ktbbh, 96 bytes                     @20     

 

struct kdbh, 14 bytes                      @124   

 

struct kdbt[1], 4 bytes                    @138   

 

sb2 kdbr[289]                              @142   

 

ub1 freespace[821]                         @720   

 

ub1 rowdata[6647]                          @1541   

 

ub4 tailchk                                @8188   



 

BBED> p *kdbr[0]

 

rowdata[6631]

 

-------------

 

ub1 rowdata[6631]                           @8172     0x2c

 

BBED> x /rncc

 

rowdata[6631]                               @8172   

 

-------------

 

flag@8172: 0x2c (KDRHFL, KDRHFF, KDRHFH)

 

lock@8173: 0x02

 

cols@8174:    2

 

col    0[2] @8175: 20

 

col    1[5] @8178: ICOL$



 

BBED> d

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459            Offsets: 8172 to 8191           Dba:0x00000000

 

------------------------------------------------------------------------

 

2c020202 c1150549 434f4c24 434f4c24 0106de78

 

<32 bytes per line>

 

BBED> p *kdbr[1]

 

rowdata[6613]

 

-------------

 

ub1 rowdata[6613]                           @8154     0x2c

 

BBED> x /rncc

 

rowdata[6613]                               @8154   

 

-------------

 

flag@8154: 0x2c (KDRHFL, KDRHFF, KDRHFH)

 

lock@8155: 0x02

 

cols@8156:    2

 

col    0[2] @8157: 46

 

col    1[7] @8160: I_USER1



 

BBED> d

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459            Offsets: 8154 to 8191           Dba:0x00000000

 

------------------------------------------------------------------------

 

2c020202 c12f0749 5f555345 52315345 52312c02 0202c115 0549434f 4c24434f

 

4c240106 de78

 

<32 bytes per line>

 

BBED> p *kdbr[288]

 

rowdata[0]

 

----------

 

ub1 rowdata[0]                              @1541     0x2c

 

BBED> set count 32

 

        COUNT           32

 

BBED> x /rncc

 

rowdata[0]                                  @1541   

 

----------

 

flag@1541: 0x2c (KDRHFL, KDRHFF, KDRHFH)

 

lock@1542: 0x02

 

cols@1543:    2

 

col    0[3] @1544: 290

 

col   1[10] @1548: I_JOB_NEXT



 

BBED> d

 

File: /usr/local/oradata/qsng/users01.dbf (0)

 

Block: 39459            Offsets: 1541 to 1572           Dba:0x00000000

 

------------------------------------------------------------------------

 

2c020203 c2035b0a 495f4a4f 425f4e45 58544e45 58542c02 0203c203 5a09495f

 

<32 bytes per line>

 

 

 

通过上述测试可以得出如下结论:
1. drop col是真的把对应列存储在block中的内容除掉,而且把后面的列的内容前移了,并且以前多于的内容(因为一行内容前移,后面就出现空闲记录不设置为空,而就是最初内容,下次如果行长度发生改变的时候使用,就和类似update把列修改短了一样)
2. drop col只是导致一行的长度变短,但是每行的偏移量未发生改变,也就是说,每行所在的偏移量没有改变,drop col之后,每行后面多了一些空闲空间
3. 根据上面分析的原理,drop col 是真的从block内部把这一列的数据使用后面列的数据覆盖了,因此从原理上而言,dul无法恢复drop col的数据(最后一列有可能可以恢复,因为他不会被覆盖),对于drop col,只能是通过备份不完全恢复,全库闪回,dg延迟应用等方法解决

 

更多精彩Oracle内容  请关注我:

© 著作权归作者所有

共有 人打赏支持
我就叫你女王吧
粉丝 3
博文 34
码字总数 25430
作品 0
海淀
为什么要始终使用PreparedStatement代替Statement

在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement. 基于以下的原因: 一.代码的可读性和可维护性. 虽然用Pre...

鉴客 ⋅ 2010/11/06 ⋅ 1

mysql学习笔记(5-DDL命令)

服务器端命令: DDL:数据定义语言,主要用于管理数据库组件,例如表、索引、视图、用户、存储过程 CREATE、ALTER、DROP DML:数据操纵语言,主要用管理表中的数据,实现数据的增、删、改、查...

黎晨 ⋅ 2017/05/15 ⋅ 0

行迁移_行链接的介绍

行迁移行链接的介绍[@more @] 一、行迁移/行链接的介绍 在实际的工作中我们经常会碰到一些Oracle数据库性能较低的问题,当然, 引起Oracle数据库性能较低的原因是多方面的,Row Migration (...

pczhangtl ⋅ 2014/03/09 ⋅ 0

mysql基本语法及使用

环境:centos6.8 软件:mysaql 5.6.20 1.mysql交互式基本指令 ;mysql交互式默认的语句结束符, 如果没有结束会出现‘->’这个符号来告知你语句没有结束 show databases;查看有那些数据库存在...

doudou___9958 ⋅ 2016/11/09 ⋅ 0

004.hive命令的3种调用方式 | ApacheCN(apache中文网)

ApacheCN apache中文网 hive命令的3种调用方式 官网地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Cli(可参考) 方式1:hive –f /root/shell/hive-script.sql......

片刻 ⋅ 2014/01/13 ⋅ 0

mySQL 触发器

㈠CREATE TRIGGER语法 CREATE TRIGGER triggername triggertime trigger_event ON tblname FOR EACH ROW triggerstmt 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对...

idoz ⋅ 2015/10/20 ⋅ 0

hive修改已经存在的表

修改已经存在的表: alter table Alter table 语句允许用户改变现有表的结构。用户可以增加列/分区,表本身重命名。 1) 增加分区 Add Partitions: ALTER TABLE tablename ADD partitionspec ...

超人学院 ⋅ 2015/05/12 ⋅ 0

从程序员的角度深入理解MySQL

前言 作为一名工作了4年的程序猿,今天我将站在程序员的角度以MySQL为例探索数据库的奥秘! 数据库基本原理 第一,数据库的组成:存储 + 实例 不必多说,数据当然需要存储;存储了还不够,显...

zfz_linux_boy ⋅ 2017/06/11 ⋅ 0

mariadb常用的客服端及其服务端命令

一、安装MariaDB及其配置步骤 1)创建存放数据目录及其用户 mkdir -pv /mydata/data groupadd -r mysql useradd -g mysql -r mysql 2)授权数据存放目录 chown -R /mydata/data 3)解压mariadb...

秦时明月路 ⋅ 2016/10/18 ⋅ 0

Mariadb的基础应用

Mariadb概述: MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区...

丁小水 ⋅ 2016/10/15 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部