Ausgangssituation
Wir entwickeln ein System mit einer umfangreichen Datenbank im unteren Bereich. Es ist eine MS SQL-Datenbank, die unter SQL Server 2008 R2 ausgeführt wird. Die Gesamtgröße der Datenbank beträgt ca. 12 GB.
Von diesen befinden sich ungefähr 8,5 GB in einer einzelnen Tabelle BinaryContent
. Wie der Name schon sagt, ist dies eine Tabelle, in der wir einfache Dateien aller Art direkt als BLOB in der Tabelle speichern. Kürzlich haben wir die Möglichkeit getestet, alle diese Dateien mit FILESTREAM aus der Datenbank in das Dateisystem zu verschieben.
Wir haben die notwendigen Änderungen an unserer Datenbank ohne Probleme vorgenommen und unser System funktioniert auch nach der Migration noch einwandfrei. Die BinaryContent
Tabelle sieht ungefähr so aus:
CREATE TABLE [dbo].[BinaryContent](
[BinaryContentID] [int] IDENTITY(1,1) NOT NULL,
[FileName] [varchar](50) NOT NULL,
[BinaryContentRowGUID] [uniqueidentifier] ROWGUIDCOL NOT NULL
) ON [PRIMARY] FILESTREAM_ON [FileStreamContentFG]
ALTER TABLE [dbo].[BinaryContent] ADD [FileContentBinary] [varbinary](max) FILESTREAM NULL
ALTER TABLE [dbo].[BinaryContent] ADD CONSTRAINT [DFBinaryContentRowGUID] DEFAULT (newsequentialid()) FOR [BinaryContentRowGUID]
Alles, was sich in der PRIMARY
Dateigruppe befindet, mit Ausnahme des Felds, FileBinaryContent
das sich in einer separaten Dateigruppe befindet FileStreamContentFG
.
Szenario
Aus Entwicklersicht möchten wir häufig eine neue Kopie der Datenbank aus unserer Produktionsumgebung, um die neuesten Daten verarbeiten zu können. In diesen Fällen interessieren uns die in BinaryContent (jetzt mit FILESTREAM) gespeicherten Dateien nur selten .
Wir haben dies fast so, wie wir möchten. Wir sichern die Datenbank ohne den folgenden Dateistream:
BACKUP DATABASE FileStreamDB
FILEGROUP = 'PRIMARY'
TO DISK = 'c:\backup\FileStreamDB_WithoutFS.bak' WITH INIT
Und stellen Sie es wie folgt wieder her:
RESTORE DATABASE FileStreamDB
FROM DISK = 'c:\backup\FileStreamDB_WithoutFS.bak'
Dies scheint in Ordnung zu sein, und unser System funktioniert, solange wir die Teile meiden, die das FileBinaryContent
Feld verwenden. Wir können zum Beispiel die folgende Abfrage problemlos ausführen:
SELECT TOP 10 [BinaryContentID],[FileName],[BinaryContentRowGUID]
--,[FileContentBinary]
FROM [dbo].[BinaryContent]
Wenn ich die obige Zeile einschließlich FileContentBinary
der Abfrage auskommentiere, erhalte ich natürlich eine Fehlermeldung:
LOB-Daten (Large Object) für die Tabelle "dbo.BinaryContent" befinden sich in einer Offlinedateigruppe ("FileStreamContentFG"), auf die nicht zugegriffen werden kann.
Unser System verarbeitet Dateien, auf die der Inhalt eingestellt ist. null
Ich möchte also Folgendes tun:
UPDATE [dbo].[BinaryContent]
SET [FileContentBinary] = null
Aber das gibt mir natürlich den gleichen Fehler wie oben. An diesem Punkt stecke ich fest.
Frage
Kann ich die Datenbank auf irgendeine Weise wiederherstellen, ohne auch alles aus der FileStreamContentFG
Dateigruppe wiederherstellen zu müssen ? Entweder durch Aktualisieren der Werte auf Null, wie ich es oben versuche, oder standardmäßig auf Null, wenn die Datei fehlt oder so?
Oder gehe ich das Problem vielleicht falsch an?
Ich bin von Natur aus ein Entwickler und habe nicht viel Wissen als DBA. Entschuldigen Sie mich, wenn ich hier etwas Triviales übersehen habe.
quelle
Antworten:
Was Sie versuchen, würde die Datenbank in einem (transaktionsbedingt) inkonsistenten Zustand belassen, daher ist dies nicht möglich.
Das Whitepaper zur Verfügbarkeit von Teildatenbanken ist ein nützliches Referenzhandbuch und enthält ein Beispiel für die Überprüfung, ob eine bestimmte Tabelle oder Datei online ist. Wenn Ihr Datenzugriff über gespeicherte Prozeduren erfolgt, können Sie diese Prüfung relativ einfach einbauen.
Ein alternativer (aber etwas hackiger) Ansatz, der in Ihrem Szenario einen Blick wert sein könnte, besteht darin, die Tabelle auszublenden und durch eine Ansicht zu ersetzen.
quelle
Sie können die Tabelle mit einem
FILESTREAM
in einer separaten Datenbank isolieren undPRODUCTION
mithilfe einer Ansicht einen Verweis auf sie in der Datenbank erstellen .Auf diese Weise können Sie tun, was Sie möchten, ohne auf Hacks zurückgreifen zu müssen.
quelle