![]() |
|

Identify and resolve SQL Server problems before they happen
|
|
By: Greg Robidoux | Read Comments (16) | Related Tips: More > Database Mirroring |
Problem
Database Mirroring was released with SQL Server 2005 and is becoming a popular choice for a failover solution. One of the big issues with Database Mirroring is that the failover is tied to one database, so if there is a database failure the mirrored server takes over for this one database, but all other databases remain functional on the primary server. The drawback is that more and more applications are being built where multiple databases make up the application, so if only one of the databases fails over the other database will still be functional on the principal server, but the application won't work. How can I be notified when this happens and make all of the databases failover?
Solution
As with just about all functions in SQL Server, there is a way to get alerts or check for events that occur when a database mirroring failure occurs. Unfortunately this event notification for Database Mirroring is not as straight forward as you would think, but it can be done.
For database mirroring you have the choice of using trace events or you can setup a SQL Server Alert to check for a WMI (Windows Management Instrumentation) event for Database Mirroring state changes. Before we get started there are a few things you need to do:
Preliminary Steps
The mirrored databases and the msdb database must have service broker enabled. This can be checked with this query
| SELECT name, is_broker_enabled FROM sys.databases |
If the service broker value is not set to 1 you can turn this on by issuing this command for each database.
| ALTER DATABASE msdb SET ENABLE_BROKER |
If SQL Server Agent is running this command will not complete, so you will need to stop SQL Server Agent, run the above command and then start SQL Server Agent again.
Lastly, if SQL Server Agent is not running you will need to start it.
Creating the Alert
To setup the alert we are going to do this just like any other alert, but we are going to be using the "WMI event alert" type.
To create the alert expand the SQL Server Agent tree and right click Alerts and select "New Alert".

On the New Alert screen we are going to change the type to "WMI event alert". Another thing that you will notice is the Namespace that is being queried. By default SQL Server will select the correct namespace based on the instance of SQL Server you are working with.

For the query we are using the following:
| SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 7 OR State = 8 |
This data is read from WMI and whenever the database mirroring state changes to either 7 (manual failover) or 8 (automatic failover) the job or notification will be fired.
In addition, you can further define the query for a particular database such as:
| SELECT * FROM DATABASE_MIRRORING_STATE_CHANGE WHERE State = 8 AND DatabaseName = 'Test' |
For additional information you can read about DATABASE_MIRRORING_STATE_CHANGE in books online.
Below is a list of the different state changes that can be monitored. Additional information can be found here Database Mirroring State Change Event Class.
On the Response screen we can setup how to handle this event when it occurs. You can either setup a job that runs when the Alert is fired and/or a notification to an operator that has been setup.

Lastly, you can setup additional options for the alert as shown below.

Example Setup
So let's say you have three databases (Customer, Orders, Log) that are part of an application and if one of the databases automatically fails over you want the other two databases to failover as well. In addition, this mirroring setup includes a Witness server so if a failure occurs the failover is automatic.
Here is how this could be setup.
First we setup the Alert to look at just these three databases.

Then we tell the alert which job to run.

Then we need to create the job "Failover Databases" which will be run when this alert is fired.
For the SQL Agent job "Failover Databases" the jobs steps would look something like the following:
| IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Customer' AND mirroring_role_desc = 'PRINCIPAL') ALTER DATABASE Customer SET PARTNER FAILOVER GO IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Orders' AND mirroring_role_desc = 'PRINCIPAL') IF EXISTS (SELECT 1 FROM sys.database_mirroring WHERE db_name(database_id) = N'Log' AND mirroring_role_desc = 'PRINCIPAL') |
The ALTER DATABASE command above forces the failover to the mirrored server for the other databases that did not automatically get flipped. This is the same as if you clicked on the "Failover" button in the GUI.
Next Steps
| Wednesday, August 20, 2008 - 7:02:04 AM - yaarrabba | Read The Tip |
|
Good article. You didn't mention about the role of witness server. Are you saying that witness server is not needed if service brooker is enabled? Thanks, |
|
| Wednesday, August 20, 2008 - 7:05:31 AM - grobido | Read The Tip |
|
For Automatic failover to occur you need to have a Witness Server. In order to use the WMI events you have to have Service Broker enabled on the msdb database regardless if you have a Witness Server or not. If you do not have a Witness Server you could still take advantage of this process, so if you do a manual failover, the event will fire and failover all of your other databases as well.
|
|
| Wednesday, August 20, 2008 - 8:59:20 AM - yaarrabba | Read The Tip |
|
Makes sense. Thanks a lot for clarification and this nice article. |
|
| Monday, September 08, 2008 - 9:50:47 AM - ASiddiqui | Read The Tip |
|
I got it working. Had a problem with the query, can not all TSQL commands. <<< I had a question regarding object DATABASE_MIRRORING_STATE_CHANGE. I have broken enabled on msdb, along with the mirrored dbs. But I can not query the above object. I assume I am missing a setting, but reading through the article, it does not specify any thing additional to broker. >>>> |
|
| Sunday, September 14, 2008 - 2:22:29 PM - Imran Mohammed | Read The Tip |
|
Man... You are too good... I feel like I am doing clustering. This is really nice. |
|
| Monday, March 16, 2009 - 3:39:24 PM - Dinga | Read The Tip |
|
Thanks, this is a great article. I am trying to just get notfications but they are not coming through. Service broker is enabled and I know the operator is set correctly and works. I cannot query the wmi directly using scriptomatic. Do the databases need to be in a particular compatibility mode as mine need to be set to 80. Looking at the history of the job it is incrementing when I fail over the databses. Any help is appreciated |
|
| Tuesday, July 28, 2009 - 8:45:54 AM - AdrianSims | Read The Tip | ||||||
|
This without doubt is a very good article, and I used this to good effect for some time. However the other week, I encountered a problem when the WMI Alert did NOT fire on an automatic failover. I am confused Why it worked in the past !!!! From http://msdn.microsoft.com/en-us/library/cc966392.aspx
Restrictions On a 32-bit system, database mirroring can support a maximum of about 10 databases per server instance because of the numbers of worker threads that are consumed by each database mirroring session.
Adrian |
|||||||
| Tuesday, August 28, 2012 - 10:45:28 AM - Lee | Read The Tip |
|
I have created this alert but when I get the email there is no information included about what database failed over. Is there anyway to see that in the email without having to have the alert trigger a job? |
|
| Wednesday, November 14, 2012 - 1:05:11 PM - Hector | Read The Tip |
|
I've got this job setup for about 12 databases, the job triggers fine but roughly only 9 of the DBs move accross, the other 3 DBs don't make it accross. I've double checked and they all have service broker enabled. It's random, it could be any 3 dbs that don't make it. Some DBs even go into suspend mode. Could the job triggering 12 times be too much? |
|
| Friday, March 01, 2013 - 12:05:24 PM - Patel | Read The Tip |
|
Greg, please help me on Database Mirroring and Log shipping. How many database we can Configure Mirroing or log shipping per instance we having around 100 + databases on one instance and we are runnig two instance on One server in Prod.
Thanks In advance ...... |
|
| Friday, March 01, 2013 - 1:37:19 PM - Greg Robidoux | Read The Tip |
|
@Patel - 100 databases will be too many to use database mirroring. Your best bet would be to use log shipping for that many databases. Database Mirroring will put too much overhead on your servers. |
|
| Tuesday, March 05, 2013 - 7:28:50 PM - Brian Jacobs | Read The Tip |
|
Greg, I am getting a permissions error when trying to create an alert for the recommended database failover job. I have read that you need to assign permissions to the WMI but to which user - the SQL Agent? Thank you for your answer in advance. |
|
| Tuesday, March 05, 2013 - 7:36:13 PM - Brian Jacobs | Read The Tip |
|
My apologies, I left the error code off in my previous post: Cannot create the event notification 'SQLWEP_9F541C30_EF29_4B93_B9B3_21C09E57D610', because you do not have permission. Thank you again. |
|
| Wednesday, March 06, 2013 - 8:29:51 AM - Greg Robidoux | Read The Tip |
|
Hi Brian, to access the WMI information the account being used would need to have permissions to read the WMI data. See if this post helps with your permission issue. |
|
| Wednesday, March 06, 2013 - 8:30:20 AM - Greg Robidoux | Read The Tip |
|
Sorry, here is the link: http://social.technet.microsoft.com/Forums/en-SG/operationsmanagergeneral/thread/0f2c24a8-2252-4219-acd7-a526e1935f1f |
|
| Wednesday, March 06, 2013 - 5:55:59 PM - Brian Jacobs | Read The Tip |
|
Thank you Greg for the reply. That seems to have cleared the issue. I have just one more question: Is there a way to customize the e-mail alert message you receive to show the database name? Mine looks like this: SQL Server Alert System: 'Database Mirroring Check - Auto Failover' occurred on \\ ...and I would like to show the database name at the end. Thank you again for your expertise.
|
|
|
privacy | disclaimer | copyright | advertise | about authors | contribute | feedback | giveaways | user groups Some names and products listed are the registered trademarks of their respective owners. Edgewood Solutions LLC | MSSharePointTips.com | MSSQLTips.com |