早上公司开发反映说开发环境数据库挂掉了,不能写入,现场报如下的错误提示。
ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法。
这是很常见的‘归档日志’写满‘快闪恢复区’(flash recovery area)导致的问题。具体的解决方法分为三种(可搭配起来使用):
一是 删除过期的归档文件;
二是 更改快闪恢复区(flash recovery area)的大小;
三是 修改归档日志文件默认路径。
第一部分:了解你的数据库环境,明白问题出在哪里,可跳过(主要为新手学习)
1.1 用sys用户登录
sqlplus sys/pass@orcl as sysdba
SQL> show parameter log_archive_dest_1;
NAME TYPE VALUE
-------------------- -------- --------------------
log_archive_dest_1 string
log_archive_dest_10 string
默认log_archive_dest_1的VALUE值为空,代表了归档日志路径使用默认值,即使用快闪恢复区。
1.3 找到recovery目录,并查看快闪恢复区最大值
SQL> show parameter recover;
NAME TYPE VALUE
-------------------------- ----------- ------------------------------
db_recovery_file_dest string /home/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 512M
recovery_parallelism integer 0
1.4 查看快闪恢复区flash_recovery_area使用情况
[root@DB104 ~]# du -h --max-depth=1 /home/oracle/flash_recovery_area/
1M /home/oracle/flash_recovery_area/ORCL
511M /home/oracle/flash_recovery_area/orcl
512M /home/oracle/flash_recovery_area/
这里看到磁盘的使用已经达到的快闪恢复区(1.3中)的最大值.
第二部分:解决问题的三种方法
2.1 方法一:删除过期的归档文件
2.1.1 进入归档目录,删除/转移过期的归档文件,可保留最近几天的文件
[root@DB104 ~]# cd /home/oracle/flash_recovery_area/ORCL/archivelog
2.1.2 使用RMAN维护控制文件,释放空间
[oracle@DB104 ~]$ rman target sys/password
RMAN> crosscheck archivelog all; ——检查所有归档日志
RMAN> delete expired archivelog all; ——删除过期的归档日志
问题解决,可通过1.5语句查看快闪恢复区使用大小
2.2 方法二:扩大快闪恢复区(flash recovery area)的大小;
SQL> alter system set db_recovery_file_dest_size=50G scope=both;
NAME TYPE VALUE
--------------------------- ----------- ------------------------------
db_recovery_file_dest string /home/oracle/flash_recovery_area
db_recovery_file_dest_size big integer 50G
recovery_parallelism integer 0
2.3 方法三:修改归档日志文件到指定路径(自定义)
SQL>alter system set log_archive_dest_1='location=/home/oracle/log_archive_dest' scope=spfile