分享

DATA BLOCK内部结构的解析续二

 昵称10504424 2013-03-14
既然已经走到这一步,为大家总结下块内空间的使用规则吧,比如有A、B、C行,B被update,空间增大,B行的位置是否被移动,如果B行位置被移动,rowid是否变化.
1.创建表并插入三行记录
SQL> create table t1 (id varchar2(10),name varchar2(1000)) pctfree 98;
Table created.
SQL> insert into t1 values(1,'A');
1 row created.
SQL> insert into t1 values(2,'B');
1 row created.
SQL> insert into t1 values(3,'C');
1 row created.
SQL> commit;
Commit complete.

SQL> alter system checkpoint;
System altered.
SQL>  select id,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid) row# from t1;

ID              FILE#     BLOCK#       ROW#
---------- ---------- ---------- ----------
1                   6        327          0
2                   6        327          1
3                   6        327          2

2.再开一个窗口转储6号文件327号块
SQL> SQL> alter system dump datafile 6 block 327;
System altered.
3.dump出的内容如下:
Block header dump:  0x01800147
Object id on Block? Y
seg/obj: 0x12dd5  csc: 0x00.54bdd5  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1800140 ver: 0x01 opc: 0
     inc: 0  exflg: 0
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0005.008.000009c2  0x00c000c5.00e4.34  --U-    3  fsc 0x0000.0054bde0
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x01800147
data_block_dump,data header at 0x2b9fde2d9a64
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x2b9fde2d9a64
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f83
avsp=0x1f65
tosp=0x1f65
0xe:pti[0]      nrow=3  offs=0
0x12:pri[0]     offs=0x1f91
0x14:pri[1]     offs=0x1f8a
0x16:pri[2]     offs=0x1f83
block_row_dump:
tab 0, row 0, @0x1f91
tl: 7 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 1]  31
col  1: [ 1]  41
tab 0, row 1, @0x1f8a
tl: 7 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 1]  32
col  1: [ 1]  42
tab 0, row 2, @0x1f83
tl: 7 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 1]  33
col  1: [ 1]  43
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 327 maxblk 327

                                                                 
4.接着修改id=2这行,把原来1个B改成100个B,使行长度变长,观察rowid是不是会变?
SQL> update t1 set name=lpad('B',100,'B') where id=2;
1 row updated.
SQL> commit;
Commit complete.
SQL> alter system checkpoint;
System altered.
SQL>  select id,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid) row# from t1;
ID              FILE#     BLOCK#       ROW#
---------- ---------- ---------- ----------
1                   6        327          0
2                   6        327          1
3                   6        327          2 
5.再次dump
Object id on Block? Y
seg/obj: 0x12dd5  csc: 0x00.54befa  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1800140 ver: 0x01 opc: 0
     inc: 0  exflg: 0
Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0005.008.000009c2  0x00c000c5.00e4.34  C---    0  scn 0x0000.0054bde0
0x02   0x0009.015.000009cb  0x00c00519.010f.01  --U-    1  fsc 0x0000.0054befc
bdba: 0x01800147
data_block_dump,data header at 0x2b52b8bf4a64
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x2b52b8bf4a64
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f19
avsp=0x1f04
tosp=0x1f04
0xe:pti[0]      nrow=3  offs=0
0x12:pri[0]     offs=0x1f91
0x14:pri[1]     offs=0x1f19
0x16:pri[2]     offs=0x1f83
block_row_dump:
tab 0, row 0, @0x1f91
tl: 7 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 1]  31
col  1: [ 1]  41
tab 0, row 1, @0x1f19
tl: 106 fb: --H-FL-- lb: 0x2  cc: 2
col  0: [ 1]  32
col  1: [100]
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
tab 0, row 2, @0x1f83
tl: 7 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 1]  33
col  1: [ 1]  43
end_of_block_dump
End dump data blocks tsn: 7 file#: 6 minblk 327 maxblk 327
                                        
对修改前B值的两次dump的内容比较
tab 0, row 1, @0x1f8a
tl: 7 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 1]  32
col  1: [ 1]  42
tab 0, row 1, @0x1f19
tl: 106 fb: --H-FL-- lb: 0x2  cc: 2
col  0: [ 1]  32
col  1: [100]
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
修改前和修改后row=1,说明行号都没变。即rowid没变!但他们在块中的偏移量(@0x1f8a,@0x1f19)变了?
一、Fashback Query闪回查询:Books-->APP-->Application Developer's Guide - Fundamentals-->Flashback
1、应用Flashback Query查询过去的数据
select * from t1 as of scn 44545454;
select * from t1 as of timestamp to_timestamp('2012-09-28:09:20:13','yyyy-mm-dd:hh24:mi:SS');
select * from t1 as of timestamp sysdate-5/1440;  
--select to_char(sysdate,'yyyy-mm-dd:hh24:mi:ss') sys_time,to_char(scn_to_timestamp(current_scn),'yyyy-mm-dd:hh24:mi:ss') scn_to_time,timestamp_to_scn(sysdate) date_to_scn,dbms_flashback.get_system_change_number scn1,current_scn scn2 from v$database;


2、应用Flashback Query查询操作的事务
  (1)使用Flashback Version Query 查询记录修改版本
       select current_scn from v$database;
       DML操作........
        insert into t1 values(20,'gyj20');
