当 Oracle 数据库发生逻辑损坏时,可以使用闪回技术简单快捷地进行数据库的恢复。
闪回数据库使用闪回日志执行闪回。闪回删除使用回收站。其它所有技术都使用还原数据。并不
是所有闪回功能都会修改数据库。有些功能只是一些用来查询数据以往版本的方法
一、闪回数据库
使用闪回数据库,通过还原自先前某个时间点以来发生的所有更改,可快速将数据库恢复到过去
的某个时间点上的状态。使用闪回数据库功能时,不需要还原备份。闪回数据库功能可以方便地
撤消导致逻辑数据损坏的更改。如果数据库发生介质丢失或物理损坏,则必须使用传统的方法进
行恢复。
1. 配置闪回数据库的方法
SQL>shutdown immediate;
SQL>startup mount exclusive;
SQL>alter system set db_flashback_retention_terget=2880 scope=both;
SQL>alter system set DB_RECOVERY_FILE_DEST_SIZE=20G scope=both;
SQL>alter system set db_recovery_file_dest='+FRA' scope=both;
SQL>alter database flashback on;
SQL>alter database open;
注意:DB_FLASHBACK_RETENTION_TARGET 初始化参数用来设置保留目标,可指定数据库所
能闪回的上限(以分钟为单位)。此参数只是一个目标,并不提供任何保证,闪回时间间隔取决
于在快速恢复区中保存的闪回日志的数据量。
查询确认闪回数据库是否已经启用:
SQL>select flashback_on from v$database;
2. 闪回数据库的方法
闪回数据库必须以 EXCLUSIVE 模式装载才能执行 FLASHBACK DATABASE 命令,而且在完成时
必须使用 RESETLOGS 选项打开数据库。
在使用 RMAN 命令 FLASHBACK DATABASE 命令执行闪回数据库操作时,可以使用 SEQUENCE
和 THREAD 指定作为下限的重做日志序列号和线程号,RMAN 只选择可用于闪回到指定序列号(但
不包括指定序列号)的文件。
也可以使用 FLASHBACK DATABASE 的 SQL 命令将数据库恢复到过去的某个时间或 SCN. 如果
使用 TO SCN 子句,则必须提供一个编号。如果指定 TO TIMESTAMP, 则必须提供一个时间戳
值。还可以指定还原点名称,例如:
RMAN> FLASHBACK DATABASE TO TIME="TO_DATE('2013-05-27 09:00:00',
'YYYY-MM-DD HH24:MI:SS')";
RMAN> FLASHBACK DATABASE TO SCN=23565;
RMAN> FLASHBACK DATABASE TO SEQUENCE=223 THREAD=1;
或者:
SQL> FLASHBACK DATABASE TO TIMESTAMP(SYSDATE-1/24);
SQL> FLASHBACK DATABASE TO SCN 53943;
SQL> FLASHBACK DATABASE TO RESTORE POINT b4_load;
3. 闪回数据库测试
本节实验测试基于时间戳的数据库闪回。
1) 创建用于实验的测试表 hr.t_obj:
SQL>create table hr.t_obj as select * from dba_objiects;
SQL>select count(*) from hr.t_obj;
2) 获取当前系统时间:
SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') tm from dual;
3) 删除 hr 用户及其对象:
SQL>drop user hr cascade;
SQL>select count(*) from hr.t_obj;
4) 建立对照表
SQL>select count(*) from system.tab1;
5) 执行闪回数据库操作,恢复 hr
SQL>shutdown immediate;
SQL>startup mount;
SQL>flashback database to timestamp to_timestamp
2 ('2014-11-03 10:48:48','yyyy-mm-dd hh24:mi:ss');
SQL>alter database open resetlogs;
6) 验证
SQL>select count(*) from hr.t_obj;
SQL>select count(*) from system tab1;
可以看到,执行闪回数据库时间戳之前的更改都得到了恢复,之后的更改不再有效。因此,闪回
数据库是对数据库的整体回退。
二、表的删除闪回
表删除(drop)闪回的原理是使用回收站技术,被删除的对象会临时放入回收站中并且仍属于其
所有者。当删除的表移到回收站时,会使用系统生成的名称重命名该表及其关联对象和约束条件。
回收站本身也是一个数据字典表,它用来维护删除对象的原始名称与其系统生成名称之间的关系。
使用 DBA_RECYCLEBIN, USER_RECYCLEBIN 视图可查询回收站的内容。
要使用闪回删除功能,必须将 FLASHBACK TABLE 或 FLASHBACK ANY TABLE 系统权限授予
使用闪回表功能的用户。此外,还必须将 SELECT, INSERT, DELETE 和 ALTER 对象权限授予
用户。
1. 表的删除闪回语法
FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO new_name];
2. 表的删除闪回测试
1) 删除 hr.t_obj 表:
SQL>conn hr/hr
SQL>select count(*) from hr.t_obj;
SQL>drop table hr.t_obj;
SQL>select count(*) from hr.t_obj;
2) 查询回收站并执行闪回删除:
SQL>select object_name, original_name, can_undrop, base_object
2 from user_recyclebin;
SQL>flashback table hr.t_obj to before drop;
SQL>select count(*) from hr.t_obj;
三、闪回查询
闪回查询通常用于检索一条记录的所有历史版本,回溯单独的事务或者回溯从指定时间以来对特
定表的所有变化。
1. 闪回查询的语法
SELECT <column_name_list> FROM <table_name>
AS OF <SCN> --- 使用 as of scn
或 AS OF <TIMESTAMP> --- 使用 as of timestamp
[WHERE <filter_conditions>]
[GROUP BY <unaggregated columns>]
[HAVING <group_filter>]
[ORDER BY <column_positions_or_name>]
2. 闪回查询测试
1) 创建实验用测试表 tab1:
SQL>create table hr.tab1 as select user_id, username from dba_users where 1=0;
SQL>insert into hr.tab1 select user_id, username from dba_users where user_id < 10;
SQL>commit;
SQLselect * from hr.tab1;
2) 对表进行删除操作,并进行闪回查询:
SQL>conn hr/hr;
SQL>select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') tm from dual;
SQL>delect tab1 where username='SYS';
SQL>select * from tab1;
SQL>seelct *from tab1 as of timestamp to_timestamp ('2022-08-01 11:00:00', 'yyyy-mm-dd hh24:mi:ss');
四、闪回表
1. 表闪回的方法
使用闪回表的先决条件是必须启用表的行迁移:
ALTER TABLE schema_name.table_name ENABLE ROW MOVEMENT;
表闪回的语法:
FLASHBACK TABLE schema_name.table_name TO SCN <scn_number>
-- 基于 SCN 的表闪回
或 TO TIMESTAMP <timestamp> -- 基于 TIMESTAMP 的表闪回
或 TO RESTORE POINT <restore_point> -- 基于 RESTORE POINT 的表闪回
[<ENABLE | DISABLE> TRIGGERS]
2. 表闪回测试
本节实验基于 RESTORE POINT 的表闪回。
基于 RESTORE POINT 的表闪回首先要创建适当的还原点,创建还原点的语法为:
CREATE RESTORE POINT point_name;
对于闪回成功之后无用的闪回点可以及时删除掉,删除闪回点的语法为:
DROP RESTORE POINT point_name;
1) 创建用于闪回表的测试表 hr.tab2,并创建还原点 p1:
SQL>create table hr.tab2 as select user_id, username from dba_users where 1 = 0;
SQL>alter table hr.tab2 enanle row movement;
SQL>insert into hr.tab2 seelct user_id, username from dba_users where user_id < 10;
SQL>select * from hr.tab2;
SQL>create restore point p1;
2) 对表 hr.tab2 进行插入操作,并创建还原点 p2:
SQL>insert into hr.tab2 select user_id, username from dba_users
2 where user_id >= 10 and user_id < 20;
SQL> select * from hr.tab2;
SQL>select * from hr.tab2;
SQL>create restore point p2;
3) 从表 hr.tab2 进行删除,创建还原点 p3:
SQL>delect hr.tab2 where user_id = 5;
SQL>seelct * from hr.tab2;
SQL>create restore point p3;
4) 开始执行闪回表操作:
SQL>flashback table hr.tab2 to restore point p1;
SQL>select * from hr.tab2;
SQL>flashback table hr.tab2 to restore point p2;
SQL>select * from hr.tab;
SQL>flashback table hr.tab2 to restore point p3;
SQL>select * from hr.tab2;
5) 删除还原点:
SQL>fdrop restore point p1;
SQL>drop restore point p2;
SQL>drop restore point p3;
五、闪回版本查询
闪回版本查询指的是 Oracle 可以针对特定的对象来查询某一特定时段内该对象变化的所有情
况,也可以根据特定的需要来将该对象修正到特定的时刻。
闪回版本查询同闪回查询、闪回表一样,都是使用了 UNDO 段的数据,即数据变更的历史副本,
当 UNDO 段的数据由于空间变化而被清除后,则无法进行闪回。
1. 闪回版本查询语法
SELECT <columns> FROM <schema_name.table_name>
VERSIONS BETWEEN SCN <minimum_scn> AND <maximum_scn>
-- 基于 SCN 的版本查询
或者:
SELECT <columns> FROM <schema_name.table_name>
VERSIONS BETWEEN timestamp
to_timestamp('start_timestamp') and to_timestamp('end_timestamp')
-- 基于 TIMESTAMP 的版本查询
2. 闪回版本查询测试
使用上节课闪回表查询创建的测试表 hr.tab2:
SQL>col USER_ID format 99999
SQL>col USERNAME format a10
SQL>seelct user_ID, username, versions_xid, versions_startscn,
2 versions_endscn, versions_operation
3 from hr.tab2 versions between scn minvalue and maxvalue;
其中:
versions_xid - 记录指定版本事务的唯一标识符。
versions_startscn - 记录的起始 SCN 号。
versions_endscn -- 记录的终止 SCN 号。
versions_operation - 记录的操作类型(I 表示插入,U 表示更新,D 表示删除)。
闪回事务查询是对闪回版本查询的扩展。从某种程度上来说,闪回版本查询通常用于更细粒度的
查询,如针对特定的记录。而闪回事务则是针对某一事务进行闪回,是基于事务级别的。闪回事
务查询是通过查询视图 flashback_transaction_query 来获得某个或多个特定事务信息,
同时可根据该视图中提供的 undo_sql 列中的语句来反转事务,从而保证数据的完整性。
要使用闪回事务查询,必须要启用补充日志记录功能并建立正确的权限。例如,要对上一节闪表
操作创建的测试表 tab2 使用闪回事务处理,就要以 SYSDBA 权限在 SQL*Plus 中执行下列设
置步骤:
SQL>alter database add supplemental log data;
SQL>alter database add supplemental log data (primary key) columns;
SQL>grant execute on dbms_flashback to hr;
SQL>grant select any transaction to hr;文章来源:https://www.toymoban.com/news/detail-613664.html
然后对 hr.tab2 进行增删改操作,然后按照十六进制的行 ID 进行闪回事务查询了:文章来源地址https://www.toymoban.com/news/detail-613664.html
到了这里,关于Oracle数据库的闪回技术的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!