RECOVERY_PENDING, wat nu?

Deze morgen werd ik geconfronteerd met een database welke niet beschikbaar was. De status stond op "RECOVERY_PENDING" Wat was de oorzaak hiervan en vooral: hoe los ik dit op?

De database was onderdeel van een sharepoint farm en betrof een ontwikkel server. Dit laatste scheelt al aardig wat telefoontjes, want als een produktie website eruit ligt hadden we dit allang geweten!

Database statussen

Een database kan verschillende statussen hebben, grofweg in te delen in beschikbaar en niet beschikbaar. Als een database niet beschikbaar is, kan dit verschillende oorzaken hebben zoals een hardware failure of een volle disk. In dat geval zal de database de status SUSPECT krijgen en kan met het DBCC commando uitgezocht worden waar de fout ligt.

De status van de database is op te vragen met de volgende query:
select name, state_desc
from master.sys.databases

RECOVERY_PENDING

Deze status is een bijzondere. Eigenlijk wil deze status zeggen dat SQL de status niet kan bepalen. Als SQL server start worden alle databases gecontroleerd voordat ze online worden gebracht. Dit proces heet recovery. Je kunt dit proces volgen in de errorlog:
2012-01-03 07:56:15.90 spid7s      Server name is '******'. This is an informational message only. No user action is required.
2012-01-03 07:56:15.90 spid7s      Informational: No full-text supported languages found.
2012-01-03 07:56:15.90 spid14s     Starting up database 'ReportServer'.
2012-01-03 07:56:15.90 spid11s     Starting up database 'msdb'.
2012-01-03 07:56:15.90 spid15s     Starting up database 'ReportServerTempDB'.
2012-01-03 07:56:15.90 spid24s     Starting up database 'AdventureWorksDW2008R2'.
2012-01-03 07:56:15.90 spid26s     Starting up database 'AdventureWorks'.
2012-01-03 07:56:15.90 spid25s     Starting up database 'AdventureWorksLT2008R2'.
2012-01-03 07:56:15.90 spid20s     Starting up database 'Sandbox'.
2012-01-03 07:56:15.91 spid27s     Starting up database 'AdventureWorksDW'.
2012-01-03 07:56:15.91 spid28s     Starting up database 'AdventureWorksLT'.
2012-01-03 07:56:15.95 spid10s     Clearing tempdb database.
2012-01-03 07:56:16.01 spid15s     CHECKDB for database 'ReportServerTempDB' finished without errors on 2011-10-09 20:46:32.953 (local time). This is an informational message only; no user action is required.
2012-01-03 07:56:16.02 spid14s     CHECKDB for database 'ReportServer' finished without errors on 2011-10-09 20:46:32.777 (local time). This is an informational message only; no user action is required.
...
2012-01-03 07:56:16.19 spid11s     The Service Broker protocol transport is disabled or not configured.
2012-01-03 07:56:16.19 spid11s     The Database Mirroring protocol transport is disabled or not configured.
2012-01-03 07:56:16.19 spid11s     Service Broker manager has started.
2012-01-03 07:56:16.20 spid7s      Recovery is complete. This is an informational message only. No user action is required.
Als de recovery om wat voor reden dan ook niet uitgevoerd kan worden, wordt de status op RECOVERY_PENDING gezet. Deze status wil dus niet zeggen dat de database corrupt is (dat weet SQL nog niet); het online brengen van de database lukt niet. Een veel voorkomende oorzaak is het ontbreken van de logfile.

Oplossing

De eenvoudigste methode om deze fout op te lossen is om een actuele backup terug te zetten, maar dat kan bij grote databases tijdrovend zijn. Ook een herstart van SQL Server lost het probleem (meestal) op, maar dat kan niet zomaar uitgevoerd worden. Als alle datafiles van de probleemdatabase aanwezig zijn en onbeschadigd lijken, is de volgende truuk een snellere optie: het OFFLINE en daarna weer ONLINE brengen van deze database. Bij het online brengen van de database wordt een recovery gestart en dus alsnog uitgevoerd.

reddingsboek.jpg
Het is altijd verstandig een actuele backup van de database te hebben. Mochten er problemen gedetecteerd worden tijdens het online brengen, dan kan altijd een backup terug gezet worden.

Samenvatting

RECOVERY_PENDING hoeft niet te betekenen dat een database corrupt is. Als alle datafiles intact lijken te zijn is het OFFLINE en daarna weer ONLINE brengen van de probleemdatabase een handig alternatief.

Blijft natuurlijk de vraag waarom deze database niet online kwam. De oorzaak was een bug in SQL. De SQL versie was niet bijgebracht tot het laatste patchlevel. Dat ga ik zo snel mogelijk doen!