当前位置:网站首页>Oracle数据库的闪回技术
Oracle数据库的闪回技术
2022-08-02 12:57:00 【青木与风】
当 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;
然后对 hr.tab2 进行增删改操作,然后按照十六进制的行 ID 进行闪回事务查询了:
边栏推荐
猜你喜欢

移动端适配,华为浏览器底色无法正常显示

GCC版本升级到指定版本

为什么IDEA连接mysql Unable to resolve table 编译报错但是可以运行

SQL Server 2019 installation error 0 x80004005 service there is no timely response to the start or control request a detailed solution

FreeRTOS实验--删除任务

js semi-circle loading progress animation js special effects

Article 48 - Analysis of timestamp2 parameters【2022-08-01】

In-depth analysis and use of Ribbon load balancing

To eliminate air bubbles to save the mushroom h5 small game source code

消除气泡解救蘑菇h5小游戏源码
随机推荐
this的绑定指向详细解答
路由-嵌套路由
pytorch模型转tensorflow模型
RestTemplate use: set request header, request body
80篇国产数据库实操文档汇总(含TiDB、达梦、openGauss等)
There are several ways to jump to js source code, jump on the current page, jump on the blank page
Import and export data of SQL Server database
SQL Server 2019 installation error 0 x80004005 service there is no timely response to the start or control request a detailed solution
js九宫格样式抽奖插件
图论之Floyd,多源图最短路如何暴力美学?
PGSQL database to realize the import and export
FreeRTOS实验--一个函数创建多个任务
[b01lers2020]Welcome to Earth-1
js semi-circle loading progress animation js special effects
Js scratchable latex style draw plug-in
pgsql数据库实现导入导出
zabbix automated monitoring script
TFRecord简介,原理分析,代码实现?[通俗易懂]
SQL Server 数据库之生成与执行 SQL 脚本
Introduction to Scala Basic Syntax (3) Various Operators in Scala