Oracle
数据库报 ora-00257
错误并且执行alter system switch logfile
命令卡死的解决过程
7
月26
日下午,某医院用户的 HIS
系统无法连接,报如下错误:
初步判断是归档日志问题。
用户的 HIS
系统数据库是双节点 Oracle 11g Rac
集群。登录服务器之后发现使用 sqlplus
可以登录系统,但是执行 alter system switch logfile;
命令时系统无反应,出现卡死状态。
这应该是 Oracle 的日志不能归档,导致无法切换日志。用户反映HIS
客户断无法连接数据库,导致医院业务停止。
解决过程如下:
步骤1:使用 v$flash_recovery_area_usage
视图查看归档日志的空间利用率。发现达到 99.95%
,如下图所示:
步骤2:使用 rman
删除归档日志。
命令如下:
rman target /
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';
CROSSCHECK ARCHIVELOG ALL;
DELETE EXPIRED ARCHIVELOG ALL;
执行以上命令后发现 7 天之前的归档日志并没有被删除。原因是 DELETE ARCHIVELOG
命令只删除做过备份的归档文件。
使用如下命令继续删除归档文件:
DELETE ARCHIVELOG UNTIL TIME 'SYSDATE-7';
DELETE FORCE ARCHIVELOG UNTIL TIME 'SYSDATE-7'; -- 强制删除归档日志,不管有没有做过备份
DELETE EXPIRED ARCHIVELOG ALL;
删除之后查询 v$flash_recovery_area_usage
视图信息,发现日志文件数量由 697
个减少为 290
个,但REDO LOG
对应的PERCENT_SPACE_USED
参数的值却变成了1455.6%(正常值应该为 0-100
)。执行 alter system switch logfile;
命令时系统仍然处于卡死状态。
查询发现:当 V$FLASH_RECOVERY_AREA_USAGE
显示 ARCHIVED LOG
使用率超过 100%
时,说明闪回恢复区空间已耗尽,会导致:
(1)归档失败(出现 ORA-00257 错误);
(2)数据库挂起(DML 操作阻塞);
(3)日志切换卡死(ALTER SYSTEM SWITCH LOGFILE
无响应)。
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 1455.6 0 290
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
7 rows selected.
步骤3:考虑到业务需要,临时修改归档日志存放的地址,然后再查找原因。
系统配置有 dg
,参数log_archive_dest_1
和 log_archive_dest_2
的配置如下:
log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=hisdb'
log_archive_dest_2='SERVICE=dghisdb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dghisdb'
执行如下操作切换归档日志存放的地址:
-- 在两个节点上分别创建目录:/u01/app/oracle/gdbak0726
-- 然后执行下面的命令切换归档日志的地址
alter system set log_archive_dest_2='location=/u01/app/oracle/gdbak0726' scope=both;
执行上面的命令之后,过了几分钟,发现系统恢复正常。用户反映可以登录系统了,业务恢复正常。执行alter system switch logfile
命令时也比较顺利。
=====================================================================================================
=============== 问题最终解决 =========================================================================
=====================================================================================================
到晚上八点半,医院下班之后,把归档日志的地址恢复为原来的参数。命令如下:
alter system set log_archive_dest_2='SERVICE=dghisdb LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dghisdb' scope=both;
执行以上命令之后,发现执行alter system switch logfile
命令时仍然卡死。
查询发现, v$flash_recovery_area_usage
视图中 ARCHIVED LOG
对应的参数 PERCENT_SPACE_USED
的值与参数db_recovery_file_dest_size
有关,把参数db_recovery_file_dest_size
的值调大即可。
查看参数db_recovery_file_dest_size
的值:
SQL> show parameter DB_RECOVERY_FILE_DEST_SIZE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest_size big integer 5G
执行下面的命令把参数db_recovery_file_dest_size
的值修改为 50G:
alter system set db_recovery_file_dest_size=50G scope=both;
然后查询 v$flash_recovery_area_usage
视图信息:
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 145.56 0 290
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
7 rows selected.
再次把参数db_recovery_file_dest_size
的值修改为 100G:
alter system set db_recovery_file_dest_size=100G scope=both;
然后查询 v$flash_recovery_area_usage
视图信息,发现ARCHIVED LOG
选项对应的PERCENT_SPACE_USED
参数的值已下降到100
以内。
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 72.78 72.43 290
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 0 0 0
FOREIGN ARCHIVED LOG 0 0 0
7 rows selected.
过了几分钟,用户反映业务恢复正常了。说明通过修改参数db_recovery_file_dest_size
的值是可以的解决问题的。