ORACLE的闪回查询 delete操作后
as of TIMESTAMP 和as of
SCN
查询该表一分钟前的数据
select * from abc as of
TIMESTAMP SYSDATE-1/1440;
查询该表一分钟前的数据
select * from abc as of SCN
16014177255;
通过这种方式,我们可以将数据回滚到以前某个状态,比如误删除并且commit后.可以通过闪回方式进行数据的恢复.
比如:
delete from abc;
commit;
insert into abc select *
from abc as of TIMESTAMP
SYSDATE-1/1440;
commit;
2.误删除数据的情况下
FLASHBACK TABLE b to timestamp
to_timestamp('2007-08-28 11:14:00','yyyy-mm-dd hh24:mi:ss');
//我试过,可以
FLASHBACK TABLE cc
TO TIMESTAMP (SYSTIMESTAMP -
INTERVAL '01'
minute);//我也史过可以,而且这种好一点,闪回一分钟以前的数据。
在这种误删除数据的情况下,应该事先激活表的行移动特征,如:
ALTER TABLE emp ENABLE ROW MOVEMENT;
闪回表:drop 操作后
SELECT object_name, original_name FROM
user_recyclebin;
SHOW recyclebin
desc
"BIN$LS3MyjLQRcXgQAB/AQA8Ow==$0"
FLASHBACK TABLE tablename TO BEFORE
DROP;
下面是一篇转载的文章:
Oracle Flashback
Oracle Flashback
Database特性允许通过SQL语句Flashback
Database语句,让数据库前滚到当前的前一个时间点或者SCN,而不需要做时间点的恢复。flashback可以迅速将数据库回到误操作或人为错误的前一个时间点,可减少解决问题所花费的时间。
OS:windows 2000
Oracle:10g
跟flashback有关的参数:
开起flashback语法
SQL>alter database flashback on;
|
查看放flash空间的地方和容量
SQL> show parameter recover;
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
db_recovery_file_dest string
D:\oracle\product\10.2.0/flash_recovery_area
db_recovery_file_dest_size big integer 2G
|
note:(修改大小值,容量大小跟flahsback的时间有关系)
SQL> alter system set
db_recovery_file_dest_size=3G;
System altered
SQL> show parameter db_recovery_file_dest_size;
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
db_recovery_file_dest_size big integer 3G
|
建立测试帐号
SQL> create user flashtest identified by
flashtest;
已建立使用者.
SQL> grant connect,resource to flashtest;
顺利授权.
SQL> grant execute on dbms_flashback to flashtest;
顺利授权.
SQL> grant dba to flashtest;
顺利授权.
SQL> conn flashtest/flashtest;
已连线.
|
flashback drop
建立测试table
SQL> create table testdrop7(id number);
Table created
|
建立几笔资料
SQL> insert into testdrop7 values (1);
1 row inserted
SQL> insert into testdrop7 values (2);
1 row inserted
|
SQL> commit;
Commit complete
|
SQL> drop table testdrop7;
Table dropped
|
查寻回收区是否有刚被删除的资料
SQL> select
object_name,original_name,operation,type,droptime from
recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION TYPE DROPTIME
------------------------------ ----------------------
------------------------- -------------------
---------------------
BIN$4ltRoED1RaCHZglxktu9kA==$0 TESTDROP DROP TABLE
2006-05-29:17:07:48
BIN$V9qmi5hUQDKcTBMbfJkk5A==$0 TESTDROP2 DROP TABLE
2006-05-29:17:43:37
BIN$0SEStB60QhC4+hULXLkNOA==$0 TESTDROP3 DROP TABLE
2006-05-29:17:51:58
BIN$rezTtmaDQ9qn2jJEy28jdg==$0 TESTDROP4 DROP TABLE
2006-05-29:17:59:05
BIN$WXp0b1+7Qfea9YaMLw8aHA==$0 TESTDROP6 DROP TABLE
2006-05-29:18:23:16
BIN$A2ADdSwnRX2Ib5CXFe1iuQ==$0 TESTDROP5 DROP TABLE
2006-05-29:18:23:18
BIN$7lPg3xr3RFyemQ5cmCq6KA==$0 TESTDROP7 DROP TABLE
2006-05-30:12:08:34
7 rows selected
|
救回刚才被误杀的table
SQL> flashback table testdrop7 to before drop
;
Done
|
note:
如有相同的table名字的话,可改用下面语法
flashback table "BIN$A2ADdSwnRX2Ib5CXFe1iuQ==$0" to before
drop;
查寻是否真的救回来了
SQL> select * from testdrop7;
ID
----------
1
2
|
Flashback Table
以时间回复:
先开起table的flashback的功能
SQL> alter table testdrop7 enable row
movement;
Table altered
|
note:如没有做这行的话,会出现错误讯习
ORA-08189: 未启用资料列移动, 因此无法倒溯表格
现在testdrop7里有5笔资料
SQL> select * from testdrop7;
ID
----------
1
2
3
4
5
|
增加二笔资料
SQL> insert into testdrop7 values (6);
1 row inserted
SQL> insert into testdrop7 values (7);
1 row inserted
SQL> commit;
Commit complete
|
查寻一下现在时间
SQL> select to_char(sysdate,'YYYY-MM-DD
hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2006-05-30 14:21:43
|
再增一笔资料准备测试还原
SQL> insert into testdrop7 values (8);
1 row inserted
SQL> commit;
Commit complete
|
现在的时间
SQL> select to_char(sysdate,'yyyy-mm-dd
hh24:mi:ss') from dual;
TO_CHAR(SYSDATE,'YYYY-MM-DDHH2
------------------------------
2006-05-30 14:22:53
|
还原整个table到未加到数字8之前的状态
SQL> flashback table testdrop7 to timestamp
to_timestamp('2006-05-30 14:21:43','yyyy-mm-dd hh24:mi:ss');
Done
|
确时还原了
SQL> select * from testdrop7;
ID
----------
1
2
3
4
5
6
7
7 rows selected
|
以scn值回复
查寻现在testdrop7里的资料
SQL> select * from testdrop7;
ID
----------
1
2
3
4
5
6
7
7 rows selected
|
假装误删一笔资料,并且commit了
SQL> delete from testdrop7 where id =7;
1 row deleted
SQL> commit;
Commit complete
|
现在testdrop7里确时只有6笔了
SQL> select * from testdrop7;
ID
----------
1
2
3
4
5
6
6 rows selected
|
有关scn值就是记录在这个table里
SQL> desc flashback_transaction_query;
Name Type Nullable Default Comments
---------------- -------------- -------- -------
-----------------------------------------
XID RAW(8) Y Transaction identifier
START_SCN NUMBER Y Transaction start SCN
START_TIMESTAMP DATE Y Transaction start timestamp
COMMIT_SCN NUMBER Y Transaction commit SCN
COMMIT_TIMESTAMP DATE Y Transaction commit timestamp
LOGON_USER VARCHAR2(30) Y Logon user for transaction
UNDO_CHANGE# NUMBER Y 1-based undo change number
OPERATION VARCHAR2(32) Y forward operation for this undo
TABLE_NAME VARCHAR2(256) Y table name to which this undo
applies
TABLE_OWNER VARCHAR2(32) Y owner of table to which this undo
applies
ROW_ID VARCHAR2(19) Y rowid to which this undo applies
UNDO_SQL VARCHAR2(4000) Y SQL corresponding to this undo
|
查寻最后的scn值为何
SQL> select start_scn,
to_char(start_timestamp,'yyyy-mm-dd hh24:mi:ss') as s_time,
commit_scn,
to_char(commit_timestamp,'yyyy-mm-dd hh24:mi:ss') as c_time,
table_name,
undo_sql
from flashback_transaction_query
where table_name='TESTDROP7'
order by commit_timestamp;
START_SCN S_TIME COMMIT_SCN C_TIME TABLE_NAME UNDO_SQL
--------------- ------------------------- ------------------
--------------------- -------------
-----------------------------------
680553 2006-05-30 12:32:05 680731 2006-05-30 12:32:08 TESTDROP7
delete from "FLASHTEST"."TESTDROP7" where ROWID =
'AAAM1tAAEAAAAHNAAC';
685412 2006-05-30 14:04:47 685415 2006-05-30 14:04:53 TESTDROP7
delete from "FLASHTEST"."TESTDROP7" where ROWID =
'AAAM1tAAEAAAAHNAAE';
685412 2006-05-30 14:04:47 685415 2006-05-30 14:04:53 TESTDROP7
delete from "FLASHTEST"."TESTDROP7" where ROWID =
'AAAM1tAAEAAAAHNAAD';
686429 2006-05-30 14:20:51 686432 2006-05-30 14:20:57 TESTDROP7
delete from "FLASHTEST"."TESTDROP7" where ROWID =
'AAAM1tAAEAAAAHNAAG';
686429 2006-05-30 14:20:51 686432 2006-05-30 14:20:57 TESTDROP7
delete from "FLASHTEST"."TESTDROP7" where ROWID =
'AAAM1tAAEAAAAHNAAF';
686506 2006-05-30 14:22:25 686507 2006-05-30 14:22:25 TESTDROP7
delete from "FLASHTEST"."TESTDROP7" where ROWID =
'AAAM1tAAEAAAAHNAAH';
686574 2006-05-30 14:24:00 686576 2006-05-30 14:24:00 TESTDROP7
delete from "FLASHTEST"."TESTDROP7" where ROWID =
'AAAM1tAAAAAAAAJGg+';
686574 2006-05-30 14:24:00 686576 2006-05-30 14:24:00 TESTDROP7
insert into "FLASHTEST"."TESTDROP7"("ID") values ('8');
686574 2006-05-30 14:24:00 686576 2006-05-30 14:24:00 TESTDROP7
insert into "FLASHTEST"."TESTDROP7"("ID") values ('7');
686963 2006-05-30 14:31:58 686965 2006-05-30 14:32:01 TESTDROP7
insert into "FLASHTEST"."TESTDROP7"("ID") values ('7');
10 rows selected
|
现在table还没有数值7
SQL> select * from testdrop7;
ID
----------
1
2
3
4
5
6
6 rows selected
|
输入最后的scn值,进行还原
SQL> flashback table testdrop7 to scn
686963;
Done
SQL> select * from testdrop7;
ID
----------
1
2
3
4
5
6
7
7 rows selected
|
Flash Version Query
Oracle Flashback Version
Query特性,利用保存的回滚信息,可以看到特定的表在时间段内的任何修改,如电影的回放一样,可以了解表在该期间的任何变化
建立测试用table
SQL> create table testdrop10 (id number,text
varchar(10));
Table created
|
新增测试资料
SQL> insert into testdrop10 values
(1,'a');
1 row inserted
SQL> commit;
Commit complete
|
查寻一下现在时间跟scn值,以利后面查寻方便
SQL> select
current_scn,to_char(systimestamp,'YYYY-MM-DD HH24:MI:SS') from
v$database;
CURRENT_SCN TO_CHAR(SYSTIMESTAMP,'YYYY-MM-
----------- ------------------------------
691931 2006-05-30 15:51:08
|
做一些dml的动作
SQL> update testdrop10 set text='b' where
id=1;
1 row updated
SQL> commit;
Commit complete
SQL> delete testdrop10 where id=1;
1 row deleted
SQL> commit;
Commit complete
SQL> insert into testdrop10 values (1,'c');
1 row inserted
SQL> commit;
Commit complete
|
SQL> SELECT
versions_startscn,to_char(versions_starttime,'hh24:mi:ss') as
s_time,
2 versions_endscn,to_char(versions_endtime,'hh24:mi:ss') as
e_time,
3 versions_xid, versions_operation,
4 text
5 FROM testdrop10
6 VERSIONS BETWEEN TIMESTAMP
7 TO_TIMESTAMP('2006-05-30 15:51:08', 'YYYY-MM-DD
HH24:MI:SS')
8 AND TO_TIMESTAMP('2006-05-30 15:53:30', 'YYYY-MM-DD
HH24:MI:SS')
8 WHERE ID=1
9 ORDER BY versions_starttime;
VERSIONS_STARTSCN S_TIME VERSIONS_ENDSCN E_TIME VERSIONS_XID
VERSIONS_OPERATION TEXT
----------------- -------- --------------- --------
---------------- ---------------------------- ----------
691964 15:51:58 691975 15:52:13 060016007A010000 U b
691975 15:52:13 0A00250079010000 D b
691992 15:52:40 0400240078010000 I c
691964 15:51:58 a
|
note:如时间乱打的话会出现下面错误
SQL> SELECT
versions_startscn,to_char(versions_starttime,'hh24:mi:ss') as
s_time,
2 versions_endscn,to_char(versions_endtime,'hh24:mi:ss') as
e_time,
3 versions_xid, versions_operation,
4 text
5 FROM testdrop10
6 VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2006-05-30 15:51:08',
'YYYY-MM-DD HH24:MI:SS')
7 AND TO_TIMESTAMP('2006-05-30 15:54:00', 'YYYY-MM-DD
HH24:MI:SS')
8 WHERE ID=1
9 ORDER BY versions_starttime;
SELECT versions_startscn,to_char(versions_starttime,'hh24:mi:ss')
as s_time,
versions_endscn,to_char(versions_endtime,'hh24:mi:ss') as
e_time,
versions_xid, versions_operation,
text
FROM testdrop10
VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2006-05-30 15:51:08',
'YYYY-MM-DD HH24:MI:SS')
AND TO_TIMESTAMP('2006-05-30 15:54:00', 'YYYY-MM-DD
HH24:MI:SS')
WHERE ID=1
ORDER BY versions_starttime
ORA-08186: 指定的时戳无效
|
Flashback Transaction Query
在上线的环境中是不可能去追踪每个事务,想要获得已提交事务的XID,可由Flashback
Version Query或直接查寻flashback_transaction_query这个table。
SQL> select * from testdrop10;
ID TEXT
---------- ----------
1 c
SQL> delete from testdrop10 where id=1;
1 row deleted
|
在commit之前先查一下xid值
SQL> select xid from v$transaction;
XID
----------------
0500180092010000
SQL> commit;
Commit complete
|
SQL> select undo_sql from
flashback_transaction_query where xid='0500180092010000';
insert into "FLASHTEST"."TESTDROP10"("ID","TEXT") values
('1','c');
|
直接查寻flashback_transaction_query
SQL> desc flashback_transaction_query;
Name Type Nullable Default Comments
---------------- -------------- -------- -------
-----------------------------------------
XID RAW(8) Y Transaction identifier
START_SCN NUMBER Y Transaction start SCN
START_TIMESTAMP DATE Y Transaction start timestamp
COMMIT_SCN NUMBER Y Transaction commit SCN
COMMIT_TIMESTAMP DATE Y Transaction commit timestamp
LOGON_USER VARCHAR2(30) Y Logon user for transaction
UNDO_CHANGE# NUMBER Y 1-based undo change number
OPERATION VARCHAR2(32) Y forward operation for this undo
TABLE_NAME VARCHAR2(256) Y table name to which this undo
applies
TABLE_OWNER VARCHAR2(32) Y owner of table to which this undo
applies
ROW_ID VARCHAR2(19) Y rowid to which this undo applies
UNDO_SQL VARCHAR2(4000) Y SQL corresponding to this undo
|
SQL> select undo_sql from
flashback_transaction_query where table_name='SYSDROP1';
delete from "SYS"."SYSDROP1" where ROWID =
'AAAM1sAABAAAO16AAB';
delete from "SYS"."SYSDROP1" where ROWID =
'AAAM1sAABAAAO16AAA';
分享到:
相关推荐
Oracle 闪回操作是Oracle数据库提供的一种高级恢复技术,它允许用户恢复数据库、表或单个行至一个特定的时间点或系统改变号 (SCN)。这种功能在处理误操作,如误删数据、错误更新等场景时尤其有用,因为它可以避免...
### Oracle 9i 使用闪回操作 #### 一、Oracle闪回技术概述 Oracle闪回技术是一种非常实用的功能,它允许用户在不依赖备份的情况下恢复数据。这项技术尤其适用于那些因误删除或更新而导致的数据丢失情况。Oracle 9i...
此外,闪回技术也有一定的限制,比如对于某些DML操作(如TRUNCATE TABLE)和DDL操作(如ALTER TABLE),可能无法直接使用闪回技术恢复。在实际应用中,了解这些限制并合理规划数据库恢复策略至关重要。 总结来说,...
首先,文章讲解了如何开启闪回功能和归档模式,确保闪回操作的基础环境准备。接着,通过具体示例展示了表删除闪回、行记录闪回的过程,包括从回收站恢复表、按时间戳或SCN闪回记录等。随后,介绍了两种类型的还原点...
需要注意的是,闪回操作依赖于数据库的闪回日志(Flashback Log)和还原点(Undo Segment)。因此,为了能够进行有效的闪回,数据库管理员需要确保有足够的闪回日志空间,并合理设置还原点策略。 此外,SCN还用于...
在实际应用中,当发生误操作时,例如误删了表中的记录,可以首先确认有无开启闪回功能,然后使用闪回查询验证能否恢复所需数据,最后执行相应的闪回操作,如闪回表或闪回事务。在完成恢复后,记得分析并修复导致问题...
本文旨在详细介绍Oracle闪回技术的各种应用场景与操作步骤,帮助读者理解并掌握如何利用Oracle闪回功能有效地进行数据恢复。Oracle闪回技术是一项强大的特性,能够在无需借助传统的备份和恢复流程的情况下,帮助用户...
1. **回闪数据库**:这是最高级别的回闪操作,可以将整个数据库恢复到某个时间点的状态。这通常用于灾难恢复,需要在归档模式下运行,并且需要足够的备份和Redo Log信息。 2. **回闪表空间**:此操作允许您恢复一个...
2. 设置保留目标:通过`ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET`命令设定闪回日志的保留时间,以小时为单位,确保在该时间段内可以执行闪回操作。 闪回数据库的体系结构包括闪回缓冲区、重做日志缓冲区、...
这些参数通常需要配合使用,以确保有足够的空间来存储必要的日志文件,并且能够支持所需的时间段内的闪回操作。 #### 二、启用闪回数据库功能 启用闪回数据库功能前,确保数据库处于归档模式。可以通过以下命令...
在使用闪回技术时,确保已启用闪回日志(Flashback Log)并合理设置回收站(Recyclebin),这是闪回操作的基础。同时,了解并实施适当的权限和安全策略,以防止未授权的闪回操作。 总之,Oracle的闪回技术为数据库...
值得注意的是,闪回操作依赖于数据库的闪回日志(Flashback Log)和事务日志,因此必须确保这些日志文件有足够的空间以支持闪回操作。此外,闪回功能可能会受制于数据库的闪回区大小和回收站策略,过度依赖闪回可能...
在Oracle RAC环境下执行数据库操作时,有时需要利用数据库的闪回功能来回溯或恢复数据。闪回数据库功能允许数据库管理员将数据库恢复到过去某个特定的系统更改号(System Change Number, SCN)点,而不需要进行时间...
4. **撤销错误的事务**:当一系列的操作中包含了错误的命令,可以通过闪回功能撤销这些操作。 #### 三、闪回的类型 ##### 1. 闪回表 (Flashback Table) - **定义**:将整个表恢复到过去某个时间点的状态。 - **...
2. **SCN与时间的映射**:在Oracle 10g中,LGWR会实时记录SCN与时间的映射关系,这比Oracle 9i中每5分钟更新一次的频率高得多,支持更精细的闪回操作。 #### 五、闪回数据库的配置与使用 若希望启用闪回数据库功能...
1. **闪回区**:闪回区是指Oracle数据库中用于存储闪回数据的区域,这些数据包括用于闪回操作的日志信息。 2. **闪回日志**:为了支持闪回功能,Oracle会在闪回区内记录额外的日志信息,即闪回日志。 3. **闪回保留...
1. 用户需要对`dbms_flashback`包具有执行权限,这是执行闪回操作的基础。 2. 必须启用自动回滚段管理,即在初始化参数文件`init.ora`中设置`UNDO_MANAGEMENT=AUTO`。此外,`UNDO_RETENTION=n`参数设定能够向前闪回...
具体讲解了每种闪回技术的原理、配置方法、操作步骤和限制条件,并提供了具体的实例和 SQL 命令。目的是帮助数据库管理员和开发人员理解和掌握如何利用这些技术来提高数据恢复和错误修复的能力,减少数据库管理的...
通过使用Oracle的闪回技术,可以在Failover操作之后有效地恢复到原始的主备环境状态,这对于维护系统的稳定性和可靠性具有重要意义。在实际操作中,需要注意细节并进行充分的测试,以避免不必要的问题。
这一技术的核心在于撤销段,它是保存事务修改数据前原始信息的地方,为闪回操作提供必要的历史数据。 撤销段(UNDO SEGMENT)是Oracle数据库中的一个重要概念,当事务开始时,Oracle会为该事务分配一个撤销段。撤销...