実際に経験した、SQLServerのレプリケーションに関するトラブルシューティングを1例紹介したいと思います。
突然レプリケーションが止まった、という場合にもし同様の状況であれば、ここで紹介している手順によって解消できる可能性があります。
(自己責任でお願いします)
レプリケーション概要
レプリの種類:トランザクションレプリケーション
push/pull: push
トラブル概要
突然、ログリーダーエージェントがハング。
これによりレプリケーションの遅延が発生。
mslogreader_historyテーブルで↓の警告メッセージを検知したことにより判明。(検知の仕組みを作っていました)
※いくつかのテーブルからのメッセージを検知していたので、もしかしたら違うテーブルかも、、
レプリケーションエージェントでは、進捗状況メッセージが10分間ログに記録されていません。
この現象は、エージェントの応答が止まったか、システムの使用率が高いことを示している場合があります。
レコードがレプリケーション先にレプリケートされていること、およびサブスクライバー、パブリッシャー、ディストリビューターへの接続がアクティブなままであることを確認してください。
ログリーダーまわりのプロセスの実行状況を確認するために、下記クエリを実行
select * from sys.dm_exec_sessions
where [program_name] like '%logreader%'
ログリーダーが二つ?と混乱したけど、こちらは正常な状態らしい。
パブリッシャーに対するプロセスとディストリビューターに対するプロセスとがあって、いわゆるreader-threadとwriter-threadってやつだと思う。
実際、一つのプロセスのdatabase_idはパブリッシャのDBIDを指していて、もう一つのプロセスのdatabase_idはディストリビューションDBのDBIDを指していた。
そして、DBIDがディストリビューションDBであるログリーダープロセスは、open_transaction_countが1であった。また、sys.dm_exec_requestsには該当のIDのレコードが存在しないことから、writer-threadがトランザクションを開きっぱなしで終了してしまったような挙動にみえる。
数十分間ハングしているような挙動にみえたため、手動にてwriter-threadと思われるセッション(database_idがディストリビューションDBとなっているプロセス)をKILLすることで、ログリーダーが正常に稼働し始めて、レプリケーション遅延が解消された。
加えて、必要に応じて ログリーダーAgentジョブの再起動も行うといいかもしれません。
なかなか発生しない事象かと思いますが、万一同様の事象が発生した方への役にたてれば嬉しいです。