Oracle DatabaseのALERTファイル参照機能を試す（ATP）


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にはアラートファイルは２種類格納されてます。テキスト形式で、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))
...
```