成为MySQL DBA后,再看ORACLE数据库(十一、闪回技术)

前文说到ORACLE通过undo实现数据的多版本模型,同样的道理ORACLE还通过undo实现了闪回查询的特性,本文将总结ORACLE的几种闪回技术。闪回技术是Oracle数据库独有的特性,支持各级恢复,包括行、事务、表、表空间和数据库范围。采用闪回技术,可以针对行级和事务级发生过变化的数据进行恢复,减少了数据恢复的时间,而且操作简单,通过SQL语句就可以实现数据的恢复,大大提升了数据库恢复的效率。按照闪回的原理ORACLE的闪回技术可以分为以下三类:

1.基于undo表空间:闪回查询、闪回版本查询、闪回事务查询、闪回表;

2.基于回收站(Recycle Bin):闪回删除;

3.基于闪回恢复区(Flash Recovery Area)中的闪回日志:闪回数据库;

一、闪回查询(Flashback Query)

闪回查询是指查询过去某个时间点或某个SCN值对应的表中的数据信息,即可以从回滚段中读取一定时间内对表进行操作的数据,从而恢复错误的DML操作。闪回查询的语句和实验步骤如下所示,可以通过scn或时间点闪回查询到过去某个时间的数据。

select * from xxx as of scn|timestamp xxx;

 

二、闪回版本查询(Flashback Version Query)

闪回版本查询是指查询过去某个时间段或某个SCN段内表中数据的变化情况。通过以下SQL可以看到表中ID,ADDR两列的数据随着事务的变化情况。

select versions_xid,versions_operation,versions_startscn,versions_endscn from xxx versions between scn minvalue and maxvalue;

三、闪回事务查询(Flashback Transaction Query)

闪回事务查询是指查看某个事务或所有事务在过去一段时间对数据进行的修改。通常需要先通过闪回版本查询获取事务的xid号,然后再通过闪回事务查询获取undo_sql,这样就可以执行undo_sql对已提交的事务进行撤销。使用闪回事务查询需要开启补充日志,并且给应用用户授予select any transaction权限。

select undo_sql from flashback_transaction_query where xid='versions_xid';

四、闪回表(Flashback TABLE)

闪回表是指将表恢复到过去的某个时间点或某个SCN值时的状态。闪回表的前提是需要先对表开启行迁移alter table enable row movement。闪回表可以直接将表恢复到过去的状态,所以应该谨慎操作,生产环境最好先通过闪回查询确认好数据再进行闪回操作。

flashback table xxxx to scn|timestamp

五、闪回删除(Flashback DROP)

闪回删除是指将已经删除的表及表上的索引恢复到删除前的状态,但索引名不会恢复到删除前的状态。闪回删除是基于回收站完成的,据库每个用户都有一个回收站,但这个回收站并不实际开辟空间(只是个逻辑标记),当drop table时(非 purge),原来的表所使用的段中的数据并没有真正的删除,实际上是以回收站方式重命名。该段所在表空间不足时,回收站中的信息会被自动清除。

flashback table xxx to before drop;

 

六、闪回数据库(Flashback Database)

闪回数据库是指将数据库恢复到过去某个时间点或某个SCN值时的状态。当数据库发生逻辑错误比如误删除用户时,可以快速将数据库恢复到过去的某个时间点从而找回被删除的用户。当数据库开启了闪回,发生变化的数据块会不断从数据库缓冲区缓存中复制到闪回缓冲区,然后,称为恢复写入器(Recovery Writer)的后台进程rvwr会将这些数据刷新到磁盘中的闪回日志文件中。闪回的过程,是一个提取闪回日志,然后将之前某个时间点的块映像复制回数据文件的过程,由于只需要物理地恢复变化的数据块,所以这个过程非常快。除了需要闪回日志,还需要重做日志来完成闪回到一致的数据库版本,因此数据库要处于归档模式。由于是相当于数据库的不完整恢复,闪回点之后的所有工作就丢失了,所以只能以resetlogs模式打开数据库重置redo log。闪回数据库的前提是需要先配置好快速恢复区,并在mount状态开启闪回数据库。

闪回数据库的语法和实验如下所示,展示了如何通过闪回数据库到具体的SCN从而找回了被删除的用户。

flashback database to scn|timestamp xxx;

除了闪回到过去的某个scn或时间点,Oracle也支持创建还原点(闪回点)的方式,闪回到之前创建的还原点,而这个还原点其实相当于某个SCN的一个别名。还原点包括normal和guarantee两种,其中对于guarantee还原点,即使数据库没有开启闪回启用闪回日志,也能保证数据库可以闪回到创建的guaranteed restore point。因为在创建guaranteed restore point后,对于任何block的第一次变更,都会将其前镜像整个的记录到快速恢复区。以后对同一个block的修改则不会记录到快速恢复区,除非在修改该块之后又创建了另一个guaranteed restore point。使用guaranteed restore point功能,可以不用开启数据库闪回,这样只需要记录还原点后的修改前的块镜像,只会产生少量的闪回数据。

create restore point before_upgrade {guarantee flashback database};
flashback database to restore point before_upgrade;
drop restore point before_upgrade;

七、闪回数据归档

闪回数据归档是指将变化的数据另外存储到闪回归档区,和undo表空间区分开,不受undo_retention影响。可以对表单独设置闪回归档区,这样就能将表恢复到很久以前的状态,而不受undo的限制。

八、总结

ORACLE的闪回技术是ORACLE独有的功能,其中闪回查询,闪回删除在实际的生产场景中都有机会发挥关键的作用。而闪回数据库更是在业务升级或转测的场景下,大大提升了数据库恢复的效率,其他数据库如MySQL、MSSQL只能通过全库备份恢复的方式前滚数据库,在数据量大的情况下效率远不如ORACLE数据库。

posted @ 2024-06-19 22:57  海布里_MySQL  阅读(6)  评论(0编辑  收藏  举报