现象:查看集群数据库状态,发现归档挂起
[oracle@jydb2 ~]$ srvctl status database -d orcl -v
实例 racdb11 正在节点 jydb1 上运行。实例状态: Stuck Archiver。
实例 racdb12 正在节点 jydb2 上运行。实例状态: Stuck Archiver。
查看日志
[oracle@jydb2 ~]$ tail -n30 /u01/app/oracle/diag/rdbms/orcl/racdb12/trace/alert_racdb12.log
************************************************************************
You have following choices to free up space from 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 RMAN
BACKUP 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.
************************************************************************
2018-08-09T11:02:25.793556+08:00
Errors in file /u01/app/oracle/diag/rdbms/orcl/racdb12/trace/racdb12_arc1_17738.trc:
ORA-19809: 超出了恢复文件数的限制
ORA-19804: 无法回收 182452224 字节磁盘空间 (从 19368247296 字节限制中)
ARC1: Error 19809 Creating archive log file to '+FRA'
查看空间使用情况
[oracle@jydb1 ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 星期三 8月 8 14:37:03 2018
Copyright (c) 1982, 2016, Oracle. All rights reserved.
连接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> set linesize 100
SQL> set pages 100
SQL> show parameter db_recovery
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string +FRA
db_recovery_file_dest_size big integer 18471M
SQL> select sum(percent_space_used) from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)
-----------------------
99.37
查看asm磁盘组磁盘空间使用情况
[root@jydb1 rlwrap-0.37]# su - grid
[grid@jydb1 ~]$ asmcmd
ASMCMD> lsdg
State Type Rebal Sector Logical_Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Voting_files Name
MOUNTED EXTERN N 512 512 4096 4194304 20480 9456 0 9456 0 N DATA/
MOUNTED EXTERN N 512 512 4096 4194304 20480 1776 0 1776 0 N FRA/
MOUNTED EXTERN N 512 512 4096 4194304 51200 15796 0 15796 0 N MGMT/
MOUNTED NORMAL N 512 512 4096 4194304 3072 2204 1024 590 0 Y OCR/
db_recovery_file_dest_size已使用完,flash recovery area闪回恢复区空间满,无法再归档。
解决办法:
1.将归档设置到其他目录,修改alter system set log_archive_dest = 其他路径
2.转移或者删除闪回恢复区里的归档日志。
3.增大闪回恢复区。
如果RMAN未使用恢复目录,或是恢复目录与目标数据库在同一数据库下,由于目标数据库实例无法正常启动,所以只能查看参数文件或是启动日志来确定闪回恢复区大小及位置。RMAN也连接不到目标数据库来删除归档日志以释放空间。
适合我的方案:在RMAN下删除目标数据库中过期的或是删除指定时间之前的归档日志。
[oracle@jydb2 ~]$ rman target=sys/*****@orcl nocatalog
恢复管理器: Release 12.2.0.1.0 - Production on 星期四 8月 9 11:30:54 2018
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.
已连接到目标数据库: ORCL (DBID=1508459345)
使用目标数据库控制文件替代恢复目录
RMAN>crosscheck archivelog all; -- 运行这个命令可以把无效的expired的archivelog标出来。
RMAN> delete expired archivelog all; ----删除过期的归档日志
释放的通道: ORA_DISK_1
分配的通道: ORA_DISK_1
通道 ORA_DISK_1: SID=160 设备类型=DISK
说明与资料档案库中的任何归档日志都不匹配 -----无过期日志可删除
RMAN> delete archivelog until time "sysdate-10"; --删除10天前的归档日志。或者:delete noprompt archivelog until time "sysdate - 10";
或者:
RMAN> delete archivelog until time "to_date('2018-08-01 23:59:59','yyyy-mm-dd hh24:mi:ss')"; --删除指定日期之前的所有归档日志。
验证
查看空间使用情况,看到已经恢复正常
SQL> select sum(percent_space_used) from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)
-----------------------
11.48
数据库也恢复OPEN状态。
[oracle@jydb2 ~]$ srvctl status database -d orcl -v
实例 racdb11 正在节点 jydb1 上运行。实例状态: Open。
实例 racdb12 正在节点 jydb2 上运行。实例状态: Open。
进一步优化策略
指定retention的策略,使得archivelog不至于这样增加
RMAN> configure retention policy to recovery window of 7 days;
旧的 RMAN 配置参数:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
新的 RMAN 配置参数:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
已成功存储新的 RMAN 配置参数