2つのデータベースサーバーServer1
とServer2
があり、ミラーリングが構成されています。単一のデータベースMirrorDB
がミラーリングされます。 Server1
にはOtherDB
という名前の別のデータベースがあり、Server1
にのみ存在し、ミラーリングされていません。 OtherDB
には、MirrorDB
のテーブルを参照して値を計算するSP_Z
という名前のストアドプロシージャがあります。
Server1
がMirrorDB
のプリンシパルである場合、OtherDB
のSP_Z
ストアドプロシージャは完全に機能しますが、MirrorDB
はServer2
にフェイルオーバーしますOtherDB
を開くことができないため、MirrorDB
のSP_Z
は失敗します。
この問題を解決するにはどうすればよいですか?
最初は、エラーがSP_Z
プロシージャの取得ポイントにあると思っていました。慌ててごめんなさい。
このリンク は、データベースのミラーリングステータスを照会する方法について説明しています。したがって、次のことを行います。
DECLARE @MirroringRole int;
SET @MirroringRole = (SELECT mirroring_role
FROM sys.database_mirroring
WHERE DB_NAME(database_id) = N'DB_X'); -- your database name here
IF @MirroringRole = 2 -- Mirror
-- connect to the failover partner server, using your database
ELSE IF @MirroringRole = 1 -- Principal
-- connect to this server
END IF
通常、ミラーリングされたデータベースに接続するときは、プリンシパルインスタンスに直接接続するのではなく、以下のリンクで指定されているネイティブクライアントまたはodbcドライバーによって作成された接続を使用します。プリンシパルにアクセスできなかった場合:
直接接続しているようです(リンクサーバー経由で接続していると思いますか???)。
編集:
これについてもう少し調査しました。ミラーリングされたデータベースへのリンクサーバー接続を使用している場合は、以下の記事の手順に従って、データベースミラーリングをサポートするようにリンクサーバーを設定できます。
データベースを切り離す必要がある前に、このスクリプトを一般的に使用しています。ミラーもテストします。
USE MASTER
GO
--===========================================================
-- before detaching the database
-- see what files it has and where they are located
-- checks mirror and replication
-- database must not be part of mirror (neither as principal nor mirror) in order to be detached
--===========================================================
SELECT d.name
,f.physical_name
,f.type_desc
,DB_in_Mirror=COALESCE(m.mirroring_role_desc,'Not Part in Mirror') --database must not be part of mirror (neither as principal nor mirror) in order to be detached
,[Size (Gb)]=CAST(f.size/1024.00/1024.00 AS NUMERIC(18,2))
FROM sys.databases d
INNER JOIN SYS.master_files f
ON d.database_id = f.database_id
LEFT OUTER JOIN sys.database_mirroring m
ON d.database_id = m.database_id
where 1 = 1
AND d.state = 0 -- online
AND D.is_published = 0 -- not on replication
AND d.is_subscribed = 0 -- not on replication
AND d.is_merge_published = 0 -- not on replication
AND d.is_distributor = 0 -- not on replication
AND d.name like '%OrderArchive' -- the dbs that i need to detach have OrderArchive at the end of their names
これは、SQLジョブで使用するものです。それが役に立てば幸い。
DECLARE @offline int
SET @offline = (
select state from sys.databases where name = [DATABASE_NAME]
)
If @offline = 0
BEGIN
-- Database is in principal mode
END
Else If @offline = 1
BEGIN
-- Database is in mirrored mode
END