Oracle 六闪回技术,flashback
Flashback 技术基于Undo segment基于内容的, 因此,限制UNDO_RETENTON参数。
要使用flashback 特征,您必须启用自己主动撤销管理表空间。
在Oracle 11g内部和外部使用的新功能:Oracle Flashback Data Archive.
FDA通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo差别开来,
这样就能够为闪回归档区单独设置存储策略,使之能够闪回到指定时间之前的旧数据而不影响undo策略。
在Oracle 10g中, Flash back家族分为下面成员:
Flashback Database。
Flashback Drop,
Flashback Query(分Flashback Query,Flashback Version Query。
Flashback Transaction Query 三种)
和Flashback Table。
Oracle 11g中闪回新特性 :闪回归档
1 闪回恢复区(Flashback Recovery Area)
在oracle 9i中引入flashback查询,以便能在须要的时候查到过去某个时刻的一致性数据,
依赖于undo表空间存储的信息来闪回查询曾经的版本号,当然这个受限于undo表空间的大小,
以及保留策略。假设undo 被覆盖了就不能进行查询。
oracle10g中增强了闪回查询的功能,而且提供了将整个数据库回退到过去某个时刻的能力,
这是通过引入一种新的flashback log实现的。
flashback log有点类似redo log。
仅仅只是redo log将数据库往前滚,flashback log则将数据库往后滚。
为了保存管理和备份恢复相关的文件,oracle10g提供了一个叫做闪回恢复区(Flashback recovery area)。
这个区域默认创建在oracle_base文件夹下。 能够将全部恢复相关的文件。
比方flashback log,archive log,backup set等。放到这个区域集中管理。
1.1 设置闪回恢复区
闪回恢复区主要通过3个初始化參数来设置和管理:
db_recovery_file_dest:指定闪回恢复区的位置
db_recovery_file_dest_size:指定闪回恢复区的可用空间大小
db_flashback_retention_target:指定数据库能够回退的时间。单位为分钟,
默认1440分钟。也就是一天。
当然。实际上可回退的时间还决定于闪回恢复区的大小,
由于里面保存了回退所须要的flash log。
所以这个參数要和db_recovery_file_dest_size配合改动。
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=3g SCOPE=BOTH;
System altered.
SQL> ALTER SYSTEM SET db_recovery_file_dest=' D:/app/Administrator/flash_recovery_area ' SCOPE=BOTH;
System altered.
SQL> show parameter db_recovery_file_dest
NAME TYPE VALUE
--------------------------- ----------- ------------------------------
db_recovery_file_dest string D:/app/Administrator/flash_recovery_area
db_recovery_file_dest_size big integer 3852M
SQL> show parameter db_flashback
NAME TYPE VALUE
---------------------------- -------- ------------------------------
db_flashback_retention_target integer 1440
我们看到db_flashback_retention_target 默认是1440分钟,即24 小时。
须要注意的是该參数尽管未直接指定flash recovery area大小。但却受其制约,
举个样例假如数据库每天有10%左右的数据变动的话,假设该初始化參数值设置为1440,
则flash recovery area 的大小至少要是当前数据库实际容量的10%。
假设该初始化參数设置为2880,则flash recovery area 的大小就至少是数据库所占容量的20%。
改动该參数:
SQL>alter system set db_flashback_retention_target=2880 scope=both;
1.2 取消闪回恢复区
将db_recovery_file_dest參数设置为空,能够停用闪回恢复区。
假设已经启用flashback database。则不能取消闪回恢复区。
SQL> alter system set db_recovery_file_dest='';
alter system set db_recovery_file_dest=''
*
第 1 行出现错误:
ORA-02097: 无法改动參数, 由于指定的值无效
ORA-38775: 无法禁用恢复区 - 闪回数据库已启用
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 849530880 bytes
Fixed Size 1377896 bytes
Variable Size 637536664 bytes
Database Buffers 205520896 bytes
Redo Buffers 5095424 bytes
数据库装载完成。
SQL> alter database flashback off;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> alter system set db_recovery_file_dest='';
系统已更改。
SQL> show parameter db_recovery_file_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string
db_recovery_file_dest_size big integer 3852M
SQL>
注意:
(1)DB_RECOVERY_FILE_DEST_SIZE 仅仅有在 DB_RECOVERY_FILE_DEST 清空之后才干够清空。
(2)初始化參数 db_recovery_file_dest_size 的设定有一点点须要注意的地方:
文件的第0块和操作系统数据块头的空间大小不包括在内,该參数并不代表实际占用的空间大小。
假设空间被压缩、镜像、RAID 的话,该參数的值意义是不一样的
1.3 闪回恢复区的内容
全部和恢复相关的文件都能够存放到闪回恢复区
TEST@orcl2> select file_type from v$flash_recovery_area_usage;
FILE_TYPE
--------------------
CONTROL FILE
REDO LOG
ARCHIVED LOG
BACKUP PIECE
IMAGE COPY
FLASHBACK LOG
FOREIGN ARCHIVED LOG
7 rows selected.
上面视图中查询的结果列出的全部类型的文件。都能够利用闪回恢复区来存放、管理。
在一些 10g 的动态视图里( V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY 等 )
的新的列 IS_RECOVERY_DEST_FILE ,指明相关的文件是否在恢复区内。
TEST@orcl2> col is_recovery_dest_file for a25
TEST@orcl2> SELECT recid, blocks, is_recovery_dest_file
FROM v$archived_log
WHERE recid < 5;
RECID BLOCKS IS_RECOVERY_DEST_FILE
---------- ---------- -------------------------
1 61856 YES
2 1 YES
3 1 YES
4 87577 YES
1.4 闪回恢复区的一些限制
假设设置了闪回恢复区,则log_archive_dest和log_archive_duplex_dest将不可用。
SQL> alter system set log_archive_dest='e:/' ;
alter system set log_archive_dest='e:/'
*
第 1 行出现错误:
ORA-02097: 无法改动參数, 由于指定的值无效
ORA-16018: 无法将 LOG_ARCHIVE_DEST 与 LOG_ARCHIVE_DEST_n 或
DB_RECOVERY_FILE_DEST 一起使用
SQL> alter system set log_archive_duplex_dest='e:/';
alter system set log_archive_duplex_dest='e:/'
*
第 1 行出现错误:
ORA-02097: 无法改动參数, 由于指定的值无效
ORA-16018: 无法将 LOG_ARCHIVE_DUPLEX_DEST 与 LOG_ARCHIVE_DEST_n 或
DB_RECOVERY_FILE_DEST 一起使用
说明:
设置闪回恢复区后,假设没有设置过log_archive_dest_n參数,则归档日志默认是保存到该区域的。
实际上,oracle是通过隐式的设置log_archive_dest_10='location=USE_DB_RECOVERY_FILE_DEST'
来实现的。所以,假设改动过log_archive_dest_n将归档日志保存到其它位置,
也能够改动该參数继续使用闪回恢复区。
多个数据库的闪回恢复区能够指定到同一个位置,可是db_name不能一样。或者db_unique_name不一样。
RAC的闪回恢复区必须位于共享磁盘上,能被全部实例訪问。
上述说明适用于单节点上有多个数据库时的情况。
1.5 闪回恢复区的空间管理
闪回恢复区中加入或删除文件等变化都将记录在数据库的 alert 日志中,
Oracle 10g 也针对该新特性提供了一个新的视图。 DBA_OUTSTANDING_ALERTS,
通过该视图能够得到相关的信息。
SYS@orcl2> desc dba_outstanding_alerts;
Name Null? Type
----------------------------------------- -------- ----------------------------
SEQUENCE_ID NUMBER
REASON_ID NOT NULL NUMBER
OWNER VARCHAR2(30)
OBJECT_NAME VARCHAR2(513)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_TYPE VARCHAR2(64)
REASON VARCHAR2(4000)
TIME_SUGGESTED TIMESTAMP(6) WITH TIME ZONE
CREATION_TIME TIMESTAMP(6) WITH TIME ZONE
SUGGESTED_ACTION VARCHAR2(4000)
ADVISOR_NAME VARCHAR2(30)
METRIC_VALUE NUMBER
MESSAGE_TYPE VARCHAR2(12)
MESSAGE_GROUP VARCHAR2(64)
MESSAGE_LEVEL NUMBER
HOSTING_CLIENT_ID VARCHAR2(64)
MODULE_ID VARCHAR2(64)
PROCESS_ID VARCHAR2(128)
HOST_ID VARCHAR2(256)
HOST_NW_ADDR VARCHAR2(256)
INSTANCE_NAME VARCHAR2(16)
INSTANCE_NUMBER NUMBER
USER_ID VARCHAR2(30)
EXECUTION_CONTEXT_ID VARCHAR2(128)
ERROR_INSTANCE_ID VARCHAR2(142)
在闪回恢复区中的空间使用超过 85% 的时候,数据库将会向 alert 文件里写入告警信息。
而当超过 97% 的时候将会写入严重告警信息。
当闪回恢复区空间不够的时候,
Oracle将报告例如以下类似的错误:
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 52428800 bytes disk space from 1258291200 limit
这个时候查询 dba_outstanding_alerts:
SQL> select reason,object_type,suggested_action from dba_outstanding_alerts;
REASON OBJECT_TYPE SUGGESTED_ACTION
------------------------------ -------------------- ----------------------------------------
db_recovery_file_dest_size of RECOVERY AREA Add disk space and increase db_recovery_
1258291200 bytes is 88.20% use file_dest_size, backup files to tertiary
d and has 148509184 remaining device, delete files from recovery area
bytes available. using RMAN, consider changing RMAN rete
ntion policy or consider changing RMAN a
rchivelog deletion policy.
同一时候。oracle在alert中还会给出解决该问题的建议
************************************************************************
You have following choices to free up space from flash recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMANB ACKUP RECOVERY AREA
command.
3. Add disk space and increase db_recovery_file_dest_size parameter to reflect
the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating system
command was used to delete files, then use RMAN CROSSCHECK
and DELETE EXPIRED commands.
************************************************************************
V$RECOVERY_FILE_DEST视图 包括闪回恢复区的相关信息:
SYS@orcl2> desc v$recovery_file_dest;
Name Null?
Type
----------------------------------------- -------- ----------------------------
NAME VARCHAR2(513)
SPACE_LIMIT NUMBER
SPACE_USED NUMBER
SPACE_RECLAIMABLE NUMBER
NUMBER_OF_FILES NUMBER
SYS@orcl2> col name for a5
SYS@orcl2> select * from v$recovery_file_dest;
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----- ----------- ---------- ----------------- ---------------
+FRA 4621074432 620756992 0 33
通过查询视图v$flash_recovery_area_usage。能够获得当前闪回恢复区的空间使用情况,
而且能够知道是哪些文件占中了空间。据此能够做出对应的处理,或者加大闪回恢复区,
或者移走对应的文件。
SYS@orcl2> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
CONTROL FILE .41 0
1
REDO LOG 4.63 0
4
ARCHIVED LOG 3.72 0
24
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
BACKUP PIECE 0 0
0
IMAGE COPY 0 0
0
FLASHBACK LOG 4.63 0
4
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
FOREIGN ARCHIVED LOG 0 0
0
7 rows selected.
假设闪回恢复区空间耗尽。且归档路径设置到了闪回恢复区中,则因为日志无法归档。
数据库会hang住。所以,对于生产库。假设将归档放到闪回恢复区中,
须要密切关注闪回恢复区的空间使用情况。否则一旦闪回恢复区的空间用尽,
将导致数据库无法提供服务。
因此,应该将闪回区的使用情况列入dba日常巡检工作中。
1.6 Flash Recovery Area空间不足导致DB不能打开或hang住处理方法
在上面讲到,当归档文件夹设置在闪回恢复区。而且闪回恢复区又满了的情况下。
DB 就会无法归档而hang住或者无法打开。
这样的情况下打开数据库会遇到例如以下错误信息:
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-16014: 日志 2 的序列号 27 未归档, 没有可用的目的地
ORA-00312: 联机日志 2 线程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'
SQL> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:/oracle/product/10.2.0/flash_recovery_area
db_recovery_file_dest_size big integer 2G
SQL> alter system archive log current;
alter system archive log current
*
第 1 行出现错误:
ORA-01109: 数据库未打开
SQL> alter system switch logfile;
alter system switch logfile
*
第 1 行出现错误:
ORA-01109: 数据库未打开
SQL> shutdown immediate;
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 201326592 bytes
Fixed Size 1248092 bytes
Variable Size 88081572 bytes
Database Buffers 109051904 bytes
Redo Buffers 2945024 bytes
数据库装载完成。
ORA-16038: 日志 2 序列号 27 无法归档
ORA-19809: 超出了恢复文件数的限制
ORA-00312: 联机日志 2 线程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-16014: 日志 2 的序列号 27 未归档, 没有可用的目的地
ORA-00312: 联机日志 2 线程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'
通过添加闪回恢复区大小。我们能够正常打开数据库
SQL> show parameter db_recovery
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string D:/oracle/product/10.2.0/flash_recovery_area
db_recovery_file_dest_size big integer 2G
SQL> alter system set db_recovery_file_dest_size=3G scope=both;
系统已更改。
SQL> alter database open;
数据库已更改。
检查一下flash recovery area的使用情况:
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 6.36 0 4
BACKUPPIECE .22 0 1
IMAGECOPY 63.68 0 5
FLASHBACKLOG .51 .25 2
已选择6行。
SQL>
计算flash recovery area已经占用的空间:
SQL> select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)*3/100
-----------------------------
2.1231
--在11.2以后,v$flash_recovery_area_usage已经被v$recovery_area_usage代替。
能够看到,这里已经有2.1231G使用了,这说明我们刚開始设置的db_recovery_file_dest_size=2G不足,
导致online redo log无法归档。在这里,我们通过设置db_recovery_file_dest_size參数,
增大了flash recovery area来解决问题。
添加Flash recovery area 是一种解决方法,也能够将归档指定到其它的文件夹来解决问题。
或者删除备份中的obsolete备份,都能够解决这个问题。
1.7 Flash Recovery Area 的备份
备份命令是Flash recovery Area,该命令是Oracle 10g以后才有的。
10g引进了flash recovery area,同一时候在rman备份中支持对该区域的备份。
在9i中oracle引入flashback查询,依赖于undo表空间存储的信息来闪回查询曾经的版本号。
当然这个受限于undo表空间的大小。以及保留策略。
在10g中oracle又引入了新的flashback功能,使用了flash recovery area来存储flashback 1og等等。
这个区域默认创建在oracle_base文件夹下。
在当中能够存放备份集、镜像拷贝、归档日志、自己主动备份的控制文件以及spfile和flashback logs。
存放位置和大小由參数db_recovery_file_dest和db_recovery_file_dest_size决定。
默认情况数据库的flashback database是关闭。能够在mount exclusive状态下打开。
看一下Oracle 官方文档上的几段文字:
To free space in the FRA we could do take a backup of the Flash Recovery Area using the
command BACKUP RECOVERY AREA.This command will take the backup of all the files in the
FRA to tape only. After this the space occupied by the files in the FRA will be
marked as reclaimable。
the larger the fast recovery area, the more useful it is. Ideally, the fast recovery
area should be large enough for copies of the data files, control files, online
redo log files, and archived redo log files needed to recover the database,
and also the copies of these backup files that are kept based on the retention policy.
The Flash Recovery Area is a unified storage location for all recovery-related files
and activities in an Oracle Database. It includes Control File, Archived Log Files,
Flashback Logs, Control File Autobackups, Data Files, and RMAN files.
从上面的几段话。我们能够得到一下信息:
(1) BACKUP RECOVERY AREA 命令仅仅能备份到磁带上。
在磁盘上备份会报例如以下错误:
RMAN> BACKUP RECOVERY AREA;
启动 backup 于 12-8月 -10
使用目标数据库控制文件替代恢复文件夹
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=15 设备类型=DISK
说明与资料档案库中的不论什么归档日志都不匹配
说明与资料档案库中的不论什么数据文件副本都不匹配
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: backup 命令 (在 08/12/2010 13:50:10 上) 失败
RMAN-06603: 必须在磁盘设备上使用 RECOVERY AREA, RECOVERY FILES 或 DB_RECOVERY_FILE_DEST 指定 TO DESTINATION 选项
(2) Flash recovery area 包括内容:控制文件,归档文件,flashback logs, 控制文件,
自己主动备份的控制文件,数据文件,数据文件拷贝,RMAN 文件(包含备份集,镜像备份)。
(3) BACKUP RECOVERY AREA 将备份全部Flash recovery area中的内容。
2 Flashback Database
2.1 Flashback Database 说明
Flashback Database 功能很类似与RMAN的不全然恢复,
它能够把整个数据库回退到过去的某个时点的状态。
这个功能依赖于Flashback log 日志。 比RMAN更高速和高效。
因此Flashback Database 能够看作是不全然恢复的替代技术。
但它也有某些限制:
(1)Flashback Database 不能解决Media Failure。 这样的错误RMAN恢复仍是唯一选择。
(2)假设删除了数据文件或者利用Shrink技术缩小数据文件大小,
这时不能用Flashback Database技术回退到改变之前的状态,
这时候就必须先利用RMAN把删除之前或者缩小之前的文件备份restore 出来,
然后利用Flashback Database 运行剩下的Flashback Datbase。
(3)假设控制文件是从备份中恢复出来的,或者是重建的控制文件。
也不能使用Flashback Database。
(4)使用Flashback Database锁能恢复到的最早的SCN,
取决于Flashback Log中记录的最早SCN。
2.2 Flashback Database 架构
Flashback Database 整个架构包含一个进程Recover Writer(RVWR)后台进程。
Flashback Database Log日志 和Flash Recovery Area。
一旦数据库启用了Flashback Database, 则RVWR进程会启动。
该进程会向Flash Recovery Area中写入Flashback Database Log,
这些日志包含的是数据块的 " 前镜像(before image)",
这也是Flashback Database 技术不全然恢复块的原因。
[oracle@rac1 ~]$ ps -ef|grep rvwr
oracle 6326 1 0 10:36 ? 00:00:00 ora_rvwr_orcl1
[oracle@rac2 ~]$ ps -ef|grep rvwr
oracle 6474 1 0 10:36 ? 00:00:00 ora_rvwr_orcl2
2.3 启用Flashback Database 步骤
数据库的Flashback Database功能缺省是关闭的,要想启用这个功能。就须要做例如以下配置。
2.3.1 配置Flash Recovery Area
这个參考1.1 节的配置。
2.3.2 启动flashback database
默认情况数据库的flashback database是关闭。
能够在mount exclusive状态下打开。
在设置了闪回恢复区后,能够启动闪回数据库功能。
SYS@orcl2> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 12
Next log sequence to archive 13
Current log sequence 13
SYS@orcl2> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@orcl2> startup mount'
SP2-0714: invalid combination of STARTUP options
SYS@orcl2> startup mount;
ORACLE instance started.
Total System Global Area 835104768 bytes
Fixed Size 2257840 bytes
Variable Size 603982928 bytes
Database Buffers 226492416 bytes
Redo Buffers 2371584 bytes
Database mounted.
SQL> alter database flashback on;
数据库已更改。
SYS@orcl2> alter database open;
Database altered.
SYS@orcl2> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
2.4 Flashback Database操作演示样例
做操作前先备份数据库:
RMAN> backup database;
2.4.1 检查是否启动了flash recovery area
SQL> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest tring D:/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 1G
2.4.2 检查是否启用了归档
SQL> archive log list;
数据库日志模式 存档模式
自己主动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 9
下一个存档日志序列 11
当前日志序列 11
2.4.3 检查是否启用了flashback database
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
2.4.4 查询当前的scn
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
947921
2.4.5 查询当前的时间
SQL> select to_char(sysdate,'yy-mm-dd hh24:mi:ss') time from dual;
TIME
-----------------
09-10-14 14:37:05
2.4.6 删除表A
SQL> select * from A;
ID NAME
---------- ----------
1 tianlesoftware
2 dave
SQL> drop table A;
表已删除。
SQL> commit;
2.4.7 重新启动DB 到mount
Flashback Database 实际是对数据库的一个不全然恢复操作。
由于须要关闭数据库重新启动到mount状态
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 209715200 bytes
Fixed Size 1248116 bytes
Variable Size 79692940 bytes
Database Buffers 121634816 bytes
Redo Buffers 7139328 bytes
数据库装载完成。
2.4.8 运行恢复:分timestamp 或者SCN两种
SQL> Flashback database to timestamp to_timestamp('09-10-14 14:37:05','yy-mm-dd hh24:mi:ss');
闪回完毕。
或者:
SQL> Flashback database to scn 947921;
闪回完毕。
2.4.9 打开数据库
在运行完flashback database 命令之后。oracle 提供了两种方式让你修复数据库:
1). 直接alter database open resetlogs 打开数据库。当然。指定scn 或者timestamp 时间点之后
产生的数据统统丢失。
2). 先运行alter database open read only 命令,以read-only 模式打开数据库,
然后立马通过逻辑导出的方式将误操作涉及表的数据导出,再运行recover database
命令以又一次应用数据库产生的redo。将数据库修复到flashback database 操作前的状态。
然后再通过逻辑导入的方式,将之前误操作的表又一次导入。这种话对现有数据的影响最小,
不会有数据丢失。
这里演示,就以resetlogs方式打开:
SQL> alter database open resetlogs;
数据库已更改。
验证数据:
SQL> select * from A;
ID NAME
---------- ----------
1 tianlesoftware
2 dave
2.5 和Flashback Database 相关的3个视图
2.5.1 V$database
这个视图能够查看是否启用了Flashback database功能
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
2.5.2 V$flashback_database_log
Flashback Database 所能回退到的最早时间,取决与保留的Flashback Database Log 的多少。
该视图就能够查看很多实用的信息。
Oldest_flashback_scn / Oldest_flashback_time : 这两列用来记录能够恢复到最早的时点
Flashback_size: 记录了当前使用的Flash Recovery Area 空间的大小
Retention_target: 系统定义的策略
Estimated_flashback_size: 依据策略对须要的空间大小的预计值
SQL> select oldest_flashback_scn os, to_char(oldest_flashback_time,'yy-mm-dd hh24:mi:ss') ot, retention_target rt,flashback_size fs, estimated_flashback_size es
from v$flashback_database_log;
OS OT RT FS ES
---------- ----------------- ---------- ---------- ----------
1150657 14-07-01 10:18:39 1440 209715200 0
2.5.3 V$flashback_database_stat
这个视图用来对Flashback log 空间情况进行更细粒度的记录和预计。
这个视图以小时为单位记录单位时间内数据库的活动量:
Flashback_Data 代表Flashback log产生数量。
DB_Date 代表数据改变数量,
Redo_Date代表日志数量,
通过这3个数量能够反映出数据的活动特点。更准确的估计Flash Recovery Area的空间需求
SQL> alter session set nls_date_format='hh24:mi:ss';
会话已更改。
SQL> select *from v$flashback_database_stat;
BEGIN_TI END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE
-------- -------- -------------- ---------- ---------- ------------------------
14:43:10 15:15:28 6455296 29310976 3898368 0
3 Flashback Drop
Flashback Drop 是从Oracle 10g 開始出现的。用于恢复用户误删除的对象(包含表,索引等),
这个技术依赖于Tablespace Recycle Bin(表空间回收站),这个功能和windows的回收站很类似。
Flashback 不支持sys用户. system表空间下的对象。也不能从回收站里拿到。
故使用SYS 或者SYSTEM用户登陆时, show recyclebin 为空。
Flashback Drop 是基于Tablespace RecycleBin 来实现恢复的。
它仅仅支持闪回与table 相关连的对象。比方表。索引。约束,触发器等。
假设是函数或者存储过程等。就须要使用Flashback Query来实现。
3.1 Tablespace Recycle Bin
从Oracle 10g 開始, 每一个表空间都会有一个叫作回收站的逻辑区域,当用户运行drop命令时,
被删除的表和表的关联对象( 包含索引。 约束,触发器,LOB段,LOB index 段) 不会被物理删除。
这些对象先转移到回收站中。这就给用户提供了一个恢复的可能。
When you drop a table, the database does not immediately remove the space associated
with the table. The database renames the table and places it and any associated
objects in a recycle bin, where, in case the table was dropped in error,
it can be recovered at a later time. This feature is called Flashback Drop,
and the FLASHBACK TABLE statement is used to restore the table. Before discussing
the use of the FLASHBACK TABLE statement for this purpose, it is important to
understand how the recycle bin works, and how you manage its contents.
The recycle bin is actually a data dictionary table containing information about
dropped objects. Dropped tables and any associated objects such as indexes,
constraints, nested tables, and the likes are not removed and still occupy space.
They continue to count against user space quotas, until specifically purged from
the recycle bin or the unlikely situation where they must be purged by the
database because of tablespace space constraints.
初始化參数recyclebin 用于控制是否启用recyclebin功能。缺省是ON, 能够使用OFF关闭。
TEST@orcl2> show parameter recycle;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
buffer_pool_recycle string
db_recycle_cache_size big integer 0
recyclebin string on
禁用该功能:
SQL> alter system set recyclebin=off;
SQL> alter system set recyclebin=on;
SQL> alter session set recyclebin=off;
SQL> alter session set recyclebin=on;
禁用后删除的对象将直接删除。不会写到Recycle中,当然在删除时。指定purge 參数,
表也将直接删除。不会写到recyclebin中。
SQL> drop table name purge;
查看recyclebin中的对象列表:
SQL> select * from A;
ID
----------
1
2
3
SQL> drop table A;
表已删除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ----------------------------- ------------
A BIN$RWXQQcTPRde0ws4h9ewJcg==$0 TABLE 2009-10-15:12:44:33
查看recyclebin中对象:
SQL> select original_name,object_name from recyclebin;
ORIGINAL_NAME OBJECT_NAME
-------------------------------- ------------------------------
A BIN$RWXQQcTPRde0ws4h9ewJcg==$0
查看recyblebin对象里的内容:
SQL> select * from "BIN$RWXQQcTPRde0ws4h9ewJcg==$0";
ID
----------
1
2
3
表空间的Recycle Bin 区域仅仅是一个逻辑区域,而不是从表空间上物理的划出一块区域固定用于回收站,
因此Recycle Bin是和普通对象共用表空间的存储区域。
或者说是Recycle Bin的对象要和普通对象抢夺存储空间。
当发生空间不够时,Oracle会依照先入先出的顺序覆盖Recycle Bin中的对象。
假设表空间的数据文件打开了自己主动扩展。则在数据文件扩展之前。不会清除recyclebin中的内容。
每次扩展的时候,Oracle实际上是运行了alter database datafile resize命令。
也能够手动的删除Recycle Bin占用的空间:
1). Purge tablespace tablespace_name:
用于清空表空间的Recycle Bin
2). Purge tablespace tablespace_name user user_name:
清空指定表空间的Recycle Bin中指定用户的对象
3). Purge recyclebin:
删除当前用户的Recycle Bin中的对象
4). Purge dba_recyclebin:
删除全部用户的Recycle Bin中的对象,该命令要sysdba权限
5). Drop table table_name purge:
删除对象而且不放在Recycle Bin中,
即永久的删除,不能用Flashback恢复。
6). Purge index recycle_bin_object_name:
当想释放Recycle bin的空间,
又想能恢复表时,能够通过释放该对象的index所占用的空间来缓解空间压力。
由于索引是能够重建的。
3.2 Flashback Drop 实例操作
SQL> select original_name,object_name from recyclebin;
ORIGINAL_NAME OBJECT_NAME
-------------------------------- ------------------------------
A BIN$RWXQQcTPRde0ws4h9ewJcg==$0
SQL> flashback table a to before drop;
闪回完毕。
SQL> select * from a;
ID
----------
1
2
3
当我们删除表A后,在新建表A。这时在恢复的时候就会报错。此时我们在闪回时,
对表重命名就能够了:
SQL> drop table a;
表已删除。
SQL> create table a
2 (id number(1));
表已创建。
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;
闪回完毕。
SQL> select * from B;
ID
----------
1
2
3
当我们删除表A。在新建表A。在删除它,这是在Recycle Bin中就会有2个同样的表名。
此时恢复我们就要指定object_name才行.
SQL> select * from B;
ID
----------
1
2
3
SQL> drop table B;
表已删除。
SQL> create table B(name varchar(20));
表已创建。
SQL> drop table B;
表已删除。
SQL> select original_name,object_name from recyclebin;
ORIGINAL_NAME OBJECT_NAME
-------------------------------- ------------------------------
B BIN$vYuv+g9fTi2exYP9X2048Q==$0
B BIN$geQ9+NekSjuRvzG+TqDVWw==$0
SQL> flashback table "BIN$vYuv+g9fTi2exYP9X2048Q==$0" to before drop;
闪回完毕。
SQL> select * from B;
ID
----------
1
2
3
一旦完毕闪回恢复。Recycle Bin中的对象就消失了.
假设表上索引或者约束等信息,这些信息也会被恢复,可是这些对象会使用Oracle 自己主动的命名。
我们须要查看这些对象,然后对这些对象又一次命名:如:
SQL>select index_name from user_indexes where table_name = 'job_history';
INDEX_NAME
------------------------------
BIN$DBo9UChwZSbgQFeMiAdCcQ==$0
BIN$DBo9UChtZSbgQFeMiAdCcQ==$0
BIN$DBo9UChuZSbgQFeMiAdCcQ==$0
BIN$DBo9UChvZSbgQFeMiAdCcQ==$0
重命名:
SQL>alter index "bin$dbo9uchtzsbgqfemiadccq==$0" rename to jhist_job_ix;
Flashback Drop 须要注意的地方:
1). 仅仅能用于非系统表空间和本地管理的表空间
2). 对象的參考约束不会被恢复,指向该对象的外键约束须要重建。
3). 对象是否能恢复成功。取决与对象空间是否被覆盖重用。
4). 当删除表时,信赖于该表的物化视图也会同一时候删除。可是因为物化视图并不会被放入recycle bin,
因此当你运行flashback table to before drop 时,也不能恢复依赖其的物化视图,
须要dba 手工介入又一次创建。
5). 对于Recycle Bin中的对象,仅仅支持查询.
4 Flashback Query
Flashback 是ORACLE 自9i 就開始提供的一项特性,在9i 中利用oracle 查询多版本号一致的特点。
实现从回滚段中读取表一定时间内操作过的数据。可用来进行数据比对,
或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。
Flashback Query分
Flashback Query,
Flashback Version Query。
Flashback Transaction Query 三种。
4.1 Flashback Query
Flashback Query 是利用多版本号读一致性的特性从UNDO 表空间读取操作前的记录数据。
flashback query 对v$tables,x$tables 等动态性能视图无效,
只是对于dba_*,all_*,user_*等数据字典是有效的。
该特性也全然支持訪问远端数据库。比方select * from tbl@dblink as of scn 3600;的形式。
4.1.1 多版本号读一致性
不同的事务在写数据时。会将数据的前映像写入undo 表空间,这样假设同一时候有其他事务查询该表数据,
则能够通过undo 表空间中数据的前映像来构造所需的完整记录集,
而不须要等待写入的事务提交或回滚。
Flashback query 有多种方式构建查询记录集。记录集的选择范围能够基于时间或基于scn,
甚至能够同一时候查询出记录在undo 表空间中不同事务时的前映象。
使用方法与标准查询很类似。要通过flashback query 查询undo 中的撤销数据,
最简单的方式仅仅须要在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn
(基于scn)就可以。
as of timestamp|scn 的语法是自9iR2 后才開始提供支持。
4.1.2 As of timestamp 的演示样例:
SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-10-15 19:04:16
SQL> select * from A;
ID
----------
2
1
3
4
模拟用户误操作。删除数据
SQL> delete from A;
已删除4行。
SQL> commit;
提交完毕。
SQL> select * from A;
未选定行
查看删除之前的状态:如果当前距离删除数据已经有5 分钟左右的话:
SQL> select * from A as of timestamp sysdate-5/1440;
ID
----------
2
1
3
4
或者:
SQL>select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');
ID
----------
2
1
3
4
用Flashback Query恢复之前的数据:
SQL>Insert into A select * from A as of timestamp to_timestamp('2009-10-15 19:04:16','YYYY-MM-DD hh24:mi:ss');
已创建4行。
SQL> COMMIT;
提交完毕。
SQL> select * from A;
ID
----------
2
1
3
4
如上述演示样例中所表示的。as of timestamp 的确很易用,可是在某些情况下,
我们建议使用as of scn 的方式运行flashback query。
比方须要对多个相互有主外键约束的表进行恢复时,假设使用as of timestamp 的方式,
可能会因为时间点不统一的缘故造成数据选择或插入失败,通过scn 方式则可以确保记录的约束一致性。
4.1.3 As of scn 演示样例
查看SCN:
SQL>SELECT dbms_flashback.get_system_change_number FROM dual;
SQL> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
1095782
删除数据:
SQL> delete from A;
已删除4行。
SQL> commit;
提交完毕。
查看删除之前的状态:
SQL> select * from A as of scn 1095782;
ID
----------
2
1
3
4
用Flashback Query恢复之前的数据:
SQL> insert into A select * from A as of scn 1095782;
已创建4行。
SQL> commit;
提交完毕。
SQL> select * from A;
ID
----------
2
1
3
4
4.1.4 SCN 与 timestamp 关系
Oracle 在内部都是使用scn。即使你指定的是as of timestamp,oracle 也会将其转换成scn,
系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME
TEST@orcl2> desc sys.smon_scn_time;
Name Null? Type
----------------------------------------- -------- ----------------------------
THREAD NUMBER
TIME_MP NUMBER
TIME_DP DATE
SCN_WRP NUMBER
SCN_BAS NUMBER
NUM_MAPPINGS NUMBER
TIM_SCN_MAP RAW(1200)
SCN NUMBER
ORIG_THREAD NUMBER
每隔5 分钟。系统产生一次系统时间标记与scn 的匹配并存入sys.smon_scn_time 表,
该表中记录了近期1440个系统时间标记与scn 的匹配记录。因为该表仅仅维护了近期的1440 条记录,
因此如果使用as of timestamp 的方式则仅仅能flashback 近期5 天内的数据(如果系统是在持续不断
执行并无中断或关机重新启动之类操作的话)。
注意理解系统时间标记与scn 的每5 分钟匹配一次这句话,举个样例。
比方scn:339988,339989 分别匹配08-05-3013:52:00 和2008-13:57:00。
则当你通过as of timestamp 查询08-05-30 13:52:00 或08-05-30 13:56:59 这段时间点内的时间时。
oracle 都会将其匹配为scn:339988 到undo 表空间中查找,
也就说在这个时间内,无论你指定的时间点是什么,
查询返回的都将是08-05-30 13:52:00 这个时刻的数据。
查看SCN 和 timestamp 之间的相应关系:
TEST@orcl2> select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;
SCN TO_CHAR(TIME_DP,'YY
---------- -------------------
999115 2014-06-28 07:22:51
1020280 2014-06-28 07:29:04
1133573 2014-07-01 00:42:16
1135161 2014-07-01 00:47:14
1137299 2014-07-01 00:51:50
1137910 2014-07-01 00:52:28
1138324 2014-07-01 00:57:29
1138782 2014-07-01 01:00:59
下面省略。
4.1.5 Flashback Query 函数,存储过程,包,触发器等对象
Flashback Drop 能够闪回与表相关联的对象。 假设是其它的对象,
比方function,procedure。trigger等。 这时候,
就须要使用到ALL_SOURCE 表来进行Flashback Query。
先看联机文档对该表的说明:
ALL_SOURCE describes the text source of the stored objects accessible to the current user.
Related Views
DBA_SOURCE describes the text source of all stored objects in the database.
USER_SOURCE describes the text source of the stored objects owned by the current user.
This view does not display the OWNER column.
Column Datatype NULL Description
OWNER VARCHAR2(30) NOT NULL Owner of the object
NAME VARCHAR2(30) NOT NULL Name of the object
TYPE VARCHAR2(12) Type of object: FUNCTION, JAVA SOURCE, PACKAGE,
PACKAGE BODY, PROCEDURE, TRIGGER, TYPE, TYPE BODY
LINE NUMBER NOT NULL Line number of this line of source
TEXT VARCHAR2(4000) Text source of the stored object
--可參见Oracle Database Reference 11g Release 2 (11.2)中ALL_SOURCE。
假设我们误删除了某些对象,如procedure,就能够使用all_source 表进行恢复。
TEST@orcl2> desc dba_source;
Name Null? Type
----------------------------------------- -------- ----------------------------
OWNER VARCHAR2(30)
NAME VARCHAR2(30)
TYPE VARCHAR2(12)
LINE NUMBER
TEXT VARCHAR2(4000)
查看dba_source 的全部type
TEST@orcl2> select type from dba_source group by type;
TYPE
------------
PROCEDURE
PACKAGE
PACKAGE BODY
LIBRARY
TYPE BODY
TRIGGER
FUNCTION
JAVA SOURCE
TYPE
9 rows selected.
基于timestamp恢复的语句
SQL>SELECT text
FROM dba_source
AS OF TIMESTAMP TO_TIMESTAMP ('XXXXX', 'YYYY-MM-DD HH24:MI:SS')
WHERE owner = 'XXXX' AND name = '你删除的对象名'
ORDER BY line;
演示样例:
创建函数:
SQL>
CREATE OR REPLACE function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;
/
Function created.
查询函数:
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select getdate() from dual;
GETDATE()
-------------------
2011-04-07 21:02:09
查询dba_source 表:
SQL> select text from dba_source where name='GETDATE' order by line;
TEXT
--------------------------------------------------------------------------------
function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;
7 rows selected.
drop 函数。再查询,记录不存在
SQL> drop function getdate;
Function dropped.
SQL> select text from dba_source where name='GETDATE' order by line;
no rows selected
使用我们的Flashback Query 查询:
SQL> select text from dba_source as of timestamp to_timestamp('2011-04-07 21:02:09','yyyy-mm-dd hh24:mi:ss') where name='GETDATE' order by line;
TEXT
--------------------------------------------------------------------------------
function getdate return date
as
v_date date;
begin
select sysdate into v_date from dual;
return v_date;
end;
7 rows selected.
这时候。又查看到了函数的代码。仅仅须要把这些代码又一次运行一下就ok了。 其它对象和这个类似。
这里就不演示了。
4.2 Flashback version Query
相对于Flashback Query 仅仅能看到某一点的对象状态,
Oracle 10g引入的Flashback Version Query能够看到过去某个时间段内。
记录是怎样发生变化的。 依据这个历史。DBA就能够高速的推断数据是在什么时点发生了错误。
进而恢复到之前的状态。
先看一个伪列 ORA_ROWSCN. 所谓的伪列,就是假的。不存在的数据列。用户创建表时尽管没有指定。
可是Oracle为了维护而加入的一些内部字段,这些字段能够像普通文件那样的使用。
最熟悉的伪列就是 ROWID。 它相当于一个指针。指向记录在磁盘上的位置。
ORA_ROWSCN 是Oracle 10g 新增的,暂且把它看作是记录最后一次被改动时的SCN。
Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。
举个样例:
SQL> select * from A;
ID
----------
2
1
3
4
SQL> insert into A values(5);
已创建 1 行。
SQL> select * from A;
ID
----------
2
1
3
4
5
SQL> commit;
提交完毕。
SQL> select ora_rowscn, id from A;
ORA_ROWSCN ID
---------- ----------
1098443 2
1098443 1
1098443 3
1098443 4
1098443 5
获取很多其它的历史信息
SQL>Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,
'I','Insert',
'U','Update',
'D','Delete', 'Original') "Operation",
id
from A versions between scn minvalue and maxvalue;
或者
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql
from flashback_transaction_query q
where q.xid in(select versions_xid
from B versions between scn 413946 and 413959);
VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio ID
---------------- ----------------- --------------- -------- ----------
05001A0054020000 1099482 Update 3
05001A0054020000 1099482 Delete 3
05001A0054020000 1099482 Delete 2
05001A0054020000 1099482 Delete 1
0400150005020000 1098443 Insert 5
以下我们来讲下伪列。 Flashback Version Query 技术事实上有非常多伪列,
可是ORA_ROWSCN是最重要。它记录的是最后一次被改动时的SCN。 注意是被提交的改动。
假设没有提交,这个伪列不会发生变化。
ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的全部记录都是一个ORA_ROWSCN,
数据块内随意一条记录被改动。这个数据库块内的全部记录的ORA_ROWSCN都会同一时候改变。
上例的查询结果以证明。
只是我们能够在建表时使用keyword rowdependencies。 能够改变这样的缺省行为。
使用这个keyword后,每条记录都有自己的ORA_ROWSCN。
举例:
SQL> create table B (id number(2)) rowdependencies;
表已创建。
SQL> insert into B values(1);
已创建 1 行。
SQL> insert into B values(2);
已创建 1 行
SQL> insert into B values(3);
已创建 1 行。
SQL> commit;
提交完毕。
SQL> select ora_rowscn, id from B;
ORA_ROWSCN ID
---------- ----------
1100560 1
1100560 2
1100560 3
此处SCN一样。一定非常奇怪,这正好说明是最后一次被改动时的SCN,假设没有提交。
是不会变的,我们重做一下就清楚了。
SQL> analyze table B compute statistics;
表已分析。
SQL> select ora_rowscn, id from B;
ORA_ROWSCN ID
---------- ----------
1100560 1
1100560 2
1100560 3
SQL> delete from B;
已删除4行。
SQL> select ora_rowscn, id from B;
未选定行
SQL> insert into B values(1);
已创建 1 行。
SQL> commit;
提交完毕。
SQL> insert into B values(2);
已创建 1 行。
SQL> commit;
提交完毕。
SQL> select ora_rowscn, id from B;
ORA_ROWSCN ID
---------- ----------
1100723 1
1100729 2
4.3 Flashback Transaction Query
Flashback Transaction Query也是使用UNDO信息来实现。
利用这个功能能够查看某个事务运行的全部变化,它须要訪问flashback_transaction_query 视图。
这个视图的XID列代表事务ID。利用这个ID能够区分特定事务发生的全部数据变化。
演示样例:
SQL> insert into B values(3);
已创建 1 行。
SQL> commit;
提交完毕。
SQL> select * from B;
ID
----------
1
2
3
查看视图,每一个事务都相应同样的XID
SQL>Select xid,operation,commit_scn,undo_sql
from flashback_transaction_query
where xid in (Select versions_xid
from B versions between scn minvalue and maxvalue);
或者
SQL>select xid,commit_scn,commit_timestamp,operation,undo_sql
from flashback_transaction_query q
where q.xid in(select versions_xid
from B versions between scn 413946 and 413959);
XID OPERATION COMMIT_SCN UNDO_SQL
-----------------------------------------------------------------------------------------------------
03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('4');
03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('3');
03001C006A020000 DELETE 1100723
insert into "SYS"."B"("ID") values ('2');
5 Flashback Table
注意SYS用户不支持闪回。这点前面已经说明过。
Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。
该命令相对简单,
输入:flashback table table_name to scn(to timestamp) 就可以。
注意:假设想要对表进行flashback。必须同意表的row movement.
SQL>Alter table table_name row movement;
要查看某表是否启用row movement,能够到user_tables 中查询(或all_tables,dba_tables).
比如:
SQL> select row_movement from user_tables where table_name='C';
ROW_MOVE
-------
ENABLED
要启用或禁止某表row movement。能够通过下列语句:
--启用
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;
表已更改。
--禁止
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;
表已更改。
举例:
SQL> create table C (id number(2));
表已创建。
SQL> insert into C values(1);
已创建 1 行。
SQL> insert into C values(2);
已创建 1 行。
SQL> commit;
提交完毕。
SQL> select * from c;
ID
----------
1
2
SQL> alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss";
会话已更改。
SQL> select sysdate from dual;
SYSDATE
-------------------
2009-10-15 21:17:47
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1103864
删除数据并恢复
SQL> delete from C;
已删除2行。
SQL> commit;
提交完毕。
SQL> alter table c enable row movement;
表已更改。
SQL> flashback table c to scn 1103864;
闪回完毕。
或者
SQL> flashback table c to timestamp to_timestamp('2009-10-15 21:17:47','yyyy-mm-dd hh24:mi:ss');
SQL> select * from c;
ID
----------
1
2
Flashback table 命令支持同一时候操作多个表,表名中间以逗号分隔就可以,
假设你运行一条flashback table命令时同一时候指定了多个表,
要记住单个flashback table 是在同一个事务中。因此这些表的恢复操作要么都成功。要么都失败。
如:
flashback table a,b ,c to scn 1103864;
一些注意事项:
(1)基于undo 的表恢复,须要注意DDL 操作的影响。改动并提交过数据之后。对表做过DDL 操作,
包含:drop/modify 列, move 表, drop 分区(假设有的话), truncate table/partition,
这些操作会令undo 表空间中的撤销数据失效,对于运行过这些操作的表应用flashback query
会触发ORA-01466 错误。
ORA-01466: unable to read data - table definition has changed
Cause: Query parsed after tbl (or index) change, and executed w/old snapshot
Action: commit (or rollback) transaction, and re-execute
另外一些表结构改动语句尽管并不会影响到undo 表空间中的撤销记录。
但有可能因表结构改动导致undo 中重做记录无法应用的情况,比方对于添加了约束,
而flashback query 查询出的undo 记录已经不符合新建的约束条件,
这个时候直接恢复显然不可能成功,你要么临时disable 约束。要么通过适当逻辑,
对要恢复的数据进行处理之后。再运行恢复。
(2)基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁)。
因此还须要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp
在运行时会自己主动disable 掉与其操作表相关的triggers。假设你希望在此期间trigger
可以继续发挥做用。可以在flashback table 后附加 ENABLE TRIGGERS 子句。
6 Oracle Flashback Data Archive
在Oracle 11g里又出了一个新特性:Oracle Flashback Data Archive.
在11g的官方文档里搜到了相关内容说明。參考:
Using Oracle Flashback Technology
--Using Flashback Data Archive (Oracle Total Recall)
http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17125/adfns_flashback.htm#BJFIEJGG
6.1 Flashback Data Archive 说明
官网的定义例如以下:
A Flashback Data Archive provides the ability to track and store transactional changes
to a table over its lifetime. A Flashback Data Archive is useful for compliance with
record stage policies and audit reports.
--Flashback Data Archive 在它的有效期内将保存事务改变的信息。
A Flashback Data Archive consists of one or more tablespaces or parts thereof.
You can have multiple Flashback Data Archives. If you are logged on as SYSDBA,
you can specify a default Flashback Data Archive for the system.
A Flashback Data Archive is configured with retention time. Data archived in the
Flashback Data Archive is retained for the retention time.
-- FDA 包括一个或者多个表空间,我们能够创建多个FDA。
当以sysdba 登陆时,
能够指定default FDA。
By default, flashback archiving is off for any table. You can enable flashback archiving
for a table if all of these conditions are true:
-- 默认情况下。FDA 是关闭的,当具备一下条件时,我们能够启用FDA。
(1). You have the FLASHBACK ARCHIVE object privilege on the Flashback Data Archive
to use for that table.
(2). The table is neither nested, clustered, temporary, remote, or external.
(3). The table contains neither LONG nor nested columns.
After flashback archiving is enabled for a table, you can disable it only if you either
have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are logged on as SYSDBA.
--当FDA 启动以后,仅仅有具有FLASHBACK ARCHIVE ADMINISTER 权限的用户或者
用SYSDBA登陆的用户才干够禁用FDA。
When choosing a Flashback Data Archive for a specific table, consider the data
retention requirements for the table and the retention times of the Flashback
Data Archives on which you have the FLASHBACK ARCHIVE object privilege.
给用户赋:
SQL> create user dvd identified by dvd default tablespace users temporary tablespace temp;
User created.
SQL> grant resource,connect to dvd;
Grant succeeded.
SQL> grant flashback archive administer to dvd;
Grant succeeded.
SQL> select * from dba_sys_privs where grantee='DVD';
GRANTEE PRIVILEGE ADM
----------------------- ---------------------------------------- ---
DVD FLASHBACK ARCHIVE ADMINISTER NO
DVD UNLIMITED TABLESPACE NO
在Oracle 10g中的flashback 包含: flashback version query、flashback transaction query、
flashback database、flashback table和flashback drop等特性。
在这些闪回技术其中,除了Flashback Database(依赖于闪回日志)、
flashback drop(依赖recyclebin)之外,其它的闪回技术都是依赖于Undo撤销数据。
都与数据库初始化參数UNDO_RETENTION密切相关。
它们是从撤销数据中读取信息来构造旧数据的。这样就有一个限制,就是undo中的信息不能被覆盖。
而undo段是循环使用的,仅仅要事务提交,之前的undo信息就可能被覆盖,
尽管能够通过 undo_retention等參数来延长undo的存活期。但这个參数会影响全部的事务,
设置过大,可能导致undo tablespace高速膨胀。
Oracle 11g中flashback添加了:Flashback Data Archive 特性。
该技术与之前的Flashback的实现机制不同。
通过将变化数据另外存储到创建的闪回归档区(Flashback Archive)中,以和undo差别开来,
这样就能够为闪回归档区单独设置存储策略。使之能够闪回到指定时间之前的旧数据而不影响undo策略。
而且能够依据须要指定哪些数据库对象须要保存历史变化数据。
而不是将数据库中全部对象的变化数据都保存下来,这样能够极大地降低空间需求。
Flashback Data Archive并非记录数据库的全部变化,而仅仅是记录了指定表的数据变化。
所以,Flashback Data Archive是针对对象的保护,是Flashback Database的有力补充。
通过Flashback Data Archive,能够查询指定对象的不论什么时间点(仅仅要满足保护策略)的数据。
并且不须要用到undo,这在有审计须要的环境,或者是安全性特别重要的高可用数据库中,
是一个非常好的特性。缺点就是假设该表变化非常频繁,对空间的要求可能非常高。
闪回数据归档区
闪回数据归档区是闪回数据归档的历史数据存储区域,在一个系统中,
能够有一个默认的闪回数据归档区。也能够创建其它很多的闪回数据归档区域。
每个闪回数据归档区都能够有一个唯一的名称。
同一时候,
每个闪回数据归档区都相应了一定的数据保留策略。
比如能够配置归档区FLASHBACK_DATA_ARCHIVE_1中的数据保留期为1年,
而归档区FLASHBACK_DATA_ARCHIVE_2的数据保留期为2天或者更短。
以后假设将表放到相应的闪回数据归档区,则就依照该归档区的保留策略来保存历史数据。
闪回数据归档区是一个逻辑概念,是从一个或者多个表空间中拿出一定的空间。来保存表的改动历史,
这样就摆脱了对Undo撤销数据的依赖,不利用undo就能够闪回到归档策略内的不论什么一个时间点上。
Flashback archive相关数据字典
*_FLASHBACK_ARCHIVE
Displays information about Flashback Data Archive files.
*_FLASHBACK_ARCHIVE_TS
Displays tablespaces of Flashback Data Archive files.
*_FLASHBACK_ARCHIVE_TABLES
Displays information about tables that are enabled for Data Flashback Archive files.
* 代表DBA 或者User。
Flashback archive的后台进程
Oracle11g为Flashback data archive特性专门引入了一个新的后台进程FBDA。
用于将追踪表(traced table,也就是将指定使用flashback data archive的table)
的历史变化数据转存到闪回归档区。
SQL> select name,description from v$bgprocess where name='FBDA';
NAME DESCRIPTION
----- -----------------------------------------------------------
FBDA Flashback Data Archiver Process
Flashback archive 的限制条件
(1)Flashback data archive仅仅能在ASSM的tablespace上创建
(2)Flashback data archive要求必须使用自己主动undo管理,
即 undo_management 參数为auto
6.2 Flashback Data Archive 的相关操作
Create a Flashback Data Archive with the CREATE FLASHBACK ARCHIVE statement, specifying:
(1)Name of the Flashback Data Archive
(2)Name of the first tablespace of the Flashback Data Archive
(3)(Optional) Maximum amount of space that the Flashback Data Archive can use
in the first tablespace。The default is unlimited. Unless your space quota
on the first tablespace is also unlimited, you must specify this value;
otherwise, error ORA-55621 occurs.
ORA-55621: User quota on tablespace "string" is not enough for Flashback Archive
Cause: An attempt was made to create or alter a Flashback Archive quota
which is larger than the user's quota.
Action: No action required.
(4)Retention time (number of days that Flashback Data Archive data for the
table is guaranteed to be stored)
-- 创建FDA 时,能够指定以上4个參数,没有没有运行Flashback Archive 的配额。
默觉得 unlimited。 这里的配额,指的是用户对表空间的配额。
If you are logged on as SYSDBA, you can also specify that this is the default Flashback
Data Archive for the system. If you omit this option, you can still make this Flashback
Data Archive the default later .
-- 假设以SYSDBA 登陆。还能够指定default Flashback Data Archive。
假设没有指定,也能够通过alter flashback archive 命令来指定。
演示样例:
(1). 先创建几个測试的表空间
SQL> create tablespace FDA1 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA01.dbf' size 100M;
Tablespace created.
SQL> create tablespace FDA2 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA02.dbf' size 100M;
Tablespace created.
SQL> create tablespace FDA3 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA03.dbf' size 100M;
Tablespace created.
SQL> create tablespace FDA4 datafile 'D:/APP/ADMINISTRATOR/ORADATA/NEWCCS/FDA04.dbf' size 100M;
Tablespace created.
(2). 创建一个默认的Flashback Archive, 配额为10M。数据保留期为1年
SQL> create flashback archive default fla1 tablespace fda1 quota 10M retention 1 year;
默认的Flashback Archive 仅仅能有一个:
SQL> create flashback archive default fla3 tablespace fda1 quota 10M retention 1 year;
create flashback archive default fla3 tablespace fda1 quota 10M retention 1 year
*
ERROR at line 1:
ORA-55609: Attempt to create duplicate default Flashback Archive
这里报错了。我们能够使用alter flashback 来改动默认的Flashback Archive.
(3) 创建一个Flashback Archive fla2,使用默认配额unlimited。
retention 为2 年。
SQL> create flashback archive fla2 tablespace fda2 retention 2 year;
Flashback archive created.
依据官网的说法,这样的情况下,用户对该表空间的配额也必须为ulimited。
否则就会报错ORA-55621。
測试一下:
SQL> conn / as sysdba;
Connected.
SQL> revoke unlimited tablespace from dvd;
Revoke succeeded.
SQL> alter user dvd quota 10m on fda4;
User altered.
SQL> conn dvd/dvd;
Connected.
SQL> create flashback archive fla5 tablespace fda4 retention 1 day;
create flashback archive fla5 tablespace fda4 retention 1 day
*
ERROR at line 1:
ORA-55621: User quota on tablespace "FDA4" is not enough for Flashback Archive
报错。
改动用户的配额,再创建,成功:
SQL> conn / as sysdba;
Connected.
SQL> grant unlimited tablespace to dvd;
Grant succeeded.
SQL> conn dvd/dvd;
Connected.
SQL> create flashback archive fla5 tablespace fda4 retention 1 day;
Flashback archive created.
6.2.2 Altering a Flashback Data Archive
With the ALTER FLASHBACK ARCHIVE statement, you can:
-- 使用alter flashback archive 能够改动例如以下内容:
(1)Change the retention time of a Flashback Data Archive
(2)Purge some or all of its data
(3)Add, modify, and remove tablespaces
Note:
Removing all tablespaces of a Flashback Data Archive causes an error.
If you are logged on as SYSDBA, you can also use the ALTER FLASHBACK ARCHIVE statement
to make a specific file the default Flashback Data Archive for the system.
-- 不能移除Flashback Data Archive里的全部表空间。 否则报错。
假设用sysdba 登陆,能够改动默认的Flashback archive。
演示样例:
6.2.2.1 将Flashback Data Archive 改动为default FA
先用我们具有flashback archive administer 权限的用户试试:
SQL> conn dvd/dvd;
Connected.
SQL> alter flashback archive fla1 set default;
alter flashback archive fla1 set default
*
ERROR at line 1:
ORA-55611: No privilege to manage default Flashback Archive
报错,没有权限,用sysdba 測试成功:
SQL> conn / as sysdba;
Connected.
SQL> alter flashback archive fla1 set default;
Flashback archive altered.
注意一点,仅仅能有一个默认的Flashback archive.
SQL> select flashback_archive_name name, status from dba_flashback_archive;
NAME STATUS
---------- -------
FLA1 DEFAULT
FLA2
当前默认的Flashback Archive 是FLA1,我们将默认改成FLA2,在查看:
SQL> alter flashback archive fla2 set default;
Flashback archive altered.
SQL> select flashback_archive_name name, status from dba_flashback_archive;
NAME STATUS
---------- -------
FLA1
FLA2 DEFAULT
6.2.2.2 为已经存在的Flashback Archive 加入表空间。并指定配额
SQL> alter flashback archive fla1 add tablespace fda3 quota 20M;
Flashback archive altered.
6.2.2.3 为已经存在的Flashback Archive 加入表空间,不指定配额,即须要多少用多少空间
SQL> alter flashback archive fla1 add tablespace fda4;
Flashback archive altered.
6.2.2.4 改动已经存在的Flashback Archive的配额
SQL> alter flashback archive fla1 modify tablespace fda1 quota 20m;
Flashback archive altered.
6.2.2.5 改动配额不受限制
SQL> alter flashback archive fla1 modify tablespace fda1;
Flashback archive altered.
6.2.2.6 改动Flashback Archive 的retention time
SQL> alter flashback archive fla1 modify retention 2 year;
Flashback archive altered.
SQL> alter flashback archive fla1 modify retention 1 month;
Flashback archive altered.
SQL> alter flashback archive fla1 modify retention 2 month;
Flashback archive altered.
SQL> alter flashback archive fla1 modify retention 2 day;
Flashback archive altered.
SQL> alter flashback archive fla1 modify retention 1 day;
Flashback archive altered.
6.2.2.7 将表空间从Flashback Archive中移除
SQL> alter flashback archive fla1 remove tablespace fda4;
Flashback archive altered.
-- 注意,这里移除的不过Flashback Archive中的信息,表空间不会被删除。
6.2.2.8 清空Flashback Archive中的全部历史记录
SQL> alter flashback archive fla1 purge all;
Flashback archive altered.
6.2.2.9 清空Flashback Archive 中超过1天的历史数据
SQL> alter flashback archive fla1 purge before timestamp (systimestamp - interval '1' day);
Flashback archive altered.
6.2.2.10 清空Flashback Archive 中指定SCN 之前的全部历史数据
SQL> select current_scn from v$database;
CURRENT_SCN
-----------
1315755078
SQL> alter flashback archive fla1 purge before scn 1315755078;
Flashback archive altered.
我这里仅仅是演示一个SCN。 详细要结合自己的情况。
6.2.3 Dropping a Flashback Data Archive
Drop a Flashback Data Archive with the DROP FLASHBACK ARCHIVE statement.
Dropping a Flashback Data Archive deletes its historical data, but does not drop
its tablespaces.
-- 删除Flashback Archive 不会删除对应的表空间
演示样例:
SQL> DROP FLASHBACK ARCHIVE fla2;
Flashback archive dropped.
SQL> select flashback_archive_name name, status from dba_flashback_archive;
NAME STATUS
---------- -------
FLA1
6.2.4 Specifying the Default Flashback Data Archive
By default, the system has no default Flashback Data Archive.
If you are logged on as SYSDBA, you can specify default Flashback Data Archive
in either of these ways:
--默认情况下。没有default Flashback Data Archive. 当以sysdba 登陆之后。就能够指定它。
6.2.4.1 改动已经存在的Flashback Archive 为default
SQL> alter flashback archive fla1 set default;
Flashback archive altered.
SQL> alter flashback archive fla10 set default;
alter flashback archive fla10 set default
*
ERROR at line 1:
ORA-55605: Incorrect Flashback Archive is specified
假设指定的Flashback 不存在。就报错。
6.2.4.2 在创建Flashback Data Archive 时。指定default
SQL>create flashback archive default fla2 tablespace tbs1 quota 10m retention 1 year;
The default Flashback Data Archive for the system is the default Flashback Data Archive
for every user who does not have his or her own default Flashback Data Archive.
6.2.5 Enabling and Disabling Flashback Data Archive
By default, flashback archiving is disabled for any table.
You can enable flashback archiving for a table if you have the FLASHBACK ARCHIVE
object privilege on the Flashback Data Archive to use for that table.
默认情况下,全部表都没有启动flashback archive。
To enable flashback archiving for a table, include the FLASHBACK ARCHIVE clause
in either the CREATE TABLE or ALTER TABLE statement.
In the FLASHBACK ARCHIVE clause, you can specify the Flashback Data Archive
where the historical data for the table are stored. The default is the
default Flashback Data Archive for the system. If you specify a nonexistent
Flashback Data Archive, an error occurs.
If you enable flashback archiving for a table, but AUM(automatic undo managed) is disabled,
error ORA-55614 occurs when you try to modify the table.
ORA-55614: AUM needed for transactions on tracked tables
Cause: An attempt was made to execute DML on a tracked table without enabling Auto Undo Management.
Action: Disable tracking on the table or enable Auto Undo Management.
If a table has flashback archiving enabled, and you try to enable it again with a
different Flashback Data Archive, an error occurs
After flashback archiving is enabled for a table, you can disable it only if you
either have the FLASHBACK ARCHIVE ADMINISTER system privilege or you are logged on
as SYSDBA.
To disable flashback archiving for a table, specify NO FLASHBACK ARCHIVE in the
ALTER TABLE statement. (It is unnecessary to specify NO FLASHBACK ARCHIVE
in the CREATE TABLE statement, because that is the default.)
演示样例:
6.2.5.1 创建table,使用默认的Flashback Data Archive 来存储历史数据
SQL> create table test1 (id number) flashback archive;
Table created.
6.2.5.2 创建table。使用指定的Flashback Data Archive 来存储历史数据
SQL> create table test2 (id number) flashback archive fla1;
Table created.
6.2.5.3 对表启用Flashback archive,并使用默认的Flashback archive。
SQL> alter table test3 flashback archive;
Table altered.
6.2.5.4 禁用表的Flashback Archive
SQL> alter table test3 no flashback archive;
Table altered.
6.2.5.5 对table 启用Flashback archive,并指定Flashaback Archive 区。
SQL> alter table test3 flashback archive fla1;
Table altered.
6.2.6 DDL Statements on Tables Enabled for Flashback Data Archive
Flashback Data Archive supports many DDL statements, including some that
alter the table definition or move data. For example:
--启动Flashback Data Archive的表支持下面的DDL 操作
(1)ALTER TABLE statement that does any of the following:
1)Adds, drops, renames, or modifies a column
2)Adds, drops, or renames a constraint
3)Drops or truncates a partition
or subpartition operation
(2)TRUNCATE TABLE statement
(3)RENAME statement that renames a table
Some DDL statements cause error ORA-55610 when used on a table enabled for
Flashback Data Archive. For example:
-- 启动Flashback Data Archive的表上的一些DDL 操作可能触发ORA-55610的错误,
这些DDL 例如以下:
(1)ALTER TABLE statement that includes an UPGRADE TABLE clause,
with or without an INCLUDING DATA clause
(3)ALTER TABLE statement that moves or exchanges a partition
or subpartition operation
(3)DROP TABLE statement
ORA-55610: Invalid DDL statement on history-tracked table
Cause: An attempt was made to perform certain DDL statement that is disallowed on tables
that are enabled for Flashback Archive.
Action: No action required.
If you must use unsupported DDL statements on a table enabled for Flashback Data Archive,
use the DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA procedure to disassociate the base table
from its Flashback Data Archive.
To reassociate the Flashback Data Archive with the base table afterward,
use the DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA procedure.
-- 假设必须在已经启用Flashback Archive的表上运行这些不支持的DDL 操作,
能够用DBMS_FLASHBACK_ARCHIVE 包将表从Flashback Data Archive 分离出来,
待操作结束后再加入进去。
The DBMS_FLASHBACK_ARCHIVE package contains two simple procedures for disassociation
and reassociation of a Flashback Data Archive (FDA) enabled table from/with
its underlying FDA respectively.
在Flashback Area中,会有一张历史表记录着我们启动FA表的全部操作。
我们能够通过例如以下SQL 来查看他们之间的映射关系。
SQL> SELECT table_name,archive_table_name,status from dba_flashback_archive_tables;
TABLE_NAME ARCHIVE_TABLE_NAME STATUS
---------- -------------------- --------
test1 SYS_FBA_HIST_78429 ENABLED
test2 SYS_FBA_HIST_78431 ENABLED
ORA SYS_FBA_HIST_78448 ENABLED
test3 SYS_FBA_HIST_78456 ENABLED
HUAINING SYS_FBA_HIST_78464 ENABLED
QS SYS_FBA_HIST_78472 ENABLED
FA SYS_FBA_HIST_78484 ENABLED
7 rows selected.
我们要运行那些不支持的DDL。就须要用dbms_flashback_archive禁用他们之间的映射关系。
在操作,操作完在用该包启用他们。
关于dbms_flashback_archive包的使用,參考官网:
DBMS_FLASHBACK_ARCHIVE
http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_flashb_archive.htm#ARPLS72464
演示样例:
SQL> drop table test1;
drop table test1
*
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table
这个表使我们之前创建的,并启用了Flashback Archive.
表的分离和又一次结合:
SQL> exec dbms_flashback_archive.disassociate_fba('SYS','test1');
PL/SQL procedure successfully completed.
SQL> exec dbms_flashback_archive.reassociate_fba('SYS','test1');
PL/SQL procedure successfully completed.
最后我们再分离,再drop table:
SQL> exec dbms_flashback_archive.disassociate_fba('SYS','test1');
PL/SQL procedure successfully completed.
SQL> drop table test1;
drop table test1
*
ERROR at line 1:
ORA-55610: Invalid DDL statement on history-tracked table
drop 失败。
google 一下,说是bug:9650074
9650074 ORA-55633 in Flashback data archive DDL support area。
ORA-55633: Cannot do DDL on Flashback Data Archive enabled table
Cause: An attempt was made to do DDL on tracked tables while one DDL is runnning.
Action: Retry the DDL at a later time.
6.3 一个用Flashback Data Archive 恢复数据的測试
这个測试使用之前的Flashback Archive: fla1.
创建測试表:
SQL> create table fa(id number) flashback archive;
Table created.
插入数据:
SQL> declare
2 i number;
3 begin
4 for i in 1..100 loop
5 insert into fa values(i);
6 end loop;
7 commit;
8 end;
9 /
PL/SQL procedure successfully completed.
SQL> select count(*) from fa;
COUNT(*)
----------
100
查询时间:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;
TM
-------------------
2011-05-11 15:33:35
再update 一次数据:
SQL> update fa set id=200 where id <50;
49 rows updated.
SQL>commit;
再查询一次时间:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') tm from dual;
TM
-------------------
2011-05-11 15:35:23
使用Flashback Archive查询1分钟之前的数据:
SQL> select count(*) from fa as of timestamp (systimestamp - interval '1'minute);
COUNT(*)
----------
100
使用Flashback Archive查询10分钟之前的数据:
SQL> select count(*) from fa as of timestamp (systimestamp - interval '10'minute);
COUNT(*)
----------
0
这里显示为0. 由于我们还没有做DML 操作。
或者使用时间来查:
SQL> select count(*) from fa as of timestamp to_timestamp('2011-05-11 15:35:23','yyyy-mm-dd hh24:mi:ss');
COUNT(*)
----------
100
SQL> delete from fa;
100 rows deleted
SQL> commit;
Commit complete.
SQL> select count(*) from fa as of timestamp (systimestamp - interval '1'minute);
COUNT(*)
----------
100
依据时间的不同,查询的结果也不一样。 以下我们来确认下这个问题:
SQL> SELECT * from dba_flashback_archive_tables;
TABLE_NAME OWNER_NAME FLASHBACK_ARCHI ARCHIVE_TABLE_NAME STATUS
---------- ---------- --------------- -------------------- --------
FA SYS FLA1 SYS_FBA_HIST_78484 ENABLED
从这个结果,能够看出。在Flashback archive相应的FA表的历史表是SYS_FBA_HIST_78484。
该表保存了FA表的全部的操作记录:
SQL> select count(*) from SYS_FBA_HIST_78484;
COUNT(*)
----------
149
SQL> desc SYS_FBA_HIST_78484
Name Null?
Type
----------------------------------------- -------- ---------------
RID VARCHAR2(4000)
STARTSCN NUMBER
ENDSCN NUMBER
XID RAW(8)
OPERATION VARCHAR2(1)
ID NUMBER
注意一点:我们不能对这些历史表做不论什么改动操作。仅仅能查询。
假设想对这些历史表进行相关的改动操作,和之前的操作一样:
使用dbms_flashback_archive分离2个表之间的关系。
如:
sql> exec dbms_flashback_archive.disassociate_fba('scott','emp_test');
sql> exec dbms_flashback_archive.reassociate_fba('scott','emp_test');
闪回归档:
实验:闪回归档
1.create tablespace arch_tbs datafile '/u01/app/oracle/oradata/PROD/arch_tbs.dbf' size 100m autoextend on maxsize 1G;
2.create user archive_admin identified by archive_admin default tablespace arch_tbs;
3.grant dba,flashback archive administer to archive_admin;
4.conn archive_admin/archive_admin
create flashback archive fda1 tablespace arch_tbs quota 10m retention 1 year;
5.alter flashback archive fdb1 set default;
--sys用户下
6.alter table test_user1.emp flashback archive;
7.select * from test_user1.emp as of timestamp(timestamp - interval '20' minute);
版权声明:本文博客原创文章,博客,未经同意,不得转载。
Oracle 六闪回技术,flashback的更多相关文章
- Oracle 的闪回技术 --flashback
SQL Fundamentals: 表的创建和管理 如何开启数据库闪回? SQL> shutdown immediate; ORA-01109: database not open Databa ...
- SQL Fundamentals: 表的创建和管理(表的基本操作,闪回技术flashback,表结构修改)
SQL Fundamentals || Oracle SQL语言 1.表的基本操作 (CREATE TABLE, DROP TABLE,TRUNCATE TABLE, RENAME tablename ...
- Oracle闪回技术(Flashback)
闪回技术有闪回表.闪回删除.闪回查询.闪回事务查询.闪回事务.闪回数据库.闪回数据归档.其中,闪回查询.闪回事务查询用来“观察”过去:闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口: ...
- 【Oracle】闪回技术
1.闪回技术描述 2.数据库的准备: --undo表空间要设置成AUTO,设置合适的保存时间.undo表空间: SYS@ENMOEDU> show parameter undo NAME TYP ...
- Oracle的闪回技术--闪回错误的DML操作
提交DML操作后,该操作使用的还原段就可以被其它对象使用了,为了保证闪回操作时这些数据仍然被保存在还原段中,可能需要重新设置undo_retention参数,表示一个事务提交后,该事务的数据必须保存在 ...
- Oracle的闪回技术--闪回已删除的表
注意闪回技术只能保护非系统表决空间中的表,而且表空间必须本地管理, 外键将不可以被恢复, 索引和约束的名字将会被命名为以BIN开头,由系统生成的名字 查看是否开启闪回: SQL> show pa ...
- Oracle Flashback Technology【闪回技术】
-------------------------与其他数据库相比,Oracle的闪回让开发者多了一条选择的路. Flashback的目的 先看下Oracle官方文档中的解释: Oracle Flas ...
- Oracle 闪回特性(FLASHBACK DATABASE)
--===================================== -- Oracle 闪回特性(FLASHBACK DATABASE) --======================= ...
- Oracle闪回技术
(一)闪回技术概要 闪回技术是数据库备份与恢复的重要补充手段,主要包括以下7种特性: 特性 原理 数据库支持 闪回查询(Flashback Query) 利用undo表空间中的回退信息,查询过去某个时 ...
随机推荐
- Android菜鸟的成长笔记(27)——ViewPager的使用
ViewPager是Android 3.0以上能够使用的API. 一.ViewPager能干什么? 1.微信5.0中连带滑动用ViewPager能够轻松实现. 2.实现相似于新浪微博的导航引导界面. ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- malloc函数的一种简单的原理性实现
malloc()是C语言中动态存储管理的一组标准库函数之一.其作用是在内存的动态存储区中分配一个长度为size的连续空间.其参数是一个无符号整形数,返回值是一个指向所分配的连续存储域的起始地址的指针 ...
- Windows下安装MySQLdb, Python操作MySQL数据库的增删改查
这里的前提是windows上已经安装了MySQL数据库,且配置完成,能正常建表能操作. 在此基础上仅仅需安装MySQL-python-1.2.4b4.win32-py2.7.exe就ok了.仅仅有1M ...
- Tkinter隐藏窗口再让他显示出来的例子
隐藏主要是 : withdraw()函数. 重新显示出来主要是: update()和deiconify()函数. 来源:http://www.blog.pythonlibrary.org/2012/0 ...
- Java重写方法与初始化的隐患(转)
原文出处: Shawon 虽然文章标题是Java, 但几乎所有面向对象设计的语言都遵守这个初始化流程, 感谢廖祜秋liaohuqiu_秋百万指出, 之前忘记提这个了. 前言 drakeet写了个和Re ...
- NET通用平台
NET通用平台.通用权限.易扩展.多语言.多平台架构框架 先拿出我半前年前平台的设计初稿,经过半年的努力我已经完成了该设计稿的所有功能.并且理念已经远远超出该设计稿. 下面是一些博友对我贴子的评价: ...
- ssh 实体关系分析确立(ER图-实体关系图)
比較简单的方式就是依据模仿同类产品,依据同类产品的进行模仿,表单就是一个起码要加的字段,然后依据项目须要额外添加字段. 注意:实体类之间的引用关系还须要考虑性能的影响.如:单向或是双向. 表设计: 设 ...
- 【HTML5游戏开发小技巧】RPG情形对话中,令文本逐琢夸出
从前用JAVAscript完成过令文本逐琢夸出的效果,明天嗡炒用html5中的canvas完成一下.canvas里的内容可没有像<p>那样好操做,起首,您需求懂得一些html5的API才气 ...
- SQL Server :理解DCM页
原文:SQL Server :理解DCM页 我们已经讨论了各种不同的页,包括数据页.GAM与SGAM页.PFS页,还有IAM页.今天我们来看下差异变更页(Differential Change Map ...