文章目录

  • 1 概述
  • 2 实例说明
    • 2.1 闪回查询
    • 2.2 闪回版本查询
    • 2.3 闪回事务查询
    • 2.4 闪回表
    • 2.5 闪回删除
  • 3 扩展

1 概述

  • 为了使 Oracle 数据库从误操作中迅速地恢复,Oracle 推出了 闪回技术
  • 本博客,主要分享闪回技术中的 闪回查询、闪回事务查询、闪回版本查询、闪回表 和 闪回删除,对于 闪回数据库 和 闪回归档,影响范围太广,一般不建议使用。

查询 当前系统 时间戳 和 SCN

SELECT to_char(SYSDATE, 'YYYY-MM-HH hh24:mi:ss:mm') timestamp,timestamp_to_scn(SYSDATE) scnFROM dual;

2 实例说明

2.1 闪回查询

  • 作用:查询过去某段时刻之前的数据
  • 注意:commit 时间

语法:

select *from table_name[as of timestamp | scn expression]
[where condition]

基础数据:插入 3 条记录,并进行 闪回查询

CREATE TABLE flashback_select_test (ID          NUMBER,NAME        VARCHAR2(30),create_date DATE,create_scn  NUMBER
);
-- 设置时间格式,查看方便
ALTER SESSION SET nls_date_format = 'YYYY/MM/DD HH24:MI:SS';
-- insert 语句,执行间隔 几秒钟,方便测试
INSERT INTO flashback_select_test(id, NAME, create_date, create_scn)
VALUES(1, 'a', SYSDATE, timestamp_to_scn(SYSDATE));
COMMIT;
INSERT INTO flashback_select_test(id, NAME, create_date, create_scn)
VALUES(2, 'b', SYSDATE, timestamp_to_scn(SYSDATE));
COMMIT;
INSERT INTO flashback_select_test(id, NAME, create_date, create_scn)
VALUES(3, 'c', SYSDATE, timestamp_to_scn(SYSDATE));
COMMIT;

数据验证:

SELECT * FROM flashback_select_test;
SELECT * FROM flashback_select_test AS OF TIMESTAMP to_timestamp('2020/8/3 22:21:04', 'YYYY/MM/DD HH24:MI:SS');
SELECT * FROM flashback_select_test AS OF SCN 12614250;

查询截图:

2.2 闪回版本查询

  • 当记录变更时,commit 时间恰好被记录下来,可用 闪回查询 (一般情况下,我们也不会特意去记录这个时间)
  • 若没有记录下来,则用 闪回版本查询
  • 作用:可以查询所有已经提交了的记录

语法:

select *from table_name
versions between scn expr | timestamp minvalueand expr | maxvalue [as of scn | timestamp expr];
1. between ... and: 时间段
2. scn | timestamp:时间格式(系统变更号 | 时间戳)
3. minvalue | maxvalue:时间取值(最小值 | 最大值)
4. 可使用的伪列(1) versions_starttime : 基于 时间 的版本有效范围下界(2) versions_startscn  : 基于 SCN 的版本有效范围下界(3) versions_endtime   : 基于 时间 的版本有效范围上界(4) versions_endscn    : 基于 SCN 的版本有效范围上界(5) versions_xid       : 操作的事务 ID(6) versions_operation : 执行操作的类型. I: insert、U: delete、D: DELETE

演示:(DML 语句执行时,间隔几秒钟,方便观察)

CREATE TABLE flashback_versions_test (ID   NUMBER,NAME VARCHAR2(30)
);
-- 下列语句执行时,间隔几秒钟,方便观察
INSERT INTO flashback_versions_test(ID, NAME) VALUES(1, '瑶瑶');
COMMIT;
INSERT INTO flashback_versions_test(ID, NAME) VALUES(2, '倩倩');
COMMIT;
UPDATE flashback_versions_test t SET t.name = '倩倩123' WHERE t.id = 2;
COMMIT;
INSERT INTO flashback_versions_test(ID, NAME) VALUES(3, '优优');
COMMIT;

闪回版本查询语句:

SELECT id,NAME,to_char(versions_starttime, 'YYYY-MM-DD HH24:MI:SS') versions_starttime,to_char(versions_endtime, 'YYYY-MM-DD HH24:MI:SS') versions_endtime,versions_startscn,versions_endscn,versions_xid,versions_operationFROM flashback_versions_test versions BETWEEN TIMESTAMP minvalue AND maxvalueORDER BY versions_starttime;

查询结果:

2.3 闪回事务查询

  • 闪回事务查询 实际上是 闪回版本查询 的一个扩充,通过它可以审计某个事务甚至 撤销 一个已经提交的事务。

前提知识了解:

SELECT t.*FROM flashback_transaction_query tWHERE t.logon_user = 'SYSTEM'; -- 你登录的用户
-- GRANT SELECT ANY TRANSACTION TO scott; -- 测试用户,若权限不足,需授权
-- 添加补充日志 (若没有 undo_sql 为空)
SELECT t.supplemental_log_data_min, t.* FROM v$database t; -- YSE: 开启
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 开启语句

