In last post I explained how LSN and seqno works. In this one we will focus on the tool that helps you investigate what actually happen with your replication.
Procedure sp_browsereplcmds.
This is one of the most important tools that use while dealing with transactional replication. The parameters that I only use with that proc are:
- @xact_seqno_start
- @xact_seqno_end
- @publisher_database_id
- @article_id
- @command_id
- @agent_id
Where only first three are “obligatory” in order to get some usefull information. For example not providing @xact_seqno_end will get you ALL commands from seqno that u provided as @xact_seqno_start…. and that could ba a LOT!.
Ok lets explain this base on some example. You have transactional replication and one of the agents is failing with “row not found on subscriber” error. Which pretty much means that the data is missing on subscriber… how do you find what exactly is broken? Well as I explained in previous post in most cases you get seqno and command id from replication monitor (from error of dist agent). To get this exact command you need to provide seqno as a start and end range. Also provide publisher database id and to get this id you can get from distribution db:
select * from MSpublisher_databases
In order to narrow down to exact command just add command id. If you want get entire transaction and all commands in given transaction just skip that variable. Here is the example. First I deleted a row on Subscriber and then I tried to update same row on Publisher.
Error:
Updating parameters taken from error above:
exec sp_browsereplcmds @xact_seqno_start='0x0000002400000053000300000000', @xact_seqno_end='0x0000002400000053000300000000', @publisher_database_id=1, --select * from MSpublisher_databases @command_id=1
After running it you will get command that is actually failing.
As you can see this is an Update procedure on TableA. Now you are able to find what exact row is missing. To get exact information about what value is matching what parameter in that update proc just go to Subscriber (and subscriber db) and check the code of that procedure. In our case it will be this:
The good news is that from SQL 2014 SP2 CU2 you won’t need this and all the information about errors you will be able to get from actual error from Replication Monitor. More about that change here (as it may give you some issues if u upgrade your servers in wrong order):
Procedure or function sp_MSreplraiserror has too many arguments specified.
Still it is good to know how to get exact command from distribution database.
2 Replies to “How to “Browse” Distributor (sp_browsereplcmds explained)”