请问怎么闪回(flashback)数据库? 如题 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以参考“小小闪回flashback”“纠正以前对flashback的一个误解” SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;--可以闪回的最早时间TO_CHAR(OLDEST_FLAS-------------------2009-09-20 10:46:57SQL> shutdown immediateSQL>startup mount;SQL> flashback database to timestamp to_date('2009-09-20 10:46:57','yyyy-mm-dd hh24:mi:ss');闪回完成。SQL> alter database open resetlogs;数据库已更改。 Oracle Flashback(三) Flashback Database(闪回数据库)http://user.qzone.qq.com/251097186/blog/1238217398三、Flashback Database如果说flashback query 可用来恢复指定时间点的记录,flashback table 可用来恢复被删除或指定时间点的表,而flashback database,则直接提供一个数据库级别的恢复,可将数据库恢复到指定的时间点,相对于前两者,其粒度是最大的。数据库级别的恢复,大家可能会想到我们通常所用的方式:借助备份。那借助flashback database 来做恢复相比通过备份恢复,有哪些优势呢?三思个人看法认为主要有两点:速度和恢复方式。众所周知之前我们对数据库做不完全恢复,不论是命令行方式备份还是rman 备份,都是借助备份+有效归档,从备份时间点向后做恢复。就三思目前的学识,还从来没有一种特性,可以让我们从当前时间点向前做恢复,正是由于有了flashback database 这一特性,我们终于可以在不借助备份的情况下将数据库向前恢复了,无数dba 欢欣雀跃啊,哎呀这么说好像不对,谁没事儿老想对数据库做恢复呢,难不成这库老有毛病?无论如何吧,这都是一项有意义的功能啊。向前向后的有些不理解是吧,没关系,看图如下:常规的恢复方式是这样,必须借助备份+归档:如果没有适当的备份,我们想依靠scn2000 时的归档和数据文件,是不可能将数据库恢复到scn1850 时的状态的。而借助flashback database,我们可以进行这样的恢复:从起用flashback database 的那刻到当前时间,借助flashback database,我们可以将数据库直接修复到这中单的任意点,比如直接将数据库flashback 至scn1850。当然,实际上我们还是借助了备份的,只不过没有了恢复数据文件的过程,因此才会表现得如此快速,下面我们通过一些实战操作来演练一下。1、必备条件A. 数据库启用了flashback databaseB. 数据库必须打开了flash recovery area,如果数据库是RAC,flash recovery area 必须位于共享存储中。C. 数据库必须处于archivelog 模式2、操作示例Flashback database 即可以在rman 中执行,也可以在sql*plus 中执行,其命令格式都是一样的,在这个示例中,我们所有操作都是在sql*plus 中执行。A. 检查是否启动了flash recovery area:JSSWEB> show parameter db_recovery_fileNAME TYPE VALUE------------------------------------ ----------- ------------------------------db_recovery_file_dest string f:\oracle\oradata\jssweb\recoveryarea\db_recovery_file_dest_size big integer 2GB. 检查是否启用了归档JSSWEB> archive log list;数据库日志模式存档模式自动存档启用存档终点USE_DB_RECOVERY_FILE_DEST最早的联机日志序列51下一个存档日志序列53当前日志序列53C. 检查是否启用了flashback database 和force_loggingJSSWEB> select flashback_on,force_logging from v$database;FLASHBACK_ON FOR------------------ ---YES YESD. 查询当前的scnJSSWEB> SELECT CURRENT_SCN FROM V$DATABASE;CURRENT_SCN-----------686384JSSWEB> select current_scn from v$database;CURRENT_SCN-----------213749E. 模拟误删除操作JSSWEB> conn jss/jss已连接。JSSWEB> drop table jss_tb1;表已删除。JSSWEB> delete jss_tb2 where id>5;已删除15 行。JSSWEB> select count(0) from jss_tb2;COUNT(0)----------5JSSWEB> commit;提交完成。F. 重新启动到mount 状态,然后执行恢复JSSWEB> conn / as sysdba已连接。JSSWEB> shutdown immediate数据库已经关闭。已经卸载数据库。ORACLE 例程已经关闭。JSSWEB> startup mountORACLE 例程已经启动。Total System Global Area 343932928 bytesFixed Size 1296620 bytesVariable Size 125830932 bytesDatabase Buffers 209715200 bytesRedo Buffers 7090176 bytes数据库装载完毕。JSSWEB>flashbackdatabasetoscn686384;闪回完成。提示:此处flashback database to timestamp 也是一样的,不过你需要估计好恢复到的时间点。注意此处,在你执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:第一种直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的数据统统丢失。另一种方式是先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,这样的话对现有数据的影响最小,不会有数据丢失。由于是演示过程,为了更简便和快速,我们这里采用方法一中提示的方式,但如果是比较重要的数据库的话,你要采用哪种方式,就需要仔细评估一下了。G. 打开数据库JSSWEB> alter database open resetlogs;数据库已更改。H. 验证数据JSSWEB> conn jss/jss已连接。JSSWEB> select *from tab;TNAME TABTYPE CLUSTERID------------------------------ ------- ----------JSS_TB1 TABLETP TABLEJSS_TB2 TABLEJSSWEB> select count(0) from jss_tb2;COUNT(0)----------20如上,之前的误操作数据均已恢复。可以看到这个过程非常迅速(当然跟我们操作的数据量小也有很大关系),这甚至都不算是在做恢复,从头到尾,我们都没有执行任何restore,也没有recover 的操作,这就是flashback database 的优势,速度。3、限制条件A. Flashback database 是用来将数据库中的数年恢复至之前的某个时间点,而非介质恢复,你不可能使用flashback database 恢复之前被删除的某个数据文件。B. 如果控制文件被重建,则在此之前所产生的所有flashback 日志统统失效,不能将数据库flashback到控制文件被重建之前。C. 对于nologging 模式下插入的数据,flashback database 也恢复不了,因此建议数据库处于force logging模式。 Oracle Flashback(三) Flashback Database(闪回数据库) 求教:表合并问题 100分求一个选择语句解决方法~~~! 关于 db_block_buffers shared_pool_size 之间的关系 求告手 PL/SQL 怎么读写文件? 求oracle merge语句的问题,谢谢! oracle支持递归触发器么? 请问一个关于从文件读出乱码的问题,谢谢 在VC++中调用OCI接口,为什么在编译的时候就会出现“OCI.Dll找不到指定的模块”的提示? 联机归档日志错误 enterprise architect连接oracle出现“表或视图不存在”的错误 Oracle 10g逻辑恢复后EM不能用,紧急求助! 每日一问,呵呵!
“小小闪回flashback”“纠正以前对flashback的一个误解”
SQL> select to_char(oldest_flashback_time,'yyyy-mm-dd hh24:mi:ss') from v$flashback_database_log;--可以闪回的最早时间TO_CHAR(OLDEST_FLAS
-------------------
2009-09-20 10:46:57
SQL> shutdown immediate
SQL>startup mount;
SQL> flashback database to timestamp to_date('2009-09-20 10:46:57','yyyy-mm-dd h
h24:mi:ss');闪回完成。SQL> alter database open resetlogs;数据库已更改。
http://user.qzone.qq.com/251097186/blog/1238217398三、Flashback Database
如果说flashback query 可用来恢复指定时间点的记录,flashback table 可用来恢复被删除或指定时间点的表,
而flashback database,则直接提供一个数据库级别的恢复,可将数据库恢复到指定的时间点,相对于前两者,
其粒度是最大的。
数据库级别的恢复,大家可能会想到我们通常所用的方式:借助备份。那借助flashback database 来做恢复
相比通过备份恢复,有哪些优势呢?三思个人看法认为主要有两点:速度和恢复方式。
众所周知之前我们对数据库做不完全恢复,不论是命令行方式备份还是rman 备份,都是借助备份+有效归
档,从备份时间点向后做恢复。就三思目前的学识,还从来没有一种特性,可以让我们从当前时间点向前做恢
复,正是由于有了flashback database 这一特性,我们终于可以在不借助备份的情况下将数据库向前恢复了,无
数dba 欢欣雀跃啊,哎呀这么说好像不对,谁没事儿老想对数据库做恢复呢,难不成这库老有毛病?无论如何
吧,这都是一项有意义的功能啊。
向前向后的有些不理解是吧,没关系,看图如下:
常规的恢复方式是这样,必须借助备份+归档:
如果没有适当的备份,我们想依靠scn2000 时的归档和数据文件,是不可能将数据库恢复到scn1850 时的状态的。
而借助flashback database,我们可以进行这样的恢复:从起用flashback database 的那刻到当前时间,借助flashback database,我们可以将数据库直接修复到这中
单的任意点,比如直接将数据库flashback 至scn1850。当然,实际上我们还是借助了备份的,只不过没有了恢
复数据文件的过程,因此才会表现得如此快速,下面我们通过一些实战操作来演练一下。
1、必备条件
A. 数据库启用了flashback database
B. 数据库必须打开了flash recovery area,如果数据库是RAC,flash recovery area 必须位于共享存储中。
C. 数据库必须处于archivelog 模式
2、操作示例
Flashback database 即可以在rman 中执行,也可以在sql*plus 中执行,其命令格式都是一样的,在这个
示例中,我们所有操作都是在sql*plus 中执行。
A. 检查是否启动了flash recovery area:
JSSWEB> show parameter db_recovery_file
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string f:\oracle\oradata\jssweb\recoveryarea\
db_recovery_file_dest_size big integer 2G
B. 检查是否启用了归档
JSSWEB> archive log list;
数据库日志模式存档模式
自动存档启用
存档终点USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列51
下一个存档日志序列53
当前日志序列53
C. 检查是否启用了flashback database 和force_logging
JSSWEB> select flashback_on,force_logging from v$database;
FLASHBACK_ON FOR
------------------ ---
YES YES
D. 查询当前的scn
JSSWEB> SELECT CURRENT_SCN FROM V$DATABASE;
CURRENT_SCN
-----------
686384
JSSWEB> select current_scn from v$database;
CURRENT_SCN
-----------
213749
E. 模拟误删除操作
JSSWEB> conn jss/jss
已连接。
JSSWEB> drop table jss_tb1;
表已删除。
JSSWEB> delete jss_tb2 where id>5;
已删除15 行。
JSSWEB> select count(0) from jss_tb2;
COUNT(0)
----------
5
JSSWEB> commit;
提交完成。
F. 重新启动到mount 状态,然后执行恢复
JSSWEB> conn / as sysdba
已连接。
JSSWEB> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
JSSWEB> startup mount
ORACLE 例程已经启动。
Total System Global Area 343932928 bytes
Fixed Size 1296620 bytes
Variable Size 125830932 bytes
Database Buffers 209715200 bytes
Redo Buffers 7090176 bytes
数据库装载完毕。
JSSWEB>
flashback
database
to
scn
686384;
闪回完成。
提示:此处flashback database to timestamp 也是一样的,不过你需要估计好恢复到的时间点。
注意此处,在你执行完flashback database 命令之后,oracle 提供了两种方式让你修复数据库:
第一种直接alter database open resetlogs 打开数据库,当然,指定scn 或者timestamp 时间点之后产生的
数据统统丢失。
另一种方式是先执行alter database open read only 命令以read-only 模式打开数据库,然后立刻通过逻辑
导出的方式将误操作涉及表的数据导出,再执行recover database 命令以重新应用数据库产生的redo,将数
据库修复到flashback database 操作前的状态,然后再通过逻辑导入的方式,将之前误操作的表重新导入,
这样的话对现有数据的影响最小,不会有数据丢失。
由于是演示过程,为了更简便和快速,我们这里采用方法一中提示的方式,但如果是比较重要的数据
库的话,你要采用哪种方式,就需要仔细评估一下了。
G. 打开数据库
JSSWEB> alter database open resetlogs;
数据库已更改。
H. 验证数据
JSSWEB> conn jss/jss
已连接。
JSSWEB> select *from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
JSS_TB1 TABLE
TP TABLE
JSS_TB2 TABLE
JSSWEB> select count(0) from jss_tb2;
COUNT(0)
----------
20
如上,之前的误操作数据均已恢复。
可以看到这个过程非常迅速(当然跟我们操作的数据量小也有很大关系),这甚至都不算是在做恢复,从
头到尾,我们都没有执行任何restore,也没有recover 的操作,这就是flashback database 的优势,速度。
3、限制条件
A. Flashback database 是用来将数据库中的数年恢复至之前的某个时间点,而非介质恢复,你不可能使
用flashback database 恢复之前被删除的某个数据文件。
B. 如果控制文件被重建,则在此之前所产生的所有flashback 日志统统失效,不能将数据库flashback
到控制文件被重建之前。
C. 对于nologging 模式下插入的数据,flashback database 也恢复不了,因此建议数据库处于force logging
模式。