16.1 闪回表(Flashback Table)
闪回表技术用于回复表中的数据,可以在线进行闪回表操作。
闪回表实质上是将表中的数据恢复到指定的时间点(timestamp)或系统改变号(scn)上,并将自动恢复索引、触发器和约束等属性,同时数据库保持联机,从而增加整体的可用性。闪回表需哟啊用到数据库中的撤销表空间,可以通过show parameter umdo语句查看与插销表空间相关的信息。
例16.1 查看当前数据库中与撤销表空间相关的设置,如下:
SQL> show parameter undo;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
1、undo_management:表示系统的撤销数据管理方式,其值为auto则表示系统使用自动撤销管理方式,也就是使用撤销表空间记录撤销数据,其值manual则表示系统使用回退段撤销管理方式。
2、undo_retention表示撤销数据库在撤销表空间中的保留时间。
3、umdo_tablespace:表示所使用的撤销表空间的名称。
例16.2下面举例介绍如何使用flashback table语句执行闪回表操作。
<1>
在system用户下创建表mytest,如下:
SQL> create table mytest (id number);
表已创建。
SQL> insert into mytest values(1);
已创建 1 行。
SQL> commit;
提交完成。
提示:如果不适用commit命令进行提交,则撤销表空间中不会记录此次操作。
<3>查询系统当前时间,用户闪回时使用,如下:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2015-12-13 21:23:58
SQL> insert into mytest values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter table mytest enable row movement;
表已更改。
提示:在执行闪回表造作之前,必须先启用该表的行移动功能。
<6>使用falshback table 命令,将mytest表中的数据闪回到第3步查询结果出来的时间点上,如下:
SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YY
-------------------
2015-12-13 21:23:58
SQL> insert into mytest values(2);
已创建 1 行。
SQL> commit;
提交完成。
SQL> alter table mytest enable row movement;
表已更改。
SQL> select * from mytest;
ID
----------
1
2
SQL> flashback table mytest to timestamp
2 to_timestamp('2015-12-13 21:23:58','yyyy-mm-dd hh24:mi:ss');
提示:闪回表实质上是将表中的数据恢复到指定的时间点(timestamp)或系统改变号(scn)上,并将自动恢复索引、触发器和约束等属性,同时数据库保持联机,从而增加整体的可用性。
闪回完成。
SQL> select * from mytest;
ID
----------
1
16.2 闪回删除(flashback drop)
闪回删除技术用户恢复已经被用户删除(drop)的数据库对象,这需要使用到oracle数据看系统中的回收站机制。
16.2.1 回收站(recyclebin)
类比:window系统中回收站,在oracle数据库系统中,同样也存在一个回收站机制,它用于保存用户删除的数据库对象,方便用户需要时进行还原操作,而当用户删除一个表时,该表的所有相关对象也将被保存到回收站中,例如表中的索引、约束和触发器等。
提示:purge关键字,使用后彻底删除,不使用,先放进到oracle数据库中回收站。
<1>禁用与启用回收站
alter session set recyclebin=on|off
<2>查看回收站中的信息
普通用户使用:show recyclebin或者是user_recyclebin数据字典。
数据库管理员:是使用dba_recyclebin数据字典
SQL> desc user_recyclebin;
名称 是否为空? 类型
----------------------------------------- -------- --------------------------
OBJECT_NAME NOT NULL VARCHAR2(30)
ORIGINAL_NAME VARCHAR2(32)
OPERATION VARCHAR2(9)
TYPE VARCHAR2(25)
TS_NAME VARCHAR2(30)
CREATETIME VARCHAR2(19)
DROPTIME VARCHAR2(19)
DROPSCN NUMBER
PARTITION_NAME VARCHAR2(32)
CAN_UNDROP VARCHAR2(3)
CAN_PURGE VARCHAR2(3)
RELATED NOT NULL NUMBER
BASE_OBJECT NOT NULL NUMBER
PURGE_OBJECT NOT NULL NUMBER
SPACE NUMBER
例16.3在scott用户下创建表mytest,然后使用drop命令删除该表,如下:
SQL> set linesize 300
SQL> from user_recyclebin;
SP2-0734: 未知的命令开头 "from user_..." - 忽略了剩余的行。
SQL> select original_name,object_name,type,droptime
2 from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE DROPTIME
-------------------------------- ------------------------------ ------------------------- -------------------
PART_TEST BIN$YlX0iCryQfKzwSQEd1uAaA==$0 TABLE 2015-12-04:18:10:03
PRIMARY_KEY_ID BIN$yyytfYnfRRmPEb45a1xdqg==$0 INDEX 2015-12-05:15:46:57
GAOZHEN BIN$iuhWwGB5TYC2CdT1+FhH8g==$0 TABLE 2015-12-05:15:46:57
MYTEST BIN$cS1W+WvXSde/0uPPG7ne0w==$0 TABLE 2015-12-13:21:48:33
例16.4使用scott用户清楚回收站中mytest表对象,如下:
SQL> purge table mytest;
表已清除。
SQL> select original_name,object_name,type,droptime
2 from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE DROPTIME
-------------------------------- ------------------------------ ------------------------- -------------------
PART_TEST BIN$YlX0iCryQfKzwSQEd1uAaA==$0 TABLE 2015-12-04:18:10:03
PRIMARY_KEY_ID BIN$yyytfYnfRRmPEb45a1xdqg==$0 INDEX 2015-12-05:15:46:57
GAOZHEN BIN$iuhWwGB5TYC2CdT1+FhH8g==$0 TABLE 2015-12-05:15:46:57
16.2.2使用闪回删除
例16.5在scott用户下创建表mytest2并上传该表后,查询该表在回收站中的信息。
SQL> create table mytest2 (id number);
表已创建。
SQL> insert into mytest2 values(1);
已创建 1 行。
SQL> drop table mytest2;
表已删除。
SQL> select original_name,object_name,type,droptime
2 from user_recyclebin;
ORIGINAL_NAME OBJECT_NAME TYPE DROPTIME
-------------------------------- ------------------------------ ------------------------- -------------------
PART_TEST BIN$YlX0iCryQfKzwSQEd1uAaA==$0 TABLE 2015-12-04:18:10:03
PRIMARY_KEY_ID BIN$yyytfYnfRRmPEb45a1xdqg==$0 INDEX 2015-12-05:15:46:57
GAOZHEN BIN$iuhWwGB5TYC2CdT1+FhH8g==$0 TABLE 2015-12-05:15:46:57
MYTEST2 BIN$lMD3tq+zQc2s4fOYkTH6zQ==$0 TABLE 2015-12-13:22:03:31
SQL> flashback table mytest2
2 to before drop
3 rename to mytest_new;
闪回完成。
SQL> select * from mytest2_new;
select * from mytest2_new
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> select * from mytest_new;
ID
----------
1
提示:从回收站中恢复出来。
16.3闪回版本查询(flashback version query)
闪回版本查询技术用于查询某段时间内对表的操作记录,主要针对insert、update、delete操作,闪回版本查询的语法形式如下:
例16.6在scott用户下创建表myversion,并对该表进行一系列增删改操作,如下:
1、创建表
SQL> create table myversion (id number,text varchar2(20));
表已创建。
2、一些dml操作,每一个操作都用commit
SQL> insert into myversion values(1,'记录');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into myversion values(2,'记录2');
已创建 1 行。
SQL> commit;
提交完成。
SQL> insert into myversion values(3,'记录3');
已创建 1 行
SQL> commit;
提交完成。
SQL> update myversion set text='记录2' where id
2 =2;
已更新 1 行。
SQL> delete from myversion where id=3;
已删除 1 行。
SQL> commit;
提交完成。
SQL> select id ,text,version_operation,versions_starttime,versions_endtime
2 from myversion
3 versions between timestamp minvalue and maxvalue;
select id ,text,version_operation,versions_starttime,versions_endtime *
第 1 行出现错误:
ORA-00904: "VERSION_OPERATION": 标识符无效
SQL> select id ,text,versions_operation,versions_starttime,versions_endtime
2 from myversion
3 versions between timestamp minvalue and maxvalue;
ID TEXT V VERSIONS_STARTTIME VERSIONS_ENDTIME
---------- -------------------- - --------------------------------------------------------------------------- --------------------------
3 记录3 D 13-12月-15 10.18.56 下午
2 记录2 U 13-12月-15 10.18.56 下午
3 记录3 I 13-12月-15 10.17.32 下午 13-12月-15 10.18.56 下午
2 记录2 I 13-12月-15 10.17.20 下午 13-12月-15 10.18.56 下午
1 记录 I 13-12月-15 10.16.31 下午
注释:
version_operation表示该行执行的操作,其值为I(INSERT)U(UPDATE) D(DELETE)
version_starttime表示对该行进行改动时的起始时间戳(versions_srartscn表示起始scn)
versions_endtime表示此次改动不再有效时的结果时间戳(versions_endscn表示结束scn)
16.4 闪回事务查询(flashback transaction query)
使用闪回版本查询可以了解某个表上的修改操作,实际上就是对表进行审计,但是此功能无法对操作进行回滚,如果需要撤销已提交的事务,可以使用闪回事务查询,闪回事务查询是闪回版本查询的扩充,通过它可以审计事务甚至撤销一个已经提交的事务。
在使用闪回版本查询时,闪回操作针对的是表,而使用闪回事务查询则针对flashback_transaction_query视图,该视图的结构如下:
SQL> desc flashback_transaction_query;
名称
------------------------------------------------------
XID--事务标示
START_SCN--事务起始时的系统改变号
START_TIMESTAMP--事务起始时间的时间戳
COMMIT_SCN--事务提交时的系统改变号
COMMIT_TIMESTAMP--事务提交的时间戳
LOGON_USER--提交该事务的登陆用户
UNDO_CHANGE#--撤销改变号
OPERATION--该事务所对应的操作
TABLE_NAME--
TABLE_OWNER
ROW_ID--唯一的行标识
UNDO_SQL
例16.7上一届介绍了闪回版本查询的使用,通过闪回版本查询可以了解表的操作记录,这些操作记录都是已提交的事务,如需撤销某个事务,可以使用如下步骤
<1>使用闪回版本查询事务id,这需要到flashback version query的另外一个伪列——version_id,例如myversion表上的事务id:
SQL> select id,text,versions_xid
2 from myversion
3 versions between timestamp minvalue and maxvalue;
ID TEXT VERSIONS_XID
---------- -------------------- ----------------
3 记录3 0800050057050000
2 记录2 0800050057050000
3 记录3 07000C0076030000
2 记录2 06000800D3040000
1 记录 05000100AD040000
<2>使用闪回事务查询需要用户具有select any transaction权限,下面使用system用户为scott用户授权:
select table_name,operation,undo_sql
from flashback_transaction_query
where xid='03000800E2040000';
/
通过undo_sql:撤销事务。
16.5闪回数据库(flashback database)
闪回数据库实际上是将数据库会退到过去的一个时间点或scn上,从而实现整个数据库的恢复。
16.5.1闪回数据库设置
alter database flashback on;
select flashback_on from v$database;
conn sys/sys as sysdba;
启用闪回数据库功能的步骤如下:
<1>确定当前数据库的日志模式是否为归档模式如下:
请输入用户名: system
输入口令:
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing option
SQL> archive log list;
ORA-01031: 权限不足
SQL> conn system/oracle as sysdba;
已连接。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 65
下一个存档日志序列 67
当前日志序列 67
<2>设置删除数据库功能为启用状态如下:
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount;
ORACLE 例程已经启动。
Total System Global Area 1486495744 bytes
Fixed Size 2175888 bytes
Variable Size 1023413360 bytes
Database Buffers 452984832 bytes
Redo Buffers 7921664 bytes
数据库装载完毕。
SQL> alter database flashback on;
alter database flashback on
*
第 1 行出现错误:
ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
ORA-38713: 闪回数据库事件记录已启用。
SQL> alter database flashback on;
alter database flashback on
*
第 1 行出现错误:
ORA-38706: 无法启用 FLASHBACK DATABASE 事件记录。
ORA-38713: 闪回数据库事件记录已启用。
SQL> alter database open;
数据库已更改。
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------
YES
16.5.2使用闪回数据库
例16.8oracle数据库闪回的示例如下:
<1>在scott用户下创建student1,student2,插入两条数据后获取时间。之后再对两个表进行dml操作。
SQL> conn scott/tiger;
已连接。
SQL> create table student1(sid number,sname varchr2(10));
create table student1(sid number,sname varchr2(10)) *
第 1 行出现错误:
ORA-00907: 缺失右括号
SQL> create table student1(sid number,sname varchar2(10));
表已创建。
SQL> insert into student1 values(1001,'CANDY');
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> create table student2(sid number,sname varchar2(10));
表已创建。
SQL> insert into student1 values(2001,'TRACY');
已创建 1 行。
SQL> insert into student2 values(2001,'TRACY');
已创建 1 行。
SQL> SELECT TO_CHAR(SYSDATE,'YYYY-MM-DD HH24:MI:SS') FROM DUAL;
TO_CHAR(SYSDATE,'YY
-------------------
2015-12-14 13:31:40
SQL> DROP TABLE STUDENT1;
表已删除
SQL> UPDATE STUDENT2 SET SNAME='PETTER' WHERE SID=2001;
已更新 1 行。
SQL> COMMIT;
提交完成。
SQL> SELECT * FROM STUDENT1;
SELECT * FROM STUDENT1
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> SELECT * FROM STUDENT2;
SID SNAME
---------- ----------
2001 PETTER
<2>闪回数据库
SQL> conn sys/sys as sysdba;
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount exclusive;
ORACLE 例程已经启动。
Total System Global Area 1486495744 bytes
Fixed Size 2175888 bytes
Variable Size 1023413360 bytes
Database Buffers 452984832 bytes
Redo Buffers 7921664 bytes
数据库装载完毕。
SQL> flashback database to timestamp
2 to_timestamp('2015-12-14 13:31:40','YYYY-MM-DD HH24:MI:SS');
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> conn scott/tiger;
已连接。
SQL> select * from student1;
SID SNAME
---------- ----------
1001 CANDY
SQL> select * from student2;
未选定行
SQL> select * from STUDENT2;
未选定行
SQL> SELECT * FROM STUDENT2;
未选定行
SQL> select * from student1;
SID SNAME
---------- ----------
1001 CANDY
16.6闪回数据归档(flashback data archive)
闪回数据库:依赖闪回日志
另外的4中闪回技术:依赖撤销表空间
依赖撤销表空间:缺点-撤销表空间是循环使用的,新的数据会不断的替换旧的数据,而且撤销表数据的保留时间也是很短的,这就导致闪回操作只能在很短的时间段内能够被成功的执行。
闪回数据归档的实现机制:他讲改变的数据两外存储到特定的闪回数据归档区中,从而然闪回不再受撤销数据的限制,大大提高了数据的保留时间。
闪回数据归档区,是指存储闪回数据归档的历史数据的区域,他是一个逻辑概念,其实是从一个或者多个表空间中分出来的一定的空间。
例16.9:在system用户下创建非默认闪回数据归档区(archive01)如下:
SQL> connect system/oracle
已连接。
SQL> create flashback archive archive01
2 tablespace myspace retention 10 day;
tablespace myspace retention 10 day
*
第 2 行出现错误:
ORA-00959: 表空间 'MYSPACE' 不存在
SQL> create flashback archive archive01
2 tablespace users retention 10 day;
闪回档案已创建。
例16.10在sys用户下创建默然闪回数据归档区archive_default如下
SQL> connect sys/admin as sysdba;
已连接。
SQL> create flashback archive default archive_default
2 tablespace users retention 1 month;
闪回档案已创建。
2、管理闪回数据归档区
对一创建的闪回数据归档区,可以进行如下形式的管理——添加表空间、删除表空间、修改数据保留期限、修改磁盘限额大小、清楚闪回数据归档区中的数据和删除珊瑚数据归档区
例16.11为闪回数据归档区archive01天剑表空间temp
SQL> alter flashback archive archive01
2 add tablespace system
3 quota 1m;
add tablespace system
*
第 2 行出现错误:
ORA-55627: 闪回归档表空间必须为 ASSM 表空间
例16.12删除闪回数据归档archive01中的表空间newsapce
alter flashback archive archive01 remove tablespace newspace;
例16.13修改闪回数据归档区archive01中的数据保留期限为20天
alter flashback archive archive01
modify retention 20 day;
例16.14修改闪回数据归档区,archive01在表空间中欧的磁盘限额大小为20mb
alter flashback archive archive01
modify tablespace myspace quota 20mb;
例16.15清除闪回数据归档区中数据
例如删除闪回数据归档区archive01在2009-10-7 15:10:22之前的数据
alter flashback archive archive01
purge before timestamp
to_timestamp('2009-10-7 15:10:20','yyyy-mm-dd hh24:mi:ss');
例16.16删除闪回数据归档区archive01如下:
drop flashback archive archive01;
16.6.2为表指定闪回数据归档区
提示:为表指定闪回数据归档区后,将不允许对该表进行ddl操作。
<1>创建表时为表指定闪回数据归档区
SQL> create table table01(id number,text varchar2(10))
2 flashback archive archive01;
表已创建。
<2>为已经存在的表指定闪回数据归档区
SQL> create table table02(id number,text varchar2(10));
表已创建。
SQL> alter table table02 flashback archive archive01;
表已更改。
<3>取消表的闪回数据归档区
SQL> drop table table01;
drop table table01
*
第 1 行出现错误:
ORA-55610: 针对历史记录跟踪表的 DDL 语句无效
SQL> alter table table01 no flashback archive;
表已更改。
SQL> drop table table01;
表已删除。
16.6.3使用闪回数据归档
SQL> select * from table02 as of timestamp (systimestamp-interval '10' day);