Was ist die Backup Database ?
Verfasst: 2. Apr 2010, 20:49
Nachdem der Client-Backup und die Backup-Database in letzter Zeit häufig Thema von Threads war möchte ich im Folgenden meine bisherige Erkenntnisse mit euch teilen
Vorab: die Backup Database ist keine Datenbank im klassischen Sinn, sondern eine Menge von Dateien in dem Verzeichnis D:\folders\{00008086-058D-4C89-AB57-A7F909A47AB4}
Client unabhängig:
Für jeden Client:
Für jede Partition jedes Clients
Bei manchen Clients zusätzlich:
Wobei der Clientname Name ggf. mit -1, -2, ... ergänzt wird wenn derselbe Name für unterschiedliche GUIDs gefunden wird
Für die Partitionsbezeichnung LW habe ich bisher entweder den Laufwerksbuchstaben oder PQSERVICE
In den Datenfiles ist XML-artig die Struktur des Inhaltes abgelegt .. leider stimmt diese Information nicht immer 100 %
commit.dat
Control.4096.dat
Data.4096.n.dat
GlobalCluster.4096.dat
Die Datei besteht aus dem Header von 4096 Byte, in dem einige Pointer und die o.a. Beschreibung stehen.
Danach folgen Sätze von 262.144 Byte Länge (256 KByte) in denen eine Datenstruktur wie oben beschrieben wurde zu erkennen ist: 16 Byte für den Hash und eine variable Anzahl Byte für den DataIndex, welcher vermutlich ein Index in die zugehörige Data.4096.nnn.dat ist. Interessanterweise sind entweder die gerade Satznummer oder die ungeraden Satznummer gültig, d.H. der Satz 1 wird gelesen, geändert und dann als Satz 2 geschrieben, Satz 3 wird gelesen und dann als Satz 4 geschrieben. Bei der nächsten Sicherung wird Satz 2 gelesen, geändert und als Satz 1 geschrieben, Satz 4 gelesen und als Satz 3 geschrieben (natürlich stark vereinfacht ohne Berücksichtigunge von Löschungen oder Einfügungen).
Wo man erfahren kann ob geraden oder ungeraden Sätze gültig sind ist unklar, ebenso ist noch unklar wie die Übergänge zwischen den 256 KByte-Sätzen behandelt werden.
Die Hash-Werte findet man in den Sätzen aufsteigend von 00 .. 00 bis FE .. FF
GlobalClusterLatest.4096.dat
Index.4096.dat
{GUID}.Machine.configdat
Name.VolumeConfig.configdat
Name.BackupSet.Dat
Name.LW.Volume.dat
Name.LW.VolumeCluster.4096.dat
Name.LW.FileRecordHash.4096.dat
Name.LW.Boot.dat
Ich werde noch weitere Informationen hinzufügen ... bei Anmerkungen oder Ergänzungen bitte PN senden
Vorab: die Backup Database ist keine Datenbank im klassischen Sinn, sondern eine Menge von Dateien in dem Verzeichnis D:\folders\{00008086-058D-4C89-AB57-A7F909A47AB4}
Client unabhängig:
Name | Beschreibung | Größe |
Commit.dat | vermutlich ein Semaphore | 7680 |
Control.4096.dat | Verwaltung der Datenfiles ?? | 4096 |
Data.4096.n.dat ..... n = (0, 1, 2, ) | die gesicherten Cluster | bis zu 4 GB |
GlobalCluster.4096.dat | var. (>8 GB) | |
GlobalClusterLatest.4096.dat | ?? | 14336 |
Index.4096.dat | var. (>2 GB) |
{GUID}.Machine.configdat | beschreibt den Client | 4608 |
Name.VolumeConfig.configdat | beschreibt die Partitionen des Clients | 4608 |
Name.BackupSet.Dat | Auflistung aller vorhandenen Sicherungen für diesen Client | > 4608 |
Name.LW.Volume.dat | Informationen zu allen Sicherungen dieser Partition | var. |
Name.LW.VolumeCluster.4096.dat | var. groß | |
Name.LW.FileRecordHash.4096.dat | Hash-Codes der File-Sätze im $MFT | var. |
Wenn Partition Bootpartition ist: Name.LW.Boot.dat | MBR der Partition | 5120 oder 5632 |
Bei manchen Clients zusätzlich:
Name.LW.VolumeClusterLatest1.4096.dat | var. groß | |
Name.LW.VolumeClusterLatest2.4096.dat | var. | |
Name.LW.VolumeClusterLatest3.4096.dat | var. |
Wobei der Clientname Name ggf. mit -1, -2, ... ergänzt wird wenn derselbe Name für unterschiedliche GUIDs gefunden wird
Für die Partitionsbezeichnung LW habe ich bisher entweder den Laufwerksbuchstaben oder PQSERVICE
In den Datenfiles ist XML-artig die Struktur des Inhaltes abgelegt .. leider stimmt diese Information nicht immer 100 %
commit.dat
Code: Alles auswählen
<File Type="Commit">
<Header>
<Field Type=""boolean"" Name=""Committed"" />
</Header>
<Record>
<Field Type=""string"" Name=""FileName"" />
<Field Type=""int"" Name=""StreamIndex"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Control">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""NextIndex"" />
<Field Type=""int"" Name=""NextDataOffset"" />
</Header>
</File>
Code: Alles auswählen
<File Type="Data">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""Index"" />
<Field Type=""int"" Name=""DataSize"" />
</Header>
</File>
Code: Alles auswählen
<File Type="GlobalCluster">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
</Header>
<Record>
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
<Field Type=""int"" Name=""DataIndex"" />
</Record>
</File>
Danach folgen Sätze von 262.144 Byte Länge (256 KByte) in denen eine Datenstruktur wie oben beschrieben wurde zu erkennen ist: 16 Byte für den Hash und eine variable Anzahl Byte für den DataIndex, welcher vermutlich ein Index in die zugehörige Data.4096.nnn.dat ist. Interessanterweise sind entweder die gerade Satznummer oder die ungeraden Satznummer gültig, d.H. der Satz 1 wird gelesen, geändert und dann als Satz 2 geschrieben, Satz 3 wird gelesen und dann als Satz 4 geschrieben. Bei der nächsten Sicherung wird Satz 2 gelesen, geändert und als Satz 1 geschrieben, Satz 4 gelesen und als Satz 3 geschrieben (natürlich stark vereinfacht ohne Berücksichtigunge von Löschungen oder Einfügungen).
Wo man erfahren kann ob geraden oder ungeraden Sätze gültig sind ist unklar, ebenso ist noch unklar wie die Übergänge zwischen den 256 KByte-Sätzen behandelt werden.
Die Hash-Werte findet man in den Sätzen aufsteigend von 00 .. 00 bis FE .. FF
GlobalClusterLatest.4096.dat
Code: Alles auswählen
<File Type="GlobalClusterLatest">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""VolumeGuid"" />
<Field Type=""string"" Name=""MachineFile"" />
<Field Type=""string"" Name=""VolumeFile"" />
<Field Type=""int"" Name=""Version"" />
</Header>
<Record>
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
<Field Type=""int"" Name=""DataIndex"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Index">
<Header>
<Field Type=""int"" Name=""BytesPerCluster"" />
</Header>
</File>
Code: Alles auswählen
<File Type="Machine">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
</Header>
<Record>
<Field Type=""string"" Name=""FileName"" />
<Field Type=""string"" Name=""MachineName"" />
<Field Type=""string"" Name=""Description"" />
<Field Type=""string"" Name=""Manufacturer"" />
<Field Type=""string"" Name=""Model"" />
<Field Type=""string"" Name=""IpAddress"" />
<Field Type=""binary"" Name=""MacAddress"" />
<Field Type=""boolean"" Name=""IsConfigured"" />
<Field Type=""boolean"" Name=""AllVolumesConfigured"" />
<Field Type=""boolean"" Name=""AnyVolumesIncluded"" />
<Field Type=""boolean"" Name=""AnyVolumesEligible"" />
<Field Type=""boolean"" Name=""JobsExist"" />
<Field Type=""int"" Name=""LastGoodBackupTime"" />
<Field Type=""int"" Name=""LastStatus"" />
<Field Type=""int"" Name=""DiskUsed"" />
</Record>
</File>
Code: Alles auswählen
<File Type="VolumeConfig">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
</Header>
<Record>
<Field Type=""fixedbinary"" Length=""16"" Name=""Guid"" />
<Field Type=""varbinary"" Name=""UniqueId"" />
<Field Type=""string"" Name=""MountPoint"" />
<Field Type=""string"" Name=""VolumeLabel"" />
<Field Type=""int"" Name=""Capacity"" />
<Field Type=""int"" Name=""BytesUsed"" />
<Field Type=""string"" Name=""FileSystem"" />
<Field Type=""int"" Name=""BytesPerSector"" />
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""Location""/>
<Field Type=""int"" Name=""BytesUsedForBackups"" />
<Field Type=""int"" Name=""Status"" />
<Field Type=""boolean"" Name=""IsEligibleForBackup"" />
<Field Type=""int"" Name=""DiskSignature"" />
<Field Type=""int"" Name=""Partition"" />
<Field Type=""boolean"" Name=""BackupsExist"" />
<Field Type=""int"" Name=""ExcludedFolderCount"" />
<Field Type=""string"" Occurs=""ExcludedFolderCount"" Name=""ExcludedFolder"" />
<Field Type=""string"" Name=""File"" />
</Record>
</File>
Name.BackupSet.Dat
Code: Alles auswählen
<File Type="BackupSet">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
</Header>
<Record>
<Field Type=""int"" Name=""Index"" />
<Field Type=""int"" Name=""Timestamp"" />
<Field Type=""int"" Name=""Duration"" />
<Field Type=""int"" Name=""BytesUsed"" />
<Field Type=""boolean"" Name=""IsAutomatic"" />
<Field Type=""string"" Name=""Description"" />
<Field Type=""int"" Name=""Status"" />
<Field Type=""int"" Name=""Retention"" />
<Field Type=""int"" Name=""VolumeCount"" />
<Field Type=""struct"" Occurs=""VolumeCount"" Name=""Volume"">
<Field Type=""fixedbinary"" Length=""16"" Name=""Guid"" />
<Field Type=""string"" Name=""Name"" />
</Field>
<Field Type=""int"" Name=""FailureReason"" />
<Field TYpe=""stringarray"" Name=""FailureDetails"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Volume">
<Header>
<Field Type="fixedbinary" Length="16" Name="MachineGuid"/>
<Field Type="binary" Length="16" Name="VolumeGuid"/>
</Header>
<Record>
<Field Type="int" Name="BackupSetIndex"/>
<Field Type="int" Name="Version"/>
<Field Type="varbinary" Name="UniqueId"/>
<Field Type="string" Name="MountPoint"/>
<Field Type="string" Name="VolumeLabel"/>
<Field Type="string" Name="FileSystem"/>
<Field Type="int" Name="BytesPerSector"/>
<Field Type="int" Name="BytesPerCluster"/>
<Field Type="int" Name="StartTime"/>
<Field Type="int" Name="Duration"/>
<Field Type="int" Name="OriginalVolumeBytes"/>
<Field Type="int" Name="MinimumRestoreBytes"/>
<Field Type="int" Name="ClusterCount"/>
<Field Type="int" Name="ChangedClusterCount"/>
<Field Type="int" Name="HashesReceivedCount"/>
<Field Type="int" Name="NewClusterCount"/>
<Field Type="int" Name="Status"/>
<Field Type="boolean" Name="IsActive"/>
<Field Type="struct" Name="AutoExclusionSizes" >
<Field Type="int" Name="ClientSideCache"/>
<Field Type="int" Name="TemporaryFiles"/>
<Field Type="int" Name="DigitalVideoRecorder"/>
<Field Type="int" Name="PageFile"/>
<Field Type="int" Name="RecycleBin"/>
<Field Type="int" Name="HibernationFile"/>
<Field Type="int" Name="MemoryDump"/>
<Field Type="int" Name="ShadowVolumes"/>
<Field Type="int" Name="Other"/>
</Field>
<Field Type="int" Name="ExcludedFoldersCount"/>
<Field Type="struct" Occurs="ExcludedFoldersCount" Name="ExcludedFolders" >
<Field Type="string" Name="Name"/>
<Field Type="int" Name="Size"/>
<Field Type="boolean" Name="IsAutoExcluded"/>
</Field>
<Field Type="int" Name="BadFilesCount"/>
<Field Type="struct" Name="BadFile" >
<Field Type="string" Name="Name"/>
<Field Type="int" Name="Size"/>
</Field>
<Field Type="int" Name="MbrIndex"/>
<Field Type="int" Name="DiskSignature"/>
<Field Type="int" Name="Partition"/>
<Field Type="int" Name="PartitionOffset"/>
<Field Type="int" Name="FailureReason"/>
<Field TYpe="stringarray" Name="FailureDetails"/>
<Field Type="varbinary" Name="ClientInfo"/>
</Record>
</File>
Code: Alles auswählen
<File Type="VolumeCluster">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
<Field Type=""varbinary"" Name=""UniqueId"" />
<Field Type=""int"" Name=""BytesPerCluster"" />
</Header>
<Record>
<Field Type=""int"" Name=""ClusterIndex"" />
<Field Type=""int"" Name=""LowestVersion"" />
<Field Type=""int"" Name=""HighestVersion"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
<Field Type=""int"" Name=""DataIndex"" />
</Record>
</File>
Code: Alles auswählen
<File Type="FileRecordHash">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid"" />
<Field Type=""varbinary"" Name=""UniqueId"" />
<Field Type=""int"" Name=""BytesPerCluster"" />
<Field Type=""int"" Name=""FileVersion"" />
</Header>
<Record>
<Field Type=""int"" Name=""Index"" />
<Field Type=""fixedbinary"" Length=""16"" Name=""Hash"" />
</Record>
</File>
Code: Alles auswählen
<File Type="Boot">
<Header>
<Field Type=""fixedbinary"" Length=""16"" Name=""MachineGuid""/>
<Field Type=""binary"" Length=""16"" Name=""VolumeGuid""/>
</Header>
<Record>
<Field Type=""int"" Name=""Count""/>
<Field Type=""varbinary"" Name=""MBR"" Occurs=""Count""/>
</Record>
</File>