一、背景
今天接到開發電話,說Oracle遠程連不上了,可能是archivelog滿了。我登陸Oracle試了下,提示
ORA-00257: archiver error. Connect internal only, until freed。
考慮到前些天已經擴大了硬盤空間,應該是archive log大小已經達到Oracle中對archive log大小的限制。而DBA已經放假了。因此決定清除下無用的日誌同時修改下對日誌大小的限制。
由於我對Oracle並不熟悉,因此在完成後將整個過程記錄下來,便於以後查閱。
二、環境
RHEL 6.3 + Oracle 11gR2
三、過程
由於archive log空間滿導致了不能遠程登錄,因此ssh到服務器後,使用sqlplus sys/pass as sysdba登陸oracle。
首先看archiv log所在位置
SQL> show parameter log_archive_dest;
會看到類似下面的結果
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest string log_archive_dest_1 string log_archive_dest_10 string
這時候如果value是空的,可以嘗試
SQL> archive log list;
然後我查看了下使用情況
SQL> select * from V$FLASH_RECOVERY_AREA_USAGE;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES ------------ ------------------ ------------------------- --------------- CONTROLFILE .13 0 1 ONLINELOG 2.93 0 3 ARCHIVELOG 99.72 0 122 BACKUPPIECE 0 0 0 IMAGECOPY 0 0 0 FLASHBACKLOG 0 0 0
顯然,已經使用了超過99%的日誌空間
這時候,我直接進入flash_recovery_are的目錄
cd /orace/app/oracle/flash_recovery_area/ORCL/archivelog
然後我決定先備份下相關文件
tar Jcvf arlog.20140125.tar.xz *
第一次操作時發現會提示文件在壓縮過程中變化了。纔想起來我沒有停止Oracle服務。因此回到sqlplus先將Oracle停下來
SQL> shutdown immediate;
這個過程等待了好久才完成。。
這時候重新打包。打包過程持續了差不多兩個多小時。。。
完成後,先把壓縮包備份到其他目錄並且scp到了一臺備份文件用的服務器。然後很暴力地刪除了這個文件夾下2013年的全部目錄
rm -rf 2013_*
完成了。將數據庫啓動起來
sqlplus sys/pass as sysdba
SQL> startup
我第一次startup失敗了,提示ORA-03113: end-of-file on communication channel。我又重新執行了下
SQL> startup mount
成功。用rman修複相關信息
rman target sys/pass RMAN> delete expired archivelog all;
完成後,回到sqlplus修改archivelog大小
SQL> alter system set db_recovery_file_dest_size=5G scope=spfile;
修改完不會立即生效。需要重啓Oracle
SQL> shutdown immediate SQL> startup
這時候查看大小
SQL> show parameter db_recover NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ ... db_recovery_file_dest_size big integer 5G
整個過程就完成了。