本文共 21121 字,大约阅读时间需要 70 分钟。
文章目录
闪回技术
Flashback 技术在Oracle 10g中提供了更强大的功能。它包括了
-
Flashback Query
闪回查询 查询过去某个时刻或者某个SCN 值时表中数据的快照select* fromhr.employees as of timestamp sysdate-2/24 where employee_id=140
-
Flashback Table
闪回表 将表中数据恢复到过去的某个时刻或者某个SCN值的状态。闪回表与闪回查询不同,闪回查询只是返回过去某个时刻或者某个SCN值中数据的快照,并不修改表的当前状态,而闪回表是将表恢复到之前的某个状态。
flashback table employees to timestamp to_timestamp('2015-5-14 11:23:23'.'yyyy-mm-dd hh24:mi:ss')
-
Flashback Version Query
闪回版本 查询过去某个时间段或者某刻SCN 段内特定表中数据的变化情况select verxions_xi xid,versions_starttime starttime,versions_endtime endtime,versions_operation operation,salary from hr.employeesversions between timestamp minvalue and maxvalue where employee_id=140 order by starttim
-
Flashback Transaction Quey
闪回事务 查看某个事务或所有事务在过去的一段时间对数据进行的修改操作select xid ,start_scn,end_scn,commit_scn,operation,logon_user,undo_sqlfrom flashback_transaction_querywhere xid= HEXTORAW(' XID ');
-
Flashback Drop
闪回删除 可以恢复用drop table语句删除的表(注意:闪回删除只针对Drop命令,对truncate操作无能为力)。是一种意外删除的表恢复机制。 相应的索引,数据库约束也会被还原(除了外键约束)flashback table employees to before drop rename to new_employees;
-
Flashback database。
闪回数据库 将数据库恢复到过去某个时刻或者某个SCN 值时的状态flashback database to scn 3423523;
其中:
-
基于undo data
- Flashback Query 闪回查询
- Flashback Version Query 闪回版本
- Flashback Transaction Quey 闪回事务 需要额外开启的东西:https://blog.csdn.net/rlhua/article/details/13996769
-
基于undo data、row movement
- Flashback Table 闪回表
注意:
- 在sys用户或以sysdba 身份登录的用户不能执行闪回表操作
- 开启 ROE movement 特性
alter table employees enable row movement
- Flashback Table 闪回表
-
基于recycle bin、undo data
- Flashback Drop 闪回删除
首先要看我们的回收站是否开着(当然在11 g 回收站是默认开着的)
show parameter recyclebin NAME TYPE VALUE------------------------------------ ----------- ------------------------------recyclebin string on
如果关闭呢 就可以使用
alter system set recyclebin=no
- Flashback Drop 闪回删除
-
基于Flashback logs、Archivelog mode、Flash recovery area
- Flashback database 闪回数据库
闪回数据库不使用撤销数据,闪回数据库是需要:
闪回日志文件
归档重做日志文件
使用闪回数据库你首先要设置好数据库的
快速恢复区
和闪回日志的保留时间,数据库中的恢复写入进程 (RVWR)周期性的将每个数据文件发生改变的数据库的镜像副本写入闪回日志文件中,利用这些数据块的镜像副本可以重建数据文件的内容。
启用快速恢复区
show parameter db_recovery_fileNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recovery_file_dest string /u01/app/oracle/fast_recovery_areadb_recovery_file_dest_size big integer 500M
设置 快速恢复区的路径和大小
alter system set db_recover_file=' 路径‘ scope=both;alter sy stem set db_recover_file_dest_size=2G scope=both
配置快速恢复区
- 数据库必须是在归档(
ARCHIVELOG
)的模式下 - 在数据库加载(
mount
)的情况下开启 flashback_on 特性alter system set db_flashback_retention_target=2880;
可以恢复到2天前(2880min前)
- Flashback database 闪回数据库
闪回数据归档
三种闪回技术(闪回数据库、闪回删除和各种形式的闪回查询)很有用,但是它们的闪回能力都很有限。可以配置闪回数据库归档来保证将表闪回到过去任何时间——或许是多年之前的某个时间。它还能保证当数据过期时给予删除。
从体系结构上看,闪回数据归档要求一个或者多个表空间、用于每个受保护的表的各种段以及一个新的后台进程:FBDA进程。DBA必须创建表空间和其内部的归档,为每个归档指定保留期限,并指定由归档保护的表。必须的段会自动创建,并根据要求启动FBDA。
- 就DML来说,用户和应用软件不会意识到任何变化。
- 一些DDL命令会受到影响。 例如,TRUNCATE命令较慢,DROP命令无法执行。
视图:
DBA_FLASHBACK_ARCHIVE
描述配置的归档DBA_FLASHBACK_ARCHIVE_TS
显示每个表空间的每个归档分配的配额DBA_FLASHBACK_ARCHIVE_TABLES
列出启用了归档的表
创建一个提供闪回数据归档使用的表空间
SQL> create tablespace fda datafile 'fda1.dbf' size 10m;Tablespace created
在表空间创建一个保留时间为1个月的闪回数据归档
SQL> create flashback archive fla1 tablespace fda retention 1 month ; Done
创建用于此练习的模式,并授予它DBA角色
SQL> grant dba to fdbauser identified by fdbauser; Grant succeeded
授予用户操作归档的必要权限
SQL> grant flashback archive on fla1 to fdbauser;Grant succeeded
作为FDBAUSER进行连接。创建一个表并为此表启用闪回数据归档
[oracle@oracle dbs]$ sqlplus fdbauser/fdbauser;SQL*Plus: Release 12.2.0.1.0 Production on Fri May 7 10:05:49 2021Copyright (c) 1982, 2016, Oracle. All rights reserved.Connected to:Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionFDBAUSER@orcl>create table t1 as select * from all_users;Table created.FDBAUSER@orcl>alter table t1 flashback archive fla1 ;Table altered.SQL> select * from dba_flashback_archive ; -- 描述配置的归档OWNER_NAME FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME LAST_PURGE_TIME STATUS-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------ ----------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------SYS FLA1 1 30 07-5月 -21 09.59.45.000000000 上午 07-5月 -21 09.59.45.000000000 上午 SQL> select * from DBA_FLASHBACK_ARCHIVE_TS; -- 显示每个表空间的每个归档分配的配额FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB-------------------------------------------------------------------------------- ------------------ ------------------------------ ----------------------------------------FLA1 1 FDA SQL> select * from DBA_FLASHBACK_ARCHIVE_TABLES; -- 列出启用了归档的表TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------------------------------------------- -------------T1 FDBAUSER FLA1 SYS_FBA_HIST_105938 ENABLEDSQL>
运行这些查询来确定归档创建的对象。(可能必须等待几分钟,因为对象不是立即创建的)
SQL> select object_name, object_type from user_objects;OBJECT_NAME OBJECT_TYPE-------------------------------------------------------------------------------- -----------------------T1 TABLESQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------SQL>
对保护的表执行一些DML
FDBAUSER@orcl>delete from t1 ;43 rows deleted.FDBAUSER@orcl>commit;Commit complete.
使用标准的闪回查询语法对保护的表执行闪回查询
FDBAUSER@orcl> select count(*) from t1 as of timestamp(sysdate-5/1440); COUNT(*)---------- 43FDBAUSER@orcl> select count(*) from t1 ; COUNT(*)---------- 0
SQL> select object_name, object_type from user_objects;OBJECT_NAME OBJECT_TYPE-------------------------------------------------------------------------------- -----------------------T1 TABLESYS_FBA_HIST_105974 TABLE PARTITIONSYS_FBA_HIST_105974 TABLESYS_FBA_TCRV_105974 TABLESYS_FBA_TCRV_IDX1_105974 INDEXSYS_FBA_DDL_COLMAP_105974 TABLESYS_FBA_TCRV_IDX2_105974 INDEX7 rows selected TABLESQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------SYS_FBA_DDL_COLMAP_105974 TABLESYS_FBA_TCRV_105974 TABLESYS_FBA_HIST_105974 TABLE PARTITIONSYS_FBA_TCRV_IDX1_105974 INDEXSYS_FBA_TCRV_IDX2_105974 INDEX
尝试对保护的表执行一些DDL命令
FDBAUSER@orcl>drop table t1;drop table t1 *ERROR at line 1:ORA-55610: Invalid DDL statement on history-tracked tableFDBAUSER@orcl>drop user fdbauser cascade;drop user fdbauser cascade*ERROR at line 1:ORA-01940: cannot drop a user that is currently connectedFDBAUSER@orcl>drop tablespace fda including contents and datafiles;drop tablespace fda including contents and datafiles*ERROR at line 1:ORA-55641: Cannot drop tablespace used by Flashback Data Archive/*切换sys用户*/SQL> drop user fdbauser cascade; drop user fdbauser cascadeORA-00604: 递归 SQL 级别 1 出现错误ORA-55622: 不允许对表 "FDBAUSER"."SYS_FBA_TCRV_105938" 执行 DML, ALTER 和 CREATE UNIQUE INDEX 操作
注意,这些命令将会生成与归档和保护的表存在有关的错误。
从表中删除归档保护
SQL> alter table fdbauser.t1 no flashback archive;Table altered/*这时候快速执行下面查询多次。可以看到记录在被逐渐删除。*/SQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------SYS_FBA_TCRV_105974 TABLESYS_FBA_TCRV_IDX1_105974 INDEXSYS_FBA_TCRV_IDX2_105974 INDEX12.130 TEMPORARYSQL> SQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------12.138 TEMPORARY12.146 TEMPORARYSQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------12.138 TEMPORARYSQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------12.138 TEMPORARYSQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------12.138 TEMPORARYSQL> select segment_name, segment_type from dba_segments where tablespace_name='FDA';SEGMENT_NAME SEGMENT_TYPE-------------------------------------------------------------------------------- ------------------SQL> SQL> select object_name, object_type from user_objects;OBJECT_NAME OBJECT_TYPE-------------------------------------------------------------------------------- -----------------------T1 TABLESQL> SQL> SQL> select * from dba_flashback_archive ;OWNER_NAME FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# RETENTION_IN_DAYS CREATE_TIME LAST_PURGE_TIME STATUS-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ------------------ ----------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------SYS FLA1 1 30 07-5月 -21 09.59.45.000000000 上午 07-5月 -21 09.59.45.000000000 上午 SQL> select * from DBA_FLASHBACK_ARCHIVE_TS;FLASHBACK_ARCHIVE_NAME FLASHBACK_ARCHIVE# TABLESPACE_NAME QUOTA_IN_MB-------------------------------------------------------------------------------- ------------------ ------------------------------ ----------------------------------------FLA1 1 FDA SQL> select * from DBA_FLASHBACK_ARCHIVE_TABLES;TABLE_NAME OWNER_NAME FLASHBACK_ARCHIVE_NAME ARCHIVE_TABLE_NAME STATUS-------------------------------------------------------------------------------- -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- ----------------------------------------------------- -------------SQL>
删除闪回数据归档
SQL> drop flashback archive fla1; Done
重新执行上面的ddl操作
SQL> drop table t1;Table droppedSQL> drop user fdbauser cascade;drop user fdbauser cascadeORA-01940: 无法删除当前连接的用户SQL> drop tablespace fda including contents and datafiles;Tablespace dropped/*切换sys*/SQL> drop user fdbauser cascade;User dropped
闪回数据库
闪回整个数据库在功能上等价于不完整数据库恢复,但是采用的方法和支持技术完全不同。
闪回数据库要求归档模式,因为如果归档日志数据流不可用,则无法将引用归档日志得到的不一致数据库版本转换到能够打开的一致数据库版本。闪回数据库既然还要求归档日志模式,那么它相对于不完整恢复的优势体现在哪里呢?优点体现在回滚数据库将更加方便和快捷。
不完整恢复总是耗时的,因为部分过程是完全还原。不完整恢复的时间很大长度上与数据库的大小成正比。与此相反,数据库闪回所需的时间主要取决于需要撤销的更改的数量。 在任何常规的环境下,与数据库的总数据量相比更改的数据量微不足道,因此闪回操作应该快很多倍。另外,闪回数据库也很容易使用。一旦配置号,闪回日志记录能够自动进行,并且用一条命令就可以很方便地闪回数据库,根本不会出现传统的还原和恢复操作中固有的错误。
# 练习:配置闪回数据库
配置一个数据库以启动闪回数据库需要停机时间:只有在数据库出于加载模式(mount)下才能发出这样一条命令。
-
确认数据库出于归档日志模式
归档日志模式是启用闪回数据库的先决条件SQL> select log_mode from v$database ; LOG_MODE------------ARCHIVELOG
参考:
-
创建闪回恢复区
闪回恢复区是存放闪回日志的场所。 除了设置闪回恢复区目录并限定其大小外,不能施加其他控制。 可以使用两个实例参数来控制:DB_RECOVERY_FILE_DEST
和DB_RECOVERY_FILE_DEST_SIZE
参考:
-
设置闪回保留目标时间
通过DB_FLASHBACK_RETENTION_TARGET
实例参数来控制,单位是分钟,默认是一天SQL> show parameter DB_FLASHBACK_RETENTION_TARGETNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_flashback_retention_target integer 1440
闪回日志空间以循环的方式重用,更新的数据将覆盖旧的数据。该参数指示Oracle在重写它之前保存闪回数据的分钟数。
-
启用闪回日志记录
SQL> alter database flashback on ; Database altered
这将启动RVWR进程并在SGA中分配闪回缓冲区。从现在起该进程启动将是自动的。
-
打开数据库
alter database open ;
从现在起将会启用从数据库缓冲区缓存到闪回缓冲区的数据块映像日志记录功能。
监视闪回数据库
闪回保留时间只是一个目标时间(实际上并不保证闪回到其内的某个时间)。相反,升职可能闪回到该目标时间之外。可获得的闪回期限是每秒钟生成的闪回日志信息量和在使用更新的数据重写它们之前可供存储这些信息的空间量的一个函数。
闪回监视最基本的层次是确认确实启用了它
SQL> select flashback_on from v$database; FLASHBACK_ON------------------YES
在Unix上可以看到RVWR进程是一个操作系统进程
为了监视当前的闪回能力,并估计为满足目标时间闪回日志所需的空间,可以查询V$FLASHBACK_DATABASE_LOG
视图
SQL> select * from V$FLASHBACK_DATABASE_LOG;OLDEST_FLASHBACK_SCN OLDEST_FLASHBACK_TIME RETENTION_TARGET FLASHBACK_SIZE ESTIMATED_FLASHBACK_SIZE CON_ID-------------------- --------------------- ---------------- -------------- ------------------------ ---------- 32669390 2021-05-07 1424:59i:4 1440 419430400 0 0SQL>
V$FLASHBACK_DATABASE_STAT
提供了一个有有关数据文件、联机重做日志文件和闪回日志文件占用磁盘I/O比例的历史视图。
SQL> select * from V$FLASHBACK_DATABASE_STAT;BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE CON_ID----------- ----------- -------------- ---------- ---------- ------------------------ ----------2021-05-07 2021-05-07 8167424 8306688 5474816 0 0
闪回缓冲区的大小不受DBA控制,但是要查询它当前的大小,可以查询v$SGASTAT
视图
SQL> select * from v$sgastat where name='flashback generation buff';POOL NAME BYTES CON_ID-------------- -------------------------- ---------- ----------shared pool flashback generation buff 15937344 0
使用闪回数据库
使用闪回数据库有两种途径:SQL*Plus
和RMAN
。不管选择使用哪种工具,方法都是相同的:
- 关闭数据库
- 加载(mount)数据库
- 闪回到某个时间点、SCN或日志切换序列号
- 使用RESTLOGS打开数据库
只要拥有需要的所有归档日志,闪回操作将能够完全自动地运行。
SQL*Plus执行闪回
shutdown abort; -- 其他任何类型的关闭是无意义的,因为无论怎样都会丢失正在进行的所有工作,并且需要最小化停机时间。startup mount;flashback database to timestamp to_timestamp('20-21-14 10:00:00', 'dd-mm-yy hh24:mi:ss');alter database open read only; -- 观察数据是否可用,尽可能把时间往后移,以恢复更多的数据/*确认好最后的闪回时间则打开数据库*/shutdown abort;startup mount;alter database open resetlogs;
RMAN执行闪回
除了语法上有微小的变化,与SQL*Plus操作相同。
有三种选择:可以闪回到某个时间点,SCN或日志切换序列号
flashback database to time=to_date('14-12-20 10:00:00', 'dd-mm-yy hh24:mi:ss'));-- 或者flashback database to scn=2728665;-- 或者flashback database to sequence=2123 thread=1;
# 练习:SQL*Plus执行闪回
作为system连接数据库,启用数据库闪回
sqlplus systemalter database flashback on;select flashback_on from v$database;
记录时间,模拟一个错误
SQL> create table t1 as select * from all_users;Table createdSQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual ; TO_CHAR(SYSDATE,'YYYY-MM-DDHH24:MI:SS')---------------------------------------2021-05-07 16:03:15SQL> truncate table t1 ;
使用各种记录尝试恢复数据库。
/*闪回查询*/SQL> select * from t1 as of timestamp to_timestamp('2021-05-07 16:03:15','yyyy-mm-dd hh24:mi:ss' );select * from t1 as of timestamp to_timestamp('2021-05-07 16:03:15','yyyy-mm-dd hh24:mi:ss' )ORA-01466: 无法读取数据 - 表定义已更改-----------------------------------------------------------------------------------------/*闪回表*/SQL> flashback table t1 to timestamp to_timestamp('2021-05-07 16:03:15','yyyy-mm-dd hh24:mi:ss' );flashback table t1 to timestamp to_timestamp('2021-05-07 16:03:15','yyyy-mm-dd hh24:mi:ss' )ORA-08189: 因为未启用行移动功能, 不能闪回表SQL> alter table t1 enable row movement; -- 因为闪回表后,行id会变,所以需要开启行移动Table alteredSQL> flashback table t1 to timestamp to_timestamp('2021-05-07 16:03:15','yyyy-mm-dd hh24:mi:ss' );flashback table t1 to timestamp to_timestamp('2021-05-07 16:03:15','yyyy-mm-dd hh24:mi:ss' )ORA-01466: 无法读取数据 - 表定义已更改/*如果用sys用户创建表,会爆这个错SQL> flashback table t1 to timestamp to_timestamp('2021-05-07 15:34:25','yyyy-mm-dd hh24:mi:ss' );flashback table t1 to timestamp to_timestamp('2021-05-07 15:34:25','yyyy-mm-dd hh24:mi:ss' )ORA-08185: 用户 SYS 不支持闪回*/-----------------------------------------------------------------------------------------/*闪回删除*/SQL> flashback table t1 to before drop ; flashback table t1 to before dropORA-38305: 对象不在回收站中SQL> drop table t1; Table droppedSQL> flashback table t1 to before drop;DoneSQL> select count(1) from t1; -- 还是truncate之后的数据。。。 COUNT(1)---------- 0SQL>
使用闪回数据库恢复表
SYS@orcl>shutdown abort ;ORACLE instance shut down.SYS@orcl>startup mount;ORACLE instance started.Total System Global Area 2801795072 bytesFixed Size 8624648 bytesVariable Size 738199032 bytesDatabase Buffers 2046820352 bytesRedo Buffers 8151040 bytesDatabase mounted.SYS@orcl>flashback database to timestamp to_timestamp('2021-05-07 16:03:15','yyyy-mm-dd hh24:mi:ss' );Flashback complete.SYS@orcl>alter database open read only;Database altered.
SQL> select count(1) from t1 ; COUNT(1)---------- 42
还原点
创建guaranteed restore point的条件
- 数据库必须以ARCHIVELOG模式运行。 The database must be running in ARCHIVELOG mode.
- 快速恢复”区域必须启用。 Fast Recovery Area must be enabled.
【待看】
flashback功能全解析
flashback log的写入机制研究
闪回日志保留删除规则
转载地址:https://lawsssscat.blog.csdn.net/article/details/103534851 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!