Oracle Flushback 学习测试
Oracle Flushback 学习测试:三思笔记
Flashback恢复
从9i开始,利用oracle查询的多版本一致的特点,实现从回滚段中读取一定时间内在表中操作的数据,被称为 flashback query,到10g,利用recycle(回收站)和flask recovery area(闪回区)的特性,来实现快速恢复被删除的表,甚至对整个db进行时间点的闪回,
1 闪回查询
Flashback query利用oracle的多版本读一致性从undo tablespace 中读取操作前的数据,
要使用闪回查询特性,必须启用自动撤销管理表空间,记录集的选择范围可以基于时间或者scn,甚至还可也查询记录在undo中的不同事物的前映像
1.1应用flashback query查询过去的数据
1.1.1基于时间的查询(as of timestamp)
创建一个表
create table t_flashback as
select rownum rn from dual connect by rownum<10
然后 delete from t_flashback
select * from t_flashback as of timestamp sysdate-5/1440—得出5分中前的数据
然后在
insert into t_flashback
select * from t_flashback as of timestamp sysdate-5/1440
1.1.2 基于scn的恢复(as of scn)
基于scn,先得到scn
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual
grant execute on DBMS_FLASHBACK to scott
-- select current_scn from v$database
恢复 select * from t_flashback as of scn 2412653
利用timestamp,也会转换成scn
desc sys.smon_scn_time—时间与scn的对应表
CREATE TABLE SYS.SMON_SCN_TIME
(
THREAD NUMBER,
TIME_MP NUMBER,
TIME_DP DATE,
SCN_WRP NUMBER,
SCN_BAS NUMBER,
NUM_MAPPINGS NUMBER,
TIM_SCN_MAP RAW(1200),
SCN NUMBER DEFAULT 0,
ORIG_THREAD NUMBER DEFAULT 0 /* for downgrade */
)
CLUSTER SYS.SMON_SCN_TO_TIME(THREAD)
NOCOMPRESS ;
在10g中,系统平均每3秒产生一次与系统时间对应的scn的匹配并存入SYS.SMON_SCN_TIME中,
可以手动转换
select timestamp_to_scn(sysdate) from dual—转换为scn
select to_char(scn_to_timestamp(2412364),'yyyy-mm-dd hh24:mi:ss') from dual
1.1.3 使用DBMS_FLASHBACK实现flashback query
1.2 应用dbms_flashback查询操作的事务
1.2.1 使用flashback version query 查询记录修改版本
通过version between能查看指定时间段内的undo表空间中记录的不同版本(只包括被提交的记录)
select rn,versions_startscn,versions_endscn,versions_operation,versions_xid from T_FLASHBACK versions between scn 2413982 and 2413988
ORA-30054: invalid upper limit snapshot expression
1.2.2 利用flashback version query查询事务信息
视图flashback_transaction_query
desc flashback_transaction_query
delete from t_flashback
commit
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual-- 2413988
获取scn
Grant select any TRANSACTION to scott
select XID,COMMIT_SCN,COMMIT_TIMESTAMP,OPERATION,UNDO_SQL
from FLASHBACK_TRANSACTION_QUERY q where q.xid in(
select versions_xid from T_FLASHBACK versions between scn 2413982 and 2414572)
结果
080020001F060000 2413986 2013-8-5 16:22:52 INSERT delete from "SCOTT"."T_FLASHBACK" where ROWID = 'AAANM8AAAAAAAAAAAA';
1.3 flashb query的注意事项
1.3.1自动撤销管理表空间
要使用flashback的相关特性,必须启用自动撤销管理表空间
是否启用了自动撤销表空间管理,有2个初始化参数
Undo_management:值为auto表示使用了自动撤销管理,为manul表示手动
select * from v$parameter where name like'%undo_management%'
Undo_tablespace:oracle db可以创建多个undo 表空间,不过同时只能使用一个,当上个参数为auto时,此参数用来指定当前使用的undo tablespace,
select *from dba_tablespaces where contents='UNDO'
select * from v$parameter where name like'%undo_tablespace%'
Undo的大小,直接影响到flashback的能力,
select * from v$parameter
undo_tablespace UNDOTBS1
undo_retention 900
select * from v$tablespace
select file#,name,bytes/1024/1024 from v$datafile
/u01/app/oracle/oradata/hongquan/undotbs01.dbf
1.3.2 undo_retention参数
用来指定undo段中数据保存的最短时间(默认900s),新事物的开始,undo被写满,则会覆盖以前的undo信息,没写满,时间过了也不会被覆盖,
只有在为undo指定了retention guarantee,在指定的日期之前不会覆盖undo的数据
Alter tablespace undo1 retention guarantee 打开
Alter tablespace undo1 retention noguarantee关闭
例如,procedure,在user_source中找到。
select * from DBA_source where type='PROCEDURE' AND NAME='P' --as of scn 2416811
select * from DBA_source as of scn 2416800 where type='PROCEDURE' AND NAME='P' conn / as sysdba
1.3.3 ddl的影响
修改并提交数据后,对该表做过ddl操作
Drop/modify列
Move表
Drop表(如果有partition)
Truncate table/partition 这些操作会令undo表空间中的撤销数据消失,这些操作对表使用后,进行flashback query操作会发生ora-01466
另外闪回查询也支持对远端数据访问select* from table@orcl as of tiemstamp/scn
create table test12 (b number)
insert into test12
values(10)
alter table test12 add(c number)
select * from test12 as of timestamp sysdate-2/24----undo中已经失效
10
10
2 flashback table 闪回表
10g中引入了recycle bin(回收站)主要针对被删除的表及关联的对象,trigger,index,constraint,被删除的对象并非真正的删除,先修改数据字典,将其改名放入recycle bin中
2.1 从recycle bin 中恢复
2.1.1 简单的删除恢复
drop table t_flashback
select * from recyclebin—查看被删掉的表
T_FLASHBACK DROP TABLE YYHHQQ 2013-08-05:15:34:36 2013-08-05:17:26:26
flashback table T_FLASHBACK to before drop---表被恢复
此时在recyclebin 中T_FLASHBACK已经消失
表关联的index也被恢复成功,但是名字需要改
Alter index xxx rename to xxx
create table test12 (b number)
insert into test12
values(10)
select * from test12
drop table test12
select * from recyclebin
flashback table TEST12 to before drop
drop table t_flashback
select * from recyclebin
flashback table t_flashback to before drop
select * from t_flashback
2.1.2 复杂的恢复
当恢复在oracle已经存在的表名,
flashback table T_FLASHBACK to before drop rename to T_FLASHBACK_OLD
2.1.3 从多次删除中恢复
flashback table T_FLASHBACK to before drop
flashback table T_FLASHBACK to before drop rename to T_FLASHBACK2最先删除的表最先被恢复
可以直接指定表名
Flashback table ‘xxxx’ to before drop
2.2 从undo中恢复
Flashback table T_FLASHBACK to scn 2416800 或者timestamp
----所有记录恢复到指定的状态
--select * from table1;
--select dbms_flashback.get_system_change_number from dual; 记录scn2416800
--select *from table1 as of scn 2416800
--flushback table table1 to scn 2416800
2.3 应用flashback table的注意事项
2.3.1 基于undo的恢复
基于undo的被恢复的表必须启用row movement
select row_movement from user_tables where table_name='T_FLASHBACK'
DISABLED/enabled
手动开启 alter table T_FLASHBACK enable row movement
手动关闭 alter table T_FLASHBACK disable row movement
基于undo表的恢复注意ddl的影响
可以手动enable triggers
可以恢复索引,但是统计信息不回恢复到指定时间段
基于undo的表恢复不支持:物化视图,系统表,远程表,对象表,嵌套表,表分区,子分区,聚簇表,高级队列
2.3.2 基于recycle bin的恢复
Flashback drop,手动恢复constraint
所操作的表必须是存在本地表空间管理中
被恢复的index 等要重命名
当删除表时,被依赖的物化视图也同时删除,恢复时,不能恢复物化视图
恢复时,缺失index等时数据文件空间不足
可以同时恢复多个表
Flashback drop只能恢复被drop的表
2..4 认识和管理recycle bin
2.4.1 查看recycle bin中的对象
Select * from recyclebin ;数据字典 user_recyclebin
Recycle bin中的内容允许访问,不能修改,
查询其一个表的内容
select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0"
recycle bin中的对象也能够支持flashback query,
select * from "BIN$72xmvC1tT7eKJxEZluwquA==$0" as of timestamp sysdate-1
2.4.2 recycle bin的管理
回收站的空间是有限的,主动触发回收站清除内容,就是回收站空间不足,
表空间无足够的空闲空间,并且没有新的扩展,
该表空间内要创建新的对象,需要分配空间
Recycle bin清除的远原则是先进先出。
2.4.3 主动清除recycle bin中的对象
1 修改初始化参数禁用或启用recycle bin
10g后新增的recyclebin,默认是开启,
SQL> show parameter recyclebin;
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
recyclebin string
on
Alter session set recyclebin=off;/on 设置为off后,所有drop的对象都不会存放在回收站中
2 删除时指定purge参数
当通过drop删除表时,默认不会把这个表所占用的空间给释放,
drop table T_FLASHBACK
select * from recyclebin
flashback table "BIN$yOxeoMpGQwmdgemrC0lD7Q==$0"to before drop
drop table T_FLASHBACK purge—后不存在recyclebin中
3 清除recyclebin中的现有对象
create table T_FLASHBACK(id number)
drop table T_FLASHBACK
select * from recyclebin
purge table T_FLASHBACK
或者 purge recyclebin
或者 purge tablespace yyhhqq
3 flashback database闪回数据库
Flashback database闪回数据库,可以把db恢复到指定的时间点,
3.1 认识flashback database
3.1.1 了解flashback database
常规备份是“备份+有效归档”,
从启用flashback database开始到当前那一刻,借助于flashback database,可以将db修复到这中间点的任意时刻,
3.1.2 原理
Oracle 引入了另外一个日志flashback logs,记录下操作执行前要修改的数据,即数据的前映像,这些信息被写入一个专门的区域(闪回区),
Oracle建议flash recovery area,能容纳下所有的(数据文件,控制文件,redo,备份文件,增量备份文件,以及尚未归档的文件,和flash logs),
3.1.3 必要条件
1 数据库必须处于归档模式
2 数据库必须知道了flash recovery area
flash recovery area 两个参数:db_recovery_file_dest 指定fra的路径,可以指定一个文件系统下的路径,或者asm磁盘组,不能指向裸设备,
db_recovery_file_dest_size:指定fra的大小
show parameter db_recover
SQL> show parameter db_recover;
NAME TYPE VALUE
------------------------------------ ---------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery
_area
db_recovery_file_dest_size big intege 2G
SQL> alter system set db_recovery_file_dest_size=4g;
System altered.
SQL> alter system set db_recovery_file_dest='f:\mydb\fra';
System altered.
3 数据库必须启动flashback on
select flashback_on from v$database
SQL> alter database flashback on;
alter database flashback on
*
ERROR at line 1:
ORA-38759: Database must be mounted by only one instance and not open.
要改变设置,db必须处于mount状态,并且已经打开了归档模式,
SQL> conn /as sysdba
Connected.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 109053520 bytes
Database Buffers 171966464 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
SQL> set time on-------多了一个进程
17:07:15 SQL> ho ps -ef|grep rvm
oracle 16473 21307 0 17:07 pts/0 00:00:00 /bin/bash -c ps -ef|grep rvm
4 初始化参数:db_flashback_retention_target
用来控制 flask logs的保留时间,或者希望flashback database最早恢复的时间点,默认1440分
select * from v$parameter where name='db_flashback_retention_target'(1天),
5 启用force logging
Force logging用来强制把所有操作都记录在redo中,
select force_logging from v$database
SQL> alter database force logging;
Database altered.
3.1.4 制约因素
1 flashback database用来恢复到某个时间点,不用于介质恢复,不能用flashback database恢复之前被删除的数据文件。
2 如果控制文件被重建,再次之前产生的所有的flashback logs统统失效,
3 不支持对数据库进行(shrink)操作后的恢复
3.2 flashback database示例
1 检查是否启用了fra
SQL> show parameter db_recover;
2 检查是否启用了归档
Sysdba
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5
3 检查是否启用了flashback on跟force logging
select force_logging ,flashback_on from v$database
4 查询当前scn
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual---- 2449174
5 模拟误操作
6 重做启动到mount状态
Shutdown immediate
Startup mount
Flashback database to scn 2449174
7 有2中方式修复数据库
1 直接alter database open resetlogs:指定scn后的数据全部丢失,方式数据处于不一致的状态
2 先执行alter database open read only,以read only模式打开数据库,然后立刻导出误操作的数据,再执行recover database以重新应用数据库产生的redo,将db修复到flashback database操作之前,
一、何时使用闪回技术
当 Oracle 数据库中发生了逻辑损坏时,如果您需要快速容易地恢复数据,就必须使用闪回技术。与发生人为错误的情况一样,很难标识受错误事务处理影响的对象和行。
使用闪回技术时,可诊断出错误是如何引入到数据库中的,然后可修复损坏的数据。您可以查看导致特定行修改的事务处理,查看某个时间段内指定行的整个版本集,或者
只查看过去特定时间显示的数据。幻灯片表中显示了闪回技术的典型用法。
闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其它所有功能都使用还原数据。并不是所有闪回功能都会修改数据库。有些功能只是一些用来查询数据
其它版本的方法。这些工具用来查看问题并帮助进行恢复。根据闪回查询结果,可执行下列其中一项操作:
确定执行哪种类型的数据库修改闪回操作来修复问题。
将这些查询结果集反馈到 INSERT、UPDATE 或 DELETE 语句以便于修复错误数据。
二、闪回数据库概要
使用闪回数据库时,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到较早的时间点。这个操作速度很快,因为不需要还原备份。
使用这个功能可撤消导致逻辑数据损坏的更改。如果数据库发生介质丢失或物理损坏,则必须使用传统恢复方法。
三、闪回数据库减少还原时间
闪回数据库比使用还原文件和重做日志文件的传统时间点恢复的速度要更快。随着数据库规模的增加,通过还原所有数据文件来执行传统的时间点恢复所需的时间长
度变得不太现实。使用闪回数据库时,因为不需要还原数据文件,所以恢复数据库的时间与需要回退的更改数目(而不是数据库大小)成比例。
闪回数据库是通过使用一类被称为闪回数据库日志的日志文件来实施的。Oracle 数据库会定期将数据块的“前像”记录在闪回数据库日志中。为了快速将数据文件更改
回退到捕获闪回日志的时间(就在所需目标时间之前),可以重用块图像。然后,应用重做日志文件中的更改来填充间隔。在快速恢复区中会自动创建和管理闪回数据库日志。
四、闪回数据库注意事项
在不能使用闪回数据库功能的情况下,必须使用不完全恢复操作将数据库返回到特定时间。闪回数据库操作完成后,可在只读模式下打开数据库,验证是否使用了正确
的目标时间或系统更改号 (SCN)。如果没有,可以再次闪回数据库,或者通过执行恢复操作来前滚数据库。因此,要撤消闪回数据库操作,必须向前恢复数据库。
注:闪回保留目标并不能绝对保证闪回可用。如果快速恢复区中必需存在的文件需要占用空间,可能会自动删除闪回日志。
五、闪回数据库限制
不能使用闪回数据库恢复自闪回目标时间以来已删除的数据文件。删除的数据文件会添加到控制文件中且标记为脱机,但是不会闪回。闪回数据库不能闪回自闪回目
标时间以来已收缩的数据文件。这种数据文件必须先脱机,才能执行闪回操作。
六、闪回数据库实施
使用FLASHBACK DATABASE可以恢复数据库到先前的某个时间点或者某个SCN号。在Oracle10g以前的版本中,要实现数据库恢复到过去某个时间点或者SCN号,
只能够通过数据库的不完全恢复实现。从Oracle 10g开始,可以使用FLASHBACK DATABASE实现。使用FLASHBACK DATABASE要比执行数据库系统的不完全恢复要快的多,但是需要对数据库做以下的配置:
1、数据库必须运行在归档模式下。
2、必须启用数据库的闪回功能。
3、必须配置初始化参数DB_FLASHBACK_RETENTION_TARGET。
注:db_flashback_retention_target参数是设定闪回数据的最长保存时间,单位是分钟;默认值是1440(60*24),即1天。
6.1 闪回操作的语法
FLASHBACK [STANDBY | DATABASE] [数据库名称] to SCN SCN号 | TIMESTAMP 时间表达式 | restore point 恢复点
6.2 配置闪回数据库选项
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> select name,log_mode,open_mode,flashback_on from v$database;
NAME LOG_MODE OPEN_MODE FLASHBACK_ON
--------- ------------ ---------- ------------------
MYORACLE ARCHIVELOG MOUNTED NO
当前闪回数据库的开关没有打开,需要设置打开闪回开关。设置FLASHBACK_ON必须将数据库加载到MOUNT状态进行。
SQL> alter database flashback on;
数据库已更改。
SQL> alter system set db_flashback_retention_target=3600;
系统已更改。
SQL> alter database open;
数据库已更改。
6.3 闪回到某个时间点
SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss')
from v$flashback_database_log;
TO_CHAR(OLDEST_FLAS
-------------------
2011-07-12 10:20:59
SQL> drop table scott.emp;
表已删除
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 92275368 bytes
Database Buffers 192937984 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> flashback database to timestamp to_date('2011-07-12 10:20:59','yyyy-mm-dd hh24:mi:ss');
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250
……………………
已选择14行。
6.4 闪回到某个系统更改号(SCN)
SQL> select oldest_flashback_scn from v$flashback_database_log;
OLDEST_FLASHBACK_SCN
--------------------
846734
SQL> truncate table scott.emp;
表被截断。
SQL> select * from scott.emp;
未选定行
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248600 bytes
Variable Size 96469672 bytes
Database Buffers 188743680 bytes
Redo Buffers 2945024 bytes
数据库装载完毕。
SQL> flashback database to scn 846734;
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-12月-80 800 20
7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
7521 WARD SALESMAN 7698 22-2月 -81 1250
………………
已选择14行。
七、Oracle数据库回收站
Oracle也有回收站,如果不小心drop掉了哪张表,或误删了记录,可以通过回收站闪回。首先查看回收站中有哪些对象被删除:
SQL> select * from recyclebin t;
主要字段有object_name、original_name、createtime、droptime,original_name就是你删除对象之前在oracle里面的名称,根据droptime我们可以找到当时你删除的版本的object_name,然后根据object_name就可以进行闪回。
SQL> flashback table "BIN$SxyIpbUaSlGWt9j/dEZEhw==$0" to before drop rename to gis_link;
注:object_name一定要用双引号括起来,而不是单引号。