Oracle Databaseインスタンス上で発生したエラーや障害の情報は、アラートファイルとトレースファイルに出力されます。アラートファイルには発生した事象の概要が、トレースファイルには詳細が出力されます。データベースが稼働するサーバにSSH等で接続できる場合はファイルを直接参照すればよいのですが、クラウド上のマネージド・サービスではOSにログインすることができません。このためOracle Databaseが提供する機能を使ってSQL文でアラートファイルとトレースファイルを参照します。
ADRの情報
Oracle Databaseでは障害情報はADR (Automatic Diagnostic Repository)で管理されます。下記はOracle Cloudが提供するATPに接続してV$DIAG_INFOビューを参照しています。
SQL> SELECT * FROM V$DIAG_INFO;
INST_ID NAME VALUE CON_ID
---------- ------------------------------ --------------------------------------------------------------------------- ----------
2 Diag Enabled TRUE 0
2 ADR Base /u02/app/oracle 0
2 ADR Home /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2 0
2 Diag Trace /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2/trace 0
2 Diag Alert /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2/alert 0
2 Diag Incident /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2/incident 0
2 Diag Cdump /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2/cdump 0
2 Health Monitor /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2/hm 0
2 Default Trace File /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2/trace/epa1pod2_ora_25184.trc 0
2 Active Problem Count 0 0
2 Active Incident Count 0 0
11行が選択されました。
アラートファイル
アラートファイルの内容ををSQL文で取得する方法について記載しています。
アラートファイルの参照
アラートファイルの情報はV$DIAG_ALERT_EXTビューで参照できます。下記の例はATPインスタンスで検索しています。
SQL> SELECT ORIGINATING_TIMESTAMP, MESSAGE_TEXT FROM V$DIAG_ALERT_EXT ORDER BY 1;
...
ORIGINATING_TIMESTAMP MESSAGE_TEXT
---------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
20-08-07 13:02:59.141000000 +00:00 Completed: alter pluggable database application APP$CDB$PDBONLY$ADWC begin upgrade '18.2.5-200702.1' to '18.2.5-200715.1' USE ERROR FUNCTION 'SYS.SQLPATCH_ACCEPTABLE_ERROR'
20-08-07 13:03:17.840000000 +00:00 alter pluggable database application APP$CDB$PDBONLY$ADWC end upgrade
20-08-07 13:03:17.849000000 +00:00 Completed: alter pluggable database application APP$CDB$PDBONLY$ADWC end upgrade
20-08-07 13:03:18.075000000 +00:00 alter pluggable database application APP$CDB$PDBONLY$OLTP begin upgrade '18.2.5-200702.1' to '18.2.5-200715.1' USE ERROR FUNCTION 'SYS.SQLPATCH_ACCEPTABLE_ERROR'
20-08-07 13:03:18.087000000 +00:00 Completed: alter pluggable database application APP$CDB$PDBONLY$OLTP begin upgrade '18.2.5-200702.1' to '18.2.5-200715.1' USE ERROR FUNCTION 'SYS.SQLPATCH_ACCEPTABLE_ERROR'
20-08-07 13:03:18.140000000 +00:00 alter pluggable database application APP$CDB$PDBONLY$OLTP end upgrade
20-08-07 13:03:18.151000000 +00:00 Completed: alter pluggable database application APP$CDB$PDBONLY$OLTP end upgrade
20-08-07 13:03:18.352000000 +00:00 alter pluggable database application APP$CDB$ALL$ADWC begin upgrade '18.2.5-200715.1' to '18.2.5-200728' USE ERROR FUNCTION 'SYS.SQLPATCH_ACCEPTABLE_ERROR'
20-08-07 13:03:18.361000000 +00:00 Completed: alter pluggable database application APP$CDB$ALL$ADWC begin upgrade '18.2.5-200715.1' to '18.2.5-200728' USE ERROR FUNCTION 'SYS.SQLPATCH_ACCEPTABLE_ERROR'
20-08-07 13:03:20.136000000 +00:00 ALTER DATABASE PROPERTY SET AUTOMATIC_TABLESPACE_CALLOUT = 'C##CLOUD$SERVICE.DBMS_AUTO_TBS.GET_SEGMENT_TABLESPACE'
20-08-07 13:03:20.141000000 +00:00 Completed: ALTER DATABASE PROPERTY SET AUTOMATIC_TABLESPACE_CALLOUT = 'C##CLOUD$SERVICE.DBMS_AUTO_TBS.GET_SEGMENT_TABLESPACE'
...
アラートファイルの種類
ADRにはアラートファイルは2種類格納されてます。テキスト形式で、traceディレクトリに格納されている「alert_{DB名}.log」ファイルと、alertディレクトリに格納されている「log.xml」ファイルです。log.xmlファイルは一定サイズ以上になると「log_{数字}.xml」ファイルが作成されます。オンプレミス環境を使って、V$DIAG_ALERT_EXTビューがどちらのファイルを参照しているか確認しました。サーバ・プロセスに対してstraceコマンドを指定し、システムコールをトレースします。
$ strace -p 6179
strace: Process 6179 attached
read(13, "\0\0\1w\6\0\0\0\0\0\3^\10a\200\0\0\0\0\0\0\376\377\377\377\377\377\377\377%\0\0"..., 8208) = 375
getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 7899}, ru_stime={0, 13823}, ...}) = 0
write(7, "Wed Aug 12 20:42:53 2020 +09:00\n", 32) = 32
write(7, "LENGTH : '286'", 14) = 14
write(7, "\n", 1) = 1
write(7, "ACTION :[37] 'SELECT COUNT(*) FR"..., 285) = 285
write(7, "\n", 1) = 1
getrusage(0x1 /* RUSAGE_??? */, {ru_utime={0, 8905}, ru_stime={0, 13852}, ...}) = 0
mmap(0x7f19cee82000, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f19cee82000
mmap(0x7f19cee92000, 65536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7f19cee92000
times({tms_utime=0, tms_stime=1, tms_cutime=0, tms_cstime=0}) = 442200221
lstat("/u01/app/oracle/diag/rdbms/o19a/O19A/alert/log.xml", {st_mode=S_IFREG|0640, st_size=1259727, ...}) = 0
stat("/u01/app/oracle/diag/rdbms/o19a/O19A/alert/log.xml", {st_mode=S_IFREG|0640, st_size=1259727, ...}) = 0
geteuid() = 1001
...
lstat("/u01/app/oracle/diag/rdbms/o19a/O19A/alert/log_7.xml", {st_mode=S_IFREG|0640, st_size=10485844, ...}) = 0
stat("/u01/app/oracle/diag/rdbms/o19a/O19A/alert/log_7.xml", {st_mode=S_IFREG|0640, st_size=10485844, ...}) = 0
geteuid() = 1001
open("/u01/app/oracle/diag/rdbms/o19a/O19A/alert/log_7.xml", O_RDONLY) = 11
...
上記のようにXML形式のファイルを参照していることがわかります。複数ファイルに分割されている場合も、すべてのファイルを参照しています。
トレースファイルの参照
トレースファイルの内容はV$DIAG_TRACE_FILEビューと、V$DIAG_TRACE_FILE_CONTENTSビューから参照できます。
トレースファイルのリスト
トレースファイルの一覧を取得できるビューがV$DIAG_TRACE_FILEです。このビューにはCON_ID列がありますが、ATPでは接続したPDBの情報だけが取得できます。
SQL> SELECT TRACE_FILENAME, CHANGE_TIME FROM V$DIAG_TRACE_FILE ORDER BY 2;
TRACE_FILENAME CHANGE_TIME
-------------------------------------------------------------------- -----------------------------
epa1pod2_mz00_215291.trc 20-08-13 01:39:57.000 +00:00
epa1pod2_mz00_290214.trc 20-08-13 01:51:55.000 +00:00
epa1pod2_mz00_367205.trc 20-08-13 02:05:44.000 +00:00
epa1pod2_mz00_45256.trc 20-08-13 03:24:58.000 +00:00
epa1pod2_mz00_263771.trc 20-08-13 04:03:06.000 +00:00
epa1pod2_mz00_278930.trc 20-08-13 04:06:54.000 +00:00
epa1pod2_mz00_349218.trc 20-08-13 04:18:57.000 +00:00
epa1pod2_w017_207029.trc 20-08-13 04:23:47.000 +00:00
epa1pod2_mz00_59563.trc 20-08-13 04:36:55.000 +00:00
epa1pod2_mz00_106559.trc 20-08-13 04:45:45.000 +00:00
epa1pod2_mz00_143273.trc 20-08-13 04:51:54.000 +00:00
...
トレースファイルの内容
トレースファイルの内容はV$DIAG_TRACE_FILE_CONTENTSビューで確認できます。
SQL> SELECT PAYLOAD FROM V$DIAG_TRACE_FILE_CONTENTS WHERE TRACE_FILENAME='epa1pod2_ora_75705.trc';
PAYLOAD
---------------------------------------------------------------------------------------------------
Trace file /u02/app/oracle/diag/rdbms/epa1pod/epa1pod2/trace/epa1pod2_ora_75705.trc
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.4.0.0.0
Build label: RDBMS_PT.DBCLOUD18_LINUX.X64_200707
ORACLE_HOME: /u02/app/oracle/product/18.1.0.0/dbhome_1
System name: Linux
Node name: xxxxxxxx
Release: 4.1.12-124.30.1.el7uek.x86_64
Version: #2 SMP Thu Aug 8 01:38:50 GMT 2019
Machine: x86_64
VM name: Xen Version: 4.4 (HVM)
Storage: Exadata
Instance name: epa1pod2
Redo thread mounted by this instance: 2
Oracle process number: 1130
*** 2020-08-13T01:24:51.805878+00:00 (BOOFMAINBG1VVMN_DB202003021003(667))
...