ALTER DATABASE (Transact-SQL) データベース ミラーリング
適用対象: SQL Server
Note
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに Always On 可用性グループ を使用してください
データベースのデータベース ミラーリングを制御します。 データベース ミラーリング オプションで指定した値は、データベースのコピーと、データベース ミラーリング セッション全体の両方に適用されます。 <database_mirroring_option> は、ALTER DATABASE ステートメントごとに 1 つだけ指定できます。
Note
構成はパフォーマンスに影響する場合があるので、データベース ミラーリングの構成はピーク タイム以外の時間に行うことをお勧めします。
ALTER DATABASE のオプションについては、ALTER DATABASE に関するページを参照してください。 ALTER DATABASE SET のオプションについては、ALTER DATABASE SET のオプションに関するページを参照してください。
構文
ALTER DATABASE database_name
SET { <partner_option> | <witness_option> }
<partner_option> ::=
PARTNER { = 'partner_server'
| FAILOVER
| FORCE_SERVICE_ALLOW_DATA_LOSS
| OFF
| RESUME
| SAFETY { FULL | OFF }
| SUSPEND
| TIMEOUT integer
}
<witness_option> ::=
WITNESS { = 'witness_server'
| OFF
}
引数
重要
SET PARTNER または SET WITNESS コマンドは入力時には正常に完了できますが、後で失敗します。
Note
ALTER DATABASE データベース ミラーリング オプションは、包含データベースでは使用できません。
database_name: 変更するデータベースの名前です。
PARTNER <partner_option> データベース ミラーリング セッションのフェールオーバー パートナー、およびそれらの動作を定義する、データベース プロパティを制御します。 SET PARTNER オプションには、パートナーのうちのいずれか一方で設定すればよいものと、プリンシパル サーバーとミラー サーバーのいずれか一方に限定されているものがあります。 詳細については、後述の各 PARTNER オプションを参照してください。 SET PARTNER 句は、それを指定したパートナーには関係なく、データベースの両方のコピーに影響します。
SET PARTNER ステートメントを実行するには、両方のパートナーのエンドポイントの STATE が、STARTED に設定されている必要があります。 また、それぞれのパートナー サーバー インスタンスのデータベース ミラーリング エンドポイントの ROLE は、PARTNER または ALL のいずれかに設定されている必要があります。 エンドポイントの指定方法については、Windows 認証でのデータベース ミラーリング エンドポイントの作成に関するページを参照してください。 サーバー インスタンスのデータベース ミラーリング エンドポイントのロールおよび状態を確認するには、そのインスタンス上で、次の Transact-SQL ステートメントを使用します。
SELECT role_desc, state_desc FROM sys.database_mirroring_endpoints
<partner_option> ::=
Note
<partner_option> は、SET PARTNER 句ごとに 1 つだけ指定できます。
' partner_server ' 新しいデータベース ミラーリング セッションでフェールオーバー パートナーとして機能する SQL Server インスタンスのサーバー ネットワーク アドレスを指定します。 各セッションには 2 つのパートナーが必要です。一方はプリンシパル サーバーとして起動し、他方はミラー サーバーとして起動します。 これらのパートナーは、別々のコンピューター上に配置することをお勧めします。
このオプションは、各パートナーでのセッションごとに 1 回指定します。 データベース ミラーリング セッションを開始するには、2 つの ALTER DATABASE <データベース> SET PARTNER =' <パートナー サーバー> ' ステートメントが必要です。 これらのステートメントの順序は非常に重要です。 最初に、ミラー サーバーに接続し、プリンシパル サーバー インスタンスを <パートナー サーバー> (SET PARTNER =' <プリンシパル サーバー> ' ) として指定します。 次に、プリンシパル サーバーに接続し、ミラー サーバー インスタンスを <パートナー サーバー> (SET PARTNER =' <ミラー サーバー> ' ) として指定します。これにより、これら 2 つのパートナー間で、データベース ミラーリング セッションが開始されます。 詳細については、データベース ミラーリングの設定に関するページを参照してください。
partner_server の値は、サーバー ネットワーク アドレスです。 構文は次のとおりです。
TCP**://<system-address>:**<port>
where
- <system-address> は、システム名、完全修飾ドメイン名、IP アドレスなどの文字列です。対象のコンピューター システムを明確に識別します。
- <port> は、パートナー サーバー インスタンスのミラーリング エンドポイントに関連付けられているポート番号です。
詳細については、 サーバー ネットワーク アドレスの指定 - データベース ミラーリングに関するページを参照してください。
SET PARTNER =' <パートナー サーバー> ' 句の例を次に示します。
'TCP://MYSERVER.mydomain.Adventure-Works.com:7777'
重要
SQL Server Management Studio ではなく ALTER DATABASE ステートメントを使用してセットアップされたセッションの場合、トランザクションの安全性が既定の完全な安全性に設定され (SAFETY の値が FULL)、セッションは自動フェールオーバーを伴わない高い安全性モードで実行されます。 自動フェールオーバーを使用するにはミラーリング監視を構成し、ハイパフォーマンス モードで実行するにはトランザクションの安全性をオフ (SAFETY OFF) にします。
FAILOVER: プリンシパル サーバーをミラー サーバーに手動でフェールオーバーします。 FAILOVER は、プリンシパル サーバー上でのみ指定できます。 このオプションは、SAFETY が FULL に設定されている (既定) 場合にのみ有効です。
FAILOVER オプションを指定する場合は、データベース コンテキストとして master が必要です。
FORCE_SERVICE_ALLOW_DATA_LOSS: データベースが非同期状態の場合、または同期状態で自動フェールオーバーが行われない場合、プリンシパル サーバーで障害が発生すると、ミラー データベースにデータベース サービスを強制します。
サービスの強制は、プリンシパル サーバーが停止した場合にのみ行うことを強くお勧めします。 それ以外の場合にサービスを強制すると、一部のクライアントが、新しいプリンシパル データベースではなく、元のプリンシパル データベースにアクセスし続ける可能性があります。 FORCE_SERVICE_ALLOW_DATA_LOSS は、ミラー サーバー上でのみ使用可能で、かつ次の条件をすべて満たしている必要があります。
- プリンシパル サーバーが停止している。
- WITNESS が OFF に設定されているか、または監視サーバーがミラー サーバーに接続されている。
サービスの強制は、データベースにサービスを直ちに復元するために一部のデータが失われてもかまわないという場合にのみ行ってください。
サービスを強制すると、セッションが中断され、元のプリンシパル データベース内のすべてのデータが一時的に保持されます。 元のプリンシパルが稼働し、新しいプリンシパル サーバーと通信できるようになると、データベース管理者はサービスを再開できます。 セッションを再開すると、すべての未送信ログ レコードと、それに対応する更新は失われます。
OFF: データベース ミラーリング セッションを削除し、データベースからミラーリングを削除します。 OFF は、どちらのパートナー上でも指定できます。 ミラーリングの削除による影響の詳細については、データベース ミラーリングの削除に関するページを参照してください。
RESUME: 中断状態のデータベース ミラーリング セッションを再開します。 RESUME は、プリンシパル サーバー上でのみ指定できます。
SAFETY { FULL | OFF }: トランザクションの安全性のレベルを設定します。 SAFETY は、プリンシパル サーバー上でのみ指定できます。
既定値は FULL です。 SAFETY が FULL の場合、データベース ミラーリング セッションは高い安全性モードで同期的に実行されます。 OFF の場合は、データベース ミラーリング セッションは高パフォーマンス モードで非同期的に実行されます。
高い安全性モードの動作は、次のように部分的にミラーリング監視に依存します。
SAFETY が FULL に設定され、ミラーリング監視がセッションに対して設定されている場合、セッションは自動フェールオーバーを伴う高い安全性モードで実行されます。 データベースが同期され、ミラー サーバー インスタンスとミラーリング監視が引き続き相互接続している場合 (つまりクォーラムを保持している場合)、プリンシパル サーバーが失われると、セッションでは自動的にフェールオーバーが発生します。 詳細については、「クォーラム: データベースの可用性にミラーリング監視が与える影響 - データベース ミラーリングに関するページを参照してください。
ミラーリング監視がセッションに対して設定されていても、ミラーリング監視サーバーが切断されていると、ミラー サーバーが利用できなくなるためプリンシパル サーバーがダウンします。
SAFETY が FULL に設定され、ミラーリング監視が OFF に設定されている場合、セッションは自動フェールオーバーを伴わない高い安全性モードで実行されます。 ミラー サーバー インスタンスがダウンしても、プリンシパル サーバー インスタンスは影響を受けません。 プリンシパル サーバー インスタンスがダウンした場合、ミラー サーバー インスタンスにサービスの提供を強制的に移行できます (データが損失する可能性があります)。
SAFETY が OFF に設定されている場合、セッションはハイパフォーマンス モードで実行されます。この場合、自動フェールオーバーも手動フェールオーバーもサポートされません。 ただし、ミラー サーバーで発生した問題が、プリンシパル サーバーに影響を及ぼすことはありません。WITNESS が OFF に設定されているか、ミラーリング監視サーバーがミラーに現在接続されているときに、プリンシパル サーバー インスタンスがダウンした場合、必要に応じてミラー サーバー インスタンスにサービスの提供を強制的に移行できます (データが損失する可能性があります)。 サービスの強制の詳細については、前の「FORCE_SERVICE_ALLOW_DATA_LOSS」を参照してください。
重要
ハイパフォーマンス モードは、ミラーリング監視の使用を想定していません。 ただし、SAFETY を OFF に設定した場合は常に、WITNESS も OFF に設定することを強くお勧めします。
SUSPEND: データベース ミラーリング セッションを一時停止します。
SUSPEND は、どちらのパートナー上でも指定できます。
TIMEOUT integer: タイムアウト時間を秒単位で指定します。 タイムアウト時間は、ミラーリング セッションの別のインスタンスからの PING メッセージを受信するために、サーバー インスタンスが待機する最大時間です。この時間を過ぎると、その別のインスタンスは接続解除されたものと見なされます。
TIMEOUT オプションは、プリンシパル サーバー上でのみ指定できます。 このオプションを指定しない場合、この時間は既定で 10 秒に設定されます。 5 以上の値を指定すると、タイムアウト時間は指定した秒数に設定されます。 タイムアウト値に 0 から 4 秒を指定すると、タイムアウト時間は自動的に 5 秒に設定されます。
重要
タイムアウト期間を 10 秒以上にしておくことをお勧めします。 値を 10 秒未満に設定すると、負荷の高いシステムでは PING を受信できず、誤認エラーが示される可能性があります。
詳細については、「 データベース ミラーリング中に発生する可能性のあるエラー」を参照してください。
WITNESS <witness_option> データベースのミラーリング監視を定義するデータベース プロパティを制御します。 SET WITNESS 句は、データベースの両方のコピーに影響しますが、SET WITNESS はプリンシパル サーバー上でのみ指定できます。 ミラーリング監視がセッションに対して設定されている場合にデータベースを使用できるようにするには、SAFETY の設定に関係なく、クォーラムが必要です。詳細については、「クォーラム: データベースの可用性にミラーリング監視が与える影響 - データベース ミラーリングに関するページを参照してください。
ミラーリング監視とフェールオーバー パートナーは、別々のコンピューターに配置することをお勧めします。 ミラーリング監視サーバーの詳細については、「データベース ミラーリング監視サーバー」を参照してください。
SET WITNESS ステートメントを実行するには、プリンシパル サーバー インスタンスおよびミラーリング監視サーバー インスタンスのエンドポイントの STATE が STARTED に設定されている必要があります。 また、ミラーリング監視サーバー インスタンスのデータベース ミラーリング エンドポイントの ROLE は、WITNESS または ALL のいずれかに設定されている必要があります。 エンドポイントの指定方法については、データベース ミラーリング エンドポイントに関するページを参照してください。
サーバー インスタンスのデータベース ミラーリング エンドポイントのロールおよび状態を確認するには、そのインスタンス上で、次の Transact-SQL ステートメントを使用します。
SELECT role_desc, state_desc FROM sys.database_mirroring_endpoints
Note
データベースのプロパティは、ミラーリング監視では設定できません。
<witness_option> ::=
Note
<witness_option> は、SET WITNESS 句ごとに 1 つだけ指定できます。
' witness_server ' データベース ミラーリング セッションのミラーリング監視サーバーとして機能するデータベース エンジンのインスタンスを指定します。 SET WITNESS ステートメントは、プリンシパル サーバー上でのみ指定できます。
SET WITNESS =' <ミラーリング監視サーバー> ' ステートメントでは、<ミラーリング監視サーバー> の構文は、<パートナー サーバー> の構文と同じです。
OFF: データベース ミラーリング セッションから、ミラーリング監視を削除します。 ミラーリング監視を OFF に設定すると、自動フェールオーバーが無効化されます。 データベースが FULL SAFETY に設定され、ミラーリング監視が OFF に設定されている場合、ミラー サーバーに障害が発生すると、プリンシパル サーバーはデータベースを使用不可にします。
解説
例
A. ミラーリング監視を使用したデータベース ミラーリング セッションを作成する
ミラーリング監視を使用したデータベース ミラーリングをセットアップするには、セキュリティを構成し、ミラー データベースを準備し、ALTER DATABASE を使用してパートナーを設定する必要があります。 完全なセットアップ プロセスの例は、データベース ミラーリングの設定に関するページを参照してください。
B. データベース ミラーリング セッションを手動でフェールオーバーする
手動フェールオーバーは、どちらのデータベース ミラーリング パートナーからでも開始できます。 フェールオーバーする前に、現在プリンシパル サーバーであると思われるサーバーが、実際にプリンシパル サーバーであるかどうかを確認する必要があります。 たとえば、AdventureWorks2022
データベースの場合、現在プリンシパル サーバーであると思われるサーバー インスタンスで、次のクエリを実行します。
SELECT db.name, m.mirroring_role_desc
FROM sys.database_mirroring m
JOIN sys.databases db
ON db.database_id = m.database_id
WHERE db.name = N'AdventureWorks2022';
GO
そのサーバー インスタンスが実際にプリンシパルである場合、mirroring_role_desc
の値は Principal
になります。 このサーバー インスタンスがミラー サーバーの場合には、SELECT
ステートメントは Mirror
を返します。
次の例では、そのサーバーが現在のプリンシパルであることを前提としています。
データベース ミラーリング パートナーに手動でフェールオーバーするには、次のステートメントを実行します。
ALTER DATABASE AdventureWorks2022 SET PARTNER FAILOVER; GO
新しいミラーでのフェールオーバーの結果を確認するには、次のクエリを実行します。
SELECT db.name, m.mirroring_role_desc FROM sys.database_mirroring m JOIN sys.databases db ON db.database_id = m.database_id WHERE db.name = N'AdventureWorks2022'; GO
mirroring_role_desc
の現在の値は、Mirror
です。