zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

oracle flashback详解2

Oracle 详解 Flashback
2023-09-27 14:28:18 时间
这部分的内容,其实早在10年年初就学习过,也记录了相关的笔记.但很多知识不用就慢慢被遗忘了.今天无意中听到同事在讨论问题:为什么删除了一个占用空间大的表后,表空间并没有释放呢? 

职业的原因,自己在想Oracle Drop table的过程是怎么实现的,是不是要做个跟踪看下.后来想起在10g后,Oracle有了Flashback的功能,删除表的时候会先放在RecycleBin中,并不真正的物理删除,所以表空间dba_free_space是不是不会有变化?

今天重新翻了下之前的笔记,并做了试验,发现dba_free_space也是会体现变化的,这是不是哪个环节理解上有问题,还需要再测试下

1 Flashback Database 架构

2 Flashback Database

3 Flashback Drop

4 Flashback Query and Flashback Table

5 小结
##################################################### 1、 Flashback Database 架构 ##################################################### Flashback Database 整个架构包括一个进程Recover Writer(RVWR)后台进程,Flashback Database Log日志和Flash Recovery Area 一旦数据库启用了Flash Database, RVWR进程会启动,RVWR进程会向Flash Recovery Area内写入Flashback Database Log, 这些日志包括数据块的"前镜像"
##################################################### 2 、Flashback Database ##################################################### 1 启用Flashback Database      1.1 配置Flash Recovery Area 1)启用Flash Recovery Area Alter system set db_recovery_file_dest_size=1G scope=both; Alter system set db_recovery_file_dest=/u01/backup/fb scope=both; 注意这个目录必须是Oracle:dba,属主
col name format a32 heading Parameter col value format a32 heading Setting select name, value from v$parameter where name like %flash% or name like %recovery% order by name;
2) 启用数据库Flashback功能 数据库必须处于归档模式 #重启数据库 startup mount(在Open下也可以打开) #检查有没有开启Flashback功能 select name, current_scn, flashback_on from v$database; #启动Flashback功能 alter database flashback on; #确认启动 select name, current_scn, flashback_on from v$database; #确认Flashback Log生成在/u01/backup/fb/目录下,该目录为OMF管理 oracle@Z810:/u01/backup/fb/MOUSE/flashback ll /u01/backup/fb/MOUSE/flashback total 8020 -rw-r-----  1 oracle dba 8200192 Aug  2 16:32 o1_mf_65f0nym9_.flb # 设置db_flashback_retention_target参数 Alter system set db_flashback_retention_target=1440 scope=both; 单位为分钟 如果/u01/backup/fb/目录下的空间不够保存一天的回退数据怎么办呢? Override; #打开数据库 Alter database open;
2 Flashback Database
1) 确认能够恢复的时间点 SQL desc v$flashback_database_log;  Name                                      Null?    Type  ----------------------------------------- -------- ----------------------------  OLDEST_FLASHBACK_SCN                               NUMBER  OLDEST_FLASHBACK_TIME                              DATE  RETENTION_TARGET                                          NUMBER  FLASHBACK_SIZE                                                NUMBER  ESTIMATED_FLASHBACK_SIZE                         NUMBER
OLDEST_FLASHBACK_SCN: 数据库能回退的最早SCN
OLDEST_FLASHBACK_TIME: 数据库能回退的最早时间

RETENTION_TARGET:当前系统设置参数

FLASHBACK_SIZE: Current size (in bytes) of the flashback data 当前的Flashback Log空间

ESTIMATED_FLASHBACK_SIZE: 为了达到Retention_target定义的要求,预计需要多大的空间,这个值用于指导设置Flash Recovery Area大小

这个会改变
2) Flashback database

Flashback Database 实际上是对数据库的一个不完全恢复操作,因此需要关闭数据库,重启数据库到Mount状态;但与不完全恢复不同的是,它不需要执行restore操作。

flashback之前,先对数据库做个备份 

#backup database;
#Shutdown immediate

#startup mount
#flashback database to timestamp to_timestamp(2010-08-02 17:10:04,yyyy-mm-dd hh24:mi:ss); 如何精确到找到恢复时间点呢?SCN_TO_TIMESTATMP()函数可以将SCN号转换成TimeStamp 如何找到某个操作的精确时间点,AUDIT?
#alter database open read only; #select count(*) from xxx; 确认数据被找回 #shutdown immediate; #Startup mount; #alter database open resetlogs; #backup database; 3 命令和视图
1) 检查是否启用了Flashback database 功能 Select flashback_on from v$database 2) v$flashback_database_log 这个视图用来描述Flashback log对Flash Recovery Area的占用情况 select * from v$flashback_database_log;
3) v$flashback_database_stat 这个视图用来对Flashback log的空间情况进行更细粒度的记录和估计
4) Flashback命令 这个命令既可以在SQL*Plus中使用,也可以在RMAN中使用,

Flashback [device type = device type ] database

to [before] scn = scn 

to [before] sequence = sequence [ thread = thread id ]

to [before] time =  data_string 

Oracle允许使用3种方式指定回退的时间点,SCN,时间,日志序列号,

TO     -- 代表回退到指定点

Before -- 代表恢复到指定点之前的一点就可以。

#####################################################

3 、Flashback Drop

#####################################################

这个功能是从Oracle 10g开始出现的,用于恢复用户误删的对象(表,索引)。这个技术依赖于Tablespace Recycle Bin(表空间回收).功能类似于Windows的回收站。

1 Tablespace Recycle Bin

从10g开始,每个表空间都会有一个叫作回收站的逻辑区域(占用表空间所在的空间),当用户执行Drop 命令时,被删除的表和表的关联对象(包括索引,约束,触发器,LOB段,LOB Index段)

不会被物理删除,而是先转移到回收站中,使用Flashback Table命令可以恢复这个对象和所有的关联对象。

不会物理清楚,是不是说明占用的物理空间仍没有释放,从dba_free_space能否反映空间的变化呢?

缺省情况下recyclebin功能是开启的

SQL show parameter recyclebin

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

recyclebin                           string      on

show recyclebin 查看Recyclebin的对象列表(注意 RecycleBin是表空间级的,每个表空间都对应一个RecycleBin对象池)

也可以通过视图来查看Recyclebin对象列表

select object_name, original_name from recyclebin;

既然是表空间级的,那这个语句反映的是哪个Recycelbin 池的内容呢?是执行语句的用户的默认表空间吧;

可以像查看普通表一样,查看Recycle Bin中的对象内容

select count(*) from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0";

对Recyclebin中的对象执行DDL/DML动作是不允许的.

SQL delete from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0";

delete from "BIN$jOLWvgYhgyXgQOYKHREVtA==$0"

            *

ERROR at line 1:

ORA-38301: can not perform. DDL/DML over objects in Recycle Bin

2 Flashback Drop 操作

flashback table t to before drop;

如果在recyclebin中有同名的对象,如两个表T都被删除,则恢复:

flashback table "BIN$jOLWvgYhgyXgQOYKHREVtA==$0" to before drop;

在恢复表的同时还可以重命名

