Oracle 六大闪回技术,flashback(2)

1.3  闪回恢复区的内容
所有和恢复相关的文件都可以存放到闪回恢复区
TEST@orcl2> select file_type from v$flash_recovery_area_usage;

FILE_TYPE
--------------------
CONTROL FILE
REDO LOG
ARCHIVED LOG
BACKUP PIECE
IMAGE COPY
FLASHBACK LOG
FOREIGN ARCHIVED LOG

7 rows selected.

上面视图中查询的结果列出的所有类型的文件,都可以利用闪回恢复区来存放、管理。在一些 10g 的动态视图里( V$CONTROLFILE, V$LOGFILE, V$ARCHIVED_LOG, V$DATAFILE_COPY 等 )
的新的列 IS_RECOVERY_DEST_FILE ,指明相关的文件是否在恢复区内。

TEST@orcl2> col is_recovery_dest_file for a25
TEST@orcl2> SELECT  recid, blocks, is_recovery_dest_file
  FROM  v$archived_log
 WHERE  recid < 5; 

RECID    BLOCKS IS_RECOVERY_DEST_FILE
---------- ---------- -------------------------
        1      61856 YES
        2          1 YES
        3          1 YES
        4      87577 YES

1.4  闪回恢复区的一些限制
如果设置了闪回恢复区,则log_archive_dest和log_archive_duplex_dest将不可用。
SQL> alter system set log_archive_dest='e:/' ;

alter system set log_archive_dest='e:/'

*

第 1 行出现错误:
ORA-02097: 无法修改参数, 因为指定的值无效
ORA-16018: 无法将 LOG_ARCHIVE_DEST 与 LOG_ARCHIVE_DEST_n 或
DB_RECOVERY_FILE_DEST 一起使用

SQL> alter system set log_archive_duplex_dest='e:/';

alter system set log_archive_duplex_dest='e:/'

*

第 1 行出现错误:
ORA-02097: 无法修改参数, 因为指定的值无效
ORA-16018: 无法将 LOG_ARCHIVE_DUPLEX_DEST 与 LOG_ARCHIVE_DEST_n 或
DB_RECOVERY_FILE_DEST 一起使用


说明:
设置闪回恢复区后,如果没有设置过log_archive_dest_n参数,则归档日志默认是保存到该区域的。
实际上,Oracle是通过隐式的设置log_archive_dest_10='location=USE_DB_RECOVERY_FILE_DEST'
来实现的。所以,如果修改过log_archive_dest_n将归档日志保存到其他位置,
也可以修改该参数继续使用闪回恢复区。

多个数据库的闪回恢复区可以指定到同一个位置,但是db_name不能一样,或者db_unique_name不一样。
RAC的闪回恢复区必须位于共享磁盘上,能被所有实例访问。
上述说明适用于单节点上有多个数据库时的情况。

1.5  闪回恢复区的空间管理
闪回恢复区中添加或删除文件等变化都将记录在数据库的 alert 日志中,Oracle 10g 也针对该新特性提供了一个新的视图, DBA_OUTSTANDING_ALERTS,通过该视图可以得到相关的信息。
SYS@orcl2> desc dba_outstanding_alerts;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 SEQUENCE_ID                                        NUMBER
 REASON_ID                                NOT NULL NUMBER
 OWNER                                              VARCHAR2(30)
 OBJECT_NAME                                        VARCHAR2(513)
 SUBOBJECT_NAME                                    VARCHAR2(30)
 OBJECT_TYPE                                        VARCHAR2(64)
 REASON                                            VARCHAR2(4000)
 TIME_SUGGESTED                                    TIMESTAMP(6) WITH TIME ZONE
 CREATION_TIME                                      TIMESTAMP(6) WITH TIME ZONE
 SUGGESTED_ACTION                                  VARCHAR2(4000)
 ADVISOR_NAME                                      VARCHAR2(30)
 METRIC_VALUE                                      NUMBER
 MESSAGE_TYPE                                      VARCHAR2(12)
 MESSAGE_GROUP                                      VARCHAR2(64)
 MESSAGE_LEVEL                                      NUMBER
 HOSTING_CLIENT_ID                                  VARCHAR2(64)
 MODULE_ID                                          VARCHAR2(64)
 PROCESS_ID                                        VARCHAR2(128)
 HOST_ID                                            VARCHAR2(256)
 HOST_NW_ADDR                                      VARCHAR2(256)
 INSTANCE_NAME                                      VARCHAR2(16)
 INSTANCE_NUMBER                                    NUMBER
 USER_ID                                            VARCHAR2(30)
 EXECUTION_CONTEXT_ID                              VARCHAR2(128)
 ERROR_INSTANCE_ID                                  VARCHAR2(142)

在闪回恢复区中的空间使用超过 85% 的时候,数据库将会向 alert 文件中写入告警信息。
而当超过 97% 的时候将会写入严重告警信息。当闪回恢复区空间不够的时候,Oracle将报告如下类似的错误:

ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 52428800 bytes disk space from 1258291200 limit

这个时候查询 dba_outstanding_alerts:
SQL> select reason,object_type,suggested_action from dba_outstanding_alerts;

REASON                        OBJECT_TYPE          SUGGESTED_ACTION
------------------------------ -------------------- ----------------------------------------
db_recovery_file_dest_size of  RECOVERY AREA        Add disk space and increase db_recovery_
1258291200 bytes is 88.20% use                      file_dest_size, backup files to tertiary
d and has 148509184 remaining                        device, delete files from recovery area
bytes available.                                    using RMAN, consider changing RMAN rete
                                                    ntion policy or consider changing RMAN a
                                                    rchivelog deletion policy.


