SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

Data Migration Assistant (DMA) で拡張イベントをインプット情報として活用する

leave a comment

SQL Server のバージョンアップや、クラウド移行 (SQL Database / Managed Instance への移行) を実施する際のアセスメントと移行を行うためのツールとして Data Migration Assistant (DMA) というツールが公開されています。

このツールでは、Data Migration Assistant を使用した SQL Server 移行評価の実行評価するデータベースと拡張イベントトレースの追加 に記載されているように、拡張イベント (xEvent) をインプットとして、アドホッククエリのシンタックスエラーのチェックを行うことができるようになります。

この、拡張イベントを入力としたアドホッククエリのチェックですが、4/7 時点のドキュメントに書いている内容を実施しても拡張イベントを使用した処理が行われていないように見えました。

先週 MicrosoftR Data Migration Assistant v5.1 の公開が行われたようで、本日この内容を確認していたところ、次の記載がありました。
(最新バージョンを使用すると SQL Server 2019 を移行元として使用することもできるようになっています)

sql_batch_completed event for application / xevent trace assessments

拡張イベントを入力として使用する場合、「sql_batch_completed」をイベントとして取得しないといけないようです。

現状のドキュメントは「sql_batch_completed」ではなく「sql_statement_completed」を取得するようになっているのですよね…。

ということで、次のような拡張イベントを使用することで、DMA の入力として活用することができます。

CREATE EVENT SESSION [DatalayerSession] ON SERVER  
ADD EVENT sqlserver.sql_batch_completed( 
    ACTION (sqlserver.sql_text,sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id))
ADD TARGET package0.asynchronous_file_target(SET filename=N'C:\temp\Demos\DataLayerAppassess\DatalayerSession.xel')  
WITH (MAX_MEMORY=2048 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=3 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF)
go

 

SQL Server のバージョンアップを実施した際の互換性については、次のようなドキュメントで確認をすることができます。

SQL Server 2012 でサポートしている互換性レベルでは動作するが、SQL Server 2019 の最新の互換性レベルでは動作しないクエリとしては次のようなものがあります。

-- 互換性レベル 100 で動作しなくなるクエリ
-- MERGE が予約されたキーワードになる
SELECT
	LoginID,
	JobTitle AS MERGE
FROM
	HumanResources.Employee
GO

-- 互換性レベル 120 で動作しなくなるクエリ
-- 再帰 CTE で重複した列名を使用
WITH cte
AS(
	SELECT
		1 as level, C1 AS C2, C2
	FROM(VALUES(1,2),(1,3), (3,1))T1(C1,C2)
	UNION ALL
	SELECT
		level+1, T1.C1, T1.C2
	FROM(VALUES(1,2),(1,3), (3,1))T1(C1,C2)
	INNER JOIN cte
		ON cte.C2 = T1.C2
)
SELECT TOP 10 * from cte
GO

 

このクエリを SQL Server 2012 の互換性レベル 90 で実行して取得した拡張イベントを、DMA の入力として使用してみると、次のようなアセスメント結果を取得することができます。

image

「sql_statement_completed」で拡張イベントを取得した場合は、上記のクエリの実行結果が拡張イベントに含まれていても、Syntax issue は発生しないのですが、「sql_batch_completed」で取得した場合は Syntax issue が確認できていましたので、ドキュメントに記載されているイベントでは、DMA の入力として必要となるイベントが取得できていないように見えました…。

(イベントが異なっているのではというプルリクを出してみましたので、ドキュメントに誤りがあるのであれば、そのうち修正されるかもしれません)

今までの、DMA はデータベース内のオブジェクトの内容を元に互換性のチェックを実施するため、アプリケーションからアドホックに実行されているクエリの互換性チェックを DMA で実施するのは難しかったのですが、拡張イベントを使用することによってチェックができると移行時に機械的に確認できる項目を改善することができます。

Syntax Issue は互換性レベル単位で厳密にチェックしているかは微妙なような気がますが (互換性レベル 90 では問題ないが 100 でエラーとなるクエリの Syntax issue が 90 でも出てしまっているので) 互換性に問題がありそうなクエリをツールベースでチェックできるのはうれしいですね。

Share

Written by Masayuki.Ozawa

4月 7th, 2020 at 11:39 pm

Posted in SQL Server

Tagged with

Leave a Reply