OracleDB에서 아카이브 오류 (ORA-00257)가 발생했을 때의 해결 방법

4604 단어 오라클oracle12c

경위



어느 아침, 평소와 같이 OracleDB를 이용하고 있는 시스템의 개발을 진행하려고 했는데,
다음과 같은 메시지가 나왔다.



과연. 뭔가 모르겠지만 에러가 발생한 것 같다.

조사



오라클의 EnterpriseManager에 액세스하려고했는데, 외형은 다르지만 위와 같은 에러 메세지가 표시되어 로그인조차 할 수 없다.

조사해 보면, 이번 에러는 「아카이브·로그」라고 하는 것이 너무 쌓여 있는 것이 문제다.
사내에서 듣기를 했는데, 누군가 다른 사람이 아카이브·로그의 기입 설정을 무효→ 유효로 변경하고 있었다고 하는 것.

증상의 해소 순서(잠정 대응)



1. teraterm 등으로 root 권한으로 로그인
2. oracle 사용자로 변경
3. 복구 관리자(RMAN) 시작
4. 일정기간(이번에는 7일간) 이상 이전 아카이브 로그 삭제
5. 복구 관리자 종료
6. oracle 사용자로 SQLPlus에 로그인
7. Oracle 인스턴스 시작
8. SQLPlus 종료
9. 리스너 컨트롤 시작
10. 리스너 시작
11. 리스너 컨트롤 종료
12. oracle 사용자로부터 로그아웃
13. teraterm 등을 종료

다음은 모두 실행하는 명령입니다. 처리 결과는 기재되어 있지 않습니다.
$ su - oracle
$ rman
RMAN> DELETE ARCHIVELOG UNTIL TIME 'sysdate - 7';
RMAN> exit
$ sqlplus [User]/[Password] as sysdba
SQL> startup
SQL> exit
$ lsnrctl
LSNRCTL> start
LSNRCTL> exit
$ exit

지속적인 대응



우선 오라클은 사용할 수 있게 되었지만, 이대로라면 어차피 다시 재발하기 때문에, 아카이브 로그를 정기적으로 삭제하는 구조를 넣기로 했다.

참고 : 아카이브 로그 삭제 방법 정리(ORA-00257 대처 방법)

삭제 배치 (배치? 쉘?) 작성



1. oracle 사용자의 홈 디렉토리(이번은 /home/oracle ) 바로 아래에, 이하의 2 파일을 작성한다

del_arclog.rcv
run{
 # 7日以前を削除
 delete noprompt archivelog until time 'sysdate-7';
 # OSから削除された場合、oracle側も削除する
 crosscheck archivelog all;
 delete expired archivelog all;
}

del_arclog.sh
su -l oracle -c "rman target / @del_arclog.rcv log=del_arclog.log append nocatalog"

2. 위 두 파일의 소유자를 oracle 사용자로 변경
3. 위의 두 파일에 소유자의 실행 권한 부여
4. 소유자 및 권한 설정 확인
$ cd /home/oracle
$ chown oracle:oinstall del_arclog.rcv
$ chown oracle:oinstall del_arclog.sh
$ chmod 744 del_arclog.rcv
$ chmod 744 del_arclog.sh
$ ll

▼실행 결과


crontab에 스케줄 등록



1. root 권한으로 teraterm 등에 로그인
2. crontab에 지정된 스케줄로 /home/oracle/del_arclog.sh를 실행하도록 등록
$ crontab -e

0 19 * * * /home/oracle/del_arclog.sh   (毎日19時に実行することとした)

cron의 실행 로그는 이하의 커맨드로 확인할 수 있다.
$ tail -f /var/log/cron

cron 메일 스풀 삭제



초기 상태에서는, cron의 실행 후에 루트 어카운트에 메일 송신하는 처리가 움직인다.
하지만 메일 설정을 하지 않은 경우에는 스풀 폴더에 점점 메일이 모여 가고,
앞으로는 이쪽이 넘쳐 버린다.

대책은 다양하다고 생각하지만, 이번에는 실행 결과를 메일 송신할 필요도 없지만,
메일을 보내지 않는 설정으로 변경하는 것도 조금 불안하기 때문에,
일정 기간마다 스풀의 메일을 삭제하는 처리를 상기와 같이 cron에 등록하기로 했다.
$ crontab -e

0 19 * * * /home/oracle/del_arclog.sh   (←さっきの)
0 5 * * * cat /dev/null > /var/spool/mail/root  (←今回の。毎朝5時にスプールを上書きする)

좋은 웹페이지 즐겨찾기