基于Oracle闪回详解(必看篇)
oracle 9i 开始支持闪回,oracle10g开始全面支持闪回功能,oracle11g有所完善,为大家快速的恢复数据,查询历史数据提供了很大的便捷方法。
本文主要对oracle常用闪回使用做些详细介绍,其中对于不常用的事务和版本闪回,这里就不做介绍
一、oracle闪回概述
闪回级别 | 闪回场景 | 闪回技术 | 对象依赖 | 影响数据 |
数据库 | 表截断、逻辑错误、其他多表意外事件 | 闪回database | 闪回日志、undo | 是 |
drop | 删除表 | 闪回drop | 回收站(recyclebin) | 是 |
表 | 更新、删除、插入记录 | 闪回table | 还原数据,undo | 是 |
查询 | 当前数据和历史数据对比 | 闪回query | 还原数据,undo | 否 |
版本查询 | 比较行版本 | 闪回version query | 还原数据,undo | 否 |
事务查询 | 比较 | 闪回transaction query | 还原数据,undo | 否 |
归档 | ddl、dml | 闪回archive | 归档日志 | 是 |
二、oracle闪回使用详解
1、闪回开启
(1)开启闪回必要条件
a.开启归档日志
sql> archive log list; database log mode archive mode automatic archival enabled archive destination /home/u01/app/oracle/oradata/testdb/arch oldest online log sequence 844 next log sequence to archive 846 current log sequence 846 ##如未开启,在mount状态执行alter database archivelog;
b.设置合理的闪回区
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库可以回退的时间,单位为分钟,默认1440分钟(1天),实际取决于闪回区大小
(2)检查是否开启闪回
sql> select flashback_on from v$database; flashback_on ------------------ no
(3)开启闪回
a.开启归档
mount状态:alter database archivelog;
b.设置闪回区
sql> alter system set db_recovery_file_dest='/home/u01/app/oracle/fast_recovery_area' scope=both; system altered. sql> alter system set db_recovery_file_dest_size=60g scope=both; system altered. sql> alter system set db_flashback_retention_target=4320 scope=both; system altered.
c.开启flashback (10g在mount开启)
sql> alter database flashback on; database altered.
(4)确定闪回开启
sql> select flashback_on from v$database; flashback_on ------------------ yes
(5)关闭闪回
sql> alter database flashback off; database altered.
2、闪回使用
(1)闪回查询
闪回查询主要是根据undo表空间数据进行多版本查询,针对v$和x$动态性能视图无效,但对dba_、all_、user_是有效的
a.闪回查询
允许用户查询过去某个时间点的数据,用以重构由于意外删除或更改的数据,数据不会变化。
sql> select * from scott.dept; deptno dname loc ---------- -------------- ------------- accounting new york research dallas sales chicago operations boston sql> delete from scott.dept where deptno=40; row deleted. sql> commit; commit complete. sql> select * from scott.dept as of timestamp sysdate-10/1440; deptno dname loc ---------- -------------- ------------- accounting new york research dallas sales chicago operations boston sql> select * from scott.dept as of timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss'); deptno dname loc ---------- -------------- ------------- accounting new york research dallas sales chicago operations boston sql> select * from scott.dept as of scn 16801523; deptno dname loc ---------- -------------- ------------- accounting new york research dallas sales chicago operations boston
b.闪回版本查询
用于查询行级数据库随时间变化的方法
c.闪回事务查询
用于提供查看事务级别数据库变化的方法
(2)闪回表(update/insert/delete)
闪回表就是对表的数据做回退,回退到之前的某个时间点,其利用的是undo的历史数据,与undo_retention设置有关,默认是14400分钟(1天)
同样,sys用户表空间不支持闪回表,要想表闪回,需要允许表启动行迁移(row movement)
闪回表示例:
sql> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss'); flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss') error at line 1: ora-08189: cannot flashback the table because row movement is not enabled sql> select row_movement from dba_tables where table_name='dept' and owner='scott'; row_move -------- disabled sql> alter table scott.dept enable row movement; table altered. sql> flashback table scott.dept to timestamp to_timestamp('2017-12-14 16:20:00','yyyy-mm-dd hh24:mi:ss'); flashback complete. sql> select * from scott.dept; deptno dname loc ---------- -------------- ------------- accounting new york research dallas sales chicago operations boston sql> alter table scott.dept disable row movement; table altered.
(3)闪回drop(drop table)
当一个表被drop掉,表会被放入recyclebin回收站,可通过回收站做表的闪回。表上的索引、约束等同样会被恢复
不支持sys/system用户表空间对象,可通过alter system set recyclebin=off;关闭回收站功能
闪回drop示例:
sql> select * from t ; id name ---------- --------------------------------------- 2 4 sql> drop table t; table dropped. sql> show recyclebin; original name recyclebin name object type drop time ---------------- ------------------------------ ------------ ------------------- t bin$yeh2qcvzdjlguxyagqpnvq==$0 table 2017-12-14:15:02:06 sql> flashback table t to before drop; flashback complete. sql> select * from t; id name ---------- ------------------------------------- 2 4
备注:即使不开始flashback,只要开启了recyclebin,那么就可以闪回drop表。
但如果连续覆盖,就需要指定恢复的表名,如果已经存在表,则需要恢复重命名。
sql> show recyclebin; original name recyclebin name object type drop time ---------------- ------------------------------ ------------ ------------------- t bin$yeh2qcvddjlguxyagqpnvq==$0 table 2017-12-14:15:07:54 t bin$yeh2qcvcdjlguxyagqpnvq==$0 table 2017-12-14:15:07:27 sql> flashback table "bin$yeh2qcvcdjlguxyagqpnvq==$0" to before drop ; flashback complete. sql> show recyclebin; original name recyclebin name object type drop time ---------------- ------------------------------ ------------ ------------------- t bin$yeh2qcvddjlguxyagqpnvq==$0 table 2017-12-14:15:07:54 sql> flashback table t to before drop rename to tt; flashback complete.
(4)闪回数据库(truncate/多表数据变更)
数据库闪回必须在mounted状态下进行,基于快照的可以再open下进行闪回库
闪回数据库主要是将数据库还原值过去的某个时间点或scn,用于数据库出现逻辑错误时,需要open database resetlogs
a.全库闪回
数据库闪回示例
sql> select * from scott.emp; empno ename job mgr hiredate sal comm deptno ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- smith clerk 7902 1980-12-17 00:00:00 800 20 allen salesman 7698 1981-02-20 00:00:00 1600 300 30 ward salesman 7698 1981-02-22 00:00:00 1250 500 30 jones manager 7839 1981-04-02 00:00:00 2975 20 martin salesman 7698 1981-09-28 00:00:00 1250 1400 30 blake manager 7839 1981-05-01 00:00:00 2850 30 clark manager 7839 1981-06-09 00:00:00 2450 10 scott analyst 7566 1987-04-19 00:00:00 3000 20 king president 1981-11-17 00:00:00 5000 10 turner salesman 7698 1981-09-08 00:00:00 1500 0 30 adams clerk 7788 1987-05-23 00:00:00 1100 20 james clerk 7698 1981-12-03 00:00:00 950 30 ford analyst 7566 1981-12-03 00:00:00 3000 20 miller clerk 7782 1982-01-23 00:00:00 1300 10 rows selected. sql> truncate table scott.emp; table truncated. sql> shutdown immediate; database closed. database dismounted. oracle instance shut down. sql> startup mount; oracle instance started. total system global area 9.4067e+10 bytes fixed size 2263936 bytes variable size 9395242112 bytes database buffers 8.4557e+10 bytes redo buffers 112766976 bytes database mounted. sql> flashback database to timestamp to_timestamp('2017-12-14 14:12:46','yyyy-mm-dd hh24:mi:ss'); flashback complete. sql> alter database open resetlogs; database altered. sql> select * from scott.emp; empno ename job mgr hiredate sal comm deptno ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- smith clerk 7902 1980-12-17 00:00:00 800 20 allen salesman 7698 1981-02-20 00:00:00 1600 300 30 ward salesman 7698 1981-02-22 00:00:00 1250 500 30 jones manager 7839 1981-04-02 00:00:00 2975 20 martin salesman 7698 1981-09-28 00:00:00 1250 1400 30 blake manager 7839 1981-05-01 00:00:00 2850 30 clark manager 7839 1981-06-09 00:00:00 2450 10 scott analyst 7566 1987-04-19 00:00:00 3000 20 king president 1981-11-17 00:00:00 5000 10 turner salesman 7698 1981-09-08 00:00:00 1500 0 30 adams clerk 7788 1987-05-23 00:00:00 1100 20 james clerk 7698 1981-12-03 00:00:00 950 30 ford analyst 7566 1981-12-03 00:00:00 3000 20 miller clerk 7782 1982-01-23 00:00:00 1300 10 rows selected.
b.快照闪回
针对主库和备库都可以创建闪回快照点,然后恢复到指定的快照点,但主库一旦恢复到快照点,备库的同步则需要重新同步
sql> select * from scott.dept; deptno dname loc addr ---------- -------------- ------------- ------------------------------ accounting new york research dallas sales chicago sql> create restore point before_201712151111 guarantee flashback database; restore point created. sql> create table scott.t as select * from scott.dept; table created. sql> truncate table scott.t; table truncated. sql> shutdown immediate; database closed. database dismounted. oracle instance shut down. sql> startup mount; oracle instance started. total system global area 9.4067e+10 bytes fixed size 2263936 bytes variable size 9663677568 bytes database buffers 8.4289e+10 bytes redo buffers 112766976 bytes database mounted. sql> flashback database to restore point before_201712151111; flashback complete. sql> alter database open resetlogs; database altered. 此时主库scott.t已不存在: sql> select * from scott.t; select * from scott.t * error at line 1: ora-00942: table or view does not exist 此时从库的scott.依旧存在,主备同步终止 解决方案:在主库创建快照时间点,从库自动停止应用日志,等主库闪回后,重新应用日志即可。 如果已经做了上述操作,从库可以选择重建 alter database register logfile '/xx/xx/archive.dbf';
c.闪回snapshot standby
此功能在11gr2非常实用,可自动创建闪回点、开启闪回日志,可完成线上数据测试后,然后做数据库闪回恢复主备关系
select scn, storage_size ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,name from v$restore_point; select database_role,open_mode,db_unique_name,flashback_on from v$database; sql> set line 200; sql> set pagesize 2000; sql> select database_role,open_mode,db_unique_name,flashback_on from v$database; database_role open_mode db_unique_name flashback_on ---------------- -------------------- ------------------------------ ------------------ physical standby read only testdbms no sql> alter database convert to snapshot standby; database altered. sql> select database_role,open_mode,db_unique_name,flashback_on from v$database; database_role open_mode db_unique_name flashback_on ---------------- -------------------- ------------------------------ ------------------ snapshot standby mounted testdbms restore point only sql> alter database open; database altered. sql> select open_mode from v$database; open_mode -------------------- read write 此时备库操作: sql> select * from scott.emp; empno ename job mgr hiredate sal comm deptno ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- smith clerk 7902 1980-12-17 00:00:00 800 20 allen salesman 7698 1981-02-20 00:00:00 1600 300 30 ward salesman 7698 1981-02-22 00:00:00 1250 500 30 jones manager 7839 1981-04-02 00:00:00 2975 20 martin salesman 7698 1981-09-28 00:00:00 1250 1400 30 blake manager 7839 1981-05-01 00:00:00 2850 30 clark manager 7839 1981-06-09 00:00:00 2450 10 scott analyst 7566 1987-04-19 00:00:00 3000 20 king president 1981-11-17 00:00:00 5000 10 turner salesman 7698 1981-09-08 00:00:00 1500 0 30 adams clerk 7788 1987-05-23 00:00:00 1100 20 james clerk 7698 1981-12-03 00:00:00 950 30 ford analyst 7566 1981-12-03 00:00:00 3000 20 miller clerk 7782 1982-01-23 00:00:00 1300 10 rows selected. sql> truncate table scott.emp; table truncated. 主库操作: sql> create table scott.t as select * from scott.dept; table created. sql> select * from scott.t; deptno dname loc addr ---------- -------------- ------------- ------------------------------ accounting new york research dallas sales chicago 备库恢复到物理standby sql> shutdown immediate; database closed. database dismounted. oracle instance shut down. sql> startup mount; oracle instance started. total system global area 9.4067e+10 bytes fixed size 2263936 bytes variable size 9663677568 bytes database buffers 8.4289e+10 bytes redo buffers 112766976 bytes database mounted. sql> alter database convert to physical standby; database altered. sql> shutdown immediate; ora-01507: database not mounted oracle instance shut down. sql> startup ; oracle instance started. total system global area 9.4067e+10 bytes fixed size 2263936 bytes variable size 9663677568 bytes database buffers 8.4289e+10 bytes redo buffers 112766976 bytes database mounted. database opened. ##此时备库的数据已经恢复到转变snapshot standby时间点 sql> select database_role,open_mode,db_unique_name,flashback_on from v$database; database_role open_mode db_unique_name flashback_on ---------------- -------------------- ------------------------------ ------------------ physical standby read only testdbms no sql> select * from scott.emp; empno ename job mgr hiredate sal comm deptno ---------- ---------- --------- ---------- ------------------- ---------- ---------- ---------- smith clerk 7902 1980-12-17 00:00:00 800 20 allen salesman 7698 1981-02-20 00:00:00 1600 300 30 ward salesman 7698 1981-02-22 00:00:00 1250 500 30 jones manager 7839 1981-04-02 00:00:00 2975 20 martin salesman 7698 1981-09-28 00:00:00 1250 1400 30 blake manager 7839 1981-05-01 00:00:00 2850 30 clark manager 7839 1981-06-09 00:00:00 2450 10 scott analyst 7566 1987-04-19 00:00:00 3000 20 king president 1981-11-17 00:00:00 5000 10 turner salesman 7698 1981-09-08 00:00:00 1500 0 30 adams clerk 7788 1987-05-23 00:00:00 1100 20 james clerk 7698 1981-12-03 00:00:00 950 30 ford analyst 7566 1981-12-03 00:00:00 3000 20 miller clerk 7782 1982-01-23 00:00:00 1300 10 rows selected. sql> alter database recover managed standby database using current logfile disconnect; database altered. sql> select * from scott.t; deptno dname loc addr ---------- -------------- ------------- ------------------------------ accounting new york research dallas sales chicago sql> select database_role,open_mode,db_unique_name,flashback_on from v$database; database_role open_mode db_unique_name flashback_on ---------------- -------------------- ------------------------------ ------------------ physical standby read only with apply testdbms no
(5)闪回归档(增加、修改、重命名、删除表的列、truncate表、修改表的约束、以及修改分区表的分区规范)
3、闪回注意事项
(1)数据库闪回需要在mounted下进行,并且open时需要使用resetlogs
(2)闪回drop只能用于非系统表空间和本地管理的表空间,外键约束无法恢复,对方覆盖、重命名需注意
(3)表drop,对应的物化视图会被彻底删除,物化视图不会存放在recyclebin里
(4)闪回表,如果在做过dml,然后进行了表结构修改、truncate等ddl操作,新增/删除结构无法做闪回
(5)闪回归档,必须在assm管理tablespace和undo auto管理下进行
(6)注意闪回区管理,防止磁盘爆满,闪回区空间不足等
(7)主库做库的闪回,会影响备库,需要重新同步
(8)snapshot standby 不支持最高保护模式
三、备注
1、相关数据字典
v$flashback_database_log ##查看数据库可闪回的时间点/scn等信息 v$flashback_database_stat ##查看闪回日志空间记录信息
2、常用查询语句
(1)查看数据库状态
sql> select name,open_mode ,database_role,current_scn,flashback_on from v$database; name open_mode database_role current_scn flashback_on ------------- -------------------- ---------------- ----------- ------------------ testdb read write primary 16812246 yes
(2)获取当前数据库的系统时间和scn
sql> select to_char(systimestamp,'yyyy-mm-dd hh24:mi:ss') as sysdt , dbms_flashback.get_system_change_number scn from dual; sysdt scn ------------------- ---------- 2017-12-14 14:28:33 16813234
(3)查看数据库可恢复的时间点
sql> select * from v$flashback_database_log; oldest_flashback_scn oldest_flashback_ti retention_target flashback_size estimated_flashback_size -------------------- ------------------- ---------------- -------------- ------------------------ 16801523 2017-12-14 11:35:05 4320 104857600 244113408
(4)查看闪回日志空间情况
sql> select * from v$flashback_database_stat; begin_time end_time flashback_data db_data redo_data estimated_flashback_size ------------------- ------------------- -------------- ---------- ---------- ------------------------ 2017-12-14 14:34:53 2017-12-14 14:56:43 1703936 9977856 1487872 0
(5)scn和timestamp装换关系查询
select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
(6)查看闪回restore_point
select scn, storage_size ,to_char(time,'yyyy-mm-dd hh24:mi:ss') time,name from v$restore_point;
(7)闪回语句
a.闪回数据库
flashback database to timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');; flashback database to scn 16813234;
b.闪回drop
其中table_name可以是删除表名称,也可以是别名
flashback table table_name to before drop; flashback table table_name to before drop rename to table_name_new;
c.闪回表
flashback table table_name to scn scn_number; flashback table table_name to timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss');
d.闪回查询
select * from table_name as of timestamp to_timestamp('2017-12-14 14:28:33','yyyy-mm-dd hh24:mi:ss'); select * from scott.dept as of scn 16801523;
e.闪回快照
create restore point before_201712151111 guarantee flashback database; flashback database to restore point before_201712151111;
(7)闪回空间爆满问题处理
以上这篇基于oracle闪回详解(必看篇)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。