flashback table肯定会造成rowid跟着修改

简介: flashback table肯定会造成rowid跟着修改,为什么要开启行移动?

下面我马上做个实验来验证一下:
SQL> drop tablespace tp2 including contents and datafiles;
Tablespace dropped.
SQL> create tablespace tp2 datafile '/u01/app/oracle/oradata/tp2.dbf' size 512K;
Tablespace created.
SQL> create table t1 (id int,name char(10)) tablespace tp2;
Table created.
SQL> begin
2 for i in 1 .. 1000 loop
3 insert into t1 values(i,'gyj'||i);
4 end loop;
5 commit;
6 end;
7 /
PL/SQL procedure successfully completed.

查rowid
SQL> select rowid,id from t1 where id>=1 and id<=5;
ROWID ID


AAASvnAAIAAAAAOAAA 1
AAASvnAAIAAAAAOAAB 2
AAASvnAAIAAAAAOAAC 3
AAASvnAAIAAAAAOAAD 4
AAASvnAAIAAAAAOAAE 5
SQL> alter table t1 enable row movement;
Table altered.
SQL> select current_scn from v$database;

CURRENT_SCN

6177172

查文件号,块号,行号
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 where id>=1 and id<=5;

    ID      FILE#     BLOCK#       ROW#

     1          8         14          0
     2          8         14          1
     3          8         14          2
     4          8         14          3
     5          8         14          4

SQL> delete from t1;
1000 rows deleted.
SQL> commit;
Commit complete.

插入大量记录,让空间用完为止
SQL> begin
2 for i in 1001 .. 100000 loop
3 insert into t1 values(i,'gyj'||i);
4 commit;
5 end loop;
6 end;
7 /
begin
*
ERROR at line 1:
ORA-01653: unable to extend table GYJ.T1 by 8 in tablespace TP2
ORA-06512: at line 3

SQL> flashback table t1 to scn 6177172;
Flashback complete.

查原来1000行记录的前5行的rowid,与原来的rowid不一样了
SQL> select rowid,id from t1 where id>=1 and id<=5;
ROWID ID


AAASvnAAIAAAAAcAFr 1
AAASvnAAIAAAAAcAFs 2
AAASvnAAIAAAAAcAFt 3
AAASvnAAIAAAAAcAFu 4
AAASvnAAIAAAAAcAFv 5

查原来1000行记录前5行所在的文件号,块号,行号,与原来的块号行号不一样了
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 where id>=1 and id<=5;

    ID      FILE#     BLOCK#       ROW#

     1          8         28        363
     2          8         28        364
     3          8         28        365
     4          8         28        366
     5          8         28        367

我做这个实验是把表空间搞小一点这样更方便观察,在t1表先添加1000条记录,然后delete,最后再向里面插一些记录直到期把空间占完,这样最后新插入的记录会占用原来1000条记录的空间。。。

相关文章
|
SQL
简单说一说 drop、delete 与 truncate 的区别
简单说一说 drop、delete 与 truncate 的区别
170 0
|
Web App开发 前端开发 搜索推荐
关于table的一些记录
HTML有10个表格相关标签
关于table的一些记录
|
SQL 关系型数据库 MySQL
|
SQL 存储 关系型数据库
delete、truncate、drop,千万别用错了。。
MySQL删除数据的方式都有哪些? 咱们常用的三种删除方式:通过 delete、truncate、drop 关键字进行删除;这三种都可以用来删除数据,但场景不同。 一、从执行速度上来说 drop > truncate >> DELETE
184 0
delete、truncate、drop,千万别用错了。。
|
SQL 机器学习/深度学习 Oracle
[20180630]truncate table的另类恢复2.txt
[20180630]truncate table的另类恢复2.txt --//上个星期做了truncate table的另类恢复,通过修改数据块的段号,再通过rowid定位收集数据,达到修复的目的.
1564 0
|
数据库管理
[20180627]truncate table的另类恢复.txt
[20180627]truncate table的另类恢复.txt --//前几天看链接http://www.xifenfei.com/2018/06/truncate-table-recovery.
1373 0
|
索引
慎用SELECT INTO复制表
原文:慎用SELECT INTO复制表 很多时候我们习惯于用SELECT INTO复制一个表或表结构,因为它方便,快捷,而且在某些情况下效率比INSERT INTO 效率要高一些。但是要注意: SELECT INTO 复制表或表结构的时候,只是得到了一个“外壳”,就像克隆人一样,只是得到了一个躯体,个人的意识、回忆都不会克隆的。
760 0