Public preview: Extended Events for Azure SQL Database https://t.co/ogYHztmiPM ムッシュ先生、出番です! https://t.co/fKPgV8K9E0 #jazug #azurejp
— こすもす.えび (@kosmosebi) October 12, 2015
で知ったのですが、SQL Database で拡張イベントがサポートされました。
Public preview: Extended Events for Azure SQL Database
Extended events in SQL Database
永続化ファイルとしては、Azure ストレージを使用できるようですので、情報のロギングも可能となっています。
現状、SQL Database では、SQL Server Profiler を使用することはできませんが、拡張イベントを使用することでクエリを取得することができますので、軽くまとめてみたいと思います。
今のところ SSMS の GUI は使えないようなのでクエリベースで拡張イベントを管理する必要があります。
※ SQL Server 2016 CTP 2.4 の SSMS であれば GUI を使うことはできました。ただし削除やプロパティの表示ができなかったので、今のところは、クエリベースで操作した方がよさそうです。
SQL Server 2012 / 2014 の GUI の設定をスクリプト化すれば基本構文は流用はできますので、それほど難易度は高くないかと。
最初に、以下のようなクエリで、クエリの完了を取得する拡張イベントを作成します。
IF EXISTS(SELECT * from sys.database_event_sessions WHERE name = 'eventsession_gm_azuresqldb51') DROP EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE; CREATE EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE ADD EVENT sqlserver.sql_batch_starting (ACTION (sqlserver.sql_text)) ADD TARGET package0.ring_buffer (SET max_memory = 500) -- Units of KB GO
上記のクエリではリングバッファーに出力をしていますので、ファイルとしては出力されておらず、情報はメモリ上に一時的に格納されています。
次に以下のクエリを実行して作成した拡張イベントを開始します。
ALTER EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE STATE = START; GO
これで、SQL Database に対して実行されたクエリが拡張イベントに取得されますので、冒頭で紹介したドキュメントに記載されている以下のクエリを実行します。
SELECT se.name AS [session-name], ev.event_name, ac.action_name, st.target_name, se.session_source, st.target_data, CAST(st.target_data AS XML) AS [target_data_XML] FROM sys.dm_xe_database_session_event_actions AS ac INNER JOIN sys.dm_xe_database_session_events AS ev ON ev.event_name = ac.event_name AND ev.event_session_address = ac.event_session_address INNER JOIN sys.dm_xe_database_session_object_columns AS oc ON oc.event_session_address = ac.event_session_address INNER JOIN sys.dm_xe_database_session_targets AS st ON st.event_session_address = ac.event_session_address INNER JOIN sys.dm_xe_database_sessions AS se ON ac.event_session_address = se.address WHERE oc.column_name = 'occurrence_number' AND se.name = 'eventsession_gm_azuresqldb51' AND ac.action_name = 'sql_text' ORDER BY se.name, ev.event_name, ac.action_name, st.target_name, se.session_source; GO
実行結果の XML 部分がリンクになっていますので、クリックします。
そうすると、拡張イベントを開始してから実行されたクエリで、リングバッファーにログが取得されているものを確認することができます。
確認が終わったら以下のクエリで拡張イベントを停止します。
ALTER EVENT SESSION eventsession_gm_azuresqldb51 ON DATABASE STATE = STOP; GO
リングバッファーの場合、取得されたデータはメモリ上のデータとなりますので、停止をするとそれまでに取得されていた情報は破棄される形になります。
後でもう一度確認したい場合には Azure ストレージを使用した設定にする必要があるかと。
どのようなイベントが使用できるかは後程調べてみたいと思います。
[…] 拡張イベントを使用した SQL Database の簡易 SQL Server Profiler […]
Azure Update (2015.10.15) | ブチザッキ
15 10月 15 at 07:43