ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Flashback学习

Flashback学习

原创 Linux操作系统 作者:wokeyi1314 时间:2010-07-09 15:30:33 0 删除 编辑

Flashback Query 闪回查询
1.create table test(id,vl) as select rownum,oname from (select substr(object_name,1,1) oname from all_objects group by substr(object_name,1,1) order by 1) where rownum<=20;
2.delete test where id<10;
  commit;
  select * from test;
3.as of timestamp/scn恢复
insert into test select * from test as of timestamp sysdate-5/1440 where id<10;
grant execute on dbms_flashback to scott;
grant select on v_$database to scott;
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1657520

delete test where id>10;
commit;
select * from test as of scn 1657520;
insert into test select * from test as of scn 1657520 where id>10;
commit;
注意:oracle内部是通过scn来标记操作,而不是时间,as of timestamp也是通过sys用户下的数据字典smon_scn_time来转化成scn,在10g中系统平均每3秒系统时间和scn匹配一次,当然也可以利用timestamp_to_scn和scn_to_timestamp手动转化

4.闪回版本 闪回事务查询
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1678942

SQL> delete test where id=5;

已删除2行。

SQL> commit;

提交完成。

SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1678957

SQL> desc flashback_transaction_query
 名称                                      是否为空? 类型
 ----------------------------------------- -------- ----------------------------
 XID                                                RAW(8)
 START_SCN                                          NUMBER
 START_TIMESTAMP                                    DATE
 COMMIT_SCN                                         NUMBER
 COMMIT_TIMESTAMP                                   DATE
 LOGON_USER                                         VARCHAR2(30)
 UNDO_CHANGE#                                       NUMBER
 OPERATION                                          VARCHAR2(32)
 TABLE_NAME                                         VARCHAR2(256)
 TABLE_OWNER                                        VARCHAR2(32)
 ROW_ID                                             VARCHAR2(19)
 UNDO_SQL                                           VARCHAR2(4000)

SQL> select xid,commit_scn,commit_timestamp,operation,undo_sql from flashback_transaction_query q wh
ere q.xid in (select versions_xid from test versions between scn 1678920 and 1678957);
XID              COMMIT_SCN COMMIT_TIMESTA OPERATION
---------------- ---------- -------------- ----------
UNDO_SQL
-------------------------------------------------------------
04001D00C8010000    1678953 09-7月 -10     DELETE
insert into "SCOTT"."TEST"("ID","VL") values ('5','D');

04001D00C8010000    1678953 09-7月 -10     DELETE
insert into "SCOTT"."TEST"("ID","VL") values ('5','D');

04001D00C8010000    1678953 09-7月 -10     BEGIN

注意:闪回查询需要启动自动撤销管理表空间,闪回表还要启用recycle bin,闪回数据库更要启用闪回区
undo_management 自动auto 手动manual
undo_tablespace 可以创建多个undo表空间,但是同时只能使用一个
undo_retention  指定retention guarantee可以保证undo表空间中的数据在undo_retention过期前一定有效
表结构的修改,move表,drop分区以及truncate table/partition会令undo表空间中的撤销数据无效

闪回表
1.SQL> select * from a;

        ID
----------
         1
         1
         1
         1
         1
         1
         1

已选择7行。

SQL> drop table a;

表已删除。

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
A                BIN$boXrYWw5RcmcrkCdWS/DaA==$0 TABLE        2010-07-09:10:21:00
SQL> flashback table a to before drop;

闪回完成。

SQL> select  * from a;

        ID
----------
         1
         1
         1
         1
         1
         1
         1

已选择7行。
2.如果要恢复的表在当前SCHEMA中已经存在同名的表,直接恢复会报错,此时使用rename to选项为待恢复的表重命名
SQL> drop table a;

表已删除。

SQL> create table a as select * from test;

表已创建。

SQL> flashback table a to before drop;
flashback table a to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用


SQL> flashback table a to before drop rename to b;

闪回完成。
3.如果同名的几张表都被删除,比如:先删除a,再创建一个a,然后再删除a。这时用flashback drop是按删除顺序恢复的,即先删除的表先恢复。当然我们同时也可以指定回收站中的名称恢复指定的表
SQL> flashback table "BIN$rKaoSvyRRluPbNyE2uGsSQ==$0" to before drop;

闪回完成。
注意:一定要加" ",另外被恢复表的关联对象,比如:索引,约束不会恢复到删除前的名称,而是系统自动生成的名称,物化视图不能恢复,清除回收站时先清除索引,因此在执行flashback drop后发现恢复出来的数据缺少索引很正常,flashback drop操作多张表时,要么都成功,要么都失败,flashback drop只能恢复drop命令删除的表

4.如果对一张表做过了许多操作(update,insert,delete),这时使用Flashback Query和Flashback Drop显然不行,这时使用flashback table ... to scn/timestamp恢复,被恢复的表必须启用row movement。
select row_movement from user_tables where table_name='B';
alter table b enable row movement;
注意:flashback table ... to scn/timestamp在执行时会自动disable掉与其操作的表相关的triggers,如果希望在此期间triggers能够继续发挥作用,可以在后面加上enable triggers;

认识和管理回收站
show recyclebin 只显示基表,相关联的对象不会显示
select * from recyclebin;
alter system set recyclebin=off;禁用recyclebin功能
drop table b purge;删除表并释放空间
purge table b;   从回收站将表b清除
purge recyclebin;清空回收站

闪回数据库
1.数据库必须处于归档模式(执行闪回数据库时,借助flashback log只能将数据恢复到某个指定时间点的状态,但该状态有可能并不是一致性的状态,要确保数据库处于一致性状态,就必须应用重做日志)
2.数据库必须指定flash recovery area
alter system set db_recovery_file_size=20g;
alter system set db_recovery_file_dest='d:\oradata\fra';
3. 数据库必须启动flashback database
select flashback_on,force_logging from v$database;
alter database flashback on; 该命令必须在mount模式下执行,并且数据库开归档

db_flashback_retention_target 控制flashback logs数据保留时间,受flash recovery area 大小制约
示例
SQL> show parameter db_recovery

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------
db_recovery_file_dest                string       d:\
db_recovery_file_dest_size           big integer 100M
SQL> archive log list;
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     1
下一个存档日志序列   1
当前日志序列           1
SQL> select flashback_on,force_logging from v$database;

FLASHBACK_ON       FOR
------------------ ---
YES                YES
SQL> select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 1694034

SQL> conn scott/scott
已连接。
SQL> drop table b purge;

表已删除。

SQL> drop table a purge;

表已删除。

SQL> conn / as sysdba
已连接。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size             331352964 bytes
Database Buffers          272629760 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。
SQL> flashback database to scn 1694034;

闪回完成。

接下来有2种方式修复数据库
1)直接alter database open resetlogs打开数据库,指定scn之后产生的数据都会丢失
2)先执行alter database open read only;然后立刻通过逻辑导出的方式将误操作表的数据导出,再执行recover database命令以重新应用数据库产生的redo,将数据修复到flashback database操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样不会有数据丢失。

SQL> alter database open resetlogs;

数据库已更改。

SQL> conn scott/scott
已连接。
SQL> desc a
 名称                                                                  
 ----------------------------------------------------------------------
 ID                                                                    
 VL                                                                    

SQL> desc b
 名称                                                                  
 ----------------------------------------------------------------------
 ID                                                                    

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22253646/viewspace-667664/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-02-26

  • 博文量
    70
  • 访问量
    157546