oracle database 11g 闪回技术

本文详细介绍了Oracle数据库中的多种闪回技术,包括闪回表、闪回删除、闪回版本查询、闪回事务查询、闪回数据库及闪回数据归档。通过实际案例展示了如何使用这些技术来恢复数据和撤销操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值