Oracle - 4.1 - 【学习笔记】for ocp 12c、闪回技术总结flashback、闪回数据归档、还原点
发布日期:2021-06-30 16:59:40 浏览次数:2 分类:技术文章

本文共 21121 字,大约阅读时间需要 70 分钟。

文章目录

在这里插入图片描述

闪回技术

Flashback 技术在Oracle 10g中提供了更强大的功能。它包括了

  1. Flashback Query

    闪回查询
    查询过去某个时刻或者某个SCN 值时表中数据的快照

    select* fromhr.employees as of timestamp sysdate-2/24 where employee_id=140
  2. Flashback Table

    闪回表
    表中数据恢复到过去的某个时刻或者某个SCN值的状态。

    闪回表与闪回查询不同,闪回查询只是返回过去某个时刻或者某个SCN值中数据的快照,并不修改表的当前状态,而闪回表是将表恢复到之前的某个状态。

    flashback table employees to timestamp to_timestamp('2015-5-14 11:23:23'.'yyyy-mm-dd hh24:mi:ss')
  3. 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
  4. Flashback Transaction Quey

    闪回事务
    查看某个事务或所有事务在过去的一段时间对数据进行的修改操作

    select xid ,start_scn,end_scn,commit_scn,operation,logon_user,undo_sqlfrom flashback_transaction_querywhere xid= HEXTORAW('  XID  ');
  5. Flashback Drop

    闪回删除
    可以恢复用drop table语句删除的表(注意:闪回删除只针对Drop命令,对truncate操作无能为力)。是一种意外删除的表恢复机制。
    相应的索引,数据库约束也会被还原(除了外键约束)

    flashback table employees to before drop rename to new_employees;
  6. Flashback database。

    闪回数据库
    数据库恢复到过去某个时刻或者某个SCN 值时的状态

    flashback database to scn 3423523;

其中:

  • 基于undo data

    1. Flashback Query 闪回查询
    2. Flashback Version Query 闪回版本
    3. Flashback Transaction Quey 闪回事务
      需要额外开启的东西:https://blog.csdn.net/rlhua/article/details/13996769
  • 基于undo data、row movement

    1. Flashback Table 闪回表

      注意:

      1. 在sys用户或以sysdba 身份登录的用户不能执行闪回表操作
      2. 开启 ROE movement 特性
        alter table employees enable row movement
  • 基于recycle bin、undo data

    1. Flashback Drop 闪回删除

      首先要看我们的回收站是否开着(当然在11 g 回收站是默认开着的)

      show parameter recyclebin NAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------recyclebin                           string      on

      如果关闭呢 就可以使用 alter system set recyclebin=no

  • 基于Flashback logs、Archivelog mode、Flash recovery area

    1. 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

    配置快速恢复区

    1. 数据库必须是在归档(ARCHIVELOG)的模式下
    2. 在数据库加载(mount)的情况下开启 flashback_on 特性
      alter system set db_flashback_retention_target=2880;
      可以恢复到2天前(2880min前)

在这里插入图片描述

闪回数据归档

三种闪回技术(闪回数据库、闪回删除和各种形式的闪回查询)很有用,但是它们的闪回能力都很有限。可以配置闪回数据库归档来保证将表闪回到过去任何时间——或许是多年之前的某个时间。它还能保证当数据过期时给予删除。

从体系结构上看,闪回数据归档要求一个或者多个表空间、用于每个受保护的表的各种段以及一个新的后台进程:FBDA进程。DBA必须创建表空间和其内部的归档,为每个归档指定保留期限,并指定由归档保护的表。必须的段会自动创建,并根据要求启动FBDA。

  • 就DML来说,用户和应用软件不会意识到任何变化。
  • 一些DDL命令会受到影响。
    例如,TRUNCATE命令较慢,DROP命令无法执行。

视图:

  1. DBA_FLASHBACK_ARCHIVE 描述配置的归档
  2. DBA_FLASHBACK_ARCHIVE_TS 显示每个表空间的每个归档分配的配额
  3. 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)下才能发出这样一条命令。

  1. 确认数据库出于归档日志模式

    归档日志模式是启用闪回数据库的先决条件

    SQL> select log_mode from v$database ; LOG_MODE------------ARCHIVELOG

    参考:

  2. 创建闪回恢复区

    闪回恢复区是存放闪回日志的场所
    除了设置闪回恢复区目录并限定其大小外,不能施加其他控制
    可以使用两个实例参数来控制:DB_RECOVERY_FILE_DESTDB_RECOVERY_FILE_DEST_SIZE

    参考:

  3. 设置闪回保留目标时间

    通过DB_FLASHBACK_RETENTION_TARGET实例参数来控制,单位是分钟,默认是一天

    SQL> show parameter DB_FLASHBACK_RETENTION_TARGETNAME                                 TYPE        VALUE------------------------------------ ----------- ------------------------------db_flashback_retention_target        integer     1440

    闪回日志空间以循环的方式重用,更新的数据将覆盖旧的数据。该参数指示Oracle在重写它之前保存闪回数据的分钟数

  4. 启用闪回日志记录

    SQL> alter database flashback on ; Database altered

    这将启动RVWR进程并在SGA中分配闪回缓冲区。从现在起该进程启动将是自动的。

  5. 打开数据库

    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*PlusRMAN。不管选择使用哪种工具,方法都是相同的:

  • 关闭数据库
  • 加载(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的条件

  1. 数据库必须以ARCHIVELOG模式运行。
    The database must be running in ARCHIVELOG mode.
  2. 快速恢复”区域必须启用。
    Fast Recovery Area must be enabled.

【待看】

flashback功能全解析

flashback log的写入机制研究

闪回日志保留删除规则

转载地址:https://lawsssscat.blog.csdn.net/article/details/103534851 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:EL - ${表达式} 概念、用法、语法、隐式对象(动态获取虚拟目录 - jsp中的)
下一篇:GitHub - 高级搜索 - 关键字 => 找好项目

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月10日 23时57分18秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章