RDS for Oracleで内部エラー(ORA-600, ORA-7445)が発生した時にやっていただきたいこと

RDS for Oracleにおいて内部エラー(ORA-600やORA-7445)が発生した場合のインシデントファイル取得方法
2021.02.28

困っていた内容

Oracle Databaseをさわったことがある方にとって、内部エラー(ORA-600やORA-7445)はよく知られたエラー・コードの一つだと思います。

オンプレの運用であれば、対象のインシデントファイルよりコールスタックやシグナルを受けた関数を特定し、MOS(My Oracle Support)より該当していそうな事象を確認したりすると思います。しかし、RDS for Oracleでは、DB作成時に「ログのエクスポート」でアラートログ/トレースログにチェックを入れたとしても、マネジメントコンソールからインシデントファイルをダウンロードすることはできません。CloudWatch Logsにもエクスポートされません。(2021年2月時点) ADRの構成上、インシデントファイルは別ディレクトリに生成されるためでしょうか?

これはオンプレで運用されていた方からすると衝撃的だと思いますが、仕様であれば仕方ありません。そこで、本記事ではインシデントファイルのダウンロード方法を含め、内部エラー発生時にお客様側でやっていただきたい内容をまとめてみます。

何をやっていただきたいか?

1. ログ一式の取得

何はともあれ、ログの取得をお願いします。以下ドキュメント通りに取得いただければ問題ありません。ドキュメントでは、problem_idincident_idから取得する方法が記載されていますが、いずれの方法でも構いません。

Oracle DB インスタンスの一般的な DBA 診断タスク - Amazon Relational Database Service

今回は、例として手元の環境で発生していたORA-800(※)を対象にproblem_id指定でインシデントファイルを取得してみたいと思います。

※: 内部エラーを無理やり引き起こすことができませんでした。ユーザー定義例外を使用することで、内部エラーを無理やり起こすことは可能ですが、この方法ではトレース/インシデントファイルは生成されません。

SQL> var task_id varchar2(80);
SQL> exec :task_id := rdsadmin.rdsadmin_adrci_util.list_adrci_problems;

PL/SQL procedure successfully completed.

SQL> select * from table(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||:task_id||'.log'));

TEXT
----------------------------------------------------------------------------------------------------------------------------------------------
2021-02-28 05:34:26.073 UTC [INFO ] Listing ADRCI problems.
2021-02-28 05:34:26.634 UTC [INFO ]
ADR Home = /rdsdbdata/log/diag/rdbms/db3_a/DB3:
*************************************************************************
PROBLEM_ID PROBLEM_KEY LAST_INCIDENT LASTINC_TIME
-------------------- ----------------------------------------------------------- -------------------- ----------------------------------------
1 ORA 800 4532 2021-02-28 05:08:32.299000 +00:00
1 row fetched

2021-02-28 05:34:26.634 UTC [INFO ] The ADRCI problems were successfully listed.
2021-02-28 05:34:26.635 UTC [INFO ] The task finished successfully.

12 rows selected.

SQL> exec :task_id := rdsadmin.rdsadmin_adrci_util.create_adrci_package(problem_id=>1);

PL/SQL procedure successfully completed.

SQL> select * from table(rdsadmin.rds_file_util.read_text_file('BDUMP', 'dbtask-'||:task_id||'.log'));

TEXT
-----------------------------------------------------------------------------------------------------------------------------------
2021-02-28 05:35:24.224 UTC [INFO ] The ADRCI package is being created.
2021-02-28 05:35:45.215 UTC [INFO ] Generated package 1 in file /rdsdbdata/log/trace/ORA800_20210228053524_COM_1.zip, mode complete
2021-02-28 05:35:45.215 UTC [INFO ] The ADRCI package was successfully created.★↑インシデントパッケージがZipファイルとして確認できます
2021-02-28 05:35:45.215 UTC [INFO ] The task finished successfully.

create_adrci_packageを実行した段階でZipファイルが生成されるため、マネジメントコンソールからダウンロード可能となります。

最後に、解凍したインシデントパッケージの中身を確認してみます。diagディレクトリ配下にインシデントファイルやトレースファイルが確認できます。

