Oracle Flashback示例集锦

Flashback Table

本例参考Rewind a Table Using Oracle Flashback Table

Flashback Table,Flashback Query和Flashback Drop的示例合集可参见这里
首先获得当前的时间,或当前的SCN,以便后续回退使用

-- 获取SCN法1
select DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER from dual;

-- 获取SCN法2
select current_scn from v$database;

-- 获取当前时间
alter session set nls_date_format='dd-mm-yy hh24:mi:ss';
select sysdate from dual;

输出如下:

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 942616

CURRENT_SCN
-----------
    9426162

SYSDATE
-----------------
09-01-23 15:03:33

以SYS登入,并修改数据:

connect / as sysdba
alter session set container=orclpdb1;
alter table hr.regions enable row movement;
select * from hr.regions;

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

update hr.regions set region_name = 'ORACLE';
commit;
select * from hr.regions;

 REGION_ID REGION_NAME
---------- -------------------------
         1 ORACLE
         2 ORACLE
         3 ORACLE
         4 ORACLE

此时,可以采用以下几种方法恢复:

-- 恢复到5分钟前
flashback table hr.regions to timestamp sysdate - 5/24/60;

-- 恢复到指定时间点
flashback table hr.regions to timestamp to_timestamp('09-01-23 15:03:33','dd-mm-yy hh24:mi:ss');

-- 恢复到指定的SCN
flashback table hr.regions to scn 9426162

也可以用类似的语法查询之前的数据:

select * from hr.regions as of timestamp to_timestamp('09-01-23 15:03:33','dd-mm-yy hh24:mi:ss');
select * from hr.regions as of 9426162;
select * from hr.regions as of timestamp sysdate - 1/24/60;

Flashback Drop

