刚处理完备库的bug,客户申告主库用不了了。登陆不了,幸好是周末,且客户所在行业关系,呵呵,不然这压力可更大一些哦。

看看是啥问题呢:

SQL> conn mesusr/hearsonic
ERROR:
ORA-00257: archiver error. Connect internal only, until freed.
SQL> conn /as sysdba
Connected.

普通用户无法登陆,但是sysdba不影响。从错误信息看,应该是归档空间满或者是权限问题。归档路径选择的是use_db_recovery_file_dest,而这个空间存放在ASM中。我们先来看看切换归档可否:

SQL> alter system switch logfile;
alter system switch logfile
*
ERROR at line 1:

接下来看看是不是都在等待归档:

SQL> set line 150
SQL> select * from v$Log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
———- ———- ———- ———- ———- — —————- ————- ————
         3          1       4203  536870912          2 NO  INACTIVE            5361530833 13-JUN-09
         2          1       4202  536870912          2 NO  INACTIVE            5361343485 13-JUN-09
         1          1       4201  536870912          2 NO  INACTIVE            5361101610 13-JUN-09
         4          1       4204  536870912          2 NO  CURRENT             5361566732 13-JUN-09
         7          2       1906  536870912          2 NO  INACTIVE            5361058403 13-JUN-09
         6          2       1909  536870912          2 NO  CURRENT             5361559825 13-JUN-09
         5          2       1908  536870912          2 NO  INACTIVE            5361530696 13-JUN-09
         8          2       1907  536870912          2 NO  INACTIVE            5361343015 13-JUN-09
         9          3       1812  536870912          2 NO  CURRENT             5361530836 13-JUN-09
        10          3       1809  536870912          2 NO  INACTIVE            5361057981 13-JUN-09
        11          3       1810  536870912          2 NO  INACTIVE            5361101473 13-JUN-09

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
———- ———- ———- ———- ———- — —————- ————- ————
        12          3       1811  536870912          2 NO  INACTIVE            5361343567 13-JUN-09
        13          4       1835  536870912          2 YES INACTIVE            5361633655 13-JUN-09
        14          4       1836  536870912          2 YES ACTIVE              5361635245 13-JUN-09
        15          4       1837  536870912          2 NO  CURRENT             5361636287 13-JUN-09
        16          4       1834  536870912          2 YES INACTIVE            5361630420 13-JUN-09

16 rows selected.

接下来看看归档目的的的情况:

SQL> show parameter reco

NAME                                 TYPE        VALUE
———————————— ———– ——————————
control_file_record_keep_time        integer     7
db_recovery_file_dest                string      +DG1
db_recovery_file_dest_size           big integer 120000M
recovery_parallelism                 integer     0
SQL> col name for a20
SQL> select * from v$recovery_file_dest;

NAME                 SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
——————– ———– ———- —————– —————
+DG1                  1.2583E+11 1.2582E+11                 0            3389

看起来似乎满了,那我们进去看看:

[hndb1:oracle:/home/oracle] export ORACLE_SID=+ASM1
[hndb1:oracle:/home/oracle] asmcmd
ASMCMD> cd dg1
ASMCMD> cd hnwx
ASMCMD> ls
ARCHIVELOG/
CONTROLFILE/
DATAFILE/
ONLINELOG/
PARAMETERFILE/
TEMPFILE/
spfilehnwx.ora
ASMCMD> du -H archivelog
      1                   1
ASMCMD>
ASMCMD>

目录里已经被清空了。我们再来看看利用率:

SQL> select * from V_$FLASH_RECOVERY_AREA_USAGE;

FILE_TYPE    PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
———— —————— ————————- —————
CONTROLFILE                 .02                         0               1
ONLINELOG                  6.83                         0              16
ARCHIVELOG                93.15                         0            3399
BACKUPPIECE                   0                         0               0
IMAGECOPY                     0                         0               0
FLASHBACKLOG                  0                         0               0

事实上,已经没那么多归档文件在里面了。这个数据从v$archived_log读取:

SQL>select count(1) from v$archived_log;

COUNT(1)
————
3399

接下来,我们将归档目的的改到本地:

 SQL> alter system set log_archive_dest_1=’location=/archive’;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> conn hs_his/handsome
Connected.
SQL> alter system set log_archive_dest_2=’location=+DG1′;

System altered.

SQL> alter system switch logfile;

System altered.
SQL>/
System altered

改完归档目的的后,归档成功,普通用户登陆正常。

再将归档改回原处(未对原归档地做任何更改),普通用户登陆正常。

但数小时后,系统再报ORA-257错误。

那问题在哪里呢?

这应该是oracle的一个bug了。

处理办法(办法是nico想到的):

  • crosscheck  archivelog
  • delete expired

–EOF—