首页 > Linux操作系统 > Linux操作系统 > Flashback学习
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/ ,如需转载,请注明出处,否则将追究法律责任。