web-dev-qa-db-ja.com

データベースがミラーリング設定のプリンシパルであるかどうかをどのように判断しますか?

2つのデータベースサーバーServer1Server2があり、ミラーリングが構成されています。単一のデータベースMirrorDBがミラーリングされます。 Server1にはOtherDBという名前の別のデータベースがあり、Server1にのみ存在し、ミラーリングされていません。 OtherDBには、MirrorDBのテーブルを参照して値を計算するSP_Zという名前のストアドプロシージャがあります。

Server1MirrorDBのプリンシパルである場合、OtherDBSP_Zストアドプロシージャは完全に機能しますが、MirrorDBServer2にフェイルオーバーしますOtherDBを開くことができないため、MirrorDBSP_Zは失敗します。

この問題を解決するにはどうすればよいですか?

2
Akshay Kulkarni

最初は、エラーが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
2
Vesper

通常、ミラーリングされたデータベースに接続するときは、プリンシパルインスタンスに直接接続するのではなく、以下のリンクで指定されているネイティブクライアントまたはodbcドライバーによって作成された接続を使用します。プリンシパルにアクセスできなかった場合:

クライアントをミラーリングされたデータベースに接続する

直接接続しているようです(リンクサーバー経由で接続していると思いますか???)。

編集:

これについてもう少し調査しました。ミラーリングされたデータベースへのリンクサーバー接続を使用している場合は、以下の記事の手順に従って、データベースミラーリングをサポートするようにリンクサーバーを設定できます。

データベースミラーリングのフェールオーバーをサポートするSQL Serverリンクサーバー

1
steoleary

データベースを切り離す必要がある前に、このスクリプトを一般的に使用しています。ミラーもテストします。

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
0

これは、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
0
avakharia