flashback闪回
9i的闪回查询特性:
闪回功能依赖的于回滚段中存储的数据前镜像 ,在9前版本中,通常只要事物提交后,前镜像数据就可以被覆盖,
空间可以重用;9中引入了自动回滚段管理,可以通过调整UNDO_RETENTION参数来设置数据库UNDO信息的保留时间,
只要前镜像没有被覆盖,那么闪回就是可能的,但要注意,UNDO信息的保留还同UNDO表空间的空间有关,如空间紧张,
为了满足事物需要,非活动的前镜像信息是可以被覆盖的
语法:as of scn(timestamp) expr
一,测试:
SQL> create table solo as select * from dba_users;
表已创建。
SQL> select count(*)from solo;
COUNT(*)
----------
21
SQL> select systimestamp from dual;
SYSTIMESTAMP
--------------------------------------------------------------------
26-7月 -08 10.50.46.060000 上午 +08:00
SQL> delete from solo where rownum<3;
已删除2行。
SQL> commit;
提交完成。
SQL> select count(*)from solo;
COUNT(*)
----------
19
SQL> select count(*) from solo as of timestamp(systimestamp -interval '480' second);
COUNT(*)
----------
21
SQL> col scn for 9999999999999999;
SQL> select dbms_flashback.get_system_change_number scn from dual;
SCN
-----------------
604268
SQL> select count(*)from solo as of scn 604000;
COUNT(*)
----------
21
案例:
某日某人误删除了部分重要数据,并且已经提交,需要恢复.由于是9i,可以尝试使用flashback query闪回数据
首先确认数据库的scn变化,通过v$archived_log视图查询:
select NAME,FIRST_CHANGE#,NEXT_CHANGE#, FIRST_TIME from v$archived_log;
略.....
SQL> select dbms_flashback.get_system_change_number scn from dual;
SCN
-----------------
605366
SQL> select count(*)from solo;
COUNT(*)
----------
19
SQL> create table solo_recov as select * from solo where 1=0;
表已创建。
尝试多个scn,获取最佳值
SQL> select count(*)from solo as of scn 604000;
COUNT(*)
----------
21
SQL> insert into solo_recov select * from solo as of scn 604000;
已创建21行。
SQL> commit;
提交完成。
SQL> select count(*)from solo_recov;
COUNT(*)
----------
21
SQL> drop table solo;
表已删除。
SQL> alter table solo_recov rename to solo;
表已更改。
二,SMON_SCN_TIME与闪回查询
在9i中,SMON_SCN_TIME是oracle数据库的系统表,每5分钟更新一次主张表,记录一个时间戳(timestamp)和当前的SCN,这个表供保存1440条记录,
也就是5天的信息,通过这个表,数据库可以对5天之内的SCN和时间进行粗略的对应和转换
SMON_SCN_TIME是数据库的一个内部表,在不同版本都可能变更这个表的内容和作用
字段项:
TIME_MP,代表最新的scn对应的时间,在9中,此时间取自系统的内核时间
TIME_DP,则代表TIME_MP转换后的系统时间,这个时间是用户可读的
SCN_WRP,代表SCN的高位
SCN_BAS,代表SCN的低位
在10g中,SMON_SCN_TIME最多保存144000条记录,平均每3秒一次的数据更新
10前通过SMON来获取和记录SCN信息的,10开始,LGWR首先会在SGA中记录SCN与时间的映射关系(由于LGWR至少每3秒就会被激活1次,
所以现在SMON_SCN_TIME能够支持大于3秒的闪回)
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
SQL> select sysdate from dual;
SYSDATE
-------------------
2008-07-26 12:10:12
SQL> create table solo_li (c1 number);
表已创建。
SQL> insert into solo_li values(1);
已创建 1 行。
SQL> commit;
SQL> select dbms_flashback.get_system_change_number scn from dual;
SQL> select * from solo_li as of scn 1249154;
从中取出当前的最大的一条记录:
SQL> select * from (select * from smon_scn_time order by time_mp desc)
2 where rownum<2;
THREAD TIME_MP TIME_DP SCN_WRP SCN_BAS NUM_MAPPINGS
---------- ---------- ------------------- ---------- ---------- ------------
TIM_SCN_MAP
--------------------------------------------------------------------------------
SCN ORIG_THREAD
----------------- -----------
0 661088723 2008-07-26 11:45:23 0 607154 86
D7696727E243090000004900DA696727E343090000007634E0696727ED43090000009107E3696727
EE43090000000000E6696727EF4309000000C99FE9696727F043090000000FD8EC696727F1430900
000060C7F2696727F44309000000CDA5F5696727F543090000003158F8696727F6430900000029D0
FB696727F743090
607154 0
通过SCN_WRP=0 和SCN_BAS=607154 可以计算出这两者代表的SCN
SCN=0*65536*65536 + 607154 =607154
此记录和获得SCN一致
三,10g中SCN与时间的映射与转换
提供了2个新的函数对于SCN和时间进行转换,scn_to_timestamp 和Timestamp_to_scn,在10g前一般通过logminer分析日志获得
用法:
SQL> select dbms_flashback.get_system_change_number scn from dual;
SCN
---------------
609283
SQL> select scn_to_timestamp(609283) scn from dual;
SCN
-----------------------------------------------------------
26-7月 -08 12.24.33.000000000 下午
SQL> select timestamp_to_scn(scn_to_timestamp(609283)) scn from dual;
SCN
---------------
609268
注意:这2个函数的转换,正是依赖于smon_scn_time表,能够转换的最小SCN也就是这个表的最小记录
1,SQL> select scn_wrp*4294967296 +scn_bas scn from smon_scn_time
2 where time_mp=(select min(time_mp) from smon_scn_time);
SCN
---------------
4
SQL> select scn_to_timestamp(4) from dual;
SCN_TO_TIMESTAMP(4)
------------------------------------------------------------------
17-4月 -07 03.34.19.000000000 上午
即使比这个SCN小1的SCN也不能在转换,因为表smon_scn_time没有相应的映射记录
SQL> select scn_to_timestamp(3) from dual;
select scn_to_timestamp(3) from dual
*
第 1 行出现错误:
ORA-08181: 指定的编号不是有效的系统更改号
ORA-06512: 在 "SYS.SCN_TO_TIMESTAMP", line 1
2,在看时间戳的转换,首先获得表中最小的时间戳
SQL> select THREAD,TIME_MP,TIME_DP,SCN_WRP,SCN_BAS,SCN_WRP*65536*65536+SCN_BAS scn
2 from smon_scn_time
3 where time_mp=(select min(time_mp) from smon_scn_time);
THREAD TIME_MP TIME_DP SCN_WRP SCN_BAS SCN
---------- ---------- ------------------- ---------- ---------- ---------------
0 620105659 2007-04-17 03:34:19 0 4 4
SQL> select timestamp_to_scn(to_timestamp('2007-04-17 03:34:19','yyyy=mm-dd hh24:mi:ss'))
2 from dual;
TIMESTAMP_TO_SCN(TO_TIMESTAMP('2007-04-1703:34:19','YYYY=MM-DDHH24:MI:SS'))
---------------------------------------------------------------------------
4
即使在小1秒,也是无法转换的
SQL> select timestamp_to_scn(to_timestamp('2007-04-17 03:34:18','yyyy=mm-dd hh24:mi:ss'))
2 from dual;
select timestamp_to_scn(to_timestamp('2007-04-17 03:34:18','yyyy=mm-dd hh24:mi:ss'))
*
第 1 行出现错误:
ORA-08180: 未找到基于指定时间的快照
ORA-06512: 在 "SYS.TIMESTAMP_TO_SCN", line 1
四,10g闪回特性
1,数据库级闪回
启用闪回功能后,数据库会将发生变化的数据块的前镜像写入闪回日志文件中,在进行数据库闪回时,这些数据块可以被直接复制回来以满足
数据库的恢复需求,同时redo log可以被应用以辅助数据恢复到更精确的时间点,从而极大地缩短了恢复时间
闪回数据库的日志文件不是由传统的lgwr进程写入,而是由一个称作rvwr的新过程写入
要使用这个特性,数据库必须采用Archivelog模式,而且必须配置为支持flashback database命令
闪回数据库的特性缺省是关闭的,启用闪回数据库特性需要在mount状态下进行:
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1292036 bytes
Variable Size 209717500 bytes
Database Buffers 394264576 bytes
Redo Buffers 7094272 bytes
数据库装载完毕。
SQL> alter database archivelog;
SQL> alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
SQL> select dbid,name,flashback_on,current_scn from v$database;
DBID NAME FLASHBACK_ON CURRENT_SCN
---------- --------- ------------------ -----------
1188804513 ORCL YES 612351
初始化参数b_flashback_retention_target用于定义一个时间的上限,设置数据库能够闪回的最大时间上限,单位分钟,
这个参数只是一个期望值,确切地闪回时间取决于闪回区保留的闪回数据。
SQL> show parameter db_flashback_retention_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
测试:
SQL> select sysdate from dual;
SYSDATE
-------------------
2008-07-26 13:13:48
SQL> select count(*) from solo;
COUNT(*)
----------
19
SQL> truncate table solo; -----truncate的数据是不能使用闪回查询恢复的,此时可以通过闪回数据库进行恢复
表被截断。
SQL> select sysdate from dual;
SYSDATE
-------------------
2008-07-26 13:14:28
SQL> select to_char(OLDEST_FLASHBACK_TIME,'yyyy-mm-dd hh24:mi:ss')
2 from v$flashback_database_log; ------查询可以闪回的最早时间点
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> startup mount; -----闪回需要在mount下进行
SQL> flashback database to timestamp
2 to_timestamp('2008-07-26 13:13:48','yyyy-mm-dd hh24:mi:ss');
闪回完成。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select count(*) from solo;
COUNT(*)
----------
19
一旦Resetlogs之后,就不能再flashback至resetlogs之前的时间点
五,flashback drop 功能
在执行drop操作时,先在oracle不是真正删除它,而是将该对象自动放入回收站recyclebin,对于一个对象的删除,其实仅仅就是进行了类似
重命名的操作,所谓回收站,是一个虚拟的容器,用于存放所有被删除的对象。在回收站中,被删除的对象将占有创建时同样的空间,甚至可以对已经删除的表查询(非system tablespace),如果该表上有索引或者触发器等也一并放到回收站,当闪回表后,索引和触发器等也能闪回来。
测试:
SQL> create table test as select * from emp;
表已创建。
SQL> drop table test;
表已删除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP BIN$ep4QZw7GSBqHS6/3MS8MYg==$0 TABLE 2008-07-27:22:30:13
EMP BIN$nb6F7NUNRoeVvRWifgVvoQ==$0 TABLE 2008-07-27:22:27:54
TEST BIN$6AHHkcjFRWq/n5fn8T134A==$0 TABLE 2008-07-28:09:53:47
sys 查询回收站信息:(可以看到表上的索引信息)
SELECT owner, original_name, object_name,
type, ts_name, droptime, related, space
FROM dba_recyclebin
WHERE can_undrop = 'YES';
用户查询回收站信息:
SELECT original_name, object_name,
type, ts_name, droptime, related, space
FROM user_recyclebin
WHERE can_undrop = 'YES';
SQL> flashback table test to before drop;
闪回完成。
如果这里闪回前有同名表产生,在闪回时,会抱错原始名称已被现有对象使用
SQL> create table emp as select * from dept;
表已创建。
SQL> flashback table emp to before drop;
flashback table emp to before drop
*
第 1 行出现错误:
ORA-38312: 原始名称已被现有对象使用
SQL> flashback table emp to before drop rename to a;
闪回完成。
SQL> desc test;
名称 是否为空? 类型
----------------------------------------- -------- -----------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> drop table test purge;---彻底删除表,不需要放在数据库回收站内
表已删除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
EMP BIN$ep4QZw7GSBqHS6/3MS8MYg==$0 TABLE 2008-07-27:22:30:13
EMP BIN$nb6F7NUNRoeVvRWifgVvoQ==$0 TABLE 2008-07-27:22:27:54
要释放空间,您需要使用以下命令清空回收站
PURGE RECYCLEBIN;
清除表空间 USERS 的回收站中的所有对象。
可以执行:
PURGE TABLESPACE USERS
限定只清除特定的用户:
PURGE TABLESPACE USERS USER SCOTT;
DBA 可以使用以下命令清除任何表空间中的所有对象
PURGE DBA_RECYCLEBIN;
<回收站>
所谓的回收站,是一个虚拟的容器,用于存放所有被删除的对象。在回收站中,被删除的对象将占用创建时的同样的空间,
你甚至还可以对已经删除的表查询,也可以利用flashback功能来恢复它, 这个就是flashback drop功能。实际上,oracle的回收站从原理上来说就是一个数据字典表
这个功能虽然可以极大的简化误drop导致的恢复操作(不支持sys的操作,但是其他dba的drop操作还是会放到回收站里)
但是长时间的积累可能会导致大量的空间占用(虽然Oracle具有自己的清理机制),
很多时候我们需要手工介入去清理回收站。
注意:普通用户删除了表,dba在dba_recyclebin 会看到该表以及索引(所以当用户闪回表后,索引信息也将恢复)
sys用户删除了普通用户的表(非system表空间的表),也会放在属主的回收站里)
大量累计的空间占用
SQL> col owner for a12
SQL> select owner,object_name,CREATETIME,DROPTIME from dba_recyclebin
order by droptime;
不同用户在回收站的对象
SQL> select owner,count(*) from dba_recyclebin group by owner;
我们可以指定删除某些特定对象
SQL> purge table common.T_SERVICE_CODE_INFO;
指定清除某个表空间的所有回收站对象
SQL> purge tablespace common;
5.以SYSDBA身份可以清除所有回收站对象
SQL> purge dba_recyclebin;
在Oracle10gR2中,recyclebin变成了一个常规参数,可以在session/system级动态修改:
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- --------------
recyclebin string on
SQL> alter session set recyclebin=off;
会话已更改。
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- --------------
recyclebin string OFF
SQL> alter system set recyclebin= on;
系统已更改。
SQL> alter system set recyclebin= off;
系统已更改。
eg:
SQL> conn scott/tiger
已连接。
SQL> show parameter recyclebin
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
recyclebin string ON
SQL> alter session set recyclebin=off;
会话已更改。
SQL> show recyclebin
SQL> drop table solo_li;
表已删除。
SQL> show recyclebin
SQL> alter session set recyclebin=on;
会话已更改。
SQL> show recyclebin
SQL> drop table bonus ;
表已删除。
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
BONUS BIN$yx1RUGjfTeCkAVgxGGwu/g==$0 TABLE 2009-07-09:12:50:33
10g 新特性 Recyclebin 空间的自动清理
放入Recyclebin中的表并不是永久存在的,当表空间被回收站数据完全占满,以至于必须扩展数据文件来容纳更多数据时,对象以先进先出的方式从回收站中自动清除。在删除表之前,相关对象(如索引)被删除。
(注意: 如果表空间 autoextent,会先自动清除,再扩展。)
同样,空间压力可能由特定表空间定义的用户限额而引起。表空间可能有足够的空余空间,但用户可能将其在该表空间中所分配的部分用完了。在这种情况下,Oracle 自动清除该表空间中属于该用户的对象。
创建一个表空间和一个用户。
SQL> create tablespace testts datafile '' size 1M;
SQL> create user test identified by test default tablespace testts temporary tablespace temp;
SQL> grant connect to test;
SQL> grant resource to test;
SQL> grant dba to test;
在表空间中创建表:
SQL> conn test/test
SQL> create table sysobj as select * from dba_tables;
SQL> select bytes from dba_segments where segment_name='SYSOBJ';
BYTES
----------
458752
SQL> create table sysobj2 as select * from dba_tables;
SQL> create table sysobj3 as select * from dba_tables;
create table sysobj3 as select * from dba_tables
*
第 1 行出现错误:
ORA-01652: 无法通过 8 (在表空间 TESTTS 中) 扩展 temp 段
因为这里空间只有1M,这时空间不够了,我们先删除一个表。
SQL> drop table sysobj2;
SQL> select * from recyclebin;
OBJECT_NAME ORIGINAL_NAME OPERATION
------------------------------ -------------------------------- ---------
TYPE TS_NAME CREATETIME
------------------------- ------------------------------ -------------------
DROPTIME DROPSCN PARTITION_NAME CAN CAN
------------------- ---------- -------------------------------- --- ---
RELATED BASE_OBJECT PURGE_OBJECT SPACE
---------- ----------- ------------ ----------
BIN$PJ6U2b0JRVWgmdmQ7+5vXg==$0 SYSOBJ2 DROP
TABLE TESTTS 2008-07-13:23:43:50
2008-07-13:23:44:46 753663 YES YES
52838 52838 52838 56
再来创建表:
SQL> create table sysobj3 as select * from dba_tables;
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
SYSOBJ TABLE
SYSOBJ3 TABLE
这时我们可以看到,recyclebin中的表不见了,空间回收了!
SQL> select * from recyclebin;
未选定行
六,flashback version query
SQL> create table solo_jh as select username from dba_users;
表已创建。
SQL> select * from solo_jh;
USERNAME
------------------------------
MGMT_VIEW
SYS
SYSTEM
......
已选择21行。
SQL> delete from solo_jh where username='SCOTT';
已删除 1 行。
SQL> commit;
提交完成。
SQL> delete from solo_jh where username='XDB';
已删除 1 行。
SQL> commit;
提交完成。
SQL> delete from solo_jh where username='MDDATA';
已删除 1 行。
SQL> commit;
提交完成。
SQL> select * from solo_jh;
USERNAME
------------------------------
MGMT_VIEW
SYS
SYSTEM
DBSNMP
SYSMAN
......
已选择18行。
SQL> commit;
提交完成。
SQL> insert into solo_jh values('lijiaohua');
已创建 1 行。
SQL> commit;
提交完成。
对于这种复杂密集数据操作,通过简单的闪回查询时很难恢复到正确的数据版本的
可以通过闪回版本察看不同事物引起的数据库变更 或者flashback_transaction_query试图
已选择25行。
七,通过flashback transaction query进行事务撤销
基于上面提到的flashback version query的恢复,就是flashback transaction query
测试:
从上节查询得到的XID,来尝试恢复XID=*******的事务,通过undo语句可以撤销事务
SQL> select undo_sql from flashback_transaction_query
2 where TABLE_NAME='SOLO_JH';
UNDO_SQL
--------------------------------------------------------------------------------
insert into "SYS"."SOLO_JH"("USERNAME") values ('SCOTT');
delete from "SYS"."SOLO_JH" where ROWID = 'AAAMm5AABAAAO7iAAX';
insert into "SYS"."SOLO_JH"("USERNAME") values ('XDB');
SQL> delete from "SYS"."SOLO_JH" where ROWID = 'AAAMo2AABAAAOwSAAV';
已删除 1 行。
SQL> select undo_sql from flashback_transaction_query
2 where xid='0A0012003F010000';
UNDO_SQL
----------------------------------------------------------------------------------------------
insert into "SYS"."SOLO_JH"("USERNAME") values ('SCOTT');-----此处就是Delete操作的反操作语句,运行之撤销事务
SQL> insert into "SYS"."SOLO_JH"("USERNAME") values ('SCOTT');
已创建 1 行。
八,闪回表(非sys 用户)
闪回表准许将数据恢复到过去的某个时间点,而不必像以前一样采用基于时间点的恢复
10g的flashback table 有如下特性:
在线操作
恢复到指定时间点或者SCN的任何数据
自动恢复相关属性,如索引,触发器
满足分布式的一致性
满足数据一致性,所有相关对象将自动一致
语法:
alter table table_name enable row movement;
flashback table table_name to timestamp|scn <timestamp|scn>;
------如果需要flashback一个数据表,需要具有flashback any table的系统权限或者是该表的flashback对象权限
同时还需要拥有该表的select,insert,delete,alter 权限,由于flashback table技术使用dml操作去恢复数据,
不能保证rowid不变,所以闪回之前还需要启动表的row movement特性
同时不能将表恢复到改变表结构的DDL操作之前(----这里注意闪回时用到临时表空间)
grant flashback any table to scott(授予某用户权限)
(sys 可以闪回其他用户的对象;对象属主可以闪回该拥有的对象;
select dbms_flashback.get_system_change_number scn from dual;---dba可以查询的内容)
测试:
SQL> conn scott/scott
已连接。
SQL> drop table solo_li;
表已删除。
SQL> create table solo_li as select username from dba_users;
表已创建。
SQL> select dbms_flashback.get_system_change_number scn from dual;(dba查询)
SCN
---------------
621351
SQL> delete from solo_li where username='SCOTT';
已删除 1 行。
SQL> alter table solo_li enable row movement;
表已更改。
SQL> flashback table solo_li to scn 621351;
闪回完成。
SQL> select count(*) from solo_li;
COUNT(*)
----------
21
<闪回区的空间监控>
SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;
用以监控闪回区空间的耗用情况
每次RMAN在闪回区(flash recovery area)创建文件时,会同时更新可删除文件列表。当闪回区存在空间压力时,
Oracle会自动从闪回区中删除废弃文件,当没有更多空间可以释放时,Oracle会给出空间压力警报。
当空间使用达到100%,数据库将会因为无法归档等原因挂起。
闪回区的大小由:db_recovery_file_dest_size 参数指定。
路径由: db_recovery_file_dest 参赛指定。
SQL> show parameter db_recovery
NAME TYPE VALUE
------------------------------------ -------------------- ------------------------------
db_recovery_file_dest string C:\oracle\product\10.2.0\flash
_recovery_area
db_recovery_file_dest_size big integer 2G
SQL> alter system set db_recovery_file_dest_size=1500m;
系统已更改。
SQL> show parameter db_recovery
NAME TYPE
------------------------------------ ------------------------------
VALUE
------------------------------
db_recovery_file_dest string
D:\oracle\product\10.2.0\flash
_recovery_area
db_recovery_file_dest_size big integer
1500M
当然如果我们想要了解具体是哪些文件,这就需要借助另外一个视图:V$ASM_FILE。
这个视图需要从ASM实例来进行查询:
SQL> select file_number,block_size,blocks,bytes,type from v$asm_file;
从这里我们可以很容易的看到不同文件所使用的不同BLOCK_SIZE,Oracle通过不同的块大小来优化存储及访问。
<闪回日志的删除>
1.- First of all we need to check if there is any guaranteed restore point defined:
select name,scn,time,database_incarnation#,guarantee_flashback_database,storage_size from v$restore_point;
2.- Remove all the restore points
Drop restore point <name>;
3.- Check how much space is used before turning off Flashback
select * from v$flash_recovery_area_usage;
4.- ALTER DATABASE FLASHBACK OFF;
5.- Now you can delete the Flashback logs manually
6.- ALTER DATABASE FLASHBACK ON
7.- Check that there are no flashback logs before turning back on
select * from v$flash_recovery_area_usage;
闪回日志丢失,导致数据库无法打开:
SQL> shutdown immediate
cd $ORACLE_BASE/flash_recovry_area/solo/flashback/
rm *
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 289406976 bytes
Fixed Size 1248576 bytes
Variable Size 142607040 bytes
Database Buffers 138412032 bytes
Redo Buffers 7139328 bytes
数据库装载完毕。
ORA-38760: 此数据库实例无法启用闪回数据库
The alert log would have error as shown below:
Sun Apr 04 20:09:44 2010
Errors in file c:\admin\solo\bdump\solo_rvwr_2256.trc:
ORA-38701: Flashback database log 1 seq 1 thread 1: "C:\FLASH_RECOVERY_AREA\SOLO\FLASHBACK\O1_MF_5VJZSPQX_.FLB"
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> alter database flashback off;
数据库已更改。
Sun Apr 04 20:12:30 2010
Errors in file c:\admin\solo\udump\solo_ora_1480.trc:
Control autobackup written to DISK device
handle 'C:\FLASH_RECOVERY_AREA\SOLO\AUTOBACKUP\2010_04_04\O1_MF_S_715463523_5VK0KD3X_.BKP'
Completed: alter database flashback off
SQL> alter database flashback on;
数据库已更改。
SQL> alter database open;
数据库已更改。
<闪回丢失的方案>
1.select flashback_on from v$database;base;
FLASHBACK_ON
------------------
YES
SQL> show parameter flash
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target integer 1440
SQL> create user fl identified by fl ;
User created.
SQL> grant connect,resource to fl;
Grant succeeded.
SQL> conn fl/fl
Connected.
SQL> create table fl_test(a int);
Table created.
SQL> desc fl_test
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)
SQL> insert into fl_test values(100);
1 row created.
SQL> commit;
Commit complete.
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2010-06-25 16:22:36
2.SQL> conn sys as sysdba
Enter password: ******
Connected.
SQL> drop user fl cascade;
User dropped.
SQL> conn fl/fl
ERROR:
ORA-01017: invalid username/password; logon denied
Warning: You are no longer connected to ORACLE.
SQL> conn sys as sysdba
Enter password: ******
Connected.
SQL> desc fl.fl_test
ERROR:
ORA-04043: object fl.fl_test does not exist
3.SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 603979776 bytes
Fixed Size 1268872 bytes
Variable Size 335545208 bytes
Database Buffers 260046848 bytes
Redo Buffers 7118848 bytes
Database mounted.
SQL> flashback database to timestamp to_date('2010-06-25 16:22:36','yyyy-mm-dd hh24:mi:ss');
Flashback complete.
SQL> alter database open read only;
Database altered.
SQL> desc fl.fl_test
Name Null? Type
----------------------------------------- -------- ----------------------------
A NUMBER(38)
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
SQL> ho exp fl/fl file=/u01/app/oracle/bak/fl.dmp owner=fl
Export: Release 10.2.0.4.0 - Production on Fri Jun 25 16:33:23 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options
Export done in US7ASCII character set and AL16UTF16 NCHAR character set
server uses WE8ISO8859P1 character set (possible charset conversion)
. exporting pre-schema procedural objects and actions
. exporting foreign function library names for user FL
. exporting PUBLIC type synonyms
. exporting private type synonyms
. exporting object type definitions for user FL
About to export FL's objects ...
. exporting database links
. exporting sequence numbers
. exporting cluster definitions
. about to export FL's tables via Conventional Path ...
. . exporting table FL_TEST 1 rows exported
. exporting synonyms
. exporting views
. exporting stored procedures
. exporting operators
. exporting referential integrity constraints
. exporting triggers
. exporting indextypes
. exporting bitmap, functional and extensible indexes
. exporting posttables actions
. exporting materialized views
. exporting snapshot logs
. exporting job queues
. exporting refresh groups and children
. exporting dimensions
. exporting post-schema procedural objects and actions
. exporting statistics
Export terminated successfully without warnings.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 603979776 bytes
Fixed Size 1268872 bytes
Variable Size 335545208 bytes
Database Buffers 260046848 bytes
Redo Buffers 7118848 bytes
Database mounted.
SQL> recover database;
Media recovery complete.
SQL> alter database open;
Database altered.
SQL> desc fl.fl_test
ERROR:
ORA-04043: object fl.fl_test does not exist
SQL> select count(*) from scott.emp;
COUNT(*)
----------
6
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options
[oracle@emrep 2010_06_25]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 25 16:36:49 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options
SQL> create user fl identified by fl ;
User created.
SQL> grant connect,resource to fl;
Grant succeeded.
SQL> exit
Disconnected from Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options
[oracle@emrep 2010_06_25]$ imp file=/u01/app/oracle/bak/fl.dmp full=y
Import: Release 10.2.0.4.0 - Production on Fri Jun 25 16:37:53 2010
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Username: fl
Password:
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options
Export file created by EXPORT:V10.02.01 via conventional path
import done in US7ASCII character set and AL16UTF16 NCHAR character set
import server uses WE8ISO8859P1 character set (possible charset conversion)
. importing FL's objects into FL
. . importing table "FL_TEST" 1 rows imported
Import terminated successfully without warnings.
[oracle@emrep 2010_06_25]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.4.0 - Production on Fri Jun 25 16:38:01 2010
Copyright (c) 1982, 2007, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, Oracle Label Security, OLAP, Data Mining
and Real Application Testing options
SQL> conn fl/fl
Connected.
SQL> select * from fl_test;
A
----------
100
<常见错误>
Symptoms
there are problems with flashback database, however, unable to turn off flashback database so that
the database can be opened:
SQL> alter database flashback off;
Database altered.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-38760: This database instance failed to turn on flashback database
.
Cause
there is a restore point in the database
checked v$restore_point
.
Solution
check whether restore points exist:
SQL> select flashback_on from v$database;
SQL> select name from v$restore_point;
If so, drop them:
SQL> drop restore point <name>;
SQL> alter database flashback off;
SQL> select flashback_on from v$database;
SQL> alter database open;
相关推荐
MySQL Flashback 闪回功能详解 MySQL Flashback 是 MySQL 中的一种闪回功能,用于快速恢复由于误操作丢失的数据。在 DBA 误操作时,可以把数据库恢复到以前某个时间点(或者说某个 binlog 的某个 pos)。Flashback ...
#### 二、Flashback闪回的基础概念 ##### 1. 什么是闪回? - **定义**:闪回技术是Oracle提供的一种用于恢复数据的技术,它可以在不需要备份的情况下恢复到某个特定的时间点或者系统更改号(SCN)的状态。 - **应用...
在Oracle RAC(Real Application Clusters)环境下启用Flashback闪回功能是一项高级的数据库管理技术,它能够帮助数据库管理员在不丢失数据的情况下恢复到过去某一时间点的状态,这对于数据安全和灾难恢复至关重要。...
### Flashback闪回技术 #### 一、概述 Flashback技术是Oracle数据库中一项重要的数据恢复工具,它基于Undo Segment中的内容实现,并受到UNDO_RETENTION参数的影响。要使用这项特性,用户必须启用自动撤销管理表...
### Oracle FlashBack 闪回技术详解 #### 一、引言 在Oracle数据库管理中,闪回技术(FlashBack)是一项极为重要的功能,它能够帮助数据库管理员恢复误操作或者数据丢失的情况,为数据的安全性和可靠性提供了强有力...
### 使用Oracle 10g的Flashback闪回功能快速恢复被删除的表 #### Oracle 10g Flashback 特性概述 Oracle Database 10g 引入了一项非常强大的特性——Flashback,该特性使得数据库管理员(DBA)能够轻松地恢复误删除...
Oracle Flashback技术是数据库管理系统中的一种高级特性,它允许用户恢复到数据库的某个历史状态,无需进行复杂的备份和恢复操作。这项技术主要基于事务日志和快照来实现,为数据库管理员提供了极大的便利,尤其在...
MySQL Flashback 闪回功能详解-附件资源
"Oracle 闪回(Flashback)技术" Oracle 闪回(Flashback)技术是 Oracle 数据库提供的一系列人为错误更正技术,用于快速恢复逻辑误操作。闪回技术从 Oracle 9i 版本开始,逐步发展到 Oracle 11g 版本,成为数据库...
Flashback Query 是 Oracle Flashback 特性中最基本的部分,它允许用户通过闪回查询来查看过去的数据状态。Flashback Query 通过使用多版本读一致性的 undo 表空间来读取操作前的记录数据。Flashback Query 有多种...
Oracle 闪回(Flashback)技术是Oracle数据库提供的一种强大工具,主要用于数据恢复和时间点一致性查询。这一技术的核心在于Undo Segment,它记录了数据库中事务的撤销信息。Oracle 10g引入了多种闪回功能,包括...
Oracle 闪回特性 FLASHBACK & RECYCLEBIN Flashback 系列是 Oracle 数据库中的一组功能强大且实用的闪回机制,旨在帮助数据库管理员和开发者快速恢复数据库中的各种对象,包括表、数据、事务等。Flashback 系列的...
"Oracle闪回(Flashback)技术" Oracle闪回(Flashback)技术是Oracle数据库提供的一系列人为错误更正技术,旨在使数据库从任何逻辑误操作中迅速恢复。该技术从Oracle 9i版本的闪回查询开始,在Oracle 10g版本中...
2. Flashback Table(闪回表):当需要将整个表恢复到之前的状态时,可以使用闪回表。通过`ALTER TABLE ... FLASHBACK TO TIMESTAMP`或`ALTER TABLE ... FLASHBACK TO SCN`命令,可以快速恢复表到指定的时间戳或系统...