DML误操作恢复过程
1在没有提交之前,自己session可以撤销,使用rollback进行回滚
2.提交之后,不能rollback。但是dml事务的提交历史数据在undo中有反操作记录的。默认保存的时间undo_retention=15分钟
SQL> show parameter undo_retention
NAME TYPE VALUE
-------------------------- ---------------------- ----------------------
undo_retention integer 900
SQL>
保留时间之内的历史数据能否被覆盖,由guarantee来确定 通过查看undo表空间确认
SQL> select tablespace_name,retention from dba_tablespaces;
TABLESPACE_NAME RETENTION
----------------------------------------------------- ---------------------
SYSTEM NOT APPLY
SYSAUX NOT APPLY
UNDOTBS1 NOGUARANTEE
TEMP NOT APPLY
USERS NOT APPLY
UNDOTBS2 NOGUARANTEE
GGDATA NOT APPLY
TEMP01 NOT APPLY
R1 NOT APPLY
R2 NOT APPLY
R3 NOT APPLY
R4 NOT APPLY
12 rows selected.
SQL>
如果确保指定时间内保存
SQL> alter tablespace undotbs1 retention guarantee;
Tablespace altered.
SQL>
SQL> select tablespace_name,retention from dba_tablespaces;
TABLESPACE_NAME RETENTION
------------------------------------------------------ ----------------------
SYSTEM NOT APPLY
SYSAUX NOT APPLY
UNDOTBS1 GUARANTEE
TEMP NOT APPLY
USERS NOT APPLY
UNDOTBS2 NOGUARANTEE
GGDATA NOT APPLY
TEMP01 NOT APPLY
R1 NOT APPLY
R2 NOT APPLY
R3 NOT APPLY
R4 NOT APPLY
12 rows selected.
SQL>
如何才能从undo表空间找出我们需要的DML历史数据呢?
使用闪回查询,查询的语句,使用as of scn/timestamp。 查询表在指定scn/timestamp的行记录状态
sql> select …… from t as of scn <> where …… order by ……;
sql> select …… from t as of timestamp <> where …… order by ……;
sql> select …… from t as of timestamp sysdate-1/1440 where …… order by ……; //查询一分钟前 1440=24*60*60-------一天的分钟数
例子:
SQL> create table t as select empno,ename,job,mgr,sal,deptno from emp; ---------------新建表emp1
Table created.
SQL> select * from t;
EMPNO ENAME JOB MGR SAL DEPTNO
---------- -------------------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7499 ALLEN SALESMAN 7698 1600 30
7521 WARD SALESMAN 7698 1250 30
7566 JONES MANAGER 7839 2975 20
7654 MARTIN SALESMAN 7698 1250 30
7698 BLAKE MANAGER 7839 2850 30
7782 CLARK MANAGER 7839 2450 10
7788 SCOTT ANALYST 7566 3000 20
7839 KING PRESIDENT 5000 10
7844 TURNER SALESMAN 7698 1500 30
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7902 FORD ANALYST 7566 3000 20
7934 MILLER CLERK 7782 1300 10
14 rows selected.
SQL>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
闪回版本查询精确的时间,或者scn
select …… from t versions between scn minvalue and maxvalue where ……;
versions_startscn 开始scn
versions_starttime 开始时间
versions_endscn 结束scn
versions_xid 事务
versions_operation ---执行了什么操作 D delete |I insert |U update
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
模拟dml误操作,删除t表中的数据,然后进行提交commit操作
SQL> delete t;
14 rows deleted.
SQL> commit;
Commit complete.
SQL>
SQL> select versions_startscn,versions_starttime,versions_operation from t versions between scn minvalue and maxvalue;
VERSIONS_STARTSCN VERSIONS_STARTTIME VE
----------------- --------------------------------------------------------------------------- --
11512532 08-JAN-16 05.51.01 PM D // 执行了delete操作
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
11512532 08-JAN-16 05.51.01 PM D
SQL>
SQL> select * from t as of scn 11512532;
no rows selected
SQL> select * from t as of scn 11512531;//scn比着查询的scn-1 ------------------------------通过scn,查询出误操作的数据
EMPNO ENAME JOB MGR SAL DEPTNO
---------- -------------------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7499 ALLEN SALESMAN 7698 1600 30
7521 WARD SALESMAN 7698 1250 30
7566 JONES MANAGER 7839 2975 20
7654 MARTIN SALESMAN 7698 1250 30
7698 BLAKE MANAGER 7839 2850 30
7782 CLARK MANAGER 7839 2450 10
7788 SCOTT ANALYST 7566 3000 20
7839 KING PRESIDENT 5000 10
7844 TURNER SALESMAN 7698 1500 30
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7902 FORD ANALYST 7566 3000 20
7934 MILLER CLERK 7782 1300 10
14 rows selected.
SQL> insert into t select * from t as of scn 11512531; 将查询获得的数据重新插入t表
14 rows created.
SQL> commit;
Commit complete.
SQL> select * from t;
EMPNO ENAME JOB MGR SAL DEPTNO
---------- -------------------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7499 ALLEN SALESMAN 7698 1600 30
7521 WARD SALESMAN 7698 1250 30
7566 JONES MANAGER 7839 2975 20
7654 MARTIN SALESMAN 7698 1250 30
7698 BLAKE MANAGER 7839 2850 30
7782 CLARK MANAGER 7839 2450 10
7788 SCOTT ANALYST 7566 3000 20
7839 KING PRESIDENT 5000 10
7844 TURNER SALESMAN 7698 1500 30
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7902 FORD ANALYST 7566 3000 20
7934 MILLER CLERK 7782 1300 10
14 rows selected.
SQL> select * from t as of timestamp to_timestamp ('08-JAN-16 17.51.00','DD-Mon-RR HH24:MI:SS.FF'); ----------------通过starttime,查询出误操作的数据 //建议使用scn比较方便
EMPNO ENAME JOB MGR SAL DEPTNO
---------- -------------------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7499 ALLEN SALESMAN 7698 1600 30
7521 WARD SALESMAN 7698 1250 30
7566 JONES MANAGER 7839 2975 20
7654 MARTIN SALESMAN 7698 1250 30
7698 BLAKE MANAGER 7839 2850 30
7782 CLARK MANAGER 7839 2450 10
7788 SCOTT ANALYST 7566 3000 20
7839 KING PRESIDENT 5000 10
7844 TURNER SALESMAN 7698 1500 30
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7902 FORD ANALYST 7566 3000 20
7934 MILLER CLERK 7782 1300 10
14 rows selected.
SQL> select * from t as of timestamp sysdate-1/1440; ------------------------如果执行误操作的时间较短,可以简单使用sysdate-n/1440!查询n分钟前的dml误操作
EMPNO ENAME JOB MGR SAL DEPTNO
---------- -------------------- ------------------ ---------- ---------- ----------
7369 SMITH CLERK 7902 800 20
7499 ALLEN SALESMAN 7698 1600 30
7521 WARD SALESMAN 7698 1250 30
7566 JONES MANAGER 7839 2975 20
7654 MARTIN SALESMAN 7698 1250 30
7698 BLAKE MANAGER 7839 2850 30
7782 CLARK MANAGER 7839 2450 10
7788 SCOTT ANALYST 7566 3000 20
7839 KING PRESIDENT 5000 10
7844 TURNER SALESMAN 7698 1500 30
7876 ADAMS CLERK 7788 1100 20
7900 JAMES CLERK 7698 950 30
7902 FORD ANALYST 7566 3000 20
7934 MILLER CLERK 7782 1300 10
14 rows selected.
SQL>
注意: 正常提交会有。如果ddl/tcl等隐式提交的,这样dml不会在undo表空间记录
相关推荐
oracle操作数据-DML语句.pptx
Oracle DML 触发器是关系型数据库系统中的一个重要组件,能够自动执行特定的操作,以响应数据库中的变化。本文将对 Oracle DML 触发器的工作原理、类型、使用方法等进行详细的介绍,并提供了实践中的应用示例。 1. ...
"Oracle DML 触发器" ...Oracle DML 触发器是一种非常有用的机制,它可以自动执行某些操作、提高数据的一致性和安全性、减少开发者的工作量等。但是,在使用触发器时需要注意一些问题,如命名、限制条件、主体等。
Oracle DML触发器是数据库管理系统Oracle中的一种特性,它允许开发者在特定的数据操作语言(DML)事件(如INSERT、UPDATE、DELETE)发生时自动执行一段PL/SQL代码。DML触发器主要用于实现数据完整性、业务规则的强制...
Oracle 操作数据 DML 语句 Oracle 操作数据 DML 语句是 Database Management System(数据库管理系统)中的一种基本语言,用于操作和管理数据库中的数据。DML 语句是 Data Manipulation Language(数据操作语言)...
oracleDML触发器.pptx
Oracle DML 触发器的执行顺序 Oracle 中的 DML 触发器是一种存储在数据库中的 PL/SQL 块,能够自动响应特定事件,以实现一些复杂的业务规则。DML 触发器可以分为三种基本类型:数据操纵语句 (DML) 触发器、数据定义...
MySql数据操作语言,包括 插入:insert、 修改:update、 删除:delete的相关语法和案例脚本。对学习MySql有很大的帮助。
4. **操作系统文件恢复**:在某些情况下,如果数据文件没有被覆盖,可能可以通过操作系统级别的文件恢复工具找回。但这通常需要专业知识,并且成功率不能保证。 5. **第三方工具**:市场上有一些专门的数据库恢复...
本节将深入探讨Oracle操作数据的DML(Data Manipulation Language)语句,包括插入、更新和删除数据以及事务管理。 1. 插入数据(INSERT语句) 插入数据是向表中添加新行的基本操作。Oracle中的INSERT语句有两种...
Oracle数据库中的DML(Data Manipulation Language)触发器是一种强大的工具,用于在数据修改操作(插入、删除、更新)时自动执行特定的PL/SQL代码块。这些触发器可以监控对表的操作,实时记录用户的修改行为,这...
6. **查询Log Miner结果**:通过查询V$LOGMNR_CONTENTS视图,可以查看到所有在指定日志区间内的DML(数据操纵语言)操作,包括删除记录。找到与误删操作相关的事务,记录其SQL语句。 7. **重建数据**:根据Log ...
数据操作语言(DML)用于在已有的数据库对象中插入、更新或删除数据。 - **SELECT**:用于检索数据库中的数据。 - 示例:`SELECT * FROM employees;` - **INSERT**:用于向表中插入新行。 - 示例:`INSERT INTO ...
在Oracle 11g数据库管理系统中,DML(Data Manipulation Language)语句,包括INSERT、UPDATE和DELETE,都会对数据库中的索引产生影响。索引是提高查询性能的重要工具,但它们的维护成本也是数据库操作的一个考虑...
* 变化表(Change Table):保存从源表捕获的变化数据(包括各种 DML 产生的数据) * 变化集(Change Set):是保证事务一致性的数据集合。一个变化集对应多个变化表 * 订阅视图(Subscription View):提供给读取...
- **并行处理**:Oracle支持并行执行DML操作,这在处理大数据时尤其有用。 - **数据管理**:可以方便地删除、备份和维护特定分区的数据,如定期清理历史数据。 - **高可用性**:如果一个分区发生故障,影响范围仅...