Oracle的闪回
1 flashback 的功能:
1)利用undo data回溯或撤销提交的数据,
2)flashback log 使database 可以恢复到过去某个时间点,可以作为不完恢复的补充。
2 flashback分类
1)flashback drop
2)flashback query (新添flashback database archive)
3)flashback table
4)flashback version query
5)flashback transaction
6)flashback database
2.1 闪回drop 又名闪回删除
1)理解回收站(recyclebin)
从管理的角度为每个用户“分配”一个回收站,但这个回收站并不实际开辟空间(只是个逻辑容器),当drop table时(非purge),原来的表所使用的段中的数据并没有真正的删除。实际上是把table的段名以回收站方式重命名。该段所在表空间不足需要扩展时,回收站中的信息会被自动清除(考点)。
做个例子理解一下
SQL> show parameter recyclebin
//当初始化参数recyclebin为on时,每个用户都有了自己的回收站
//如果参数设为off 就取消了用户的回收站,那么当你drop table就相当于purge了。
SQL> create tablespace test1 datafile '/u01/app/oracle/oradata/hyyk/test01.dbf' size 1m;
SQL> create table scott.t1(id int) tablespace test1;
SQL> insert into scott.t1 values(1);
SQL> insert into scott.t1 values(1);
SQL> commit;
SQL> select segment_name from dba_segments where tablespace_name='TEST1';
//看test表空间下有了一个段
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
//看这个段有多少空闲空间
继续插入数据,将表空间撑满
SQL> insert into scott.t1 values(1);
SQL> insert into scott.t1 select * from scott.t1;
/
/
查看数据有多少行
SQL> select count(*) from scott.t1;
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
//显示没有空闲空间
删除表t1
SQL> drop table scott.t1;
查看表空间为TEST1的段名被修改了
SQL> select segment_name from dba_segments where tablespace_name='TEST1';
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
请看,TEST表空间中的空闲空间又回来了,这说明如果test表空间不够时,这部分空闲空间是可以被重新利用的,实际上即使你设置了表空间autoextend特性,Oracle 会先使用recyclebin,若空间还不够,再考虑autoextend.
SQL> create table scott.emp2 tablespace test1 as select * from scott.emp; //挤占test表空间
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
SQL> select segment_name from dba_segments where tablespace_name='TEST1';
//t1表的数据已经被冲掉了,使用闪回删除无法找回了(考点)。
2)关于回收站中的对象的闪回和清除
闪回和清除的顺序不同
闪回使用LIFO (后进先出)
清除使用FIFO (先进先出)
假设回收站里有两个t1表,看以下两条语句:
SQL> flashback table t1 to before drop; //闪回的是最新的那个t1表(考点)。
SQL> purge table t1; //清除的是最旧的那个t1表(考点)。
如果想避免混淆,可以直接点出回收站里的表名
SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop;
SQL> purge table "BIN$qrJLbL74ZgvgQKjA8Agb/A==$0";
SQL> purge recyclebin; //清空回收站
3)如何恢复同一个schema下准备闪回的表已有同名的对象存在,闪回drop需要重命名.
SQL> drop table emp1;
SQL> create table emp1 as select * from emp;
SQL> select * from tab;
SQL> show recycle;
SQL> flashback table emp1 to before drop rename to test_old;
//闪回drop语句中使用了重命名
1 flashback 的功能:
1)利用undo data回溯或撤销提交的数据,
2)flashback log 使database 可以恢复到过去某个时间点,可以作为不完恢复的补充。
2 flashback分类
1)flashback drop
2)flashback query (新添flashback database archive)
3)flashback table
4)flashback version query
5)flashback transaction
6)flashback database
2.1 闪回drop 又名闪回删除
1)理解回收站(recyclebin)
从管理的角度为每个用户“分配”一个回收站,但这个回收站并不实际开辟空间(只是个逻辑容器),当drop table时(非purge),原来的表所使用的段中的数据并没有真正的删除。实际上是把table的段名以回收站方式重命名。该段所在表空间不足需要扩展时,回收站中的信息会被自动清除(考点)。
做个例子理解一下
SQL> show parameter recyclebin
//当初始化参数recyclebin为on时,每个用户都有了自己的回收站
//如果参数设为off 就取消了用户的回收站,那么当你drop table就相当于purge了。
SQL> create tablespace test1 datafile '/u01/app/oracle/oradata/hyyk/test01.dbf' size 1m;
SQL> create table scott.t1(id int) tablespace test1;
SQL> insert into scott.t1 values(1);
SQL> insert into scott.t1 values(1);
SQL> commit;
SQL> select segment_name from dba_segments where tablespace_name='TEST1';
//看test表空间下有了一个段
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
//看这个段有多少空闲空间
继续插入数据,将表空间撑满
SQL> insert into scott.t1 values(1);
SQL> insert into scott.t1 select * from scott.t1;
/
/
查看数据有多少行
SQL> select count(*) from scott.t1;
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
//显示没有空闲空间
删除表t1
SQL> drop table scott.t1;
查看表空间为TEST1的段名被修改了
SQL> select segment_name from dba_segments where tablespace_name='TEST1';
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
请看,TEST表空间中的空闲空间又回来了,这说明如果test表空间不够时,这部分空闲空间是可以被重新利用的,实际上即使你设置了表空间autoextend特性,Oracle 会先使用recyclebin,若空间还不够,再考虑autoextend.
SQL> create table scott.emp2 tablespace test1 as select * from scott.emp; //挤占test表空间
SQL> select sum(bytes) from dba_free_space where tablespace_name='TEST1';
SQL> select segment_name from dba_segments where tablespace_name='TEST1';
//t1表的数据已经被冲掉了,使用闪回删除无法找回了(考点)。
2)关于回收站中的对象的闪回和清除
闪回和清除的顺序不同
闪回使用LIFO (后进先出)
清除使用FIFO (先进先出)
假设回收站里有两个t1表,看以下两条语句:
SQL> flashback table t1 to before drop; //闪回的是最新的那个t1表(考点)。
SQL> purge table t1; //清除的是最旧的那个t1表(考点)。
如果想避免混淆,可以直接点出回收站里的表名
SQL> flashback table " BIN$qrJLbL74ZgvgQKjA8Agb/A==$0" to befroe drop;
SQL> purge table "BIN$qrJLbL74ZgvgQKjA8Agb/A==$0";
SQL> purge recyclebin; //清空回收站
3)如何恢复同一个schema下准备闪回的表已有同名的对象存在,闪回drop需要重命名.
SQL> drop table emp1;
SQL> create table emp1 as select * from emp;
SQL> select * from tab;
SQL> show recycle;
SQL> flashback table emp1 to before drop rename to test_old;
//闪回drop语句中使用了重命名