ORACLE数据库基于时间点的闪回数据库
最近在和一个顶尖的开发团队做项目,目前有4个测试数据库,有个需求,需要时不时的从生产库同步数据到测试库,以前都是用RMAN在做恢复,数据量1.6T,加上压缩备份300多G,恢复一次要一宿,后来又来了一个新的需求,有个数据迁移测试需要做很多次,每次做完迁移测试,需要重新搭建测试数据库,这个数据库对数据要求不是很高,每次迁移测试完,在造一个干净的测试库即可,这样就可以使用ORACLE的闪回数据库功能,数据迁移测试完成后,将数据库闪回到数据迁移之前即可,闪回操作要比使用RMAN重新搭建环境要快很多,这样就节省了大量的时间,而且也简化了操作。
闪回数据库需要开启数据库的归档模式,并记录闪回日志,redo数据可以使数据库在故障或恢复的时候向前推进,undo数据可以使一个事物往后退,或者通过闪回查询功能查询一段时间范围内的数据,而闪回日志可以使数据库整体向后退。虽然在生产数据库闪回数据库功能并不常有,但是在生产数据库的备库上开启闪回数据库功能就很方便的恢复误操作,如果没有备库并没有开启闪回数据库功能,一旦发生误操作,通常需要在其他服务器上恢复一个数据库到误操作之前的时间点,再将数据迁移到生产数据库,数据量较大的情况下需要很长的时间才可以恢复,如果没有RMAN备份,就很难恢复了。如果有备库并且备库开启了闪回数据库功能,那么只需要将备库闪回到误操作之前的时间点,read only模式打开备库,将数据迁移到生产环境,再启动MRP进程,备库就会自动应用日志继续和主库同步,这样会极大的缩减恢复误操作的时间。当然,为了解决误操作的问题,ORACLE在11g开始推出了闪回数据归档(Flashback Data Archive)功能,将undo数据记录在特定的表空间中,在保留的时间范围内,一旦出现误操作,通过闪回数据归档,可以很快查询到误操作之前的数据,而不会遇到快照过旧(ORA-01555)错误。
开启闪回数据库很简单,首先需要设置闪回恢复区的两个参数,通常即使设置了闪回恢复区的参数,大小通常也需要再次设置,解决闪回恢复区太小的问题。
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=2048G SCOPE=SPFILE; SQL> ALTER SYSTEM SET db_recovery_file_dest= '/u01/app/oracle/fast_recovery_area/ivldb' SCOPE=SPFILE;
一致性关闭数据库。
SQL> SHUTDOWN IMMEDIATE
然后将数据库启动到MOUNT状态。
SQL> STARTUP MOUNT
如果数据库没有开启归档,需要开启数据库的归档。
SQL> ALTER DATABASE ARCHIVELOG;
开启闪回数据库。
SQL> ALTER DATABASE FLASHBACK ON;
打开数据库。
SQL> ALTER DATABASE OPEN;
设置闪回日志的保存周期,单位是分钟,以下是设置闪回日志保留一个月。
SQL> ALTER SYSTEM SET db_flashback_retention_target= 43200;
如果要闪回数据库,通常都是基于时间点的闪回操作比较多,基于SCN的闪回比较少,原因很简单,时间好定位呀。那么怎么样才能知道数据库可以闪回的最早的时间呢?可以通过下面的命令来查询。
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; Session altered. SQL> select oldest_flashback_time from v$flashback_database_log; OLDEST_FLASHBACK_TI ------------------- 2016-04-14 14:26:35
下面将数据库闪回到2016-04-14 17:00:00。
闪回数据库,需要将数据库启动到MOUNT状态。
SQL> SHUTDOWN IMMEDIATE SQL> STARTUP MOUNT SQL> flashback database to timestamp to_timestamp('2016-04-14 17:00:00','yyyy-mm-dd hh24:mi:ss');
闪回完成后,可以通过READ ONLY的方式打开数据库,检查是否是需要的时间点,如果还想接着闪,可以直接再次指定个时间接着闪,如果闪回过头了,想将数据库往回来点,可以指定时间使用recover database的命令将数据库进行不完全恢复,非常灵活。
可以通过v$flashback_database_stat视图来查看闪回的状态和进度等信息。
SQL> select * from v$flashback_database_stat; BEGIN_TIME END_TIME FLASHBACK_DATA DB_DATA REDO_DATA ESTIMATED_FLASHBACK_SIZE ------------------- ------------------- -------------- ---------- ---------- ------------------------ 2016-04-22 17:31:30 2016-04-22 17:49:19 1451458560 1438490624 210660864 0
之前恢复一个1.6TB的测试数据库,需要一夜的时间,使用闪回数据库,四十分钟基本就差不多了。
【下一篇】ORACLE数据库RMAN-06023 no backup or copy of datafile 4 found to restore错误
666
2016-04-27 09:21高手!
2016-04-27 12:54