本例参考[https://docs.oracle.com/en/database/oracle/oracle-database/tutorial-rec-flashback/index.html?opt-release-19c](Recover a Dropped Table Using Oracle Flashback Drop)。

LiveSQL中的例子可参见这里

以SYS用户登录并执行以下:

connect / as sysdba
alter session set container=orclpdb1;
create table hr.regions_hist as select * from hr.regions; 
select * from hr.regions_hist;


 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

drop table hr.regions_hist;
select * from hr.regions_hist;
select * from hr.regions_hist
                 *
ERROR at line 1:
ORA-00942: table or view does not exist

flashback table hr.regions_hist to before drop;
select * from hr.regions_hist;

 REGION_ID REGION_NAME
---------- -------------------------
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

truncate table hr.regions_hist;

Table truncated.

flashback table hr.regions_hist to before drop;
flashback table hr.regions_hist to before drop
*
ERROR at line 1:
ORA-38305: object not in RECYCLE BIN

drop table hr.regions_hist purge;

Flashback Transaction

本例参考Backing Out Transactions with Flashback

LiveSQL中的示例可参考这里
什么是Flashback Transaction Back-Out?

Flashback Transaction Back-Out is a logical recovery option to roll back a target transaction and its dependent transactions while the database remains online. A dependent transaction is related by either a write-after-write (WAW) relationship, in which a transaction modifies the same data that was changed by the target transaction, or a primary key constraint relationship, in which a transaction re-inserts the same primary key value that was deleted by the target transaction. Flashback Transaction utilizes undo and the redo generated for undo blocks, to create and execute a compensating transaction for reverting the affected data back to its original state.

Flashback Transaction要求启用归档。如果没有启用,请运行以下脚本:

echo "******************************************* "
echo "For demo purposes ONLY:"
echo "  * Unlock HR account"
echo "  * Enable ARCHIVELOG mode for database"
echo ""
echo "The script may appear to hang at the SQL prompt"
echo "when the database is shutting down and being"
echo "opened. Wait a few minutes and it should progress."
echo "******************************************* "
sqlplus "/ as sysdba" << EOF

ALTER USER HR IDENTIFIED BY hr ACCOUNT UNLOCK;
ALTER SYSTEM SET db_recovery_file_dest_size = 10737418240 SCOPE=BOTH;

shutdown immediate
startup mount
alter database archivelog;
alter database open;
archive log list
exit
EOF

本实验的初始化需要运行以下脚本:

REM "******************************************* "
REM "For demo purposes ONLY:"
REM "  * Setup for Flashback Transaction"
REM "Execute script as SYSDBA" 

set echo on
set serveroutput on
set term on
set lines 200
set pause on

/*== Set up the HR database account for this OBE ==*/

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

ALTER SESSION SET CONTAINER = orclpdb1;
GRANT EXECUTE ON dbms_flashback TO hr;
GRANT select any transaction TO hr;
pause Press [Enter] to continue...

/*== Create test data for flashback transaction ==*/
connect hr@orclpdb1;

/*== Test transaction 1 ==*/
INSERT INTO hr.regions VALUES (10,'Pole');
INSERT INTO hr.regions VALUES (20,'Moon');
INSERT INTO hr.regions VALUES (30,'Venus');
INSERT INTO hr.regions VALUES (40,'Mars');
INSERT INTO hr.regions VALUES (50,'Saturn');
COMMIT;
pause Press [Enter] to continue...

/*== Test transaction 2 ==*/
/*== Region 10 and 20 has a WAW dependency on transaction 1 ==*/
UPDATE hr.regions SET region_name='Two Poles'  WHERE region_id = 10;
UPDATE hr.regions SET region_name='Many Moons' WHERE region_id = 20;
COMMIT;
pause Press [Enter] to continue...

/*== Test transaction 3 ==*/
/*== Region 10 has a WAW dependency on transaction 1 and 2 ==*/
/*== Region 40 and 50 has a WAW dependency on transaction 1 ==*/
UPDATE hr.regions SET region_name='No star'  WHERE region_id = 10;
UPDATE hr.regions SET region_name='Red star' WHERE region_id = 40;
UPDATE hr.regions SET region_name='Big star' WHERE region_id = 50;
COMMIT;
pause Press [Enter] to continue...

/*== Test transaction 4 ==*/
/*== Region 30 has a WAW dependency on transaction 1 ==*/
UPDATE hr.regions SET region_name='Still called Venus' WHERE region_id = 30;
COMMIT;

pause Press [Enter] to continue...

connect / as sysdba
ALTER SYSTEM ARCHIVE LOG CURRENT;

prompt "Setup for Flashback Transaction completed"
pause Press [Enter] to continue...

exit

查看当前数据:

select * from hr.regions;


 REGION_ID REGION_NAME
---------- -------------------------
        10 No star
        20 Many Moons
        30 Still called Venus
        40 Red star
        50 Big star
         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

9 rows selected.

查询和regions表相关的事务:

set lines 140
set pages 9999
col VERSIONS_STARTTIME for a22
col VERSIONS_ENDTIME for a22
select region_id, region_name, versions_xid, versions_startscn, versions_starttime, versions_endscn, versions_endtime, versions_operation from hr.regions versions between scn minvalue and maxvalue;

 REGION_ID REGION_NAME               VERSIONS_XID     VERSIONS_STARTSCN VERSIONS_STARTTIME   VERSIONS_ENDSCN VERSIONS_ENDTIME     V
---------- ------------------------- ---------------- ----------------- -------------------- --------------- -------------------- -
        30 Still called Venus        05001900BE030000           9430052 09-JAN-23 03.26.31 P                                      U
                                                                        M

        50 Big star                  03001400EE030000           9430048 09-JAN-23 03.26.22 P                                      U
                                                                        M

        40 Red star                  03001400EE030000           9430048 09-JAN-23 03.26.22 P                                      U
                                                                        M

        10 No star                   03001400EE030000           9430048 09-JAN-23 03.26.22 P                                      U
                                                                        M

        20 Many Moons                02001600C0030000           9430043 09-JAN-23 03.26.10 P                                      U
                                                                        M

        10 Two Poles                 02001600C0030000           9430043 09-JAN-23 03.26.10 P         9430048 09-JAN-23 03.26.22 P U
                                                                        M                                    M

        50 Saturn                    09000B00BB030000           9430037 09-JAN-23 03.25.53 P         9430048 09-JAN-23 03.26.22 P I
                                                                        M                                    M

        40 Mars                      09000B00BB030000           9430037 09-JAN-23 03.25.53 P         9430048 09-JAN-23 03.26.22 P I
                                                                        M                                    M

        30 Venus                     09000B00BB030000           9430037 09-JAN-23 03.25.53 P         9430052 09-JAN-23 03.26.31 P I
                                                                        M                                    M

        20 Moon                      09000B00BB030000           9430037 09-JAN-23 03.25.53 P         9430043 09-JAN-23 03.26.10 P I
                                                                        M                                    M

        10 Pole                      09000B00BB030000           9430037 09-JAN-23 03.25.53 P         9430043 09-JAN-23 03.26.10 P I
                                                                        M                                    M

         1 Europe
         2 Americas
         3 Asia
         4 Middle East and Africa

15 rows selected.

可查询行的所有修改历史。以上结果按时间降序排列,因此需从底部读起。

以上minvalue和maxvalue实际为scn.minvalue和scn.maxvalue,是常数。也可以查询某事件范围,如between timestamp(systimestamp - 1/24) and timestamp
依赖于伪列(pseudocolumns ); 伪列不是ISO标准。以上VERSIONS_XID,VERSIONS_STARTSCN ,VERSIONS_ENDSCN,VERSIONS_OPERATION都是伪列。最著名的伪列是ROWID。

Flashback Data Archive

本例参考(以后再写)

其它参考

Object Level Scenario Examples Flashback Technology Depends On Affectes Data
Database Truncate table; undesired multitable changes made Database Flashback logs TRUE
Table Drop table Drop Recycle bin TRUE
Update with the wrong WHERE clause Table Undo data TRUE
Compare current data with data from the past Query Undo data FALSE
Compare versions of rows Version Query Undo data FALSE
Transaction Investigate and back out suspect transactions Transaction Query Undo/redo from archive logs TRUE
Table and Transaction Audit, compliance, historical reports, ILM Data Archival (Temporal) Tablespace FALSE

相关推荐

  1. Oracle Flashback示例集锦

    2023-12-08 18:34:02       48 阅读
  2. springboot 集成 @Cacheable简单示例

    2023-12-08 18:34:02       55 阅读
  3. Spring Boot集成Redis简单示例

    2023-12-08 18:34:02       53 阅读
  4. RabbitMQ与Spring Boot集成示例

    2023-12-08 18:34:02       139 阅读
  5. Android 高通平台集成无源码apk示例

    2023-12-08 18:34:02       40 阅读
  6. 使用Spring Boot集成RocketMQ进行消息发送的示例

    2023-12-08 18:34:02       28 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-08 18:34:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-08 18:34:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-08 18:34:02       82 阅读
  4. Python语言-面向对象

    2023-12-08 18:34:02       91 阅读

热门阅读

  1. K3cloud-计算成本分析DEmo

    2023-12-08 18:34:02       36 阅读
  2. vivado $clog2函数

    2023-12-08 18:34:02       61 阅读
  3. 14、深度学习之推理和训练

    2023-12-08 18:34:02       52 阅读
  4. 带有运行时参数的 PostgreSQL 视图

    2023-12-08 18:34:02       53 阅读
  5. js中数组对象去重的方法

    2023-12-08 18:34:02       62 阅读
  6. csp 训练计划 C语言

    2023-12-08 18:34:02       49 阅读
  7. 使用True False矩阵对torch.tensor切片

    2023-12-08 18:34:02       53 阅读
  8. 【Node.js】笔记梳理 7 - mongoose

    2023-12-08 18:34:02       63 阅读