暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle的数据库级闪回

suger 2023-04-06
210

Flashback Database是Oracle 10g的新增功能,在启用Flashback Database功能之后,数据库会定期将发生变化的数据块的前镜像写入闪回日志的日志文件中,在进行数据库闪回时,这些数据块可以被直接复制回来以满足数据库的恢复需求,同时Redo Log可以被应用以辅助数据恢复到更精确的时间点,从而极大的缩短了恢复时间。

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

闪回数据库的日志文件不是由传统的Log Writer(LGWR)进程写入,而是由一个称作RecoVery WRiter(RVWR)的新过程写入,这是Oracle 10g新增的一个后台进程:

$ ps -ef|grep rvwr|grep -v grep
  oracle 27231     1  0 17:10:30 ?        0:00 ora_rvwr_eygle
复制

在Windows系统上,可以通过动态视图找到相关信息:

SQL> select sid,program from v$session where program like '%RVWR%';
       SID PROGRAM
---------- ------------------------------
       156 ORACLE.EXE (RVWR)
复制

闪回日志文件由RVWR进程在恢复区中自动创建和维护。
闪回数据库的特性缺省是关闭的,启用闪回数据库特性需要在Mount状态下进行:

SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248600 bytes
Variable Size             113246888 bytes
Database Buffers          171966464 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
SQL> alter database flashback on;
数据库已更改。

SQL> alter database open;
数据库已更改。
复制

数据库的闪回状态可以从v$database视图中查询得到:

SQL> select dbid,name,flashback_on,current_scn
  2  from v$database;
      DBID NAME      FLASHBACK_ON       CURRENT_SCN
---------- --------- ------------------ -----------
1417824532 EYGLE     YES                     586483
复制

初始化参数db_flashback_retention_target用于定义一个时间上限,用于设置数据库能够闪回的最大时间上限,单位是分钟。这个参数设置的只是一个期望值,确切的闪回时间取决于闪回区中保留的闪回数据:

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

来看一下闪回数据库的用途,测试用户eygle下有两张测试表:

SQL> connect eygle/eygle
已连接。

SQL> select count(*) from eygle;
  COUNT(*)
----------
         1

SQL> select count(*) from test;
  COUNT(*)
----------
        15
复制

分别在不同时间Truncate这两张表,Truncate的数据是不能使用闪回查询恢复的,此时可以通过闪回数据库进行恢复:

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。

SQL> select sysdate from dual;
SYSDATE
-------------------
2007-03-10 13:41:52

SQL> truncate table eygle;
表被截断。

SQL> select sysdate from dual;
SYSDATE
-------------------
2007-03-10 13:42:04

SQL> truncate table test;
表被截断。

SQL> select sysdate from dual;
SYSDATE
-------------------
2007-03-10 13:42:13
复制

闪回需要在mount状态下进行,可以指定Timestamp/SCN/Sequence进行闪回。
首先将数据库闪回到第一个时间点,以Read Only的方式打开数据库:

SQL> startup mount;
ORACLE 例程已经启动。

Total System Global Area  289406976 bytes
Fixed Size                  1248600 bytes
Variable Size             117441192 bytes
Database Buffers          167772160 bytes
Redo Buffers                2945024 bytes
数据库装载完毕。
SQL> flashback database to timestamp
  2  to_timestamp ('2007-03-10 13:41:52','yyyy-mm-dd hh24:mi:ss');
闪回完成。

SQL> alter database open read only;
数据库已更改。
复制

此时检查,两个数据表的数据都已经恢复:

SQL> select count(*) from eygle.eygle;
  COUNT(*)
----------
         1

SQL> select count(*) from eygle.test;
  COUNT(*)
----------
        15
复制

如果数据恢复得不够理想,可以关闭数据库继续进行恢复:

SQL> flashback database to timestamp
  2  to_timestamp ('2007-03-10 13:42:04','yyyy-mm-dd hh24:mi:ss');
闪回完成。

SQL> alter database open read only;
数据库已更改。

SQL> select count(*) from eygle.eygle;
  COUNT(*)
----------
         0
SQL> select count(*) from eygle.test;
  COUNT(*)
----------
        15
复制

可以看到此时eygle表的数据已经被截断,test表的数据仍然存在。
从alert文件中,可以看到恢复过程的提示信息:

Sat Mar 10 13:54:57 2007
flashback database to timestamp
to_timestamp ('2007-03-10 13:42:04','yyyy-mm-dd hh24:mi:ss')
Sat Mar 10 13:54:58 2007
Flashback Restore Start
Flashback Restore Complete
Flashback Media Recovery Start
Sat Mar 10 13:55:00 2007
Recovery of Online Redo Log: Thread 1 Group 1 Seq 34 Reading mem 0
  Mem# 0 errs 0: D:\ORADATA\EYGLE\ONLINELOG\O1_MF_1_2G8OGOQG_.LOG
  Mem# 1 errs 0: D:\ORADATA\FLASH_RECOVERY_AREA\EYGLE\ONLINELOG\O1_MF_1_2G8OGTJH_.LOG
Sat Mar 10 13:55:02 2007
Incomplete Recovery applied until change 587319
Flashback Media Recovery Complete
Completed: flashback database to timestamp
to_timestamp ('2007-03-10 13:42:04','yyyy-mm-dd hh24:mi:ss')
Sat Mar 10 13:55:09 2007
复制

如果确认恢复了需要的数据,那么就可以resetlogs打开数据库,恢复工作。

SQL> alter database open resetlogs;
数据库已更改。
复制

注意:一旦resetlogs之后,将不能再flashback至resetlogs之前的时间点。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论