Oracle 数据库报 ora-00257 错误并且执行alter system switch logfile 命令卡死的解决过程

发布于:2025-07-28 ⋅ 阅读:(17) ⋅ 点赞:(0)

Oracle 数据库报 ora-00257 错误并且执行alter system switch logfile 命令卡死的解决过程

726日下午,某医院用户的 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_1log_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的值是可以的解决问题的。


网站公告

今日签到

点亮在社区的每一天
去签到