Wednesday, August 18, 2010

Strømbrudd -> diskhavari -> SQL = merde...

I mine 5 år i bransjen, har jeg opplevd til tider daglig, korrupte SQL-databaser.

Hvorfor skjer dette ?

SQL er en server som genererer mye I/O, og kanskje mest av alt kjent for å konsumere det som er av RAM på maskinen, dersom det ikke er satt opp noe tak for dette.

( Sette MAX RAM til 1GB:

EXEC sys.sp_configure N'show advanced options', N'1' RECONFIGURE WITH OVERRIDE



GO


EXEC sys.sp_configure N'max server memory (MB)', N'1024'


GO


RECONFIGURE WITH OVERRIDE


GO


EXEC sys.sp_configure N'show advanced options', N'0' RECONFIGURE WITH OVERRIDE


GO


)
 
SQL sin måte å forhindre datakorrupsjon på, er 'Page Verify' innstillingen på hver enkelt database. Denne anbefales å sette til Checksum. Dette vil gi deg best sikkerhet, men samtidig ta ørlite mer av maskinens ressurser.
 
Dersom uhellet alikevel er ute, og det har oppstått datakorrupsjon, vil du etter all sansynlighet finne informasjon om dette i errorloggen til SQL-server.
Det kan f.eks gi melding om at databasen ikke kan åpnes siden er er merket 'SUSPECT'. I de verste tilfellene så merker ikke brukeren noe av korrupsjonen, da databasene er online, men samtidig skadet. Mistanken her kommer først når dataene ikke samsvarer med det brukeren faktisk hadde forventet. F.eks negativt resultat i regnskapsrapporter :-)
 
Dette vil man kunne avklare om man kjører en sjekk på databasen:
 
dbcc checkdb ('userdatabase')
 
Denne kommandoen sjekker databasen, og fikser eventuelt moderate feil. Skulle den gi melding om feil som krever ytterligere behandling, bør du krysse det du har om at du har fersk backup.
 
Desverre er ikke dette alltid tilfelle, og man må derfor sette på takstameteret og begynne feilrettingen.
 
Hvordan redde data fra korrupt databaase:
 
Dersom basen er online, kan man gjøre følgende:
 
1. Sette databasen i single_user mode. ( alter database userdatabase set single_user )
2. dbcc checkdb ('userdatabase', 'repair_allow_data_loss') <-- Denne gjør faktisk det du tror
3. dbcc checkdb ('userdatabase') . Kjør denne for å se at den ikke rapporterer flere feil.
4. Sette databasen i multi_user mode. ( alter database userdatabase set multi_user )
5. Databasen er klar til drift.
 
Dersom databasen er merket 'SUSPECT' og man ikke får tilgang:
 
1. Sette databasen i 'nødsituasjon'. alter database userdatabase set emergency
2. Databasen er nå i 'emergency', tilsvarende read-only.
3. BCP...  Bulk Copy Program. Brukes til å eksportere data fra tabeller, og dumpes enten til disk, eller til en ny SQL-database.

Husk: Alltid ha fersk backup. I de tilfellene det ikke er fullversjon av SQL installert, så vil det heller ikke være anledning til å kjøre SSIS-pakker (backupjobber, vedlikehold m.m).
Man kan da enkelt sette opp et .bat-script som gjør denne jobben.

Dette kan kjøres på kveld/nattestid,og kopiere data til filserver, eller annet område.

Net stop mssqlserver /Y
xcopy "c:\program files\microsoft sql server\mssql\data\*.*" P:\backup /C /Y
Net start mssqlserver

No comments: