SQL Serverの高可用性機能であるAlways On可用性グループは、企業システムの安定稼働を支える重要な技術です。しかし、障害発生時に手動でフェイルオーバーを実施するのは手間がかかり、迅速な対応が求められる場面では適切に実行できないことがあります。
そこで、PowerShellを活用することで、SQL Server Always Onのフェイルオーバーを簡単に自動化できます。本記事では、PowerShellを使ってSQL Serverの可用性グループを操作し、フェイルオーバーを迅速かつ確実に実施する方法を解説します。
具体的には、以下の内容をカバーします。
- Always On可用性グループの基本概念
- フェイルオーバーの種類と手順
- PowerShellでSQL Serverに接続し、可用性グループの状態を取得する方法
- フェイルオーバーを実行するスクリプトの作成
- フェイルオーバー後の確認と自動化の方法
PowerShellを活用することで、管理者の負担を軽減し、障害発生時の対応速度を大幅に向上させることが可能になります。これにより、SQL Serverの高可用性を最大限に活用できるようになります。
Always On可用性グループとは
Always On可用性グループ(AG: Availability Group)は、SQL Serverが提供する高可用性(HA: High Availability)と災害復旧(DR: Disaster Recovery)のための機能です。複数のSQL Serverインスタンス間でデータベースを同期または非同期レプリケーションし、障害発生時には別のサーバーに迅速に切り替え(フェイルオーバー)を実行することができます。
Always On可用性グループの主な特徴
- 複数のレプリカを利用可能
プライマリレプリカ(Primary Replica)とセカンダリレプリカ(Secondary Replica)を持ち、最大8つのレプリカを設定できます。 - 同期モードと非同期モードの選択
- 同期モード(Synchronous Commit Mode):データの完全整合性を確保。データベースの一貫性を維持しながらフェイルオーバーが可能。
- 非同期モード(Asynchronous Commit Mode):遠隔地へのレプリケーションなどに適しており、レイテンシの影響を受けにくい。
- 自動フェイルオーバーのサポート
一定条件を満たせば、プライマリレプリカが障害を検知した際に、自動的にフェイルオーバーを実行できます。 - セカンダリレプリカの活用
セカンダリレプリカは読み取り専用のワークロードに利用でき、負荷分散の役割も果たせます。 - SQL Serverのエンタープライズ機能と統合
可用性グループは、SQL Server Management Studio(SSMS)やPowerShell、SQL Server Agentと統合して管理できます。
Always On可用性グループの構成要件
- Windows Server Failover Clustering(WSFC)が有効になっている必要がある。
- SQL Server Enterprise Edition(またはSQL Server Standard EditionのBasic Availability Groups)が必要。
- 各SQL Serverインスタンスで可用性グループの設定が適切に構成されている。
Always On可用性グループの利用メリット
メリット | 説明 |
---|---|
高可用性 | サーバー障害が発生しても、迅速なフェイルオーバーでダウンタイムを最小限に抑える。 |
データ整合性の確保 | 同期レプリケーションにより、データの一貫性を維持できる。 |
負荷分散 | 読み取り専用ワークロードをセカンダリレプリカに分散し、パフォーマンスを向上させる。 |
災害復旧(DR)の強化 | 遠隔地にセカンダリレプリカを配置することで、災害発生時の復旧対策として機能する。 |
PowerShellを利用することで、これらの機能を効率的に管理し、手動操作の手間を削減できます。次のセクションでは、フェイルオーバーの基本概念について詳しく解説します。
フェイルオーバーの基本概念
フェイルオーバー(Failover)とは、SQL Server Always On可用性グループ(AG)において、プライマリレプリカ(Primary Replica)からセカンダリレプリカ(Secondary Replica)へ役割を切り替えるプロセスを指します。サーバーの障害や計画的なメンテナンスの際にデータベースの可用性を維持するために使用されます。
フェイルオーバーの種類
SQL Server Always Onのフェイルオーバーには、自動フェイルオーバー、手動フェイルオーバー(同期コミット)、手動フェイルオーバー(非同期コミット)の3種類があります。
1. 自動フェイルオーバー(Automatic Failover)
条件:
- 同期コミットモード(Synchronous Commit Mode)が有効
- 可用性グループリスナーが設定済み
- クラスター監視(Windows Server Failover Clustering, WSFC)が機能
特長:
- プライマリレプリカがダウンすると、自動的にセカンダリレプリカがプライマリとして昇格。
- 人手を介さず可用性が維持されるため、ミッションクリティカルなシステムに適用可能。
2. 手動フェイルオーバー(同期コミット)
条件:
- 同期コミットモード(Synchronous Commit Mode)が有効
特長:
- SQL Server管理者が手動でフェイルオーバーを実行する。
- 自動フェイルオーバーに比べ、計画的なフェイルオーバーを安全に実施可能。
実行例(SSMS):
ALTER AVAILABILITY GROUP [AG_NAME] FAILOVER;
3. 手動フェイルオーバー(非同期コミット)
条件:
- 非同期コミットモード(Asynchronous Commit Mode)が有効
特長:
- 遠隔地のデータセンターなど、ネットワーク遅延が発生する環境で使用。
- データ同期の保証がないため、フェイルオーバー後のデータ損失のリスクがある。
- ディザスタリカバリー(DR)用として利用されることが多い。
実行例(SSMS):
ALTER AVAILABILITY GROUP [AG_NAME] FORCE_FAILOVER_ALLOW_DATA_LOSS;
フェイルオーバー時の考慮点
- データの同期状態を確認する
- フェイルオーバー前に、プライマリとセカンダリが同期しているかを確認する。
sys.dm_hadr_database_replica_states
ビューを活用。
- 自動フェイルオーバーの監視と制御
- Windows Server Failover Clustering(WSFC)を正しく構成し、必要に応じてフェイルオーバーポリシーを調整する。
- アプリケーションの接続影響を確認
- 可用性グループリスナーを使用することで、アプリケーションの接続先を自動的に切り替え可能。
PowerShellを活用するメリット
- フェイルオーバーの状態をスクリプトで確認できる。
- 自動化することで、手動操作の手間やヒューマンエラーを削減できる。
- タスクスケジューラと組み合わせることで、スケジュール化したメンテナンスにも対応可能。
次のセクションでは、PowerShellを使用してSQL Serverに接続し、可用性グループの状態を取得する方法について詳しく解説します。
PowerShellでSQL Serverに接続する方法
PowerShellを使用してSQL Serverに接続し、可用性グループの状態を取得・管理するためには、SQL Server Management Objects(SMO)やDBAToolsモジュールを活用します。本セクションでは、PowerShellを利用したSQL Serverへの接続方法を解説します。
1. PowerShellを使用したSQL Server接続方法
1.1 SQL Server Management Objects(SMO)を利用する
SMOは、SQL Serverの管理をPowerShellで実行するための.NETライブラリです。
接続スクリプト(SMO)
# SQL Serverインスタンス名
$serverInstance = "SQLSERVER01"
# SMOオブジェクトをロード
$server = New-Object Microsoft.SqlServer.Management.Smo.Server $serverInstance
# 接続の確認
if ($server.PingSqlServer()) {
Write-Output "SQL Serverに接続しました: $serverInstance"
} else {
Write-Output "SQL Serverへの接続に失敗しました: $serverInstance"
}
特徴
- SQL Serverのインスタンス情報に直接アクセスできる。
- 可用性グループの情報やデータベースの状態を取得可能。
1.2 SQL Server PowerShellモジュール(SQLPS)を利用する
SQLPSモジュールは、SQL Server用のPowerShellコマンドレットを提供します。
SQLPSのインストール
Install-Module -Name SqlServer -Scope CurrentUser
接続スクリプト(SQLPS)
# SQL Serverに接続しデータベース一覧を取得
$serverInstance = "SQLSERVER01"
Invoke-Sqlcmd -ServerInstance $serverInstance -Query "SELECT name FROM sys.databases"
特徴
Invoke-Sqlcmd
を使ってT-SQLを直接実行可能。- SQL Serverエージェントジョブの管理なども可能。
1.3 DBAToolsモジュールを利用する
DBAToolsは、SQL Serverの管理を容易にするためのPowerShellモジュールで、多くの管理タスクをサポートします。
DBAToolsのインストール
Install-Module -Name dbatools -Scope CurrentUser
接続スクリプト(DBATools)
# SQL Serverに接続
$serverInstance = "SQLSERVER01"
$server = Get-DbaInstance -SqlInstance $serverInstance
# サーバー情報を表示
$server
特徴
Get-DbaInstance
を使って簡単にサーバー情報を取得可能。- 可用性グループの状態確認やフェイルオーバー操作も可能。
2. SQL Server接続時の注意点
- 認証方式の確認
- Windows認証を使用する場合は、管理者権限でPowerShellを実行する。
- SQL認証を使用する場合は、
-Credential
パラメータを追加して資格情報を渡す。
- ファイアウォール設定
- SQL Serverのポート(デフォルト: 1433)が開放されているか確認。
- 権限の適用
- 接続するアカウントがSQL Serverの管理者権限を持っているか確認。
次のセクションでは、PowerShellを使って可用性グループの状態を確認する方法について解説します。
PowerShellで可用性グループの状態を確認する
SQL Server Always On可用性グループ(AG)の状態を確認することは、正常な動作を保証し、フェイルオーバーの準備を整える上で重要です。本セクションでは、PowerShellを使用して可用性グループの状態を確認する方法を解説します。
1. DBAToolsを使用した可用性グループの状態確認
DBAToolsモジュールには、可用性グループの情報を簡単に取得できる便利なコマンドが用意されています。
1.1 可用性グループの一覧を取得
# DBAToolsをインストール(未インストールの場合)
Install-Module -Name dbatools -Scope CurrentUser -Force
# SQL Serverインスタンスを指定
$serverInstance = "SQLSERVER01"
# 可用性グループの情報を取得
Get-DbaAvailabilityGroup -SqlInstance $serverInstance | Format-Table -AutoSize
出力例
Name PrimaryReplica AutomatedBackupPreference FailoverMode
---- -------------- ------------------------- ------------
AG1 SQLSERVER01 Primary Automatic
ポイント
- 可用性グループの名前(
Name
) - 現在のプライマリレプリカ(
PrimaryReplica
) - フェイルオーバーモード(
FailoverMode
)
1.2 可用性グループのレプリカ状態を確認
# 可用性グループのレプリカ情報を取得
Get-DbaAgReplica -SqlInstance $serverInstance | Format-Table -AutoSize
出力例
AvailabilityGroup ServerName Role AvailabilityMode FailoverMode
---------------- ---------- ---- ----------------- ------------
AG1 SQLSERVER01 Primary SynchronousCommit Automatic
AG1 SQLSERVER02 Secondary SynchronousCommit Automatic
ポイント
- プライマリ / セカンダリのサーバー名(
ServerName
) - 可用性モード(
AvailabilityMode
) - フェイルオーバーモード(
FailoverMode
)
2. Invoke-Sqlcmd
を使用した確認
PowerShellのInvoke-Sqlcmd
を使用して、SQL Serverの動作状態を直接確認することもできます。
2.1 可用性グループの状態を取得
$serverInstance = "SQLSERVER01"
# SQLクエリで可用性グループの情報を取得
Invoke-Sqlcmd -ServerInstance $serverInstance -Query "
SELECT ag.name AS AvailabilityGroup, r.replica_server_name, rs.role_desc, rs.synchronization_health_desc
FROM sys.availability_groups ag
JOIN sys.availability_replicas r ON ag.group_id = r.group_id
JOIN sys.dm_hadr_availability_replica_states rs ON r.replica_id = rs.replica_id"
出力例
AvailabilityGroup replica_server_name role_desc synchronization_health_desc
----------------- ------------------ ---------- ---------------------------
AG1 SQLSERVER01 PRIMARY HEALTHY
AG1 SQLSERVER02 SECONDARY HEALTHY
ポイント
role_desc
でプライマリ / セカンダリを確認synchronization_health_desc
で同期状態を確認
3. フェイルオーバー前に確認すべき項目
- プライマリレプリカの確認
Get-DbaAvailabilityGroup
で現在のプライマリレプリカを特定する。
- 同期状態のチェック
Get-DbaAgReplica
またはsys.dm_hadr_availability_replica_states
を使い、同期がHEALTHY
であることを確認。
- フェイルオーバーモードの確認
FailoverMode
がAutomatic
かManual
かをチェックし、適切なモードになっているか確認。
次のセクションでは、PowerShellを使用してフェイルオーバーを実行する方法について解説します。
PowerShellでフェイルオーバーを実行する方法
SQL Server Always On可用性グループ(AG)のフェイルオーバーは、手動または自動で実行できます。PowerShellを使用することで、スクリプトによる確実なフェイルオーバー操作が可能になり、管理者の作業負担を軽減できます。
1. DBAToolsを使用したフェイルオーバー実行
DBAToolsのInvoke-DbaAgFailover
コマンドを使用すると、可用性グループのフェイルオーバーを簡単に実行できます。
1.1 フェイルオーバーの前に確認すべき情報
フェイルオーバー前に、以下のコマンドで現在のプライマリレプリカを確認します。
$serverInstance = "SQLSERVER01"
# プライマリレプリカを取得
Get-DbaAvailabilityGroup -SqlInstance $serverInstance | Format-Table -AutoSize
出力例
Name PrimaryReplica AutomatedBackupPreference FailoverMode
---- -------------- ------------------------- ------------
AG1 SQLSERVER01 Primary Automatic
確認ポイント
PrimaryReplica
が現在のプライマリサーバーを示しているか?FailoverMode
がAutomatic
かManual
か?
1.2 PowerShellでフェイルオーバーを実行
以下のスクリプトを実行すると、指定した可用性グループのプライマリを変更できます。
# フェイルオーバーの実行
$PrimaryServer = "SQLSERVER01"
$SecondaryServer = "SQLSERVER02"
$AvailabilityGroup = "AG1"
Invoke-DbaAgFailover -SqlInstance $PrimaryServer -AvailabilityGroup $AvailabilityGroup -Confirm:$false
ポイント
Invoke-DbaAgFailover
コマンドは、指定した可用性グループのフェイルオーバーを実行。-Confirm:$false
を指定することで、ユーザー確認なしに即時フェイルオーバーが実行される。
出力例
AvailabilityGroup ServerName Role Failover Successful
---------------- ------------ ----------- -------------------
AG1 SQLSERVER02 Primary True
この出力を確認し、ServerName
が新しいプライマリレプリカになっていることを確認します。
2. Invoke-Sqlcmd
を使用したフェイルオーバー
PowerShellのInvoke-Sqlcmd
を利用してT-SQLを実行し、フェイルオーバーを手動で行うこともできます。
2.1 同期モードで手動フェイルオーバー
$serverInstance = "SQLSERVER01"
$AvailabilityGroup = "AG1"
# 手動フェイルオーバー
Invoke-Sqlcmd -ServerInstance $serverInstance -Query "
ALTER AVAILABILITY GROUP [$AvailabilityGroup] FAILOVER;"
ポイント
- 同期モード(Synchronous Commit)の可用性グループでのみ実行可能。
ALTER AVAILABILITY GROUP
コマンドにより、プライマリが新しいレプリカへ変更される。
2.2 非同期モードでのフェイルオーバー(データ損失を許容)
非同期モード(Asynchronous Commit)では、FORCE_FAILOVER_ALLOW_DATA_LOSS
を指定する必要があります。
$serverInstance = "SQLSERVER01"
$AvailabilityGroup = "AG1"
# データ損失を許容したフェイルオーバー
Invoke-Sqlcmd -ServerInstance $serverInstance -Query "
ALTER AVAILABILITY GROUP [$AvailabilityGroup] FORCE_FAILOVER_ALLOW_DATA_LOSS;"
注意
- 非同期モードでは、同期が取れていない場合にデータ損失が発生する可能性がある。
- データが完全に同期されているかを確認したうえで実行する。
3. フェイルオーバー後の検証
フェイルオーバーが正常に完了したかどうか、以下のスクリプトで確認できます。
3.1 新しいプライマリレプリカの確認
# 新しいプライマリレプリカを確認
Get-DbaAvailabilityGroup -SqlInstance $SecondaryServer | Format-Table -AutoSize
出力例
Name PrimaryReplica AutomatedBackupPreference FailoverMode
---- -------------- ------------------------- ------------
AG1 SQLSERVER02 Primary Automatic
確認ポイント
PrimaryReplica
に新しいプライマリサーバー名が表示されていること。- フェイルオーバー前のサーバー名とは異なっていること。
3.2 可用性グループのレプリカ状態の確認
# レプリカの状態を確認
Get-DbaAgReplica -SqlInstance $SecondaryServer | Format-Table -AutoSize
出力例
AvailabilityGroup ServerName Role AvailabilityMode FailoverMode
---------------- ---------- ---- ----------------- ------------
AG1 SQLSERVER02 Primary SynchronousCommit Automatic
AG1 SQLSERVER01 Secondary SynchronousCommit Automatic
確認ポイント
- 新しいプライマリサーバー(
Primary
)とセカンダリサーバー(Secondary
)の役割が正しく切り替わっているか? AvailabilityMode
がSynchronousCommit
の場合、データは完全同期されている。
4. フェイルオーバー時の注意点
- フェイルオーバーを実行する前に、可用性グループの同期状態を確認する。
- 非同期モードでは、フェイルオーバー時にデータ損失の可能性があるため注意が必要。
- SQL Serverエージェントジョブやアプリケーションの接続先を可用性グループリスナーで管理していることを確認する。
- タスクスケジューラやSQL Serverエージェントジョブと連携させることで、フェイルオーバーの自動化が可能。
次のセクションでは、PowerShellを用いてフェイルオーバーのスクリプトを自動化する方法について解説します。
PowerShellでフェイルオーバーを自動化する方法
SQL Server Always On可用性グループのフェイルオーバーを自動化することで、障害発生時の対応時間を短縮し、システムのダウンタイムを最小限に抑えることができます。本セクションでは、PowerShellを使用してフェイルオーバーを自動実行する方法を解説します。
1. 自動化の概要
PowerShellを利用してフェイルオーバーを自動化するためには、以下の手順が必要です。
- フェイルオーバーのトリガー条件を設定する
- サーバー障害の監視
- SQL Serverのレプリカ状態の確認
- 特定のイベントログの検出
- PowerShellスクリプトを作成する
- 可用性グループの状態をチェック
- フェイルオーバーの実行
- フェイルオーバー後の確認
- WindowsタスクスケジューラやSQL Server Agentで定期実行
- 障害が発生した場合に自動でスクリプトを実行
- 定期的にフェイルオーバーの要否をチェック
2. フェイルオーバーを実行するPowerShellスクリプト
以下のスクリプトでは、SQL Serverの可用性グループの状態をチェックし、プライマリがダウンしている場合にフェイルオーバーを実行します。
# PowerShellスクリプト: 自動フェイルオーバー
# 変数の定義
$PrimaryServer = "SQLSERVER01"
$SecondaryServer = "SQLSERVER02"
$AvailabilityGroup = "AG1"
# DBAToolsをインポート(必要に応じてインストール)
if (!(Get-Module -ListAvailable -Name dbatools)) {
Install-Module -Name dbatools -Force -Scope CurrentUser
}
Import-Module dbatools
# プライマリの状態を取得
$agState = Get-DbaAvailabilityGroup -SqlInstance $PrimaryServer -AvailabilityGroup $AvailabilityGroup
# プライマリが応答しない場合、フェイルオーバーを実行
if (!$agState -or $agState.PrimaryReplica -ne $PrimaryServer) {
Write-Output "フェイルオーバーを開始します..."
Invoke-DbaAgFailover -SqlInstance $SecondaryServer -AvailabilityGroup $AvailabilityGroup -Confirm:$false
Write-Output "フェイルオーバー完了"
} else {
Write-Output "フェイルオーバー不要: プライマリは正常です"
}
スクリプトの動作
Get-DbaAvailabilityGroup
でプライマリレプリカの状態を確認- プライマリが落ちている場合、
Invoke-DbaAgFailover
を実行してセカンダリに切り替え - ログメッセージを出力してフェイルオーバーの成否を確認
3. タスクスケジューラでスクリプトを定期実行する
Windowsタスクスケジューラを使って、上記のPowerShellスクリプトを定期的に実行し、フェイルオーバーの自動化を行います。
3.1 タスクスケジューラの設定手順
- [タスクスケジューラ] を開く
Win + R
→taskschd.msc
→ Enter
- [基本タスクの作成] をクリック
- [タスクの名前] を入力(例: “SQL Always On フェイルオーバーチェック”)
- [トリガー] を設定
- 「毎分」「5分ごと」など定期的に実行
- [操作] で PowerShell スクリプトを実行
- プログラム/スクリプト:
powershell.exe
- 引数の追加:
-File "C:\Scripts\FailoverCheck.ps1"
- [完了] をクリック
4. SQL Server Agentでスクリプトを定期実行する
SQL Serverの管理者であれば、SQL Server Agentを利用する方法も有効です。
4.1 SQL Server Agentジョブの作成
- SQL Server Management Studio(SSMS)を開く
- SQL Server Agent → [ジョブ] を右クリック → [新しいジョブ] を作成
- [ステップ] タブで新しいステップを追加
- タイプ:PowerShell
- コマンド:
powershell powershell.exe -File "C:\Scripts\FailoverCheck.ps1"
- [スケジュール] タブで実行頻度を設定
- 例えば、5分ごとにスクリプトを実行
- [OK] をクリックしてジョブを作成
5. 自動フェイルオーバー時の考慮点
項目 | 説明 |
---|---|
フェイルオーバー条件 | サーバーの障害を適切に検知できるか? |
データ同期状態 | フェイルオーバー時に同期がとれているか? |
アプリケーションの接続 | フェイルオーバー後に接続が自動で切り替わるか? |
通知の設定 | フェイルオーバーが発生したことを管理者が把握できるか? |
5.1 フェイルオーバー時の通知を設定
PowerShellスクリプトにメール通知を追加することで、フェイルオーバーが発生した際に管理者へ通知を送信できます。
# フェイルオーバー通知メール
$SmtpServer = "smtp.example.com"
$To = "admin@example.com"
$From = "sqlserver@example.com"
$Subject = "SQL Server Always On フェイルオーバー発生"
$Body = "フェイルオーバーが実行されました。新しいプライマリ: $SecondaryServer"
Send-MailMessage -SmtpServer $SmtpServer -To $To -From $From -Subject $Subject -Body $Body
まとめ
PowerShellを活用してSQL Server Always Onのフェイルオーバーを完全自動化することで、システムの可用性を向上させることができます。
- PowerShellスクリプトで可用性グループの状態を監視
- プライマリが応答しない場合にフェイルオーバーを実行
- タスクスケジューラやSQL Server Agentで定期実行
- メール通知を設定してフェイルオーバー発生時に管理者に連絡
これにより、SQL Serverの高可用性をより確実に管理できるようになります。
次のセクションでは、フェイルオーバー後の確認方法について詳しく解説します。
フェイルオーバー後の検証と確認方法
SQL Server Always On可用性グループでフェイルオーバーが完了した後、新しいプライマリレプリカが正しく動作しているかを確認することが重要です。フェイルオーバーの成功を確認し、システムの正常性を維持するために、以下のポイントをチェックします。
1. 新しいプライマリレプリカの確認
1.1 PowerShellでプライマリレプリカを確認
フェイルオーバーが成功したかどうか、Get-DbaAvailabilityGroup
コマンドを使用してプライマリレプリカの状態を取得します。
# フェイルオーバー後のプライマリレプリカ確認
$serverInstance = "SQLSERVER02" # フェイルオーバー先のサーバー
Get-DbaAvailabilityGroup -SqlInstance $serverInstance | Format-Table -AutoSize
出力例
Name PrimaryReplica AutomatedBackupPreference FailoverMode
---- -------------- ------------------------- ------------
AG1 SQLSERVER02 Primary Automatic
確認ポイント
PrimaryReplica
が新しいプライマリサーバー (SQLSERVER02
) になっていることFailoverMode
がAutomatic
またはManual
になっていること
2. 可用性グループのレプリカ状態の確認
フェイルオーバー後に、すべてのレプリカが適切に動作しているかを確認します。
# 可用性グループのレプリカ状態を取得
Get-DbaAgReplica -SqlInstance $serverInstance | Format-Table -AutoSize
出力例
AvailabilityGroup ServerName Role AvailabilityMode FailoverMode
---------------- ---------- ---- ----------------- ------------
AG1 SQLSERVER02 Primary SynchronousCommit Automatic
AG1 SQLSERVER01 Secondary SynchronousCommit Automatic
確認ポイント
- 新しいプライマリサーバー (
Primary
) がSQLSERVER02
になっていること - セカンダリレプリカ (
Secondary
) も正常に動作していること AvailabilityMode
がSynchronousCommit
の場合、データの同期が維持されていること
3. データベースの状態確認
可用性グループに属するデータベースがすべて正常な状態 (ONLINE
) になっているかを確認します。
# データベースの可用性状態を確認
Invoke-Sqlcmd -ServerInstance $serverInstance -Query "
SELECT database_name, synchronization_state_desc
FROM sys.dm_hadr_database_replica_states"
出力例
database_name synchronization_state_desc
------------- -------------------------
DB1 SYNCHRONIZED
DB2 SYNCHRONIZED
確認ポイント
synchronization_state_desc
がSYNCHRONIZED
になっていること- すべてのデータベースが同期され、正常に動作していること
4. アプリケーションの接続確認
フェイルオーバー後、アプリケーションが新しいプライマリレプリカ (SQLSERVER02
) に接続できているかを確認します。
4.1 可用性グループリスナーを使用した接続確認
# リスナーを使用して接続テスト
$ListenerName = "AG1Listener"
Invoke-Sqlcmd -ServerInstance $ListenerName -Query "SELECT @@SERVERNAME"
確認ポイント
- 正しいサーバー (
SQLSERVER02
) に接続できること - アプリケーションの接続先が自動で切り替わっていること
5. フェイルオーバー時のログ確認
フェイルオーバーが適切に実行されたか、WindowsのイベントログやSQL Serverエラーログを確認します。
5.1 Windowsイベントログでフェイルオーバーを確認
# SQL Server関連のイベントログを取得
Get-WinEvent -LogName Application | Where-Object {$_.Message -like "*AlwaysOn*" } | Select-Object TimeCreated, Message -First 10
確認ポイント
Always On
に関連するログを確認し、異常がないかをチェック
5.2 SQL Serverエラーログの確認
# SQL Serverのエラーログを取得
Invoke-Sqlcmd -ServerInstance $serverInstance -Query "EXEC xp_readerrorlog 0, 1, 'AlwaysOn'"
確認ポイント
Failover complete
などのメッセージがあること- フェイルオーバー時にエラーが発生していないかを確認
6. フェイルオーバー後のバックアップ戦略
フェイルオーバーが発生すると、バックアップポリシーに影響を与える可能性があります。以下の確認を行います。
6.1 バックアップの優先設定を確認
Get-DbaAvailabilityGroup -SqlInstance $serverInstance | Select-Object Name, AutomatedBackupPreference
確認ポイント
AutomatedBackupPreference
がPrimary
になっているかをチェック
6.2 バックアップジョブの再設定
新しいプライマリサーバー (SQLSERVER02
) でバックアップジョブを再設定し、必要ならば以下のようにバックアップを実行します。
# データベースバックアップの実行
Backup-SqlDatabase -ServerInstance $serverInstance -Database "DB1" -BackupFile "C:\Backup\DB1.bak"
7. 通知設定(メールアラート)
フェイルオーバー後の確認が完了したことを管理者に通知するため、メールを送信するスクリプトを組み込むことができます。
# フェイルオーバー完了通知メール
$SmtpServer = "smtp.example.com"
$To = "admin@example.com"
$From = "sqlserver@example.com"
$Subject = "SQL Server Always On フェイルオーバー完了"
$Body = "フェイルオーバーが完了しました。現在のプライマリレプリカ: $serverInstance"
Send-MailMessage -SmtpServer $SmtpServer -To $To -From $From -Subject $Subject -Body $Body
まとめ
フェイルオーバー後は、以下の確認を実施してシステムの安定稼働を保証しましょう。
- プライマリレプリカの変更を確認
Get-DbaAvailabilityGroup
で新しいプライマリを特定
- 可用性グループのレプリカ状態を確認
Get-DbaAgReplica
で同期状態をチェック
- データベースの同期を確認
sys.dm_hadr_database_replica_states
でSYNCHRONIZED
になっているか確認
- アプリケーションの接続確認
- 可用性グループリスナーを使用して正しく接続できるか確認
- ログとエラーチェック
- Windowsイベントログ、SQL Serverエラーログを解析
- バックアップ設定の確認
AutomatedBackupPreference
の設定とバックアップジョブの再確認
- 管理者通知
- フェイルオーバー完了時にメール通知を送信
フェイルオーバー後の適切な確認を行うことで、SQL Server Always On可用性グループの高可用性を最大限に活用できます。
次のセクションでは、フェイルオーバー時のトラブルシューティングと注意点について詳しく解説します。
フェイルオーバー時のトラブルシューティングと注意点
SQL Server Always On可用性グループのフェイルオーバーは強力な高可用性機能ですが、適切に設定されていない場合や予期しない障害が発生した場合には、正常に動作しないことがあります。このセクションでは、フェイルオーバー時のトラブルシューティング方法と注意点について解説します。
1. フェイルオーバーが失敗する原因と対処法
1.1 フェイルオーバーに失敗する
エラーメッセージ例
Msg 41131, Level 16, State 0, Line 1
Cannot bring the Availability Group to the primary role because one or more databases are not synchronized.
原因
- セカンダリレプリカがプライマリレプリカと同期していない
ALTER AVAILABILITY GROUP FAILOVER
を実行する前にSYNCHRONIZED
状態になっていない
対処方法
# データベースの同期状態を確認
Invoke-Sqlcmd -ServerInstance "SQLSERVER02" -Query "
SELECT database_name, synchronization_state_desc
FROM sys.dm_hadr_database_replica_states"
SYNCHRONIZED
になっていない場合、データの同期を再実行- 非同期モードなら
FORCE_FAILOVER_ALLOW_DATA_LOSS
を使用する(データ損失のリスクあり)
Invoke-Sqlcmd -ServerInstance "SQLSERVER02" -Query "
ALTER AVAILABILITY GROUP [AG1] FORCE_FAILOVER_ALLOW_DATA_LOSS;"
1.2 フェイルオーバー後にデータベースが NOT SYNCHRONIZED
になる
エラーメッセージ例
The secondary replica is not synchronized with the primary.
原因
- フェイルオーバー直後にセカンダリレプリカが同期を取れていない
- ネットワーク遅延やSQL Serverサービスの遅延
対処方法
# データベースの状態を確認
Invoke-Sqlcmd -ServerInstance "SQLSERVER02" -Query "
SELECT database_name, synchronization_health_desc
FROM sys.dm_hadr_database_replica_states"
SYNCHRONIZED
になるまで待機- 必要に応じてセカンダリレプリカを手動で再同期
# セカンダリレプリカを再同期
Set-DbaAgReplica -SqlInstance "SQLSERVER02" -AvailabilityGroup "AG1" -JoinOnly
1.3 アプリケーションが新しいプライマリに接続できない
エラーメッセージ例
Cannot connect to SQL Server. The database is not available.
原因
- 可用性グループリスナーが適切に設定されていない
- アプリケーションの接続文字列が固定IPアドレスを指定している
対処方法
# リスナーの設定を確認
Get-DbaAgListener -SqlInstance "SQLSERVER02"
- 可用性グループリスナー(AGリスナー)を使用する
mylistener.domain.com
のようなFQDNを接続先に設定- アプリケーションの接続文字列を変更
Server=mylistener.domain.com; Database=MyDB; Integrated Security=True;
2. SQL Serverエージェントジョブが動作しない
フェイルオーバー後、新しいプライマリでSQL Serverエージェントジョブが動作しないことがあります。
対処方法
- ジョブの所有者を変更
- フェイルオーバー前のプライマリに設定されている場合、新しいプライマリに変更する
Get-DbaAgentJob -SqlInstance "SQLSERVER02" | Set-DbaAgentJobOwner -OwnerLogin "sa"
- ジョブを手動で実行
Start-DbaAgentJob -SqlInstance "SQLSERVER02" -Job "バックアップジョブ"
- ジョブのステータスを確認
Get-DbaAgentJob -SqlInstance "SQLSERVER02" | Select Name, IsEnabled, LastRunOutcome
3. フェイルオーバー後のバックアップ設定を再確認
フェイルオーバー後、新しいプライマリサーバーでバックアップが正しく動作しているか確認します。
バックアップの優先順位を確認
Get-DbaAvailabilityGroup -SqlInstance "SQLSERVER02" | Select-Object Name, AutomatedBackupPreference
Primary
の場合、バックアップが新しいプライマリで実行されるSecondary
の場合、セカンダリでバックアップを実行する設定が必要
手動でバックアップを実行
Backup-SqlDatabase -ServerInstance "SQLSERVER02" -Database "MyDB" -BackupFile "C:\Backup\MyDB.bak"
4. フェイルオーバー時の注意点
項目 | 説明 |
---|---|
フェイルオーバーの条件を事前に確認 | 同期状態 (SYNCHRONIZED ) を確認 |
アプリケーションの接続文字列をFQDNにする | 可用性グループリスナーを使用 |
SQL Serverエージェントジョブの所有者変更 | 新しいプライマリでジョブを有効化 |
バックアップ戦略の確認 | 新しいプライマリでバックアップを実施 |
5. フェイルオーバー発生時に通知を受け取る
フェイルオーバーが発生した際に、管理者へメール通知を送ることができます。
メール通知スクリプト
$SmtpServer = "smtp.example.com"
$To = "admin@example.com"
$From = "sqlserver@example.com"
$Subject = "SQL Server Always On フェイルオーバー発生"
$Body = "フェイルオーバーが発生しました。現在のプライマリ: SQLSERVER02"
Send-MailMessage -SmtpServer $SmtpServer -To $To -From $From -Subject $Subject -Body $Body
まとめ
SQL Server Always Onのフェイルオーバーは、高可用性を実現する強力な機能ですが、適切に設定されていないと障害が発生する可能性があります。本セクションでは、よくあるトラブルとその対処方法を解説しました。
- フェイルオーバーが失敗する場合
SYNCHRONIZED
状態であることを確認- 必要に応じて
FORCE_FAILOVER_ALLOW_DATA_LOSS
を実行
- フェイルオーバー後のデータ同期を確認
sys.dm_hadr_database_replica_states
をチェックし、SYNCHRONIZED
であることを確認
- アプリケーションの接続を確認
- 可用性グループリスナーを使用し、接続文字列をFQDNで設定
- SQL Serverエージェントジョブを確認
- 新しいプライマリレプリカでジョブが有効になっているかチェック
- フェイルオーバー時の通知を設定
Send-MailMessage
を使用して管理者へアラートを送信
適切なトラブルシューティングを行うことで、SQL Server Always Onの可用性を最大限に引き出すことができます。
次のセクションでは、本記事のまとめを解説します。
まとめ
本記事では、PowerShellを活用したSQL Server Always On可用性グループのフェイルオーバー管理について詳しく解説しました。手動でのフェイルオーバー実行から、スクリプトによる自動化、フェイルオーバー後の確認、トラブルシューティングまでの一連の流れを学びました。
本記事のポイント
- Always On可用性グループの基本概念
- SQL Serverの高可用性機能で、プライマリとセカンダリレプリカ間でデータを同期する。
- PowerShellを用いたSQL Serverの接続
Invoke-Sqlcmd
やDBATools
を活用してSQL Serverとやり取りする方法。
- PowerShellで可用性グループの状態を確認
Get-DbaAvailabilityGroup
やsys.dm_hadr_database_replica_states
でレプリカの状態をチェック。
- フェイルオーバーの実行
Invoke-DbaAgFailover
でプライマリレプリカを切り替える。
- フェイルオーバーの自動化
- タスクスケジューラやSQL Server Agentを活用し、定期的に状態チェックとフェイルオーバーを実施。
- フェイルオーバー後の確認
- 可用性グループのプライマリレプリカ、データ同期状態、アプリケーション接続をチェック。
- トラブルシューティングと注意点
SYNCHRONIZED
状態の確認、アプリケーション接続エラー対策、SQL Serverエージェントジョブの修正など。
PowerShellを活用するメリット
✅ フェイルオーバーの迅速化:スクリプトを実行するだけでプライマリレプリカを切り替え可能。
✅ 自動化による負担軽減:タスクスケジューラやSQL Server Agentと連携して、障害発生時の手作業を削減。
✅ トラブルシューティングの容易さ:レプリカの状態や同期状況をPowerShellで簡単に確認できる。
PowerShellを活用することで、SQL Server Always On可用性グループの管理をより効率的に行うことができます。適切な設定と監視を行い、システムの高可用性を最大限に活用しましょう!
コメント