”ORA-03113 end-of-file on communication channel”の対処法について記述します。
(0) 目次
(1) 解析
(2) 原因
(3) 対策
(4) 解説
(4-1) アラート・ログ
(4-2) トレースファイル
(4-3) リスナー・ログ
(4-4) DDLログファイル
(1) 解析
以下のログファイルについて内容を確認します。
cd /u01/app/oracle/diag/rdbms/orcl/orcl/trace tail -100 alert_orcl.log
※ログの出力結果
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc1_4650.trc: ORA-19815: WARNING: db_recovery_file_dest_size of 2713714688 bytes is 100.00% used, and has 0 remaining bytes available. ************************************************************************ You have following choices to free up space from recovery area: 1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard, then consider changing RMAN ARCHIVELOG DELETION POLICY. 2. Back up files to tertiary device such as tape using RMAN BACKUP RECOVERY AREA command. 3. Add disk space and increase db_recovery_file_dest_size parameter to reflect the new space. 4. Delete unnecessary files using RMAN DELETE command. If an operating system command was used to delete files, then use RMAN CROSSCHECK and DELETE EXPIRED commands. Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_4639.trc: ORA-19815: WARNING: db_recovery_file_dest_size of 2713714688 bytes is 100.00% used, and has 0 remaining bytes available. ************************************************************************ ************************************************************************ You have following choices to free up space from recovery area: Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc1_4650.trc: ORA-19809: limit exceeded for recovery files ORA-19804: cannot reclaim 39296512 bytes disk space from 2713714688 limit 1. Consider changing RMAN RETENTION POLICY. If you are using Data Guard, ARC1: Error 19809 Creating archive log file to '/home/oracle/flash/ORCL/archivelog/2017_10_15/o1_mf_1_137_%u_.arc' then consider changing RMAN ARCHIVELOG DELETION POLICY. 2. Back up files to tertiary device such as tape using RMAN BACKUP RECOVERY AREA command. 3. Add disk space and increase db_recovery_file_dest_size parameter to reflect the new space. 4. Delete unnecessary files using RMAN DELETE command. If an operating system command was used to delete files, then use RMAN CROSSCHECK and DELETE EXPIRED commands. ************************************************************************ Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_4639.trc: ORA-19809: limit exceeded for recovery files ORA-19804: cannot reclaim 39489536 bytes disk space from 2713714688 limit ARCH: Error 19809 Creating archive log file to '/home/oracle/flash/ORCL/archivelog/2017_10_15/o1_mf_1_136_%u_.arc' ARCH: Archival stopped, error occurred. Will continue retrying ORACLE Instance orcl - Archival Error ORA-16038: log 2 sequence# 137 cannot be archived ORA-19809: limit exceeded for recovery files ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/orcl/redo02.log' Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_arc1_4650.trc: ORA-16038: log 2 sequence# 137 cannot be archived ORA-19809: limit exceeded for recovery files ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/orcl/redo02.log' Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_4639.trc: ORA-16038: log 1 sequence# 136 cannot be archived ORA-19809: limit exceeded for recovery files ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log' USER (ospid: 4639): terminating the instance due to error 16038 Instance terminated by USER, pid = 4639
(2) 原因
どうやら「フラッシュリカバリ領域」が不足している事が原因でエラーが発生している様です。
ORA-19809: limit exceeded for recovery files
(3) 対策
方針として、まずは『3-1.一時的に領域を拡張してDBをOPEN状態にする』、 OPENしたら次に『3-2.「不要なログファイルを削除」or「NOARCHIVELOGモードへの変更」』のいずれかを検討
という対応をします(今回の記事は(3-1)まで実施)。
(3-1)一時的に領域を拡張してDBをOPEN状態にする
以下の手順でSQL*Plusを起動して一時的にフラッシュリカバリ領域を拡張し、DBをOPEN状態にします。
//sql*Plusを起動 export ORACLE_BASE=/u01/app/oracle/ export ORACLE_HOME=/u01/app/oracle/product/11.2.0/dbhome_1 export ORACLE_SID=orcl cd /u01/app/oracle/product/11.2.0/dbhome_1/bin/ ./sqlplus /nolog //sql*Plusを起動完了後 //インスタンスに接続 CONN SYSTEM/XXXXX AS SYSDBA //データベースをマウント状態にする STARTUP MOUNT //フラッシュリカバリ領域の容量を増量 ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=10G SCOPE=BOTH SID='orcl' //データベースをオープンする ALTER DATABASE OPEN;
(4) 解説
Oracleデータベースの代表的なログについて記載します。
(4-1) アラート・ログ
データベース個別のイベントとダンプファイル情報などを保持し、稼働する間の動作の状態が逐次記録されています。障害が発生した場合に最初に確認するログが「アラート・ログ」になるケースが多く、「アラート・ログ」で障害が確認出来ない場合、トレースログも併せて確認を行うのがベストプラクティスの様です。
●格納場所
$ORACLE_BASE/diag/rdbms/[DB名]/[SID]/trace
私の環境では「$ORACLE_BASE」=/u01/app/oracle、[DB名]=orcle、[SID]=orcleのため下記に存在していました。
/u01/app/oracle/diag/rdbms/orcl/orcl/trace
●ログのサンプル
[oracle@tk2-262-40837 trace]$ head -2000 alert_orcl.log | grep "ORA-" ORA-1109 signalled during: ALTER DATABASE CLOSE NORMAL... ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log' ORA-27037: unable to obtain file status ORA-00313: open failed for members of log group 1 of thread 1 ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log' ORA-27037: unable to obtain file status ORA-00313: open failed for members of log group 2 of thread 1 ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/orcl/redo02.log' ORA-27037: unable to obtain file status ORA-00313: open failed for members of log group 2 of thread 1 ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/orcl/redo02.log' ORA-27037: unable to obtain file status ORA-00313: open failed for members of log group 3 of thread 1 ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log' ORA-27037: unable to obtain file status ORA-00313: open failed for members of log group 3 of thread 1 ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/orcl/redo03.log' ORA-27037: unable to obtain file status ORA-19815: WARNING: db_recovery_file_dest_size of 2713714688 bytes is 85.88% used, and has 383157248 remaining bytes available.
(4-2) トレースファイル
トレースファイルとは「エラーが発生した際の情報やメモリダンプの事を指しています。
①Oracleのバックグラウンドプロセスでエラーや異常終了が発生した際にプロセスが書き出すファイルで、障害の原因調査に利用される情報が記載されます。ファイルの名前にはそのファイルを生成したプロセスの名前が含まれており、拡張子は「.trc」で記載されます。
②クリティカルエラーに対してはインシデント番号を採番し、データをADR(Automatic Diagnostic Repository)に格納します。
③ディレクトリ上の出力場所は初期化パラメーターの「USER_DUMP_DEST」と「BACKGROUND_DUMP_DEST」から確認ができます。
●出力場所の確認手順
①SQL*Plusにログイン
②USER_DUMP_DESTの現在の値の確認
SQL> SHOW PARAMETER USER_DUMP_DEST
③BACKGROUND_DUMP_DESTの現在の値の確認
SQL> SHOW PARAMETER BACKGROUND_DUMP_DEST
上記階層を「ls」コマンドで照会した例を示します。
(4-3) リスナー・ログ
リスナーへの接続要求毎に1行出力され、タイムスタンプと共にSID・ホスト名・プロトコル・接続試行結果・リターンコード(0=接続成功、失敗時はエラー)などの情報が出力されています。格納場所の調べ方として「リスナー制御ユーティリティ(lsnrctl)」の「status」コマンドで確認する方法があります。
●格納場所
$ORACLE_BASE/diag/tnslsnr/[ホスト名]/listener/trace
私の環境では「$ORACLE_BASE」=/u01/app/oracleのため下記に存在していました。
/u01/app/oracle/diag/tnslsnr/[ホスト名]/listener/trace
●ログのサンプル
09-JUN-2017 03:50:14 * (CONNECT_DATA=(SID=orcl)(CID=(PROGRAM=perl)(HOST=tk2-262-40837.vs.sakura.ne.jp)(USER=oracle))) * (ADDRESS=(PROTOCOL=tcp)(HOST=XXX.XXX.XXX.XXX)(PORT=45005)) * establish * orcl * 0
(4-4) DDLログファイル
実行されたDDL文(CREATE・DROP・ALTERとTRUNCATEも一部)の一部情報が書き込まれるログファイルです。ENABLE_DDL_LOGGING初期化パラメーターがTRUEに設定されている場合にのみログが作成されます。このパラメーターの変更は以下の手順で実施します。
●出力パラメタ変更手順
①SQL*Plusにログイン
②ENABLE_DDL_LOGGINGの現在の値の確認
SQL> SHOW PARAMETER ENABLE_DDL_LOGGING
③ENABLE_DDL_LOGGINGの値の更新
上記②の結果がFALSEだった場合TRUEに更新します。
SQL> ALTER SYSTEM SET ENABLE_DDL_LOGGING = TRUE SCOPE = BOTH;
上記の文で「SCOPE = BOTH」は変更の適用を起動中インスタンスとSPFILEの両方に行う事を意味します。 各種の診断結果ファイルの場所は「V$DIAG_INFO」ビューからも確認が出来ます。