$ ~/tmp
% ll
合計 1472
-rwxr-xr-x 1 nzw nzw 988869 2月 28 14:58 ORA800_20210228053524_COM_1.zip
drwxr-xr-x 1 nzw nzw 4096 2月 28 14:58 diag
-rw-r----- 1 nzw nzw 547 2月 28 14:35 metadata.xml
$ ~/tmp
% tree diag
diag
└── rdbms
└── db3_a
└── DB3
├── alert
│   └── log.xml
├── incident
│   ├── incdir_1538
│   │   ├── DB3_vktm_5926_i1538.trc★
│   │   ├── DB3_vktm_5926_i1538.trm
│   │   └── incident_sig.xml
│   ├── incdir_3035
│   │   ├── DB3_vktm_6172_i3035.trc★
│   │   ├── DB3_vktm_6172_i3035.trm
│   │   └── incident_sig.xml
│   ├── incdir_41
│   │   ├── DB3_vktm_5622_i41.trc★
│   │   ├── DB3_vktm_5622_i41.trm
│   │   └── incident_sig.xml
│   └── incdir_4532
│   ├── DB3_vktm_7316_i4532.trc★
│   ├── DB3_vktm_7316_i4532.trm
│   └── incident_sig.xml
├── incpkg
│   └── pkg_1
│   └── seq_1
│   ├── config.xml
│   ├── export
│   │   ├── DDE_USER_ACTION.dmp
│   │   ├── DDE_USER_ACTION_DEF.dmp
│   │   ├── DDE_USER_ACTION_PARAMETER.dmp
│   │   ├── DDE_USER_ACTION_PARAMETER_DEF.dmp
│   │   ├── DDE_USER_INCIDENT_ACTION_MAP.dmp
│   │   ├── DDE_USER_INCIDENT_TYPE.dmp
│   │   ├── EM_USER_ACTIVITY.dmp
│   │   ├── HM_RUN.dmp
│   │   ├── INCCKEY.dmp
│   │   ├── INCIDENT.dmp
│   │   ├── INCIDENT_FILE.dmp
│   │   ├── IPS_CONFIGURATION.dmp
│   │   ├── IPS_FILE_COPY_LOG.dmp
│   │   ├── IPS_FILE_METADATA.dmp
│   │   ├── IPS_PACKAGE.dmp
│   │   ├── IPS_PACKAGE_FILE.dmp
│   │   ├── IPS_PACKAGE_HISTORY.dmp
│   │   ├── IPS_PACKAGE_INCIDENT.dmp
│   │   └── PROBLEM.dmp
│   ├── manifest_1_1.html
│   ├── manifest_1_1.txt
│   ├── manifest_1_1.xml
│   ├── metadata.xml
│   └── opatch
│   ├── opatch.log
│   └── opatch.xml
├── log
│   └── debug
│   └── log.xml
└── trace
├── DB3_aqpc_6493.trc
├── DB3_ckpt_5669.trc
├── DB3_ckpt_5972.trc
:

2. ライセンスモデルの確認

お客様のライセンスモデルによって、サポート体制が異なります。

  • bring-your-own-license(BYOL):Oracle社へお問い合わせください。(RDS固有の問題だった場合、AWSへの問い合わせになる場合もございます)
  • License Included:弊社へお問い合わせください。状況によっては、AWSへのエスカレーションとなります。

詳細は以下の様に定められていますので、併せてご確認ください。

よくある質問 - Amazon RDS for Oracle | AWS

Q: Amazon RDS for Oracle のサポート体制どのようになっていますか?

・BYOL: このモデルでは、アクティブな Oracle サポートアカウントを継続してご使用いただけます。Oracle データベースの特定のサービスリクエストに関しては、直接 Oracle にご連絡ください。アクティブな AWS サポートのアカウントをお持ちの場合、Amazon RDS 固有の問題については、AWS サポートにご連絡ください。アマゾン ウェブ サービスと Oracle は、両方の組織からの援助が必要な場合のために、マルチベンダーサポートプロセスを用意しています。

・ライセンス込み: このモデルでは、アクティブな AWS サポートのアカウントをお持ちの場合、Amazon RDS と Oracle データベースどちらの場合も、特定のサービス要望を AWS サポートにお問い合わせいただく必要があります。

3. サポートへの提供

項番2でライセンスモデルが「License Included」だったお客様は、チケット起票時に以下情報をいただけるとスムーズな調査が可能となります。是非とも、チケット起票前に一度ご確認ください。

  1. 事象発生時間
  2. 事象の再現性や過去にも発生していないか
  3. 事象発生時間帯やその前に特別な作業(設定変更や処理)をしていないか
  4. DBのAWSリソース名(ARN)
  5. 項番1で取得したインシデントパッケージのZipファイル名か、Zipファイルそのもの

本記事によって、少しでも未解決の内部エラーが減れば幸いです。

以上です。

参考資料