Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

121

积分

0

好友

2

主题
1#
发表于 2012-2-3 20:38:22 | 查看: 6244| 回复: 3
Oracle 版本 10.2.0.4
1.FLASH BACK区的空间释放问题
  为了减少DG在failover的工作量,我在主、备库都开启了FLASHBACK,所有的RMAN备份都是定期在备库完成,FLASHBACK参数如下:
  db_recovery_file_dest_size = 200G
  db_flashback_retention_target = 4320 (3天)
  ALERT中发现错误:
    ORA-19809: limit exceeded for recovery files
    ORA-19804: cannot reclaim 76374016 bytes disk space from 214748364800 limit
  从v$recovery_file_dest中查到200G空间已经全部用完。
  为了释放空间,在RMAN中执行:
    DELETE NOPROMPT ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-3';
    crosscheck archivelog all;
  执行完之后发现几个问题:
  1) FLASHBACK的空间没有释放,ORA-19809错误依旧。在FLASHBACK的目录中查询,发现最老的文件是2012-1-28;
  2) 查归档目录中归档日志,发现只删除了一部分:2012-1-14之前的日志全部没有删除,但2012-1-14到2012-1-31之间的日志有成功删除(执行DELETE时没有报异常)。
    list archivelog all completed before 'sysdate-3';
    不会列出2012-1-4之前的归档日志。
2.一般采用什么方法来释放DG主库的FLASHBACK区?
3.FLASHBACK区满了之后数据库为何没有HANG住?
2#
发表于 2012-2-3 20:46:48
action plan:

1. 跑一下这段查询 并上传结果
  1. select * from v$version;

  2. Select file_type, percent_space_used as used,percent_space_reclaimable as reclaimable,
  3.     number_of_files as "number" from v$flash_recovery_area_usage;
  4.        
  5. select name, space_limit as Total_size ,space_used as Used,
  6.     SPACE_RECLAIMABLE as reclaimable ,NUMBER_OF_FILES as "number"
  7.     from  V$RECOVERY_FILE_DEST;

  8. select * From v$restore_point;
  9.        
  10.        
  11. WITH flashback_database_log AS
  12. (SELECT ROUND((SYSDATE - oldest_flashback_time) * 24 * 60, 2) oldest_log_minutes,
  13.          retention_target retention_target_minutes,
  14.          flashback_size / 1048576 flashback_size_mb,
  15.          estimated_flashback_size / 1048576 estimated_flashback_size_mb
  16.     FROM v$flashback_database_log),
  17. flashback_database_logfile AS
  18. (SELECT COUNT(*) logs,
  19.          SUM(BYTES / 1048576) size_mb,
  20.          MIN(first_time) oldest_log,
  21.          MAX(first_time) latest_log
  22.     FROM v$flashback_database_logfile),
  23. flashback_usage AS
  24. (SELECT file_type,
  25.          ROUND(mb_used, 2) mb_used,
  26.          ROUND(mb_reclaimable, 2) mb_reclaimable,
  27.          DECODE(total_mb, 0, 0, ROUND(mb_used * 100 / total_mb, 2)) percent_space_used,
  28.          DECODE(total_mb, 0, 0, ROUND(mb_reclaimable * 100 / total_mb, 2)) percent_space_reclaimable,
  29.          number_of_files,
  30.          total_mb db_recovery_file_dest_mb,
  31.          flashback_retention_target,
  32.          oldest_record,
  33.          ROUND((sysdate - oldest_record) * 24 * 60, 2) oldest_record_age_sec
  34.     FROM (SELECT SUM(DECODE(NAME,
  35.                             'db_recovery_file_dest_size',
  36.                             VALUE / 1048576,
  37.                             0)) total_mb,
  38.                  SUM(DECODE(NAME, 'db_flashback_retention_target', VALUE, 0)) flashback_retention_target
  39.             FROM v$parameter
  40.            WHERE NAME IN ('db_recovery_file_dest_size',
  41.                           'db_flashback_retention_target')),
  42.          (SELECT 'FLASHBACKLOG' file_type,
  43.                  NVL(SUM(BYTES) / 1048576, 0) mb_used,
  44.                  sum(CASE
  45.                        WHEN last_time <= (sysdate - (tgt.value / 1440)) THEN
  46.                         bytes / 1048576
  47.                        ELSE
  48.                         0
  49.                      END) mb_reclaimable,
  50.                  COUNT(*) number_of_files,
  51.                  MIN(first_time) oldest_record
  52.             FROM (select bytes,
  53.                          lead(first_time) over(order by first_time asc) last_time,
  54.                          first_time
  55.                     from v$flashback_database_logfile) fla_log,
  56.                  (SELECT value value
  57.                     FROM v$parameter
  58.                    WHERE name = 'db_flashback_retention_target') tgt
  59.           UNION
  60.           SELECT 'BACKUPPIECE' file_type,
  61.                  NVL(SUM(BYTES / 1048576), 0) mb,
  62.                  SUM(CASE
  63.                        WHEN dl.rectype = 13 THEN
  64.                         (BYTES / 1048576)
  65.                        ELSE
  66.                         0
  67.                      END) reclaimable_mb,
  68.                  COUNT(*) no_of_files,
  69.                  MIN(start_time) oldest_record
  70.             FROM v$backup_piece bp, x$kccagf dl
  71.            WHERE is_recovery_dest_file = 'YES'
  72.              AND deleted = 'NO'
  73.              AND bp.recid = dl.recid(+)
  74.              AND dl.rectype(+) = 13
  75.           UNION
  76.           SELECT 'ARCHIVELOG' file_type,
  77.                  NVL(SUM(blocks * block_size) / 1048576, 0) mb,
  78.                  SUM(CASE
  79.                        WHEN dl.rectype = 11 THEN
  80.                         (LOG.blocks * LOG.block_size / 1048576)
  81.                        ELSE
  82.                         0
  83.                      END) reclaimable_mb,
  84.                  COUNT(*) no_of_files,
  85.                  MIN(first_time) oldest_record
  86.             FROM v$archived_log log, x$kccagf dl
  87.            WHERE deleted = 'NO'
  88.              AND is_recovery_dest_file = 'YES'
  89.              AND dl.recid(+) = log.recid
  90.              AND dl.rectype(+) = 11
  91.           UNION
  92.           SELECT 'ONLINELOG' file_type,
  93.                  SUM(BYTES / 1048576) mb,
  94.                  0 reclaimable,
  95.                  COUNT(*) no_of_files,
  96.                  MIN(first_time) oldest_record
  97.             FROM v$logfile lf,
  98.                  (SELECT group#, BYTES, first_time
  99.                     FROM v$standby_log
  100.                   UNION
  101.                   SELECT group#, BYTES, first_time FROM v$log) l
  102.            WHERE l.group# = lf.group#
  103.              AND lf.is_recovery_dest_file = 'YES'
  104.           UNION
  105.           SELECT 'IMAGECOPY',
  106.                  NVL(SUM(blocks * (block_size / 1048576)), 0) mb,
  107.                  0 reclaimable_mb,
  108.                  COUNT(*) no_of_files,
  109.                  MIN(creation_time) oldest_record
  110.             FROM v$datafile_copy
  111.            WHERE deleted = 'NO'
  112.              AND is_recovery_dest_file = 'YES'
  113.           UNION
  114.           SELECT 'CONTROLFILE',
  115.                  NVL(SUM(block_size * file_size_blks) / 1048576, 0) mb,
  116.                  0 reclaimable,
  117.                  COUNT(*) no_of_files,
  118.                  NULL oldest_record
  119.             FROM v$controlfile
  120.            WHERE is_recovery_dest_file = 'YES'))
  121. SELECT order_, NAME, VALUE
  122.   FROM(
  123. SELECT 0 order_, NAME, VALUE
  124.   FROM v$parameter
  125. WHERE NAME LIKE 'db_recovery_file%'
  126. UNION
  127. SELECT 3, 'oldest flashback log (minutes)', TO_CHAR(ROUND(oldest_log_minutes, 2))
  128.   FROM flashback_database_log
  129. UNION
  130. SELECT 1, 'retention target (minutes)', TO_CHAR(ROUND(retention_target_minutes, 2))
  131.   FROM flashback_database_log
  132. UNION
  133. SELECT 2, 'estimated size for flashback logs (MB)', TO_CHAR(ROUND(estimated_flashback_size_mb, 2))
  134.   FROM flashback_database_log
  135. UNION
  136. SELECT 2, 'Current flashback log count', TO_CHAR(logs)
  137.   FROM flashback_database_logfile
  138. UNION
  139. SELECT 3, 'Most recent flashback log (minutes)', TO_CHAR(ROUND((SYSDATE - latest_log) * 24 * 60, 2))
  140.   FROM flashback_database_logfile
  141. UNION
  142. SELECT 4, 'Total size of all files in MB', TO_CHAR(ROUND(SUM(mb_used), 2))
  143.   FROM flashback_usage
  144. UNION
  145. SELECT 5, 'Total size of reclaimable files in MB', TO_CHAR(ROUND(SUM(mb_reclaimable), 2))
  146.   FROM flashback_usage
  147. UNION
  148. SELECT 6, 'unused space in MB', TO_CHAR(ROUND(MIN(db_recovery_file_dest_mb) - SUM(mb_used)))
  149.   FROM flashback_usage)
  150. ORDER BY order_, NAME
  151. /       
复制代码
2.

尝试在RMAN中执行以下命令

CROSSCHECK BACKUP;
CROSSCHECK ARCHIVELOG ALL;
Delete expired backup;
Delete expired archivelog all;


3.
rerun step 1 再次执行 步骤1 的查询

回复 只看该作者 道具 举报

3#
发表于 2012-2-3 21:11:52
主库没有执行过RMAN备份。另外,现在主库的归档日志还不能全删掉,还有几个归档在备库GAP了,而备库和主库的网络连接现在出了问题,没有传过去。

SQL的执行结果如下:
select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi
PL/SQL Release 10.2.0.4.0 - Production
CORE        10.2.0.4.0        Production
TNS for 64-bit Windows: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production


Select file_type, percent_space_used as used,percent_space_reclaimable as reclaimable,
     number_of_files as "number" from v$flash_recovery_area_usage;

FILE_TYPE          USED RECLAIMABLE     number
------------ ---------- ----------- ----------
CONTROLFILE           0           0          0
ONLINELOG             0           0          0
ARCHIVELOG            0           0          0
BACKUPPIECE           0           0          0
IMAGECOPY             0           0          0
FLASHBACKLOG      99.99       50.69       1119     
        
select name, space_limit as Total_size ,space_used as Used,
    SPACE_RECLAIMABLE as reclaimable ,NUMBER_OF_FILES as "number"
    from  V$RECOVERY_FILE_DEST;

NAME                                                                             TOTAL_SIZE       USED RECLAIMABLE     number
-------------------------------------------------------------------------------- ---------- ---------- ----------- ----------
D:\oracle\product\10.2.0\flash_recovery_area                                     2147483648 2147346595 10885368217       1119
     

select * From v$restore_point;
无数据

最后一条执行结果:
    ORDER_ NAME                                                                             VALUE
---------- -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
         0 db_recovery_file_dest                                                            D:\oracle\product\10.2.0\flash_recovery_area
         0 db_recovery_file_dest_size                                                       214748364800
         1 retention target (minutes)                                                       4320
         2 Current flashback log count                                                      1119
         2 estimated size for flashback logs (MB)                                           79199.23
         3 Most recent flashback log (minutes)                                              4.18
         3 oldest flashback log (minutes)                                                   9646.47
         4 Total size of all files in MB                                                    204786.93
         5 Total size of reclaimable files in MB                                            103810.96
         6 unused space in MB                                                               13

回复 只看该作者 道具 举报

4#
发表于 2012-2-3 21:31:33
最后一个查询的结果已经很明显了 flashback log  占用了主要的flashback area空间

回复 只看该作者 道具 举报

您需要登录后才可以回帖 登录 | 注册

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-24 00:32 , Processed in 0.048191 second(s), 21 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569