ORACLE 闪回技术简介

闪回技术是若干技术的集合 包含对数据库整体的闪回 对表的闪回 对事务的闪回

经典面试题面试题:简述Oracle数据库闪回技术?

1.闪回Oracle数据库

2.闪回表

3.闪回事务

数据库闪回

要想实现数据库闪回

1.必须配置数据库的恢复区

SQL> show parameter recover

NAME TYPE VALUE


db_recovery_file_dest string

db_recovery_file_dest_size big integer 0

数据库的恢复区 可用用来存放多种数据 比如:控制文件的镜像 redo文件的镜像 归档 备份 闪回日志(只能存放在这里)

闪回日志

数据库能够实现时间的倒退(闪回)要依赖闪回日志的记录

! mkdir -p /home/oracle/flash

alter system set db_recovery_file_dest_size=2G;

alter system set db_recovery_file_dest='/home/oracle/flash';

2.开启数据库的闪回功能

(1)保证数据库已经运行在归档模式

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

(2)查询是否已经开启闪回

SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON


NO

开启闪回

alter database flashback on ;

SQL> select FLASHBACK_ON from v$database;

FLASHBACK_ON


YES

验证数据库的闪回功能

SQL> create table t1 as select * from dba_objects;

Table created.

SQL> select current_scn from v$database;

CURRENT_SCN


1679739

SQL> create table t2 as select * from t1;

Table created.

SQL> alter system switch logfile;

System altered.

SQL> /

System altered.

SQL> /

System altered.

SQL> truncate table t1;

Table truncated.

SQL> shutdown immediate

SQL> startup mount

SQL> flashback database to scn 1679739;

SQL> alter database open resetlogs;

生产上 闪回数据库这个操作 不能够用来找回误删除的数据

1.闪回需要数据库运行在mount阶段 意味着需要关闭数据库

2.闪回到过去的时间点后 在这期间数据库的所有数据全部丢失

闪回数据库技术能干什么

1.压力测试后 回退数据

2.数据库版本升级

在生产上 误删除了数据 可以用备份恢复的方式找回数据

闪回表

1.drop表后 将表闪回

利用Oracle的回收站功能

回收站

SQL> show parameter recyc

NAME TYPE VALUE


recyclebin string on

回收站各个用户之间独立

回收站的空间属性问题

SQL> create tablespace test datafile '/u01/app/oracle/oradata/PROD4/PROD4/test.dbf' size 10m;

Tablespace created.

SQL> create user bsr identified by oracle default tablespace test;

User created.

SQL> conn bsr/oracle

Connected.

SQL> create table TEST1 as select * from dba_objects;

Table created.

SQL> select sum(bytes)/1024/1024 from dba_segments where segment_name='TEST1';

SUM(BYTES)/1024/1024


9

SQL> show recyclebin

SQL> desc dba_free_space;

Name Null? Type


TABLESPACE_NAME VARCHAR2(30)

FILE_ID NUMBER

BLOCK_ID NUMBER

BYTES NUMBER

BLOCKS NUMBER

RELATIVE_FNO NUMBER

SQL> select TABLESPACE_NAME,bytes/1024/1024 from dba_free_space where tablespace_name='TEST';

select TABLESPACE_NAME,sum(bytes)/1024/1024 from dba_free_space group by TABLESPACE_NAME;

no rows selected

SQL> DROP TABLE TEST1;

Table dropped.

DROP表的本质 是将表进行改名 并且 将段使用的空间从永久变为临时

show recyclebin

flashback table "BIN$xxxxx" to before drop [rename to 表名]

2.delete行 将表中已删除的行找回

SQL> create table SALARY as select EMPLOYEE_ID,COMMISSION_PCT from hr.employees;查看下操作系统时间date

delete SALARY where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));

闪回查询 只要修改的数据在undo中存放 就可以在查询时 添加时间点 找到对应的数据 如果undo中数据被覆盖 那么会报快照过旧

Fri Apr 12 02:49:47 UTC 2019

select * from SALARY AS OF timestamp to_date('2019-04-12 02:49:47','yyyy-mm-dd hh24:mi:ss') where employee_id in (select employee_id from hr.employees where HIRE_DATE<to_date('2002-01-01','yyyy-mm-dd'));

EMPLOYEE_ID COMMISSION_PCT


102

delete t1 where 条件 name=fuxian

update t1 set salary=salary+1000 where name=fuxian

insert into table xxx values( );

02:15:40 UTC 2016

--delete 整个表后可以使用flashback table 找回

SQL> alter table test enable row movement;--先打开行移动的功能

flashback table SALARY to timestamp to_date('2019-04-12 02:49:49','yyyy-mm-dd hh24:mi:ss');


两种方式 生产上 尽量用第一种方式 插入的方式

因为数据的还原值都在undo里记录 我们可以利用undo对数据进行闪回版本查询

flash version query

