oracle闪回数据库flashback database的用法

2024-03-20 00:38

本文主要是介绍oracle闪回数据库flashback database的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        在传统的数据库恢复中,如果为了应对用户错误,通常需要进行基于时间点的不完全恢复,恢复的过程需要恢复数据文件,归档日志、再通过日志应用恢复到指定的时间点,这种恢复可能需要更长的时间,而flashback database可以避免文件恢复过程,从而缩短恢复时间。

       flashback database的原理:要使用flashback database,必须先启用此功能 。当启用flashback database后,数据库会定期将发生变化的数据块的前镜像写入闪回日志的日志文件中,在数据库闪回时,这些数据块可以直接被复制过来以满足数据库的恢复需求,同时redo log可以被应用以辅助恢复到理精确的时间点,从而极有的缩小恢复时间。不过使用flashback database有一些限制:

1)、flashback database 不能解决media failue,对于这种错误只能是rman恢复;

2)如果删除了数据文件或者利用shrink技术缩小数据文件大小,这时是不能用flashback database技术回退到改变之前的状态,这时间就必须利用RMAN把删除之前或者缩小之前的文件备份restore出来,然后利用flashback  database执行剩下的恢复;

3)如果控制文件是从备份中恢复出来的,或者是重建的控制文件,也不能使用flashback database;

4)使用flashback database 所能恢复到的最早的scn,取决于flashback log中的记录的最早的scn.


下面通过scott用户下的表作为测试:

步骤1:查看rvwr进程:

flashback database 的日志文件不是由传统的lgwr进程写入,而是由recovery  writer (RVWR)的进程写入(这是由oracle 10g新增的一个进程):

[oracle@localhost ~]$ ps -ef|grep rvwr

步骤2:启用flashback  database的功能

SQL> startup mount;
ORACLE instance started.
Total System Global Area 2405122048 bytes
Fixed Size    2255592 bytes
Variable Size  603981080 bytes
Database Buffers 1778384896 bytes
Redo Buffers   20500480 bytes
Database mounted.


SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select dbid,name,flashback_on,current_scn from v$database;
      DBID             NAME       FLASHBACK_ON   CURRENT_SCN
    ----------            ---------      ------------------           -----------
1821627089    WUTONG    YES           1133591

SQL> show parameter db_flashback
NAME     TYPE VALUE
------------------------------------ ----------- ------------------------------
db_flashback_retention_target     integer 1440

步骤3:在scott用户下查询有哪些表,并且分别查询emp和test_emp中的数据量

SQL> conn scott/tiger
Connected.
SQL> select * from tab;
TNAME       TABTYPECLUSTERID
------------------------------ ------- ----------
BONUS       TABLE
DEPT       TABLE
EMP       TABLE
SALGRADE       TABLE
TEST_EMP       TABLE

SQL> select count(*) from scott.emp;

COUNT(*)
----------
14

SQL> select count(*) from scott.emp;

COUNT(*)
----------
14

步骤4:设置会话时间格式,分别用truncate清除test_emp和emp表

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
Session altered.
SQL> select sysdate from dual;
SYSDATE
-------------------
2016-09-12 03:37:30

SQL> truncate table test_emp;
Table truncated.
SQL> select sysdate from dual;
SYSDATE
-------------------
2016-09-12 03:38:39
SQL> truncate table emp;
Table truncated.

步骤5:把数据库启动到mount下,以timestamp/scn/sequence方式闪回,并且以只读方式打开数据库

SQL> select sysdate from dual;
SYSDATE
-------------------
2016-09-12 03:39:05
SQL> conn / as sysdba
Connected.
SQL> startup mount;
ORA-01081: cannot start already-running ORACLE - shut it down first
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 2405122048 bytes
Fixed Size    2255592 bytes
Variable Size  603981080 bytes
Database Buffers 1778384896 bytes
Redo Buffers   20500480 bytes
Database mounted.



SQL> flashback database to timestamp to_timestamp('2016-09-12 03:37:30','yyyy-mm-dd hh24:mi:ss');
Flashback complete.

SQL> alter database open read only;
Database altered.
SQL> select count(*) from scott.emp;
  COUNT(*)
----------
14
SQL> select count(*) from scott.test_emp;
  COUNT(*)
----------
14

最后以resetlogs方式打开数据库,但是一旦以resetlogs方式打开数据库就不能再flashback 至resetlogs之前的时间点了

此时可以看到数据已经恢复,如果数据恢复的不够理想,则关闭数据库后重新进行上述恢复。

这篇关于oracle闪回数据库flashback database的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/827739

相关文章

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

oracle数据库索引失效的问题及解决

《oracle数据库索引失效的问题及解决》本文总结了在Oracle数据库中索引失效的一些常见场景,包括使用isnull、isnotnull、!=、、、函数处理、like前置%查询以及范围索引和等值索引... 目录oracle数据库索引失效问题场景环境索引失效情况及验证结论一结论二结论三结论四结论五总结ora

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

Springboot中Jackson用法详解

《Springboot中Jackson用法详解》Springboot自带默认json解析Jackson,可以在不引入其他json解析包情况下,解析json字段,下面我们就来聊聊Springboot中J... 目录前言Jackson用法将对象解析为json字符串将json解析为对象将json文件转换为json