同时,oracle在alert中还会给出解决该问题的建议
************************************************************************
You have following choices to free up space from flash recovery area:
1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard,
  then consider changing RMAN ARCHIVELOG DELETION POLICY.
2. Back up files to tertiary device such as tape using RMANB ACKUP RECOVERY AREA
  command.
3. Add disk space and increase db_recovery_file_dest_size parameter to reflect
  the new space.
4. Delete unnecessary files using RMAN DELETE command. If an operating system
  command was used to delete files, then use RMAN CROSSCHECK
  and DELETE EXPIRED commands.
************************************************************************

V$RECOVERY_FILE_DEST视图 包含闪回恢复区的相关信息:
SYS@orcl2> desc v$recovery_file_dest;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NAME                                              VARCHAR2(513)
 SPACE_LIMIT                                        NUMBER
 SPACE_USED                                        NUMBER
 SPACE_RECLAIMABLE                                  NUMBER
 NUMBER_OF_FILES                                    NUMBER

SYS@orcl2> col name for a5
SYS@orcl2> select * from v$recovery_file_dest;

NAME  SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
----- ----------- ---------- ----------------- ---------------
+FRA  4621074432  620756992                0              33

通过查询视图v$flash_recovery_area_usage,可以获得当前闪回恢复区的空间使用情况,
并且可以知道是哪些文件占中了空间,据此可以做出相应的处理,或者加大闪回恢复区,
或者移走相应的文件。
SYS@orcl2> select * from v$flash_recovery_area_usage;

FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
CONTROL FILE                        .41                        0
              1

REDO LOG                          4.63                        0
              4

ARCHIVED LOG                      3.72                        0
            24


FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
BACKUP PIECE                          0                        0
              0

IMAGE COPY                            0                        0
              0

FLASHBACK LOG                      4.63                        0
              4


FILE_TYPE            PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE
-------------------- ------------------ -------------------------
NUMBER_OF_FILES
---------------
FOREIGN ARCHIVED LOG                  0                        0
              0


7 rows selected.


如果闪回恢复区空间耗尽,且归档路径设置到了闪回恢复区中,则由于日志无法归档,数据库会hang住。所以,对于生产库,如果将归档放到闪回恢复区中,需要密切关注闪回恢复区的空间使用情况,否则一旦闪回恢复区的空间用尽,将导致数据库无法提供服务。
因此,应该将闪回区的使用情况列入dba日常巡检工作中。
 

1.6  Flash Recovery Area空间不足导致DB不能打开或hang住处理方法
在上面讲到,当归档目录设置在闪回恢复区,并且闪回恢复区又满了的情况下,DB 就会无法归档而hang住或者无法打开。


这种情况下打开数据库会遇到如下错误信息:
SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> alter database open;

alter database open

*

第 1 行出现错误:

ORA-16014: 日志 2 的序列号 27 未归档, 没有可用的目的地
ORA-00312: 联机日志 2 线程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'


SQL> show parameter db_recovery_file

NAME                                TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest    string      D:/oracle/product/10.2.0/flash_recovery_area
db_recovery_file_dest_size        big integer 2G

SQL> alter system archive log current;

alter system archive log current

*

第 1 行出现错误:
ORA-01109: 数据库未打开
 

SQL> alter system switch logfile;

alter system switch logfile

*

第 1 行出现错误:
ORA-01109: 数据库未打开

SQL> shutdown immediate;

ORA-01109: 数据库未打开

已经卸载数据库。
ORACLE 例程已经关闭。

SQL> startup
ORACLE 例程已经启动。
Total System Global Area  201326592 bytes
Fixed Size                  1248092 bytes
Variable Size              88081572 bytes
Database Buffers          109051904 bytes
Redo Buffers              2945024 bytes
数据库装载完毕。

ORA-16038: 日志 2 序列号 27 无法归档
ORA-19809: 超出了恢复文件数的限制
ORA-00312: 联机日志 2 线程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'

SQL> alter database open;

alter database open

*

第 1 行出现错误:
ORA-16014: 日志 2 的序列号 27 未归档, 没有可用的目的地
ORA-00312: 联机日志 2 线程 1:
'D:/ORACLE/PRODUCT/10.2.0/ORADATA/ORCL/REDO02.LOG'


通过增加闪回恢复区大小,我们可以正常打开数据库

SQL> show parameter db_recovery

NAME                                TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest                string      D:/oracle/product/10.2.0/flash_recovery_area
db_recovery_file_dest_size          big integer 2G

SQL> alter system set db_recovery_file_dest_size=3G scope=both;

系统已更改。

SQL> alter database open;

数据库已更改。

检查一下flash recovery area的使用情况:

SQL> select * from v$flash_recovery_area_usage;

FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE          0                        0              0
ONLINELOG          0                        0              0
ARCHIVELOG        6.36                        0              4
BACKUPPIECE      .22                        0              1
IMAGECOPY        63.68                        0              5
FLASHBACKLOG    .51                      .25              2

已选择6行。

SQL>


计算flash recovery area已经占用的空间:

SQL> select sum(percent_space_used)*3/100 from v$flash_recovery_area_usage;

SUM(PERCENT_SPACE_USED)*3/100
-----------------------------
                      2.1231                     
--在11.2以后,v$flash_recovery_area_usage已经被v$recovery_area_usage取代。

可以看到,这里已经有2.1231G使用了,这说明我们刚开始设置的db_recovery_file_dest_size=2G不足,导致online redo log无法归档,在这里,我们通过设置db_recovery_file_dest_size参数,增大了flash recovery area来解决这个问题。
增加Flash recovery area 是一种解决方法,也可以将归档指定到其他的目录来解决这个问题。
或者删除备份中的obsolete备份,都可以解决问题。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/59716b2fb9394c7866eb3120ed90cd10.html