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之前。

相关推荐
r i c k1 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL2 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·3 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德3 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫3 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i3 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.3 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn3 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露4 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot