検証用に Windows Server 2019 の Hyper-V 上に Windows Server 2012 の仮想マシンを構築しようとして小出しにはまったのでメモを。
Windows Server 2012 については、投稿を書いている時点では 評価版 が提供されていますので、 Evaluation Edition で検証可能です。
SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿
検証用に Windows Server 2019 の Hyper-V 上に Windows Server 2012 の仮想マシンを構築しようとして小出しにはまったのでメモを。
Windows Server 2012 については、投稿を書いている時点では 評価版 が提供されていますので、 Evaluation Edition で検証可能です。
System.Data.SqlClient のイベントトレースについては BID (Built-In Diagnostics) トレースで実装されていたため、BID トレースの設定を有効化する必要があったかと思います。
BID トレースについては次のドキュメントで解説が行われています。
最新の SQL Server のデータプロバイダーである、Microsoft.Data.SqlClient では、イベントトレースの取得方法が BID から、EventSoure からのイベントの取得に変わっているようです。
有効化の方法については、SqlClient でのイベントのトレースの有効化 で記載されていますが、C# であれば、ドキュメントに記載されている方法でトレースを取得することができます。
PowerShell (7.0.2) で Microsoft.Data.SqlClient 2.0 を使用する の Windows PowerShell についての記述を追加していて、PowerShell で Microsoft.Data.SqlClient を実行した場合にもトレースが取得できるのかが気になったので試してみました。
今回、コネクションプールの調査でイベントトレースを使用していたのですが、System.Data と Microsoft.Data のイベントトレースの出力の違いについては、次のソースを確認してみても良いのではないでしょうか。
普段は SQL Server を使用しているのですが、OSS の DB についても学習をする必要が出てきました。
私の場合、SQL Server を使用する際には開発ではなく管理側となり「SQL Server の各種情報を取得し分析する」ことが多いです。
その中で「OSS DB では通常、SQL Server で確認しているこの情報はどのように取得するのか?」という調査をすることになるのですが、「取り掛かりとしてどこを見ればよいのか」の勘所がわからなくて四苦八苦しています。
そこで、基本的なメトリクスを取得するためにはどのような情報を取得すればよいのかを少し調べてみました。
さらに踏み込んで情報取得について検討を行う必要があるとは思いますが、私が情報を確認しようとした場合には、これらの情報を足掛かりすると対応ができそうな感じでした。
Windows Server 2016 以降の環境では、DNN (Distributed Network Name : 分散ネットワークネーム) というクラスターリソースが追加されました。
この DNN のクラスターリソースは、SQL Server 2019 で SQL Server on Azure VM の高可用性環境を構築する場合にも活用をすることができるようになっています。
Windows Server 2019 の Azure VM で WSFC を構築した場合、CNO (Cluster Name Object) が従来の VNN (Virtual Network Name : VNN) ではなく、DNN で自動的に作成が行われたりもしますが、DNN についてきちんと情報を調べたことが無かったので、本投稿で情報をまとめておきたいと思います。
本ブログでも DNN を使用した SQL Server on Azure VM の高可用性環境には触れてきましたが、きちんと情報を調べるまで、雰囲気でしか理解できていませんでした…。
2021/4 の関連情報です。
5 月に Build 2021 がありますので、来月はボリュームが多いかもしれませんね。
PowerShell は 7.0 以降で、Foreach-Object で Parallel パラメーターが使用できるようになりました。
従来までは、複数スレッドで処理をする場合は、Windows PowerShell ワークフロー / ジョブ / Runspace などを使用するケースがありました。(Windows PowerShell ワークフローは 5.1 までしか使用できないので、現時点で利用することはほとんどない気もしますが)
PowerShell 7.0 以降では、Foreach-Object の Parallel パラメーターを使用することで複数スレッドの処理をシンプルに記述することができるようになっています。
$SampleText = "PowerShell Foreach-Object Parallel"
Clear-Host
Measure-Command {
1..50 | Foreach-Object {
$text = $SampleText
Write-Host ("{0} : {1}" -f $text, $_)
}
}
Measure-Command {
1..50 | Foreach-Object -ThrottleLimit 5 -Parallel {
$text = $using:SampleText
Write-Host ("{0} : {1}" -f $text, $_)
}
}
PowerShell ForEach-Object Parallel Feature には次のように記載されています。
However, there is still quite a bit of overhead to run script blocks in parallel. Script blocks run in a context called a PowerShell
runspace.
シンプルな処理では、スクリプトブロックを並行で実行する際のオーバーヘッドにより、Parallel を使用しない方が処理が短時間で実行されるケースもありますので、どのような処理を並行で実行するかについては注意しておく必要がありますが、1 回の実行に数秒かかる処理などは並行実行すると効果があるのではないでしょうか。
Azure Functions の PowerShell ランタイムも PowerShell のバージョンが 7.0 になっていますので、Azure 上で関数を実行する場合にも効果的に動作するケースがあるかと思います。(Azure Automation については How can we improve Azure Automation service? に記載されていますが、CY21 Q4 に、PowerSHell 7.0 をサポート予定のようです)
Foreach-Object で Parallel パラメーターを使用したした際の情報ですが、冒頭に記載したリリース時の情報だけでなく、docs のドキュメントでいくつかの情報が公開されていますので、どのような情報があるかをまとめておきたいと思います。
SQL Server から SQL Server ベースの環境へのマイグレーションに使用することができるツールとして、Database Migration Assistant (DMA) という無償のツールが提供されています。
このツールでは、SQL Server から SQL Database へのスキーマ移行 / データ移行をサポートしており、SQL Server の環境を SQL Database に移行する際に利用することができます。
このツールの中で、SQL Database にデータを移行する際には、どのような方法を使用しているのかが理解できると、SQL Server ベースの環境の移行に活用できるのではと思い、データ移行方法を調べてみました。
Read the rest of this entry »SQL Server / SQL Database で UPDATE を実行する際に、現在の値と同じ値で更新 (SET 句に指定した変更内容が現在の値と同じ) をした場合の挙動について触れておきたいと思います。
SQL Database のテレメトリ情報を取得する方法としては、次の DMV / システムビューを検索するという方法があります。
SQL Database で発生している「イベント」を取得する方法としては、sys.event_log を参照するという方法があるのですが、このシステムビューは、検索に時間がかかる、かつ、v11 での利用を想定しており、現在の v12 の環境では有益な情報を取得できないケースがあります。
v12 の環境で、「発生しているイベント」を取得する方法として、sys.event_log / 拡張イベントを使用しなくても標準で取得されているテレメトリからイベントを取得するという方法がありますので、本投稿ではその方法についてみていきたいと思います。
現状、初期状態で「デッドロック」の情報を取得するためには、本投稿の内容を使用することになるかと思います。
Azure Functions の PowerShell ランタイムでマネージド ID (Managed Identity) を使用して SQL Database に接続をする方法についてまとめておきたいと思います。