在Oracle中,什么是块改变跟踪?
Tags: Block Change TrackingOracle块改变跟踪
执行增量备份是为了只备份自上一次备份以来更改过的数据块。使用RMAN可创建数据文件、表空间或整体数据库的增量备份。在执行增量备份时,RMAN将扫描数据文件的每个块以确定自上次备份以来哪些块发生过更改。这会减小备份大小,因为只备份更改过的块。此外,由于减少了需要还原的块数,因此还会加快恢复速度。
块改变跟踪(Block Change Tracking)是在使用RMAN执行增量备份的情况下,若启用块改变跟踪,则会把自上次备份以来所有块的改变记录到文件中,这个文件称为跟踪文件,通过后台进程CTWR(Change Tracking Writer Process)对其进行实时地写入。这样在做增量备份时就可以避免扫描所有数据文件中的所有块,而改为参考跟踪文件,直接访问需要备份的块,会大大缩短RMAN备份的时间,从而提高RMAN备份的性能。当然0级备份时还是需要扫描所有的数据文件,毕竟需要创建一个基准,以此来判断哪些块发生了改变。因此,通过启用块更改跟踪,可执行快速增量备份。
跟踪文件的维护是完全自动进行的,不需要用户的干预。块改变跟踪默认是禁用的,如果配置了增量备份,那么建议开启块改变跟踪。数据库在OPEN或者MOUNT状态都可以启用块改变跟踪。可以使用如下命令开启块改变跟踪:
1 | ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/mydir/rman_change_track.f' REUSE; |
如果是RAC环境,那么跟踪文件必须放在共享设备上。如果设置DB_CREATE_FILE_DEST参数值,那么可以直接启用:
1 2 | ALTER SYSTEM SET DB_CREATE_FILE_DEST = '+FRA' SCOPE=BOTH SID='*'; ALTER DATABASE ENABLE BLOCK CHANGE TRACKING; |
若想禁用块改变跟踪,则可以使用如下命令:
1 | ALTER DATABASE DISABLE BLOCK CHANGE TRACKING; |
在V$BLOCK_CHANGE_TRACKING视图的输出中会显示块改变跟踪文件的位置、块改变跟踪的状态(ENABLED/DISABLED)和文件大小(字节),可以使用如下命令查看是否启用了块改变跟踪:
1 2 3 | COL STATUS FORMAT A8 COL FILENAME FORMAT A60 SELECT STATUS,FILENAME,BYTES FROM V$BLOCK_CHANGE_TRACKING; |
对V$BACKUP_DATAFILE视图进行查询,可显示块改变跟踪功能对最大限度减少增量备份I/O的作用(PCT_READ_FOR_BACKUP列)。值比较高时表示RMAN在增量备份期间从数据文件中读取的块非常多。通过减少增量备份之间的时间间隔可降低这个比率。
1 2 3 4 5 6 7 8 9 | SELECT FILE#, AVG(DATAFILE_BLOCKS), AVG(BLOCKS_READ), AVG(BLOCKS_READ / DATAFILE_BLOCKS) * 100 AS PCT_READ_FOR_BACKUP, AVG(BLOCKS) FROM V$BACKUP_DATAFILE WHERE USED_CHANGE_TRACKING = 'YES' AND INCREMENTAL_LEVEL > 0 GROUP BY FILE#; |
相关SQL语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | alter system set db_create_file_dest = '/u01/bct/' scope=both sid='*'; alter database enable block change tracking; ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '+FRA'; ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/mydir/rman_change_track.f' REUSE; ALTER DATABASE DISABLE BLOCK CHANGE TRACKING; COL STATUS FORMAT A8 COL FILENAME FORMAT A60 SELECT STATUS, FILENAME,BYTES FROM V$BLOCK_CHANGE_TRACKING; SELECT file#, AVG(datafile_blocks), AVG(blocks_read), AVG(blocks_read / datafile_blocks) * 100 AS PCT_READ_FOR_BACKUP, AVG(blocks) FROM v$backup_datafile WHERE used_change_tracking = 'YES' AND incremental_level > 0 GROUP BY file#; |