2022年4月28日木曜日

Autonomous Databaseで動作しているAPEXアプリのSQLトレースを取得する

以前にも同じテーマで記事を書いているのですが、 SQLトレースの保存先に事前承認リクエストではなくクリデンシャルを使う、APEXのアプリケーションでSQLトレースを有効にするために、セキュリティの設定ではなくプロセスを作成するようしました。

以下、SQLトレースを取得する手順を紹介します。


認証トークンの生成


手順を簡素にするため、グループAdministratorsに含まれているユーザーで認証トークンを生成します。できれば、ユーザー、グループ、ポリシーの作成を検討しましょう。

OCIコンソールよりアイデンティティユーザーから、ユーザーの詳細を開きます。リソースより認証トークンを選択します。

トークンの生成を実行します。

説明を入力し、トークンの生成を実行します。

トークンが生成されるので、コピーします。この値はAutonomous Databaseにクリデンシャルを作成する際に使用します。

閉じるをクリックします。


以上で、認証トークンの生成はできました。


オブジェクト・ストレージのバケットの作成

OCIコンソールよりオブジェクト・ストレージバケットを開きます。バケットの作成を実行します。


バケット名を指定して、作成を実行します。今回はバケット名をsql_traceとしています。


バケットsql_traceが作成されます。作成されたバケットを開きます。


作成したバケットのパスを確認します。小さなファイルをバケットにアップロードして、オブジェクト詳細の実行を行います。


URLパス(URI)として表示されているパスの、ファイルの名前を除いた/o/までをコピーします。コピーしたら取消をクリックして、ドロワーを閉じます。


以上で、SQLトレースの出力先の準備はできました。


Autonomous Databaseの設定



管理者ユーザーADMINにてデータベース・アクションに接続し、SQLを開きます。

以下のコマンドを実行しクリデンシャルDEF_CRED_NAMEを作成します。

BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'DEF_CRED_NAME',
username => 'ユーザー名',
password => '生成した認証トークン'
);
END;
/


SQLトレースの出力先を、データベース・プロパティDEFAULT_LOGGING_BUCKETとして設定します。

SET DEFINE OFF;
ALTER DATABASE PROPERTY SET
DEFAULT_LOGGING_BUCKET = 'https://objectstorage.リージョン.oraclecloud.com/n/ネームスペース/b/sql_trace/o/';


デフォルトで使用するクリデンシャルとして、先ほど作成したDEF_CRED_NAMEを設定します。スキーマ名のADMINをつける必要があります。

ALTER DATABASE PROPERTY SET DEFAULT_CREDENTIAL = 'ADMIN.DEF_CRED_NAME';


APEXのワークスペース・スキーマでSQLトレースを有効にできるよう、ALTER SESSIONを実行する権限を与えます。ワークスペース・スキーマがAPEXDEVの例です。

grant alter session to apexdev;


Autonomous Databaseの設定は以上で完了です。


APEXアプリでのSQLトレースの有効化



APEXアプリケーションでSQLトレースを取る処理の前に、以下のコードを実行するプロセスを作成します。

execute immediate 'alter session set sql_trace = true';

ページのレンダリング全体のSQLトレースを取得する場合は、レンダリング前にプロセスを配置します。


データベースのセッションは別のページ処理で再利用されるため、かならずページ処理が終了する前に、SQLトレースを停止します。

execute immediate 'alter session set sql_trace = false';

レンダリング前にSQLトレースを開始した場合は、レンダリング後にSQLトレースを停止します。


セッションのClient IdentifierModuleの情報は、APEXによって設定されているので、設定しない方がよいでしょう。

変更したAPEXのアプリケーションを実行すると、SQLトレースがオブジェクト・ストレージに出力されます。サーバー側の条件などを組み合わせると、より効果的にSQLトレースが取得できると思います。


出力されたSQLトレースの確認



SQLトレースの出力先として指定したバケットの内容を確認します。

サインインしたユーザー、セッションID、ワークスペース、アプリケーションIDやページ番号で分類されたフォルダの下に、SQLトレースが出力されています。


今回の記事は以上です。

Oracle APEXのアプリケーション開発の参考になれば幸いです。