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: hetOFFLINE en daarna weer ONLINE brengen van deze database. Bij het online brengen van de database wordt een recovery gestart en dus alsnog uitgevoerd.| 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!