flashback version query提供了一个审计行改变的功能,它能找到所有已经提交了的行的记录,比如说,时间1,我插入一条记录,时间2我删除了这条记录,对于时间3,当然查询不到这条记录,但是flashback version query能够把时间1、时间2的操作给记录下来,并详细的查询出来。

flashback version query一样依赖于AUM(自动undo管理),所以,这里就不再多说AUM的配置。flashback version query采用VERSIONS BETWEEN语句来进行查询

,常用的有:

·VERSIONS_SCN -- 系统改变号

·VERSIONS_TIMESTAMP -- 时间

下面将展示这个 flashback version query

SQL> connect test/test

Connected.

SQL> create table t1(ID int,NAME varchar2(10));

Table created.

我们执行一系列如下的操作:

insert into T1 values(1,'A');

commit;

update T1 set ID=2;

commit;

update T1 set ID=3;

commit;

update T1 set ID=4;

现在,我们看到该表最后的记录是

16:34:49 SQL> select * from T1;

A B


5 16:34:34

这个时候,如果我们利用flash table或者是flash query,我们也只能是看到过去的莫一个快照而已,利用flashback version query,我们将找到其中的任何变化,如

SQL>select versions_starttime, versions_endtime, versions_xid,

versions_operation,ID,NAME

from t1 versions between timestamp minvalue and maxvalue

order by VERSIONS_STARTTIME;

SELECT * FROM (select versions_starttime, versions_endtime, versions_xid,

versions_operation,ID,NAME

from t1 versions between timestamp minvalue and maxvalue

order by VERSIONS_STARTTIME) WHERE NAME='B' ;

VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID V ID NAME


12-OCT-15 02.01.30 PM 01000D00C3010000 U 5 D

12-OCT-15 02.01.30 PM 12-OCT-15 02.01.30 PM 0600110096020000 I 4 C

12-OCT-15 02.01.30 PM 12-OCT-15 02.01.30 PM 0A001F00FB010000 I 1 A

12-OCT-15 02.01.30 PM 12-OCT-15 02.01.30 PM 04001C002B020000 U 3 B

12-OCT-15 02.01.30 PM 12-OCT-15 02.01.30 PM 080009006D030000 U 2 B

12-OCT-15 02.01.30 PM 090002008E020000 D 3 B

select versions_starttime, versions_endtime, versions_xid,

versions_operation,salary

from employees versions between timestamp minvalue and maxvalue where employee_id=107

order by VERSIONS_STARTTIME;

注意:

此处显示了对该表所作的所有更改,甚至包括该行被删除和重新插入的情况。VERSION_OPERATION 列显示对该行执行了什么操作 (Insert/Update/Delete)。

所做的这些工作不需要历史表或额外的列。

flashback version query记载的是行的改变,如果一个操作有多行的改变,如delete from tablename,那么,在flashback version query对应的也是多行。

在上述查询中,列 versions_starttime、versions_endtime、versions_xid、versions_operation 是伪列,与 ROWNUM、LEVEL 等其他熟悉的伪列相类似。其他伪列 --- 如 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN --- 显示了该时刻的系统更改号。列 versions_xid 显示了更改该行的事务标识符。有关该事务的更多详细信息可在视图 FLASHBACK_TRANSACTION_QUERY 中找到(这个将在flashback transaction query中描述)。

当然,除了分析以上所有的变更之外,我们可以指定时间段,如

select ID,NAME

from test versions between timestamp

to_date('2004-04-07 04:34:04','yyyy-mm-dd hh24:mi:ss')

and to_date('2004-04-07 04:34:50','yyyy-mm-dd hh24:mi:ss');

还可以使用 SCN 来找出过去的版本值。可以从伪列 VERSIONS_STARTSCN 和 VERSIONS_ENDSCN 中获得 SCN 号。以下是一个示例:

select versions_starttime, versions_endtime

from test versions

between scn 1000 and 1001

flashback transaction query闪回事务:

Oracle 11g的闪回事务查询就是对过去某段时间内所完成的事务的查询和撤销。10g数据来源于undo,11g来自undo/redo/archivelog,在考试中我们使用em来操作,举例如下:

a、打开数据库补充日志:

sql>alter database add supplemental log data;

b、打开主键补充日志:

sql>alter database add supplemental log data (primary key) columns;

然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择

/*== transaction 1 ==*/

INSERT INTO hr.departments VALUES (280,'ERP', NULL, 1700)

/

INSERT INTO hr.departments VALUES (290,'Support Operations', NULL, 1700)

/

INSERT INTO hr.departments VALUES (300,'HR Training', NULL, 1700)

/

commit

/

/*== transaction 2 ==*/

update hr.departments set department_id=310 where department_id=280

/

commit

/

/*== transaction 3 ==*/

update hr.departments set department_name='ABC' where department_id=310

/

commit

alter system switch logfile; 切三遍以上

然后用em查询,和查询闪回版本差不多:打开em----Availability----->Perform Recovery----如下选择:将上面的事务操作闪回到第一次update之前。

相关推荐
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站3 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
装不满的克莱因瓶3 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb