Title:       HOWTO Automatically restart MySQL on Windows
Author:      Emmanuel KARTMANN
Email:       emmanuel@kartmann.org
Environment: VC++ 7.0, Windows 2000/XP
Keywords:    MySQL Windows Service Failure Restart Corrective Action
Level:       Intermediate"
Description: This article provides a small executable (36K) which configure MySQL (or another Windows Service) to automatically restart whenever it fails/crashes.
Section      Platforms
SubSection   Win32 / SDK

Introduction

This article presents a not-so-known feature of Windows 2000 and above: the ability to automatically restart a Windows Service when it crashes. We use this feature to improve reliability of many Services, including MySQL which (alas) sometimes crashes unexpectedly.

Background (optional)

A Windows Service is a specially designed application that can be started automatically at system boot. Windows Services can execute even when no user is logged on to the system. Windows services are usually implemented in C++, but can also be written in any .NET language (C#, VB.NET).

Since Windows 2000, Windows Services support corrective actions - actions to be taken in case of a failure (a Service is considered failed when it terminates without reporting a status of SERVICE_STOPPED to the Service Control Manager).

Whenever a service fails, the Service Control Manager detects it and logs an error in System Event Log:

    The XXX service terminated unexpectedly. It has done this YYY time(s).
    

If the service has an associated corrective action, it logs the following message and executes the corrective action:

    The following corrective action will be taken in ZZZ milliseconds: ACTION
    

Corrective actions can be:

This sample application, written in Visual C++ .NET, uses WIN32 function ChangeServiceConfig2 to configure the MySQL Service to automatically restart in case of failure. It can be called (or integrated) as part of a setup/installation procedure of MySQL on Windows.

Using the application

You can run the application from the command line prompt (CMD.EXE):

C:\> MySQLServiceSetCorrectiveActions.exe
SUCCESS: Configuration for Service "MySQL" changed!

You can use the application to configure another service, e.g. W3SVC (IIS):

C:\> MySQLServiceSetCorrectiveActions.exe W3SVC
SUCCESS: Configuration for Service "W3SVC" changed!

You can use the application to call your own recovery program (even a batch) in case of failure:

C:\> MySQLServiceSetCorrectiveActions.exe MySQL "CMD.EXE /C C:\mybatch.bat"
SUCCESS: Configuration for Service "MySQL" changed!

And you can also clear the corrective action by passing an empty string as the 2nd parameter:

C:\> MySQLServiceSetCorrectiveActions.exe MySQL ""
SUCCESS: Configuration for Service "MySQL" changed!

Points of Interest

There is no such thing as bug-free code - Windows Services are no exception. Since most Services provide vital functionality to an application, they must be up and running 24/7. This lack of auto-restart feature in Services was a severe deficiency in Windows (compared to UNIX where inetd - among others - as been here for ages to automatically start/restart daemon processes). Now it's over - but not so popular or well-known. Let's make tools integrate the right system calls into all services - why not directly into all installation programs for services ?

History

V1.0: May 3rd, 2005