commit;
update t1 set name='gyj200000' where id=20;
commit;
delete from t1 where id=20;
commit;
       select current_scn from v$database;
       SELECT ID,NAME,VERSIONS_STARTSCN STARTSCN,VERSIONS_ENDSCN ENDSCN,VERSIONS_OPERATION OPERATION,VERSIONS_XID XID
        FROM T1 VERSIONS BETWEEN SCN 2942841 AND 2942947;
    --VERSIONS_STARTSCN:该条记录操作时的SCN,如果为空,表示该行记录是在查询范围外创建的
    --VERSIONS_ENDSCN:该条记录失效时的SCN,如果为空,说明记录在这段时间无操作,或者已经被删数,配合VERSIONS_OPERATION
    --VERSIONS_OPERATION:I表示insert、D表示delete、U表示update

    --VERSIONS_XID:该操作的事务ID


  (2)使用Flashback Transaction Query 查询事务信息(可以做审计)
      alter database add supplemental log data; //Oracle11g禁用了supplemental logging
       select current_scn from v$database;
        DML操作........
       select current_scn from v$database;
      select xid,commit_scn,commit_timestamp,operation,undo_sql 
       from flashback_transaction_query q where q.xid in (select 
       versions_xid from t1 versions between SCN  2943656 and 2943676);
 SQL> DESC FLASHBACK_TRANSACTION_QUERY --能获得这个事务执行时的很多信息,包括UNDO语句
 Name              Null?    Type
 ----------------- -------- ------------
 XID                 RAW(8)    --事务ID,对应Versions Query中的VERSIONS_XID
 START_SCN           NUMBER       --事务开始时的SCN
 START_TIMESTAMP     DATE         --事务开始时间
 COMMIT_SCN          NUMBER    --事务提交时的SCN,该列为空的话,说明事务为活动事务
 COMMIT_TIMESTAMP    DATE     --事务提交时间
 LOGON_USER          VARCHAR2(30) --操作用户
 UNDO_CHANGE#        NUMBER    --UNDO SCN
 OPERATION           VARCHAR2(32) --执行操作,有几个值:Delete、Insert、Update、B、UNKNOWN
 TABLE_NAME          VARCHAR2(256)--DML操作对象的表名
 TABLE_OWNER         VARCHAR2(32) --表的属主
 ROW_ID              VARCHAR2(19) --DML操作记录的行地址

 UNDO_SQL            VARCHAR2(4000)--撤销该操作对应的SQL



二、Flashbackup Table闪回表:Books-->ADM-->Administrator's Guide-->flashback
1、从undo表空间恢复
      select row_movement from user_tables where table_name='T1';
      alter table t1 enable row movement;
      select * from t1;
      select current_scn from v$database;
      delete from t1;
      commit;
      select * from t1;
      select * from t as of scn 9999;
      flashback table t1 to scn 9999;
      flashback table t1 to timestamp sysdate-5/1440; 
      --create temporary tablespace temp2 tempfile '/u01/app/oracle/oradata/bxdb/temp02.dbf' size 50M;

      --alter user gyj  temporary tablespace temp2;


  2、利用recyclebin,drop闪回
      drop table t1;
      select object_name,original_name,droptime from recyclebin;
      flashback table t1 to before drop;
      --flashback table t1 to before drop rename to t1_old;
   实验:多个名为t1的表恢复会是什么顺序???
      回收站清除是按什么规则的??????
         恢复表时索引也同时被恢复,但索引名称是????
    drop table t1 purge; --真正删除表


三、数据库闪回配置:Books-->BAK-->Backup and Recovery Advanced User's Guide-->flashback
 v$flashback_database_log
1、闪回区的大小
      db_recovery_file_dest

      db_recovery_file_dest_size


2、闪回日志保留时间
     db_flashback_retention_target

3、设闪回
      startup mount
      alter database flashback on;

      alter database open;


4、闪回操作要在mount下做
      一般在备库中做完测试,用闪回恢复到测度前状态
      flashbackup database TO TIMESTAMP(SYSDATE-1/24); 

      alter database open;


5、建闪回点
     create restore point 恢复点名字 [guarantee flashback database]
     drop restore point 恢复点名字

     flashback database to  restore point re_data;


6、***场景1:
    show parameter db_recover
    arcive log list;
    select flashback_on,force_logging from v$database;
    alter database force logging;
    select dbms_flashback.get_system_change_number from dual;
    drop table t1 purge;
    shutdown immediate;
    startup mount;
    flashback database to  restore point re_data;
  --flashback database to scn 1511225;
    alter database open resetlogs;

    select * from t1;




**********本博客所有内容均为原创,如有转载请注明作者和出处!!!**********
Name:    guoyJoe

QQ:        252803295

Email:    oracledba_cn@hotmail.com

Blog:      http://blog.csdn.net/guoyJoe

ITPUB:   http://www./space-uid-28460966.html

OCM:     http://education.oracle.com/education/otn/YGuo.HTM
 _____________________________________________________________
加群验证问题:哪些SGA结构是必需的,哪些是可选的?否则拒绝申请!!!

答案在:http://blog.csdn.net/guoyjoe/article/details/8624392

Oracle@Paradise  总群:127149411

Oracle@Paradise No.1群:177089463(已满)

Oracle@Paradise No.2群:121341761

Oracle@Paradise No.3群:140856036


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多