Datenbanken können auch teilweise online sein. Im Falle eines Defekts an einer Datenbankdatei kann diese auf Offline gesetzt werden. Die Datenbank kann in diesem Fall weiter betrieben werden. Das bedeutet, dass INS, UP und DEL Statements weiterhin funktionieren, zumindest solange nicht auf die fehlende Datei bzw Dateigruppe zugegriffen werden müsste (Z.B Indizes liegen auf den betroffenen Offline Dateien).
Hier ein Beispiel, wie ein Teil einer DB Offline gesetzt wird.
--DB mit mehreren Dateien und Dateigruppen
CREATE DATABASE [DBPart]
ON PRIMARY
( NAME = N'DBPart', FILENAME = N'C:_SQLDBDBPart.mdf' , SIZE = 5120KB , FILEGROWTH = 1024KB ),
FILEGROUP [KUNDEN]
( NAME = N'kundendaten', FILENAME = N'C:_SQLDBkundendaten.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB ),
FILEGROUP [UMSATZ]
( NAME = N'Umsatzdaten', FILENAME = N'C:_SQLDBUmsatzdaten.ndf' , SIZE = 5120KB , FILEGROWTH = 1024KB )
LOG ON
( NAME = N'DBPart_log', FILENAME = N'C:_SQLDBDBPart_log.ldf' , SIZE = 1024KB , FILEGROWTH = 10%)
GO
USE [DBPart]
GO
..ein Paar Datensätze
create table kunden (id int identity, name varchar(50)) on KUNDEN
insert into kunden values ('Huber'), (Maier)
create table Umsaetze (id int identity, sp1 varchar(50)) on UMSATZ
insert into umsaetze values ('##1'), ('sdsd')
Nun wird es wichtig. Es müssen Sicherung der Dateigruppen / Dateien vorliegen. Das geht natürlich im SSMS besonders leicht.
Nun kann man mit folgenden Befehl Teile der DB Offline setzen. Allerdings sollte das nicht die Primary Dateigruppe betreffen. Diese wird auf jeden Fall gebraucht! Ohne diese, keine DB!
Offline setzen einer Datenbankdatei
alter database DBPart
modify file (name = N'Umsatzdaten', OFFLINE)
go
alter database DBPart
set online
--geht
insert into kunden values ('RAUCH'), ('MAIER')
--geht nicht
insert into umsaetze values ('##1'), ('sdsd')
Würde man nun allerdings versuchen die Datenbank wiederherzustellen, hätte man mehrere Problem. Einerseits könnten Inkonsistenzen entstehen, da ja nur ein Teil der DB wiederhergestellt wird, aber aufgrund eines referentiellen Integrität zu Fremdschlüsseln die passenden Primarschlüsselwerte fehlen würden. Auf der anderen Seite würde man Daten verlieren, da man eine alte Sicherung zurückspielt und bis dahin schon einige neue Datensätze hinzugefügt bzw. verändert wurden. Daher ist eine Logfile Sicherung dringend und unbedingt notwendig.
Daher unbedingt das Logfile sichern! (am besten natürlich regelmäßig). Also auch nach dem Verlust bzw Offline setzen der betroffenen Datenbankdatei!
Wer dies nicht gemacht hat bekommt in der Regel den Fehler 8653:
Msg 8653, Level 16, State 1, Line 3
The query processor is unable to produce a plan for the table or view ‚X‘ because the table resides in a filegroup which is not online.
Restore der Datenbankdateien
Nun sollten alle Tabellen wieder zu Verfügung stehen.
Nur der Restore kann eine Offline gesetzte Datei /Dateigruppe wieder auf Online bringen.
That’s it!