基础数据准备:假设 update 时,忘记带上 where 条件

CREATE TABLE flashback_transaction_query_ts (ID          NUMBER,NAME        VARCHAR2(30),create_date DATE
);
-- insert 语句,间隔 几秒钟,方便观察
INSERT INTO flashback_transaction_query_ts(id, NAME, create_date)
VALUES(1, '小游子', SYSDATE);
COMMIT;
INSERT INTO flashback_transaction_query_ts(id, NAME, create_date)
VALUES(2, '小优子', SYSDATE);
COMMIT;
INSERT INTO flashback_transaction_query_ts(id, NAME, create_date)
VALUES(3, '小倩子', SYSDATE);
COMMIT;
-- 假设本来想更新 id = 2 的记录,结果忘记写条件 where id = 2
UPDATE flashback_transaction_query_ts t SET t.name = '小优子22';
COMMIT;

数据验证:

1. 首先使用 闪回版本查询,查询 事务id
SELECT id,NAME,to_char(versions_starttime, 'YYYY-MM-DD HH24:MI:SS') versions_starttime,to_char(versions_endtime, 'YYYY-MM-DD HH24:MI:SS') versions_endtime,versions_startscn,versions_endscn,versions_xid,versions_operationFROM flashback_transaction_query_ts versions BETWEEN TIMESTAMP minvalue AND maxvalueORDER BY versions_starttime;
2. 根据 事务id,获取 undo_sql
SELECT t.*FROM flashback_transaction_query tWHERE t.logon_user = 'SYSTEM'AND t.xid = '08001C00AB1F0000';

测试结果:

-- undo_sql 复制如下:
1 update "SYSTEM"."FLASHBACK_TRANSACTION_QUERY_TS" set "NAME" = '小倩子' where ROWID = 'AAAVUzAABAAAVxpAAC';
2 update "SYSTEM"."FLASHBACK_TRANSACTION_QUERY_TS" set "NAME" = '小优子' where ROWID = 'AAAVUzAABAAAVxpAAB';
3 update "SYSTEM"."FLASHBACK_TRANSACTION_QUERY_TS" set "NAME" = '小游子' where ROWID = 'AAAVUzAABAAAVxpAAA';

2.4 闪回表

  • 恢复被 delete 删除的额数据
  • 需要启用行迁移
  • 注意 undo_retention 中保留的时间

基础数据:

CREATE TABLE flashback_table_test (ID   NUMBER,NAME VARCHAR2(30)
);
INSERT INTO flashback_table_test (ID, NAME) VALUES(1, '瑶瑶');
INSERT INTO flashback_table_test (ID, NAME) VALUES(2, '倩倩');
INSERT INTO flashback_table_test (ID, NAME) VALUES(3, '优优');
COMMIT;

闪回表演示:

-- 先查询
SELECT t.*, ROWID FROM flashback_table_test t;
SELECT to_char(SYSDATE, 'YYYY-MM-HH hh24:mi:ss:mm') 时间,timestamp_to_scn(SYSDATE) scnFROM dual;
-- 再删除
DELETE FROM flashback_table_test t WHERE t.id = 2;
COMMIT;
-- 闪回命令 start
ALTER TABLE flashback_table_test ENABLE ROW MOVEMENT; -- 打开表的行移动(重新生成 rowid)
FLASHBACK TABLE flashback_table_test TO SCN 12442453;
-- 闪回命令 end
SELECT t.*, ROWID FROM flashback_table_test t;

2.5 闪回删除

  • 可以恢复:使用 drop 删除的表
  • 不可以恢复:管理员用户下的表(如:system、sys) 或 truncate 的表

语法:

FLASHBACK TABLE table_name TO BEFORE DROP [RENAME TO table_name2] -- 删除表同时修改 表名[ENABLE|DISABLE] triggers; -- 删除表的同时,启用|禁用 触发器

基础数据准备:

CREATE TABLE scott.flashback_drop_test (ID   NUMBER,NAME VARCHAR2(30)
);
SELECT * FROM scott.flashback_drop_test;
DROP TABLE scott.flashback_drop_test;

情况1:一般闪回

SELECT * FROM dba_recyclebin t WHERE t.owner = 'SCOTT'; -- 或 user_recyclebin
FLASHBACK TABLE scott.flashback_drop_test TO BEFORE DROP;

情况2:回收站中的表名在数据库中已存在(重名):

  • 解决办法:重命名
SELECT * FROM dba_recyclebin t WHERE t.owner = 'SCOTT' ORDER BY t.droptime DESC; -- 或 user_recyclebin
方式1:
FLASHBACK TABLE scott.flashback_drop_test TO BEFORE DROP RENAME TO flashback_drop_test2;
方式2:(推荐,防止 "一张表,多次删除" 的情况)
-- SELECT * FROM scott."BIN$hr4mmwLmTAyvSvOcqvFO+A==$0";
FLASHBACK TABLE scott."BIN$hr4mmwLmTAyvSvOcqvFO+A==$0" TO BEFORE DROP RENAME TO flashback_drop_test3;

情况3:一张表,多次删除

  • 请注意:恢复的是最后一次删除的表

基础数据准备:

CREATE TABLE scott.flashback_drop_test (ID   NUMBER,NAME VARCHAR2(30)
);
DROP TABLE scott.flashback_drop_test;
-- 以上 创建、删除 至少操作 2 次,方便演示
SELECT * FROM user_recyclebin t ORDER BY t.droptime DESC;

演示:

FLASHBACK TABLE flashback_drop_test TO BEFORE DROP;

3 扩展

1. 显示回收站(sqlplus 命令)
> show recyclebin
2. 清空回收站(sqlplus 命令)
> purge recyclebin
3. 查询回收站
select * from dba_recyclebin; -- user_recyclebin
4. 删除表并在回收站中清空
drop table table_name purge;
5. 清空表数据并在回收站中清空
truncate table table_name;

Oracle 闪回技术详解(flashback)相关推荐

  1. Oracle 闪回技术详解

    概述 闪回技术是Oracle强大数据库备份恢复机制的一部分,在10g的时候就被推出一直延续到现在.在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成 ...

  2. Oracle闪回技术详解

    Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前 ...

  3. 【转载】oracle闪回技术详解之闪回drop(神奇的flashback)

    写在前面:删库跑路,相信这是绝大多数程序员会经常听到的一个词.俗话说:常在河边走,哪有不湿鞋,作为经常和数据打交道的程序员也好,运维实施也好,有时难免会出现数据误删除,误操作等情况.如果你是一个ora ...

  4. oracle flash_back oracle闪回技术详解,oracle flashback 闪回技术实例

    oracle flashback 闪回技术实例 相关操作 1.DBA必须设定undo保持力足够大以能够重构需要闪回的数据 ALTER SYSTEM SET UNDO_RETENTION=; secon ...

  5. oracle闪回技术详解之闪回drop(神奇的flashback)

    写在前面:删库跑路,相信这是绝大多数程序员会经常听到的一个词.俗话说:常在河边走,哪有不湿鞋,作为经常和数据打交道的程序员也好,运维实施也好,有时难免会出现数据误删除,误操作等情况.如果你是一个ora ...

  6. oracle闪回数据库详解

    --- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...

  7. oracle 闪回功能详解

    Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,可以查询以前的 ...

  8. oracle 闪回表定义,oracle闪回表详解

    --- 说明闪回数据库 --- 使用闪回表将表内容还原到过去的特定时间点 --- 从删除表中进行恢复 --- 使用闪回查询查看截止到任一时间点的数据库内容 --- 使用闪回版本查询查看某一行在一段时间 ...

  9. Oracle 闪回特性 详解

    Oracle的闪回技术提供了一组功能,可以访问过去某一时间的数据并从人为错误中恢复.闪回技术是Oracle 数据库独有的,支持任何级别的恢复,包括行.事务.表和数据库范围.使用闪回特性,您可以查询以前 ...

最新文章

  1. 2022-2028年中国DTRO膜行业市场全景评估及产业前景规划报告
  2. 超强后浪:14岁考上研究生,如今17岁的他或将成为全国最小的博士生!
  3. spring 事件监听
  4. oracle查询表字段sql语句怎么写,oracle联合查询并更新一个表字段的sql语句
  5. 2015-10-21 C#1
  6. 网络基础 2-1(应用层,HTTP三点注意,HTTP协议格式, 最简单的HTTP服务器)
  7. Uber从Postgres切换到MySQL
  8. 5Python全站之路系列之MySL连表查询
  9. springboot快速入门【小白也能看懂】
  10. 程序员的你不可不知的数据库northwind
  11. cocos creator后台切入切出
  12. 中国176个AAAAA级景区,存起来吧!下一站你去哪里?
  13. 一次从ZoomeyeAPI脚本编写到提权的***实践
  14. bzoj 4987 Tree - dp
  15. epub转换mobi
  16. 程序人生,心态变化!
  17. chrono_duration(一)
  18. python在abaqus中的应用光盘文件下载_Python语言在Abaqus中的应用DVD光盘
  19. arm synchronization primitives
  20. WAS7和WAS8.5布署Axis2 webservice

热门文章

  1. 数字内容营销不迷路,天猫内容力为你领航
  2. 计算机网络第七部分--因特网协议(英文版本)
  3. 用c语言转八进制,C语言十进制如何转八进制?
  4. 在线学习的特点和优劣分析
  5. 华为桌面计算机丢了,电脑数据丢失怎么办?手把手教你如何恢复删除的文件
  6. Python pip 源设置成国内源,阿里云源,清华大学源,最方便的方式,都在这里了
  7. ssh远程执行python本地脚本_ssh远程执行命令方法和Shell脚本实例
  8. linux的ls命令没反应,Linux:ls命令如何使用
  9. 兰兰酱日常分享小妙招~~CSDN消除水印
  10. 访问其他电脑上的共享文件时提示输入网络凭证的解决方法