flashback table t to before drop rename to t_bak;
Note: 一旦完成恢复,RecycleBin中的对象就消失 3 Recycle Bin的维护
Recycle Bin 是和普通对象共用表空间存储区域的,或者说RecycelBin的对象要和普通对象抢夺存储空间。如果发生空间不够,Oracle会按照先入先出的顺序, 也就是对象被删除的时间顺序覆盖Recycle Bin中的对象。也可以通过如下办法手动清除Recycle Bin占用的空间。 1) #清空某个表空间的RecycleBin池 Purge tablespace tablespace_name; 2) #清空某个表空间内的某个用户的对象 Purge tablespace tablespace_name user user_name; 3) 清除删除当前用户的对象 purge recyclebin 4) 清除所有用户的对象 Purge dba_recyclebin 需要Sysdba权限 5) Drop table xxx purge 永久删除 6) purge index object_name  清除对象的关联索引 4 Flashback Drop 的局限性
Flashback drop 是一个非常实用的技术,减少了很多不完全恢复的需要。 但仍存在一些局限性: 1) 只能用于非系统表空间和本地管理表空间 2) 不能对Recycle Bin中的对象执行DDL,DML操作,只支持查询 3)对象的参考约束不会被恢复,也就是外键约束需要重建  
##################################################### 4、 Flashback Query and Flashback Table ##################################################### 这些功能的实现也依赖于Flashback 功能的打开吗?是的; Flashback Query 实际包含3个工具,即Flashback Query, Flashback Version Query 和 Flashback Transaction Query. 这些工具都是利用Undo的内容来实现回退功能。 前两个属于分析工具,用于找出想要回退到的时间点,而Flashback Table才真正完成回退的操作。 1 Flashback Query #查询过去某个时间点时的数据 select * from emp as of timestamp to_timestamp(2010-08-03 10:55:15,yyyy-mm-dd hh24:mi:ss); # 恢复数据 Insert into emp select * from emp as of timestamp to_timestamp(2010-08-03 10:55:15,yyyy-mm-dd hh24:mi:ss);
2 Flashback Version Query 相对于Flashback Query只能看到某一点的对象状态,Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录如何变化的。 根据这个变化的历史,可以决断数据是在什么时间点发生了错误。
#查看表EMP的操作历史 col versions_xid format a16 heading XID col versions_startscn format 99999999 heading Vsn|Start|SCN col versions_endscn  format 99999999 heading Vsn|End|SCN col versions_operation format a12  heading Operation select versions_xid, versions_startscn, versions_endscn, decode( versions_operation, I, Insert, U, Update, D, Delete, Original) "operation", id, name from emp versions between scn minvalue and maxvalue; 注意结果主从下向上看。Original代表最开始的数据。 3 相关的伪列 1) ORA_ROWSCN 记录最后一次被修改时的SCN, 这里的修改是指"被提交的修改",如果没有提交,那么这个伪列不会发生变化。 ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的所有记录都是一个ORA_ROWSCN. 数据块内的任意一条记录被修改,这个数据块内的所有记录ORA_ROWSCN都会同时改变。 通过在建表时使用关键字rowdependencies, 可以改变这咱缺省行为。使用这个关键字后,每条记录都有自己的ORA_ROWSCN.
创建表时,如果没有使用rowdependencies关键字,则ORA_ROWSCN使用的是数据块头的SCN,因此在一个数据块内所有记录的ORA_ROWSCN都一样。 如果使用了rowdependencies关键字,则每个记录都有自己的ORA_ROWSCN。这个值来自于ITL或dscn字段。 2)VERSIONS_STARTSCN 表示这行记录获得的值是在哪个SCN获得的,如果为NULL,则表明这一行的值早于versions between scn MINVALUE and MAXVALUE中的MINVALUE。 3) VERSIONS_STARTTIME 4) VERSIONS_ENDSCN 这行记录的这个值是到哪个SCN过期的。 5) VERSIONS_TIME 6) VERSIONS_XID 导致事务修改的事务号 7) VERSIONS_OPERATION U: update I: insert D: delete 两个函数: SCN_TO_TIMESTAMP(current_scn) select current_scn,scn_to_timestamp(current_scn) curr_time  from v$database;
TIMESTAMP_TO_SCN(yyyy-mm-dd hh24:mi:ss1)
Notes 要使用Flashback Version Query, 用户首先要有对象的Select, flashback权限,对表执行过DDL语句之后,就只能查看DDL语句之后的版本, 也就是说Flashback Version Query 不会跨越DDL操作。 Oracle 11g有没有改变,如果可以跨越DDL的话,就可以作为小范围内的审计了;?? 4 Flashback Transaction Query Flashback Transaction Query 与Flashback Version Query类似,也是使用UNDO信息来实现,利用这个功能可以查看某个事务执行的所有变化。 使用这个功能,需要访问Flashback_transaction_query视图 select xid, operation, commit_scn, undo_sql from flashback_transaction_query where xid in( select versions_xid from emp versions between scn minvalue and maxvalue); XID              OPERATION                        COMMIT_SCN UNDO_SQL ---------------- -------------------------------- ---------- -------------------------------------------------------------------------------- 0500260003030000 INSERT                              2160333 delete from "GZDC"."EMP" where ROWID = AAANPcAAEAAAABUAAB; 0500260003030000 BEGIN                               2160333 0A00050086020000 INSERT                              2160316 delete from "GZDC"."EMP" where ROWID = AAANPcAAEAAAABUAAA; 0A00050086020000 INSERT                              2160316 delete from "GZDC"."DEP" where ROWID = AAANPbAAEAAAABMAAA; 0A00050086020000 BEGIN                               2160316
可以看到每个事务的操作历史。
5 Flashback table Flashback table 真正进行数据的回退。 如果想对表进行Flashback,必须允许row movement. alter table t1 enable row movement; flashback table emp,dep to scn xxxx;
6 UNDO Retention UNDO_RETENTION参数定义的是提交修改后的UNDO记录还要保留多长时间,但是Oracle并不强制保留,如果UNDO空间不够,即使时间没有达到限制,这些记录还是会被覆盖。 可以通过在UNDO表空间或者数据库设置Retention Guanrantee来强制保留,缺省没有打开这个功能。
select tablespace_name, retention from dba_tablespaces; TABLESPACE_NAME                RETENTION ------------------------------ ----------- SYSTEM                         NOT APPLY UNDOTBS1                       NOGUARANTEE SYSAUX                         NOT APPLY TEMP                           NOT APPLY USERS                          NOT APPLY alter tablespace UNDOTBS1 retention guarantee; SQL select tablespace_name, retention from dba_tablespaces; TABLESPACE_NAME                RETENTION ------------------------------ ----------- SYSTEM                         NOT APPLY UNDOTBS1                       GUARANTEE SYSAUX                         NOT APPLY TEMP                           NOT APPLY USERS                          NOT APPLY 即使强制后,如果空间出现不够时,如何处理? ##################################################### ##################################################### Flashback 家族技术总结: 工具 -- 相关技术 -- 目的 1) Flashback database -- Flashback Log -- 回滚数据库 2) Flashback drop -- Tablespace Bin -- 恢复用户误删的对象 3) Flashback Version Query -- UNDO -- 恢复用户误删的操作 4) Flashback Transaction Query -- UNDO -- 恢复用户误删的操作 5) Flashback table -- UNDO -- 恢复用户误删的操作,在表级别上的操作