Nico Weinreich Entwicklung eines alternativen Backup- und Recoveryverfahrens für relationale Datenbanken unter Microsoft SQL Server 2005 eingereicht als DIPLOMARBEIT an der HOCHSCHULE MITTWEIDA _________________________________ UNIVERSITY OF APPLIED SCIENCES Fakultät für Mathematik/Naturwissenschaften/Informatik Mittweida, 2010 Erstprüfer: Herr Prof. Dr.-Ing. Wilfried Schubert Zweitprüfer: Frau Dipl.-Inf. Ines Feuerstein Vorgelegte Arbeit wurde verteidigt am: Bibliographische Beschreibung: Weinreich, Nico: Entwicklung eines alternativen Backup- und Recoveryverfahrens für relationale Datenbanken unter Microsoft SQL Server 2005. – 2010. – 146 S. Mittweida, Hochschule Mittweida, Fakultät für Mathematik/Naturwissenschaften/Informatik, Diplomarbeit, 2010 Referat: Im Rahmen dieser Diplomarbeit wird ein Programm entwickelt, welches vorhandene Backupstrategien ergänzen soll. Oft ist es erforderlich, im Falle eines Disasters, den entstandenen Datenverlust durch eine Wiederherstellung in kürzest möglicher Zeit zu beheben. Das Programm soll neben Standardfunktionalitäten, wie Sicherung und Wiederherstellung von Datenbanken, die Möglichkeit bieten, aus diesen angefertigten Sicherungen einzelne Objekte, insbesondere Tabellen, wiederherstellen zu können. Dabei werden Konsistenzfaktoren, sowie die Zugriffsmöglichkeit auf die Schemadaten und das Transaktionsprotokoll von SQL Server untersucht, und unter Berücksichtigung dieser Erkenntnisse eine Backup- und Restorefunktionalität entworfen. Abschließend soll die Funktionalität im Vergleich mit anderen Produkten bewertet, sowie eine Einschätzung für den Praxiseinsatz getroffen werden. Inhaltsverzeichnis Inhaltsverzeichnis ....................................................................................................................... 3 Verzeichnisse .............................................................................................................................. 6 Abbildungsverzeichnis ........................................................................................................... 6 Tabellenverzeichnis ................................................................................................................ 7 Listingverzeichnis .................................................................................................................. 7 1. 2. 3. Einführung .......................................................................................................................... 8 1.1. Gründe für ein alternatives Backup- und Recoveryverfahren ..................................... 8 1.2. Übersicht über verfügbare Produkte .......................................................................... 10 1.3. Ziel dieser Arbeit und Abgrenzung ............................................................................ 12 1.4. Vorgehensweise ......................................................................................................... 14 Grundlagen und –begriffe ................................................................................................ 15 2.1. Backup und Restore ................................................................................................... 15 2.2. Historisierung und Versionierung .............................................................................. 16 2.3. Archivierung .............................................................................................................. 17 2.4. Vollständige Sicherung .............................................................................................. 17 2.5. Differenzielle Sicherung ............................................................................................ 18 2.6. Inkrementelle Sicherung ............................................................................................ 20 2.7. Vater-Sohn-Prinzip .................................................................................................... 20 Standard-Sicherungsmechanismen unter SQL Server...................................................... 22 3.1. 4. Wiederherstellungsmodelle ....................................................................................... 22 3.1.1. Einfach ............................................................................................................... 22 3.1.2. Vollständig .......................................................................................................... 22 3.1.3. Massenprotokolliert ............................................................................................ 23 3.2. Sicherungsmedien ...................................................................................................... 24 3.3. Systemdatenbanken ................................................................................................... 24 3.4. Backup-Funktionsweise............................................................................................. 25 3.5. Restore-Funktionsweise............................................................................................. 27 Untersuchung zu Integritätsfaktoren ................................................................................ 30 4.1. Übersicht .................................................................................................................... 30 4.2. Constraints ................................................................................................................. 30 4.3. CHECK-Einschränkung ............................................................................................ 32 4.4. Trigger ....................................................................................................................... 33 4.5. Views ......................................................................................................................... 34 4.6. 5. Referenzielle Integrität .............................................................................................. 35 Produktdefinition .............................................................................................................. 37 5.1. Problemanalyse .......................................................................................................... 37 5.2. Spezifikation des Produkts ........................................................................................ 37 5.2.1. Zielbestimmungen .............................................................................................. 37 5.2.2. Produkteinsatz .................................................................................................... 38 5.2.3. Produktübersicht................................................................................................. 39 5.2.4. Produktfunktionen .............................................................................................. 40 5.2.5. Produktdaten....................................................................................................... 43 5.2.6. Produktleistungen ............................................................................................... 45 5.2.7. Qualitätsanforderungen nach ISO/IEC 9126...................................................... 46 5.2.8. Benutzeroberfläche............................................................................................. 49 5.2.9. Nichtfunktionale Anforderungen........................................................................ 49 5.2.10. 6. Analyse ............................................................................................................................. 51 6.1. Anwendungsfälle ....................................................................................................... 51 6.2. Untersuchung zum SQL Server Transaktionsprotokoll ............................................. 55 6.3. Untersuchung zum Auslesen des Datenbankschemas ............................................... 58 6.3.1. Möglichkeiten zum Auslesen ............................................................................. 58 6.3.2. Integrierte Funktionen in SQL Server ................................................................ 58 6.3.3. Auslesen durch Hilfstools .................................................................................. 59 6.4. Untersuchung zur eindeutigen Kennzeichnung von Daten ....................................... 62 6.5. Datenkonsistenz während eines Sicherungsvorgangs ............................................... 64 6.6. Datenkonsistenz bei der Wiederherstellung .............................................................. 66 6.7. Einbindung von externen Hilfstools .......................................................................... 71 6.8. Datenmodell............................................................................................................... 71 6.9. Einsatz von Prozeduren oder Funktionen .................................................................. 75 6.10. 7. Umgebungsbedingungen ................................................................................ 50 Abhängigkeitsdiagramm für Prozeduren ............................................................... 77 Entwurf ............................................................................................................................. 80 7.1. Einflussfaktoren ......................................................................................................... 80 7.1.1. Einsatzbedingungen ........................................................................................... 80 7.1.2. Umgebungs- und Randbedingungen .................................................................. 80 7.1.3. Nichtfunktionale Produkt- und Qualitätsanforderungen .................................... 82 7.2. Grundsatzentscheidungen .......................................................................................... 82 7.2.1. Datenhaltung ...................................................................................................... 82 7.2.2. 7.3. Funktionen des Programms ................................................................................ 84 7.3.2. Vollständige Syntax des Programmaufrufs ........................................................ 85 7.3.3. Verwendete Prozeduren in TSQL-Backup ......................................................... 87 7.3.4. Schnittstellen- und Prozedurbeschreibung ......................................................... 89 Entwurf der Backup-Funktionalität von TSQL-Backup............................................ 89 7.4.1. Aktivitätsdiagramm ............................................................................................ 90 7.4.2. Aufruffolge der Prozeduren................................................................................ 91 7.4.3. Prozeduren newBackupGetSchema und newBackupBackup ............................ 94 7.5. Sicherheitsaspekte ..................................................................................................... 98 Implementierung und Praxistest ..................................................................................... 100 8.1. Installation auf dem Datenbankserver ..................................................................... 100 8.2. Anwendungstest....................................................................................................... 101 8.2.1. Prüfung auf Fehlverhalten ................................................................................ 101 8.2.2. Durchführung eines Backups ........................................................................... 102 8.2.3. Durchführung einer Wiederherstellung ............................................................ 102 8.3. 9. Programmaufruf in TSQL.......................................................................................... 83 7.3.1. 7.4. 8. Verteilung im Netz ............................................................................................. 83 Vergleich mit vorhandenen Tools ............................................................................ 103 8.3.1. Funktionsumfang .............................................................................................. 104 8.3.2. Performanz ....................................................................................................... 105 8.3.3. Auswertung ...................................................................................................... 108 8.4. Anwendungsempfehlung ......................................................................................... 110 8.5. Einsatz unter SQL Server 2008 ............................................................................... 111 Abschließende Betrachtungen ........................................................................................ 112 Anhang – Syntaxerklärung für TSQL-Backup ....................................................................... 117 Anhang – Schnittstellenbeschreibung .................................................................................... 119 Anhang – Struktogramm für newBackupGetSchema ............................................................ 128 Anhang – Struktogramm für newBackupBackup .................................................................. 129 Anhang – Testszenarien in TSQL-Backup ............................................................................. 130 Anhang – Durchgeführte Sicherungsvorgänge ...................................................................... 134 Anhang – Durchgeführte Wiederherstellungsvorgänge ......................................................... 137 Glossar .................................................................................................................................... 141 Literaturverzeichnis ................................................................................................................ 144 Verzeichnisse Abbildungsverzeichnis Abbildung 1: Vollständige Sicherung....................................................................................... 18 Abbildung 2: Differenzielle Sicherung .................................................................................... 19 Abbildung 3: Inkrementelle Sicherung .................................................................................... 20 Abbildung 4: Vater-Sohn-Prinzip ............................................................................................. 21 Abbildung 5: Sicherungsdialog von SQL Server ..................................................................... 26 Abbildung 6: Wiederherstellungsdialog von SQL Server ........................................................ 29 Abbildung 7: Produktübersicht ................................................................................................ 40 Abbildung 8: Anwendungsfalldiagramm ................................................................................. 51 Abbildung 9: Aktivitätsdiagramm "vollständige Wiederherstellung" ...................................... 55 Abbildung 10: CHECK-Einschränkung bei der Wiederherstellung ........................................ 67 Abbildung 11: Wiederherstellung mit vorhandenen Triggern .................................................. 68 Abbildung 12: Wiederherstellung bei vorhandenen Schlüsselbeziehungen ............................ 69 Abbildung 13: Entity-Relationship-Model der Metadatenbank ............................................... 75 Abbildung 14: Grobe Übersicht über den Aufbau von TSQL-Backup .................................... 77 Abbildung 15: Abhängigkeiten der Prozeduren von TSQL-Backup........................................ 88 Abbildung 16: Aktivitätsdiagramm für die Backup-Funktionalität ......................................... 90 Abbildung 17: Sequenzdiagramm für die Backup-Funktionalität ........................................... 92 Abbildung 18: Struktogramm für newBackupGetSchema..................................................... 128 Abbildung 19: Struktogramm für newBackupBackup ........................................................... 129 Tabellenverzeichnis Tabelle 1: Constraint-Typen ..................................................................................................... 31 Tabelle 2: Qualitätsanforderungen an TSQL-Backup .............................................................. 46 Tabelle 3: Anwendungsfall "Datenbankschema auslesen" ....................................................... 52 Tabelle 4: Anwendungsfall "Sicherung durchführen" .............................................................. 53 Tabelle 5: Anwendungsfall "Element wiederherstellen" .......................................................... 54 Tabelle 6: Anwendungsfall "vollständige Wiederherstellung" ................................................. 54 Tabelle 7: Isolationsstufen in SQL Server ................................................................................ 65 Tabelle 8: Unterschiede zwischen Funktionen und Prozeduren in TSQL................................ 76 Tabelle 9: Funktionsvergleich mit anderen Tools................................................................... 104 Tabelle 10: Performanzvergleich mit anderen Tools .............................................................. 107 Tabelle 11: Übersicht über umgesetzten Funktionen ............................................................. 112 Listingverzeichnis Listing 1: Abfrage von Schlüsselbeziehungen bei CHECK-Einschränkungen ........................ 32 Listing 2: Auslesen der Tabellenbeziehungen bei Triggern ..................................................... 34 Listing 3: Fremdschlüsseldefinition bei Erstellung einer Tabelle ............................................ 35 Listing 4: Arbeiten mit einer Transaktions-Isolationsstufe ...................................................... 66 Listing 5: Aktivieren von xp_cmdshell .................................................................................... 71 Listing 6: Vollständige Syntax von TSQL-Backup .................................................................. 86 Listing 7: Pseudocode .............................................................................................................. 93 Listing 8: Auslesen des Datenbankschemas ............................................................................. 94 Listing 9: Einlesen der Ausgabe von DPW .............................................................................. 95 Listing 10: Vergleich von Schemaobjekten in der Metadatenbank .......................................... 96 Listing 11: Alle Spalten zur Hashwertbildung verwenden ....................................................... 97 Listing 12: Hashwerte einer Tabelle berechnen ....................................................................... 97 Listing 13: Datenexport anhand der berechneten Hashs .......................................................... 97 Listing 14: Erzeugen einer Dummy-Tabelle .......................................................................... 105 1. Einführung 1.1. Gründe für ein alternatives Backup- und Recoveryverfahren Datenbanken werden bereits seit vielen Jahren dort eingesetzt, wo große Datenmengen effizient gespeichert werden sollen. Hierbei können die Daten nach den Erfordernissen der Anwendung oder des Unternehmens strukturiert und bereitgestellt werden. Heute hat nahezu jeder einmal Kontakt mit einer solchen Datenbank gehabt. Dazu gehören nicht nur der Internetshop, über den man sich seine Bücher kaufen kann – auch bei Suchmaschinen, Telefon- und Kabelnetzbetreibern und unzählig anderen Anbietern sind Datenbanken im Einsatz, nicht zuletzt gehört auch ein Krankenhaus mit den Krankendaten seiner Patienten dazu. Es ist auch nicht selten der Fall, dass sich diese Datenbanken, besonders im Bereich Data Warehousing – hier werden diese in der Regel für Auswertungen und Reportings genutzt – im Bereich mehrerer Gigabyte bewegen. Durch Historisierung 1 der Daten in einem Data Warehouse wachsen diese Datenbanken oft um mehrere hundert Megabyte am Tag. Microsoft SQL Server 2005 (weiterhin SQL Server) bietet lediglich ein ganzheitliches Konzept zur Sicherung und Wiederherstellung einer Datenbank. Mit den Mitteln, die SQL Server bietet, kann eine Datenbank nur vollständig gesichert werden. „Vollständig“ muss in diesem Zusammenhang im Sinne von „Sicherung aller Objekte der Datenbank“ verstanden werden [Mic083]. Hierbei wird ein komplettes Abbild der hinter der Datenbank liegenden Datei erstellt [Woo07 S. 137]. Sicher mag dies die Handhabbarkeit vereinfachen, da man meist nur mit einem Objekt, der Backupdatei, arbeitet und entsprechende Dialogsysteme für Sicherung und Wiederherstellung demnach recht einfach gestaltet sind. Die sehr umfangreiche SQL Server Dokumentation im Microsoft Developer Network (weiterhin MSDN) zeigt ebenfalls nur die genannte Variante zur Sicherung und Wiederherstellung auf [Mic082]. Darüber hinaus ist ein Export einzelner Tabellen oder Schemaobjekte aus einer Datenbank nur durch erhöhten Aufwand durchführbar. Tabellen lassen sich zwar durch einen Befehl „bcp“ auf der Windows-Kommandozeile exportieren [Mic084] [Woo07 S. 107ff] [Bau06 S. 269ff], Schemaobjekte, wie die Struktur einer Tabelle, können aber nur über die grafische Oberfläche von SQL Server in Form eines Skripts generiert werden, welches dann durch den Anwender als Textdatei gespeichert werden muss [Mic085] [Bau06 S. 83]. Daraus folgt, dass für diese Arbeit meist die grafische Oberfläche zur Anwendung kommen muss, somit eine Automatisierung eines Sicherungsprozesses ausgeschlossen ist und der Aufwand 1 Hier: die Aufbewahrung älterer Datenstände zu bestimmten Stichtagen [8] zur Sicherung mehrerer Objekte linear steigt. Zuletzt bleibt auch der Aspekt der Verwaltung der so erzeugten Daten offen, welche ebenfalls durch den Anwender geschehen muss. In der Praxis und aus eigener Erfahrung zeigt sich so, dass Sicherungsprozesse auf Basis der Mittel von SQL Server einen entscheidenden Nachteil haben. Die Wiederherstellung eines einzelnen Objekts aus einer gesamten Sicherung ist mit Standardmitteln von SQL Server nicht möglich. Eine Wiederherstellung von Datenbanken oder Teilen einer Datenbank kann jederzeit erforderlich werden. Die IT-Grundschutz-Kataloge des Bundesamtes für Sicherheit in der Informationstechnik geben einen Überblick über typische und häufige Ursachen eines Datenverlusts. Auszugsweise werden einige Gründe genannt [Inf08]: Organisatorische Mängel • Fehlende oder unzureichende Aktivierung von Datenbank-Sicherheitsmechanismen • Mangelhafte Konzeption einer Datenbank Menschliches Versagen • Fehlerhafte Administration von Zugangs- und Zugriffsrechten • Fehlerhafte Administration einer Datenbank oder eines Datenbankmanagementsystems • Unbeabsichtigte Datenmanipulation Technisches Versagen • Ausfall einer Datenbank • Verlust von Daten einer Datenbank • Verlust der Datenbankintegrität/-konsistenz Vorsätzliches Handeln • Unberechtigte IT-Nutzung • Manipulation an Daten oder Software bei Datenbanksystemen • SQL-Injection Nun müsste man für die beiden beispielhaften Fälle: • Wiederherstellung einer gelöschten Lookup-Tabelle • Einsicht in einen historisierten Datenstand in einem Data Warehouse ein vorhandenes Backup vollständig wiederherstellen – gegebenenfalls in einer zusätzlichen Datenbank, um die vorhandenen Daten nicht zu gefährden – und kann sich dann aus dieser Wiederherstellung die gewünschte Tabelle herausnehmen. Wenn es sich, wie eben im Beispiel, um eine kleine Referenztabelle handelt, die in einer produktiven Datenbank gelöscht [9] wurde und in möglichst kurzer Zeit wieder zur Verfügung gestellt werden soll, kann sich der Prozess der Wiederherstellung bei einem mehrere Gigabyte umfassenden Backup durchaus viele Stunden hinziehen. Mit einem Verfahren, das eine Wiederherstellung einer einzelnen Tabelle oder allgemein eines einzelnen Objekts direkt aus dem Backup ermöglicht, lässt sich ein zeitlicher Ausfall während der Wiederherstellung und auch – bei entsprechender Automatisierung – der Aufwand für beispielsweise das Einbinden der Tabelle in die produktive Datenbank minimieren. 1.2. Übersicht über verfügbare Produkte Es sind unterschiedliche Produkte am Markt verfügbar, welche ebenfalls auf eine Sicherung und Wiederherstellung von Datenbanken spezialisiert sind. Allen professionellen Produkten ist gemeinsam, dass es sich um proprietäre Software handelt, die kommerziell angeboten wird und meist grundlegend, wenn auch leicht modifiziert, nur die Funktionen von SQL Server selbst zur Verfügung stellt und somit nicht den gewünschten Anforderungen gerecht wird. Nur wenige Anwendungen können ein sogenanntes Object-Level-Recovery bieten, also die Wiederherstellung Softwareprodukten, einzelner welche Objekte als aus einer Ergänzung Sicherung. oder Zu Ersatz der den wichtigen vorhandenen Sicherungsmechanismen von SQL Server dienen sollen, gehören: Acronis Recovery für MS SQL Server 2 Acronis Recovery bietet eine durch Assistenten geführte Erstellung von Backup- und Disaster-Recovery-Strategien, unterstützt eine Vielzahl von Speichermedien und ermöglicht eine assistentengestützte oder automatische Wiederherstellung einer Datenbank bis zum letzten bekannten stabilen Zustand. Acronis ist ebenfalls in der Lage, Backup und Restore auf Grundlage der CPU- und Netzwerkauslastung ressourcenschonend zu erledigen. Eine selektive Wiederherstellung von Objekten ist nicht möglich, daher wird dieses Produkt nicht weiter untersucht. 2 http://www.acronis.de/enterprise/products/ARSQL/ [10] Quest LiteSpeed for SQL Server 3 Schwerpunkte dieses Produkts sind die hohe Komprimierung und Performanz bei Backup und Restore. Weiterhin gehören das Auslesen von Transaktionsprotokollen und die Wiederherstellung von einzelnen Datenbankobjekten, wie Tabellen, Prozeduren und Sichten, zu den Stärken dieses Programms. LiteSpeed zählt zu den bekannteren Softwareprodukten, welche eine Wiederherstellung auf Objektbasis zulassen, und wird daher noch genauer untersucht. Peer DRS 4 Peer DRS bietet ein Datenbankbackup auf Byte-Level-Ebene, also das Sichern von binären Unterschieden zur Schonung der Ressourcen, und ist auf die Replikation von Datenbanken optimiert. Diese Software bietet keine Möglichkeit eine gesicherte Datenbank wieder herzustellen. Da weder eine Objektsicherung noch generell eine Wiederherstellung eines Backups möglich ist, bleibt es hier nur bei der Nennung dieses Produkts. idera SQL safe backup 5 Hierbei handelt es sich um eine durch eine Oberfläche gestützte Software, welche Wert auf Performanz und Sicherheit legt. Dieses Produkt lässt ebenfalls die Funktion eines Object-Level-Recoverys vermissen. redgate SQL Backup Pro 6 Schwerpunkte von SQL Backup Pro sind die hohe Kompression und die Möglichkeit, beispielsweise durch Netzwerkfehler unterbrochene Transaktionen an der Stelle fortzusetzen, an der sie unterbrochen wurden. Neu in SQL Backup Pro ist die Unterstützung von Object-Level-Recovery. Die von redgate angebotenen Softwareprodukte gehören zu den bekanntesten und daher wird SQL Backup Pro auch in weiteren Tests untersucht. 3 http://www.questsoftware.de/litespeed-for-sql-server/ 4 http://de.peersoftware.com/products/peer_drs/peerdrs.aspx 5 http://www.idera.com/Products/SQL-Server/SQL-safe-backup/ 6 http://www.red-gate.com/products/SQL_Backup/index_v2.htm [11] DataBK.com SQL Server Backup 7.8.6 7 Dieses Produkt bietet die Standardfunktionen, die auch in den anderen bereits genannten Anwendungen enthalten sind. Besonderheit dieses Produkts ist die Möglichkeit, die produkteigenen Backups in das SQL Server-eigene Format zu konvertieren. Dieses Produkt lässt eine selektive Wiederherstellung vermissen, was auch nicht die Konvertierung in das SQL Backup-Format aufwiegen kann, daher wird diese Software nicht weiter untersucht. Quest LiteSpeed for SQL Server und redgate SQL Backup Pro sind die wenigen bekannten Produkte, welche die Wiederherstellung von einzelnen Datenbankobjekten ermöglichen, und werden deshalb später in dieser Arbeit einem genaueren Test unterzogen. Nicht zu dieser Liste zählt Standard-Backupsoftware, welche auf die Sicherung eines kompletten Systems ausgelegt ist, wie beispielsweise CA ARCserve Backup 8. 1.3. Ziel dieser Arbeit und Abgrenzung Wie in Abschnitt 1.1 erwähnt, ist es für den „fiktiven“ Anwendungsfall (der Wiederherstellung eines einzelnen Objekts in einer sehr großen Datenbank) hilfreich, wenn nicht sogar notwendig (falls es entsprechende zeitliche Anforderungen gibt), Objekte einer Datenbank selektiv wiederherzustellen. Die für diesen Zweck angebotenen Softwareprodukte, die unter Abschnitt 1.2 erwähnt wurden, bieten aber keine Transparenz und lassen sich auch nicht direkt oder nur bedingt in eigenen SQL Programmen verwenden. In dieser Arbeit soll ein Weg gefunden werden, der es ermöglicht, vollständige sowie partielle Backups von Datenbanken des SQL Server zu erstellen und aus diesen einzelne Objekte wiederherzustellen. Dabei sind folgende Probleme zu lösen: • Auslesen des Datenbankschemas • Eindeutige Kennzeichnung eines Datensatzes in einer Tabelle • Bildung von Inkrementen eines Backups • Verwaltung eines Backups • Wiederherstellung eines Datenbankobjekts aus dem Backup • Wahrung der Datenintegrität 7 http://www.databk.com/sql-server-backup.htm 8 http://www.ca.com/de/products/product.aspx?id=4536 [12] Auf Grundlage der gewonnenen Erkenntnisse soll ein Skript geschaffen werden, welches ganzheitlich diese Aufgaben übernimmt. Wichtigstes Kriterium soll sein, dass jegliche Datenbewegungen, die durch das Programm vorgenommen werden, keinerlei Veränderungen an der bestehenden und zu sichernden Datenbank bewirken 9. Schwerpunkte bei dieser Arbeit sind dabei die Logik für die Bildung von Dateninkrementen und die Wahrung der Datenintegrität. Die Implementierung erfolgt auf niedrigster Applikationsebene über der Datenbank, welches bei SQL Server die Skriptsprache TSQL ist. Durch Umsetzung in dieser Sprache kann das Programm auch dem Wunsch nach Transparenz und Revisionsfähigkeit gerecht werden, da durch offen liegenden Quellcode jederzeit nachvollziehbar ist, was mit den zu verarbeitenden Daten geschieht. Dies kann beispielsweise bei vertraglichen Vereinbarungen mit externen Dienstleistern oder Vorschriften wie den „Grundsätzen ordnungsgemäßer Datenverarbeitung und DV-Revisionen“ 10 notwendig sein. Leider ist diese Transparenz bei externen Tools, welche auf nativem Code basieren, nicht vorhanden. Damit ist der Übergang von einer „Blackbox“-Backupstrategie, die eine proprietäre Software bietet, zu einer „Whitebox“Backupstrategie möglich. Das Ergebnis soll eine funktionale Erweiterung für SQL Server sein, welche die Vorteile externer Software, also die selektive Wiederherstellung auf Objektebene, mit den Funktionen von SQL Server, wie der Integritätswahrung, verbindet. Es soll keine eigenständige Anwendung entstehen, die die Aufgaben einer vollwertigen Backupsoftware vollumfänglich übernimmt – die Erkenntnisse dieser Arbeit sollen dazu dienen, vorhandene Strategien zu optimieren und zu ergänzen. Weiterhin soll im Rahmen dieser Arbeit kein Schwerpunkt auf Performance oder die Verifikation einer angefertigten Sicherung beziehungsweise Wiederherstellung (wie bei kommerziellen Programmen üblich) gelegt werden. Abschließend soll eine Aussage über die Anwendbarkeit in der Praxis getroffen werden. 9 Ausnahme kann hier bei der Wiederherstellung eines einzelnen Objekts die Manipulation dieses Objekts zur Wahrung der Konsistenz sein 10 Die Grundsätze ordnungsgemäßer Datenverarbeitung und DV-Revisionen (Abk. „GoDV“) sind Standardrichtlinien, welche sich aus geltendem Recht, insbesondere den Vorschriften aus dem Handelsgesetzbuch über ordnungsgemäße Buchführung herleiten; „Grundsätze für eine ordnungsmäßige Datenverarbeitung (GoDV). Handbuch der DV-Revision (Gebundene Ausgabe)“ von Rainer Schuppenhauer, Idw-Verlag GmbH, 5. Auflage, ISBN 3802107527 [13] 1.4. Vorgehensweise Zur Einführung in die Thematik soll auf grundlegende Sicherungsarten zum Thema Backup eingegangen und anschließend die Möglichkeiten von SQL Server in Bezug auf Datensicherung aufgezeigt werden. SQL Server bietet einen reichhaltigen Katalog an Optionen zur Sicherung und Wiederherstellung von Datenbanken mit unterschiedlichsten Szenarien. Dies überschreitet den Rahmen dieser Arbeit und ist zudem meist nur für spezielle Fälle, wie hochverfügbare oder auf mehrere Speichermedien verteilte Datenbanken, geeignet. Daher soll hier nur auf die wichtigsten Eigenschaften der integrierten Backupmöglichkeiten eingegangen werden. Der Kern dieser Arbeit beginnt mit einer Abgrenzung des, im Rahmen dieser Arbeit zu erstellenden Programms, es sollen dessen Leistungsumfang und Anforderungen festgehalten werden. Ein wichtiger Aspekt bei der Arbeit mit dem fertigen Programm ist in jedem Fall die Wahrung der Datenintegrität, hierzu sollen umfangreiche Überlegungen stattfinden. Zu lösende Probleme sind unter anderem das Auslesen des Datenbankschemas und die eindeutige Kennzeichnung von Zeilen einer Tabelle. Auch hierzu sollen ebenfalls Vorüberlegungen stattfinden. Anschließend soll schrittweise, unterstützt durch verschiedene Diagramme und Pläne, eine Funktionalität des Programms entworfen und dabei auch der technische Hintergrund beleuchtet werden. Nach dem Entwurf werden einige Funktionstests an einer Test-Datenbank durchgeführt. Nach der Entwicklung wird das gewonnene Produkt den hauseigenen Mitteln von SQL Server und einigen kommerziellen Produkten gegenübergestellt, um so Effizienz und Handhabung miteinander vergleichen zu können. Abschließend soll eine Aussage über den Einsatz in produktiven Umgebungen getroffen, sowie ein Ausblick auf weitere Entwicklungen gegeben werden. [14] 2. Grundlagen und –begriffe Unter dem Begriff Backup verstehen viele Anwender, eine Datei von A nach B zu kopieren. Dabei umfasst dieser Begriff weitaus mehr, wenn auch nebenläufige Dinge, die meist durch eine Software für den Nutzer erledigt werden. In diesem Kapitel sollen wichtige Grundbegriffe und Arbeitstechniken in Bezug auf Backups erläutert werden. 2.1. Backup und Restore Der Begriff „Backup“ 11 umfasst allgemein einen Sicherungsvorgang. Es ist hierbei irrelevant, um welche Art von Daten es sich handelt, in welchem Umfang und wohin sie gesichert werden. Üblicherweise werden hierbei aber (unternehmens-) kritische Daten oder auch für einen Endanwender wichtige Dokumente, meist vollumfänglich, auf ein externes Speichermedium, wie eine DVD, oder auf Magnetband gesichert. Die Wahl des Sicherungsmediums sollte an die spezifischen Bedürfnisse angepasst sein. Hier können folgende Kennzahlen wichtig sein [Inf05]: • Umfang des zu sichernden Datenvolumens • Zugriffszeiten auf dem Medium • Aufbewahrungsfristen (zulässige Lagerungszeiten für ein Medium) • Revisionssicherheit Ziel eines Backups ist in der Regel für den Fall eines Ausfalls oder Totalverlustes diese wichtigen Daten nochmals zur Verfügung zu haben, um diese gegebenenfalls auch auf einem anderen Rechnersystem wiederherstellen zu können. Eine Sicherung auf demselben Medium, auf dem sich auch die zu sichernden Daten befinden, ist in dem Sinne kein Backup, da ein Backup zum Grundsatz hat, Daten gegen Verlust zu schützen. Dem widerspräche beispielsweise eine Sicherung auf einem Produktivsystem, bei dem die Festplatte ausfällt – alle Daten wären verloren. Eine Sicherung soll vor Datenverlust bei: 11 • Hardwaredefekten (mechanische Beschädigung des Rechnersystems, insbesondere der Festplatte) • Diebstahl der Daten (egal ob lokal am System oder online über das Internet) http://www.bullhost.de/b/backup.html [15] • versehentlichem oder absichtlichem Ändern und Löschen der Daten • Beschädigung oder Verlust durch Viren, Würmer oder Trojaner schützen [Inf09]. Daher ist es ratsam, eine Sicherung auf einem transportablen Medium anzufertigen und örtlich getrennt vom Produktivsystem, idealerweise auch durch Schließfach oder Tresor gegen Zugriff geschützt aufzubewahren [Inf06] [Inf061]. Restore (auch Recovery genannt) stellt allgemein den Vorgang der Datenwiederherstellung dar. Es existiert keine genaue Definition, die einen Unterschied zwischen Restore und Recovery herausstellt. Im Bereich der Systemadministration wird teilweise von einem Restore gesprochen, wenn es um die Wiederherstellung einzelner Daten oder Dateien geht, Recovery hingegen bezeichnet die Wiederherstellung eines vollständigen PC-Systems [Adm08]. In Bezug auf SQL Server gibt es lediglich eine kleine Unterscheidung: „You have a backup file from that you can create the database using restore command you can also overwrite an existing database. Recovery is a different process, when you start Sql Server it will recover the database i.e it will roll forward all the committed transactions and roll back all the uncommitted transactions.“ [Mic08] - Restore wird hier für die Wiederherstellung einer Datenbank aus einem Backup verwendet und Recovery für den Vorgang, den SQL Server beim Start auf seinen Datenbanken ausführt, um diese beispielsweise bei einem Absturz wieder in einen konsistenten Zustand zu bringen. Im Rahmen dieser Arbeit wird weiterhin von Restore gesprochen. 2.2. Historisierung und Versionierung Es handelt sich hierbei um zwei Begriffe, die nah beieinander liegen und oft gleichgesetzt werden. Beide Begriffe werden in dieser Arbeit nur ein nebensächlich von Bedeutung sein, werden aber oft in Zusammenhang mit Backups und Sicherungen erwähnt, daher sollen sie hier trotzdem kurz angesprochen werden. Grundsätzlich lassen sich diese wie folgt definieren: Versionierung Grundgedanke der Versionierung ist die Dokumentation von Änderungen an einem Dokument. Eine Änderung an einem Dokument bewirkt die Erzeugung einer neuen Version davon. Hierbei werden meist Zeitstempel und Personendaten des ausführenden Nutzers gespeichert. Ein Versionsverwaltungssystem übernimmt hierbei das Management. [16] Historisierung Historisierung bedeutet, inhaltliche Änderungen an Daten zu dokumentieren. Es wird hierbei die zeitliche Entwicklung dieser Daten festgehalten. Bezogen auf Datenbanken, gibt es für die Historisierung verschiedene Möglichkeiten Daten zu historisieren. Zwei wichtige Methoden sind: • Erweiterung der Tabelle um eine zusätzliche Spalte, welche den neuen Wert enthält • Einführung eines Zeitstempels, der die Gültigkeit einer Datenzeile bestimmt Die Definition von Historisierung lässt sich insofern auf diese Arbeit übertragen, als dass ein Backup einen historisierten Datenbestand widerspiegelt. Es werden hier also keine Änderungen in den Daten an sich berücksichtigt, sondern eine Sicherung ist eine historische Sicht auf die Daten zum Zeitpunkt der Sicherung. 2.3. Archivierung Die Archivierung ist begrifflich von einer Datensicherung zu trennen. Eine Sicherung hat zum Zweck, eine Kopie von Daten physikalisch vom System getrennt und zugriffsgeschützt zu erstellen. Eine Archivierung hingegen ist direkt in die Systeme integriert und im laufenden Betrieb eingebunden. Durch eine Archivierung sollen Daten dauerhaft in geeigneter Form gespeichert werden, um sie jederzeit einfach wiederzufinden und sofort darauf zugreifen zu können [Inf091]. Die Archivierung findet sehr oft in Dokumentenmanagement-Systemen Anwendung. Dabei gibt es meist eine Indexdatenbank, welche die Metadaten, also beispielsweise Beschreibung und Speicherort, verwaltet, und einen physikalischen Speicher der das eigentliche Dokument, beziehungsweise die Daten, enthält. In dieser Arbeit kann insofern von einem Archivsystem gesprochen werden, als dass eine Metadatenbank alle nötigen Informationen über die erstellten Backups enthält und die physikalisch erstellten Sicherungen logisch verwaltet. 2.4. Vollständige Sicherung Eine vollständige Sicherung bedeutet, dass bei jedem Sicherungsvorgang eine vollumfängliche Kopie der zu sichernden Daten angefertigt wird [Bau06 S. 281f], unabhängig davon, ob es sich um Dateien, Verzeichnisse, ein komplettes Laufwerk, oder in diesem Fall, den kompletten Datenbestand einer Datenbank [17] handelt. Um einen Datenstand wiederherzustellen, muss lediglich die letzte Sicherung herangezogen werden. Als Vorteil ist hier zu sehen, dass in jeder vorhandenen Sicherung der komplette (und somit auch konsistente) Datenbestand zu finden ist und bei einem Defekt einer Sicherung im schlimmsten Fall die letzte vorhergehende Sicherung verwendet werden muss. Sicher wird hier schnell der Gedanke aufkommen, dass eine vollständige Sicherung auch den meisten Speicherplatz verbraucht. Insofern es also der Geschäftsprozess und auch die Anforderungen an die Sicherheit und Verfügbarkeit einer Datenbank zulassen, gilt es, nach kostengünstigeren Lösungen zu suchen. Abbildung 1: Vollständige Sicherung 2.5. Differenzielle Sicherung Eine differenzielle Sicherung ist der ausgewogenste Ansatz zwischen Sicherheit der erstellten Backups und Speicherplatzverbrauch. Grundlage für diese Sicherungsart ist eine vollständige Sicherung der Datenbank (oder auch Dateien, Verzeichnisse etc.), da im weiteren Verlauf nur Änderungen, die seit der letzten vollständigen Sicherung vorgenommen wurden, dokumentiert werden [Bau06 S. 283]. Somit ist zur Wiederherstellung einer Datenbank ein weiterer Schritt nötig. Zuerst muss die vorhandene vollständige Sicherung wieder eingespielt werden, welche als Basis für die differenziellen Sicherungen dient und anschließend die gewünschte (letzte) differenzielle Sicherung [Woo07 S. 145]. Es lässt sich erkennen, dass aufgrund der [18] dokumentierten Änderungen zur letzten Vollsicherung bedeutend weniger Speicherplatz verbraucht wird, als bei jedem Sicherungsvorgang die komplette Datenbank zu sichern. Ein angenehmer Nebeneffekt ist hier, dass der Sicherungsvorgang an sich auch schneller ist. Wenn man bei Dateien beispielsweise das letzte Änderungsdatum zur Sicherung heranzieht und dieses mit dem Sicherungsdatum der letzten Vollsicherung vergleicht, kann man die zu sichernde Datenmenge recht einfach reduzieren. Die Sicherheit der Daten ist hierbei aber nicht mehr in dem Maße wie bei einer Vollsicherung gegeben. Bei einem Defekt der Datei, welche die Vollsicherung enthält, ist dieses Backup nicht mehr verwendbar und man muss auf die davorliegende vollständige Sicherung zurückgreifen, weil durch den Defekt der Vollsicherung alle nachfolgenden differenziellen Sicherungen unbrauchbar geworden sind. Hier ist es also auch wichtig, eine vernünftige Strategie zu finden, die dieses Risiko minimiert. Bei Datenbanken im Bereich mehrerer Gigabyte und einer geplanten täglichen Sicherung, ist es sicher ungünstig, einmal monatlich eine Vollsicherung und für den Rest des Monats differenzielle Backups durchzuführen. Eine wöchentliche Vollsicherung ist hier geeigneter, zumal eine differenzielle Sicherung immer größer ist als die letzte, da hier ja alle Änderungen im Vergleich zur letzten Vollsicherung dokumentiert und somit auch die Daten der letzten differenziellen Sicherung enthalten sind. Auch aus diesem Grund ist es sinnvoll, in regelmäßigen Abständen neue Vollsicherungen, die als Basis für folgende differenzielle Sicherungen dienen, anzufertigen. Abbildung 2: Differenzielle Sicherung [19] 2.6. Inkrementelle Sicherung Die platzsparendste Methode ist die inkrementelle Sicherung. Diese arbeitet prinzipiell wie eine differenzielle Sicherung, dokumentiert aber im Gegensatz zu der differenziellen Sicherung nur die Unterschiede zur letzten inkrementellen Sicherung. Eine Sicherung baut also auf den Datenstand der letzten Sicherung auf. Somit muss ein Wiederherstellungsvorgang wie folgt verlaufen: zuerst wird die letzte vollständige Sicherung eingespielt und darauf aufbauend in chronologischer Reihenfolge alle (und damit sind auch alle gemeint) angefertigten inkrementellen Sicherungen. Ist nur eine dieser Sicherungen defekt oder wird eine davon beim Wiederherstellen vergessen, so ist der Datenstand unbrauchbar. Von SQL Server wird diese Variante einer Sicherung nicht angeboten, soll aber prinzipiell in dieser Arbeit berücksichtigt werden. Abbildung 3: Inkrementelle Sicherung 2.7. Vater-Sohn-Prinzip Das Vater-Sohn-Prinzip stellt keine Sicherungsart, sondern lediglich eine Strategie zur Aufbewahrung der Datensicherungen dar (Archivierung). Häufig wird es auch als Generationenprinzip bezeichnet. Hierbei werden verschiedene Sicherungszyklen festgelegt, wie beispielsweise: täglich, wöchentlich, monatlich – in diesem Fall spricht man von Großvater-Vater-Sohn-Prinzip [Wik10]. Diese Zyklen rotieren dann regelmäßig. [20] Um es an einem kurzen Beispiel zu verdeutlichen: • Die tägliche Sicherung von Montag bis Samstag wird als Sohn (S) bezeichnet • Die wöchentliche Sicherung am Sonntag wird als Vater (V) bezeichnet • Und die Großväter (G) stellen die Sicherung am letzten Tag im Monat dar Für die Söhne wird in diesem Fall kein Sonntags-Medium benötigt, weil diese Sicherung mit den Vätern zusammenfällt – da sonntags die wöchentliche Sicherung stattfindet, kann eine zusätzliche tägliche Sicherung entfallen. Zyklisch werden die Sicherungsmedien wie folgt überschrieben: am Montag der folgenden Woche wird das erste Medium der aktuellen Woche überschrieben. Nach dem fifo-Prinzip (first in first out) werden also immer die ältesten Sicherungen mit der aktuellen Sicherung überschrieben. Dieses Generationenprinzip kann auf alle 3 Sicherungsarten angewendet werden. MO 1 DI 2 MI 3 DO 4 FR 5 SA 6 SO 7 S1 S2 S3 S4 S5 S6 V1 8 9 10 11 12 13 14 S1 S2 S3 S4 S5 S6 V2 15 16 17 18 19 20 21 S1 S2 S3 S4 S5 S6 V3 22 23 24 25 26 27 28 S1 S2 S3 S4 S5 S6 V4 29 30 1 2 3 4 5 S1 S2/G1 S3 S4 S5 S6 V1 MO 6 DI 7 MI 8 DO 9 FR 10 SA 11 SO 12 S1 S2 S3 S4 S5 S6 V2 13 14 15 16 17 18 19 S1 S2 S3 S4 S5 S6 V3 ... Abbildung 4: Vater-Sohn-Prinzip [21] 3. Standard-Sicherungsmechanismen unter SQL Server 3.1. Wiederherstellungsmodelle Das Wiederherstellungsmodell bei SQL Server hat wesentlichen Einfluss auf die Sicherungsund Wiederherstellungsstrategien einer Datenbank. Es muss bereits beim Anlegen einer Datenbank ausgewählt werden, kann aber nachträglich noch geändert werden [Bau06 S. 172]. Das Wiederherstellungsmodell bestimmt die Verwendung der Protokolldatei einer Datenbank und somit, wann eine Transaktion aus dem Transaktionsprotokoll gelöscht wird [Woo07 S. 130f]. Wenn eine Transaktion begonnen wird, werden alle Anweisungen dieser Transaktion fortlaufend in das Protokoll geschrieben und erst bei Abschluss der Transaktion die daraus resultierenden Änderungen in der Datenbank vorgenommen. 3.1.1. Einfach Das einfache Wiederherstellungsmodell hat zur Folge, dass alle Einträge zu einer Transaktion nach Übernahme in die Datenbank aus dem Transaktionsprotokoll gelöscht werden. Während der Transaktion vergrößert sich also das Protokoll und verkleinert sich nach Abschluss automatisch wieder [Woo07 S. 131]. Vorteile dieses Modells sind, dass es schnell und platzsparend ist und den Verwaltungsaufwand minimiert (es muss keine Protokollsicherung vorgenommen werden). Es ist aber ebenso das Unsicherste [Mic086]. Konkret bedeutet dies, dass Daten im Falle eines Crashs oder Ausfalls verloren gehen können. Vorhandene Sicherungen enthalten ja lediglich den Datenstand zum Zeitpunkt der Sicherung. Alle danach vorgenommen Änderungen an der Datenbank sind somit verloren, weil diese an keiner weiteren Stelle gespeichert waren. Das einfache Wiederherstellungsmodell bietet sich daher bei selten verändernden oder schreibgeschützten Datenbanken an. Dieser Nachteil kann zwar durch recht kurze Zeitabstände zwischen den Sicherungen gemindert, aber niemals komplett eliminiert werden [Mic087]. 3.1.2. Vollständig Die Nachteile des einfachen Wiederherstellungsmodells gelten beim vollständigen Modell nicht im gleichen Maße. Ist dieses Modell aktiviert, verbleiben Transaktionen auch nach der Übernahme in die Datenbank im Transaktionsprotokoll. Diese Einträge werden erst aus dem Protokoll entfernt, wenn die Datenbank oder die Protokolldatei gesichert wird [Woo07 S. [22] 132]. Letztlich bedeutet dies also einen erhöhten Wartungsaufwand, weil so das Protokoll relativ schnell anwächst, aber auch einen höheren Schutz. In einem Sicherungsszenario müssen also neben (vollständigen) Sicherungen der Datenbank auch verhältnismäßig kleine Sicherungen des Protokolls vorgenommen werden, dies kann mehrmals täglich bis stündlich (oder gar noch häufiger) passieren – je nach Anforderung an die Sicherheit. Der Wiederherstellungsvorgang gestaltet sich nun wie folgt: zuerst wird die letzte Vollsicherung eingespielt und anschließend alle nachfolgenden Protokollsicherungen. Somit kann eine Datenbank bis zum Zeitpunkt des Auftretens eines Fehlers wiederhergestellt werden. Durch die Protokollsicherung wird es aber auch möglich, die Datenbank zu einem bestimmten Zeitpunkt innerhalb der Sicherung, also nicht unbedingt bis zur letzten Transaktion, wiederherzustellen [Mic088]. Auch hier kann es natürlich passieren, dass bei einem Ausfall alle Daten seit der letzten Protokollsicherung verloren sind. Hier hilft letztlich nur eine Hochverfügbarkeitslösung, um Datenverlust vollständig auszuschließen. 3.1.3. Massenprotokolliert Das massenprotokollierte Wiederherstellungsmodell ähnelt dem vollständigen Modell. Es bringt aber einen niedrigeren Schutz bei Ausfällen mit sich. Das heißt, dass beispielsweise das Einfügen von großen Datenmengen über die Befehle BULK INSERT oder INSERT … SELECT * FROM OPENROWSET(BULK …) oder andere Massenvorgänge wie SELECT INTO oder CREATE INDEX nur minimal protokolliert werden. Damit steigt natürlich das Risiko von Datenverlust bei einem Fehler. Das massenprotokollierte Wiederherstellungsmodell sollte nicht allein eingesetzt werden, sondern bei Verwendung des vollständigen Wiederherstellungsmodells kann im Bedarfsfall vor größeren Einfügungsvorgängen auf das massenprotokollierte Modell umgeschaltet, und nach Abschluss der Einfügeoperationen wieder zurück gewechselt werden [Woo07 S. 133f]. Somit wird die Leistung bei Massenvorgängen gesteigert und die Speicherplatzbelegung verringert. [23] 3.2. Sicherungsmedien Unter SQL Server gibt es zwei Arten von Sicherungsmedien: • physikalisch • logisch Ein physikalisches Sicherungsmedium kann ein Bandlaufwerk, eine USB-Festplatte oder ein sonstiger Datenträger sein, der durch das Betriebssystem bereitgestellt wird [Woo07 S. 140f]. Pfade können hierbei als absolute lokale Pfade, oder im Falle von Netzwerkfreigaben als UNC-Pfade angegeben werden. Prinzipiell sollte für Sicherungen eine andere Festplatte verwendet werden als die, auf denen Datenbank- oder Protokolldateien liegen. Bei logischen Sicherungsmedien werden logische Namen für physikalisch vorhandene Medien definiert [Bau06 S. 285]. Diese Namen können dann in der grafischen Oberfläche von SQL Server oder bei direkten SQL-Anweisungen benutzt werden und bieten gerade bei Skripten mehr Flexibilität – muss also ein Medium getauscht werden, beispielsweise soll ein Wechsel von lokaler Festplatte auf Netzwerkmedium vorgenommen werden, muss lediglich die Verknüpfung hinter dem logischen Namen geändert werden. Bereits vorhandene Sicherungsaufträge und –programme müssen dann nicht erst noch angepasst werden [Woo07 S. 141]. 3.3. Systemdatenbanken Zu den sicherungsbedürftigen Datenbanken von SQL Server gehören • master • model • msdb Diese Datenbanken sind Grundvoraussetzung für den Betrieb von SQL Server und werden bei der Installation des SQL Servers automatisch angelegt. Spielt Replikation beim Betrieb des SQL Servers eine Rolle, muss zusätzlich die Datenbank distribution gesichert werden [Bau06 S. 278]. Die master-Datenbank enthält wichtige Informationen wie Anmeldekonten, Systemeinstellungen und Informationen für den Zugriff auf andere Datenbanken. Die Datenbank model dient als Vorlage für das Erstellen neuer Datenbanken, unter anderem auch für die tempdb, welche der Arbeitsbereich für SQL Server ist (hier werden temporäre Tabellen und Ergebnisse zwischengespeichert). Als dritte Datenbank im Bunde enthält die msdb Daten des SQL Server-Agents sowie zugehöriger Zeitplanungsinformationen zum [24] Ausführen von Aufgaben und den vollständigen Sicherungs- und Wiederherstellungsverlauf [Bau06 S. 113, 277f]. Eine Sicherung der msdb-Datenbank sollte an den jeweiligen Geschäftsprozess angepasst sein, mindestens aber nach jeder Datenbankänderung durchgeführt werden. Alle drei Datenbanken können mit denselben Mitteln wie für normale Datenbanken gesichert werden. Lediglich für die master kann nur eine vollständige Datenbanksicherung durchgeführt werden [Bau06 S. 282]. 3.4. Backup-Funktionsweise Ein Backup mit Hilfe der in SQL Server integrierten Funktionen ist auf unterschiedliche Weise möglich: • durch Drittanbietertools, welche eine API 12 nutzen [Mic081] • TSQL-Befehl auf der SQL-Befehlszeile • Sicherung über die grafische Oberfläche von SQL Server, dem SQL Server Management Studio [Kon07 S. 50ff] [Bau06 S. 79ff] • manuelle Sicherung Die sicher allgemeinste Variante ist die Sicherung einer normalen, nicht verteilten oder replizierten Datenbank mit nur einer Dateigruppe auf ein Sicherungsmedium, daher soll dieses Szenario hier detaillierter erläutert werden. Ein Backup lässt sich in TSQL mit BACKUP DATABASE {dbname} TO <medium>; auf ein logisches Sicherungsmedium durchführen [Bau06 S. 289]. Dies ist ausreichend, um eine vollständige Sicherung einer Datenbank zu erhalten. Alternativ kann mit BACKUP DATABASE {dbname} TO DISK=’path’; auch eine Sicherung auf einen physikalischen Pfad erreicht werden. Wird das vollständige Wiederherstellungsmodell verwendet, so muss entsprechend das Transaktionsprotokoll gesichert werden. Dies kann mit BACKUP LOG {dbname} TO <medium>; erfolgen. 12 Die API stellt die Funktionen zur Verfügung, wie sie auch in den integrierten Möglichkeiten durch SQL Server selbst angeboten werden [25] Diese Funktionalität wird ebenfalls durch das SQL Server Management Studio in Form einer grafischen Oberfläche bereit gestellt [Woo07 S. 149ff]. Abbildung 5: Sicherungsdialog von SQL Server Im Menüpunkt „Optionen“ werden alle Einstellungen erreicht, die ebenso in TSQL in Verbindung mit WITH angegeben werden können. Über diesen Dialog werden auch Sicherungen des Transaktionsprotokolls beim vollständigen oder massenprotokollierten Wiederherstellungsmodell vorgenommen. Letztlich besteht noch die Möglichkeit einer manuellen Sicherung. Dazu kann eine Datenbank vom Server „getrennt“ werden [Woo07 S. 143]. Es werden also alle Transaktionen beendet und die Verbindung geschlossen. Die hinter einer Datenbank liegenden Dateien lassen sich nach dem Trennen wie übliche Dateien handhaben und können so an einen beliebigen Ort [26] zum Sichern kopiert werden. Je nach Datenbankaktivität sollte ein solches Trennen aber nur unter großer Vorsicht erfolgen, da hiermit die Datenbank für Benutzer während der Sicherung nicht mehr erreichbar ist. Alle Varianten, bei denen SQL Server ein Backup auf Basis der integrierten Funktionen durchführt, ist zu eigen, dass ein Backup aus einem Schnappschuss erstellt wird, der zu Beginn des Backups von der Datenbank erstellt wird. Damit wird ein konsistenter Bestand der Daten gesichert. Die Datenbank ist aber weiterhin für andere Nutzer erreichbar. Transaktionen, die nun durch andere Benutzer durchgeführt werden nachdem ein Sicherungsvorgang gestartet wurde, beeinflussen das Backup aber nicht, sondern werden unabhängig vom gewählten Wiederherstellungsmodell im Transaktionsprotokoll zwischengespeichert. Ist die Sicherung der eigentlichen Datenbank beendet, wendet SQL Server alle nach Beginn der Sicherung ausgeführten und abgeschlossenen Transaktionen nacheinander auf das erstellte Backup an und bringt somit bei Abschluss das Backup auf den aktuellen Datenstand, wie er auch in der Datenbank vorhanden ist [Woo07 S. 136] . 3.5. Restore-Funktionsweise Interne Arbeitsweise von SQL Server: Die Wiederherstellung einer Datenbank unterteilt sich prinzipiell in 3 Phasen [Mic0810]: 1. Kopieren der Daten – diese Phase umfasst das Kopieren aller Daten (auch Protokolldaten) aus den Sicherungsdateien in die Datenbankdateien 2. Rollforwardphase – hierbei werden die abgeschlossenen, protokollierten Transaktionen (beispielsweise bei Wiederherstellung einer Protokollsicherung) auf die soeben kopierten Daten angewendet 3. Rollbackphase – in dieser Phase werden Transaktionen, welche nicht durch ein Commit abgeschlossen wurden, rückwärts wieder aufgehoben In der ersten Phase werden alle zu einer Sicherung gehörigen Daten in die Datenbank kopiert. Dies umfasst mindestens eine vollständige Sicherung und eventuell erstellte differenzielle Sicherungen. Die Rollforwardphase dient dazu, noch vorhandene Transaktionen in Protokollsicherungen auf die soeben hergestellten Daten anzuwenden. Bei dem vollständigen Wiederherstellungsmodell kann dabei der Zeitpunkt in Form einer Datumsangabe oder einer bestimmten Transaktionsnummer angegeben werden, bis zu dem die Wiederherstellung durchgeführt werden soll. Begonnen wird mit dem ersten vorhandenen Protokoll, welches in [27] der Regel in der Datensicherung selbst enthalten ist. Diese Transaktionen werden schrittweise und chronologisch, so wie sie auch vom Nutzer ausgeführt wurden, auf den Daten abgearbeitet. Ziel der Wiederherstellung ist, einen konsistenten Datenstand in der Datenbank zum Zeitpunkt der Wiederherstellung zu erhalten. Durch das Rollforward können in der Wiederherstellung aus den Protokollsicherungen Transaktionen enthalten sein, für die noch kein Commit zum Zeitpunkt der Wiederherstellung durchgeführt wurde – die also noch nicht abgeschlossen sind. Um einen konsistenten Datenstand zu erreichen, wird für diese offenen Transaktionen ein Rollback durchgeführt. Dabei werden diese Transaktionen, insofern sie nicht durch andere Transaktionen gesperrt sind, rückgängig gemacht. Sind die Daten konsistent, werden sie online 13 gestellt. Durchführung einer Wiederherstellung durch den Nutzer: Die Wiederherstellung eines Backups unter SQL Server gestaltet sich recht einfach. Auch hier stehen die Möglichkeiten der Bedienung über das SQL Server Management Studio oder die skriptbasierte Wiederherstellung in TSQL zur Verfügung [Bau06 S. 298ff]. 13 Hier: für Benutzer zur Verfügung gestellt, in dem Verbindungen zur Datenbank zugelassen werden [28] Abbildung 6: Wiederherstellungsdialog von SQL Server Unter dem Punkt „Optionen“ finden sich wieder all jene Funktionen, welche auch in TSQL mit den WITH-Argumenten erreicht werden können. In TSQL wird ein Restore ähnlich einfach wie ein Backup durchgeführt: RESTORE DATABASE { dbname } FROM <medium>; Mit Ersetzung von <medium> durch DISK=’path’ kann entsprechend ein physischer Pfadname anstatt eines Backupmediums verwendet werden. Soll statt einer Datenbank nur ein Transaktionsprotokoll wiederhergestellt werden, um beispielsweise nach einem differenziellen Restore die verbleibenden Protokolle einzuspielen, kann dies mit RESTORE LOG { dbname } FROM <medium>; erfolgen. [29] 4. Untersuchung zu Integritätsfaktoren 4.1. Übersicht SQL Server selbst garantiert bei der Wiederherstellung eines Backups aus seinem proprietären Format die Datenintegrität durch die Rollforward- und Rollbackphase, welche sich an das Kopieren der eigentlichen Datendateien aus dem Backup in die Datenbank anschließt. Transaktionen, für die noch kein Commit zum Zeitpunkt der Sicherung durchgeführt wurde, werden bei einem Restore so weit durch ein Rollback rückgängig gemacht, bis ein konsistenter Zustand der Daten erreicht wird [Mic0810]. Nachfolgende Kapitel werden fast ausschließlich für die Wiederherstellung einzelner Tabellen aus einer Sicherung von Bedeutung sein, da vollständige Sicherungen und Wiederherstellung in der Regel auf konsistenten Datenbestanden agieren und somit eine Konsistenz der Daten vom System her bereits gewahrt ist. Es gilt verschiedene Objekte bei einem Object-Level-Recovery zu beachten, die Einfluss auf die Integrität haben: • Constraints (als Spezialfall hier die CHECK-Einschränkung und Schlüsselprüfung) • Trigger • Views • Referenzielle Integrität (als Sonderfall der Constraints) 4.2. Constraints Constraints (Einschränkungen) können auf Spaltenebene oder Tabellenebene vergeben sein. Es handelt sich hierbei um einen Oberbegriff für unterschiedliche Regeln. Ein Sonderfall, die referenzielle Integrität, zu der Primär- und Fremdschlüssel gehören, wird in Abschnitt 4.6 behandelt. [30] Nachfolgende Tabelle gibt einen Überblick, welche Einschränkungen es gibt und welchen Gültigkeitsbereich sie haben [Fae07 S. 211ff]: Constraint Gültigkeitsbereich [NOT] NULL Spalte UNIQUE Spalte/Tabelle CHECK Spalte/Tabelle PRIMARY KEY Spalte/Tabelle FOREIGN KEY Spalte/Tabelle Tabelle 1: Constraint-Typen NULL-Einschränkungen definieren auf Spaltenebene, dass auch NULL-Werte eingefügt werden dürfen. NOT NULL negiert dies. Weiterhin gehören zu den Constraints Schlüsseleinschränkungen (PRIMARY KEY und FOREIGN KEY), sowie UNIQUESchlüssel. Die Schlüsseleinschränkungen definieren allgemein eine oder mehrere Spalten einer Tabelle, die nur eindeutige Werte enthalten [War03 S. 191f]. Eine weitere Einschränkung sind die Gültigkeitsprüfungen (auch CHECK-Einschränkung), welche den Wertebereich einer Spalte definieren. So wird geprüft, ob eine einzufügende Zeile alle Wertebereichsvorgaben einhält, andernfalls wird sie verworfen [War03 S. 204f]. Bei der Wiederherstellung einzelner Tabellen muss auf folgende Constraints keine Rücksicht genommen werden: • [NOT] NULL • UNIQUE • CHECK • PRIMARY KEY Die Integrität kann hierbei dadurch gewahrt werden, dass die Tabelle gelöscht und mit dem Schema zum Zeitpunkt der Sicherung wieder angelegt wird. Somit müssen alle Datenzeilen den gegebenenfalls vorhandenen Constraints entsprechen. [31] 4.3. CHECK-Einschränkung Auch wenn CHECK-Einschränkungen prinzipiell nicht beachtet werden müssen, gibt es einen Sonderfall, der behandelt werden muss: Tabellen, die selbst Primärschlüssel oder eindeutige Schlüssel enthalten und von anderen Tabellen per Fremdschlüssel referenziert werden, wobei auf dem Primär-/UNIQUE-Schlüssel eine CHECK-Einschränkung existiert. Es existiere eine Tabelle manager mit dem Primärschlüssel manager_id (Typ INT) und einer CHECK-Einschränkung, die prüft, ob manager_id<100 gilt. Weiterhin existiere eine Tabelle sales mit einem Fremdschlüssel auf der Spalte manager_id, welcher auf den Primärschlüssel in der Tabelle manager verweist. Davon ausgehend, dass bei Wiederherstellung der Tabelle manager in der Tabelle sales Datensätze enthalten sind, die einen Manager enthalten, der noch nicht in der manager-Tabelle existiert 14 , müsste dieser angelegt werden um die Konsistenz zu wahren. Handelt es sich hierbei um Datensätze in der Tabelle sales mit einer manager_id größer als 100, würde dies der CHECK-Einschränkung aus der manager-Tabelle widersprechen und ein Einfügen zur Konsistenzwahrung wäre nicht möglich. SELECT a.name AS IndexName, c.name AS ColumnName, d.name AS CheckName, d.definition AS CheckDefinition FROM sys.indexes a INNER JOIN sys.index_columns b ON a.object_id=b.object_id INNER JOIN sys.syscolumns c ON a.object_id=c.id AND b.column_id=c.colid INNER JOIN sys.check_constraints d ON a.object_id=d.parent_object_id AND b.column_id=d.parent_column_id WHERE a.is_primary_key=1 ORDER BY a.name, b.index_column_id Listing 1: Abfrage von Schlüsselbeziehungen bei CHECK-Einschränkungen Vorstehende Abfrage listet alle vorhandenen Primärschlüssel und zugehörigen Spalten auf, die in einer CHECK-Einschränkung verwendet werden und gibt auch die angewandte CHECKEinschränkung im Klartext aus. Für tabellenbezogene CHECK-Einschränkungen enthält die Spalte parent_column_id in der Tabelle check_constraints den Wert 0, somit kann auch kein Bezug mehr zu Spalten aus einem Primärschlüssel hergestellt werden. Für diesen Fall muss bei Existenz einer CHECK-Einschränkung auf Tabellenebene immer die Gültigkeit der 14 Dies kann zutreffen, weil beispielsweise zwischen Backup und aktuellem Datenstand ein großer Zeitraum liegt, und in dieser Zeit viele Änderungen in der Datenbank geschehen sind [32] Werte geprüft werden, unabhängig davon, ob ein Primär- oder UNIQUE-Schlüssel davon betroffen ist oder nicht. Zusammenfassend kann gesagt werden, dass CHECK-Einschränkungen nur berücksichtigt werden müssen, falls diese nur einen Bezug zur gesamten Tabelle aufweisen. 4.4. Trigger Trigger sind eigenständige Datenbankobjekte und dafür verantwortlich, dass bei einer spezifizierten SQL-Anweisung auf eine Tabelle oder den SQL Server eine vorgegebene Aktion ausgeführt wird. Es gibt hierbei drei Arten von Triggern: • DML 15-Trigger reagieren auf Änderungen am Datenbestand • DDL 16- Trigger werden bei Änderungen am Datenbankschema ausgelöst • LOGON-Trigger werden beim Beginn einer Benutzersitzung in SQL ausgelöst Für weitere Betrachtungen sind DDL- und DML-Trigger von Bedeutung. Ein einfaches Beispiel für einen DML-Trigger kann sein, dass bei Einfügen eines Verkaufs in eine salesTabelle in einer entsprechenden manager-Tabelle der kumulierte Umsatz des Verkäufers mitgeschrieben wird. So reagiert der Trigger auf ein INSERT INTO dbo.sales … und führt ein UPDATE dbo.manager SET volume_of_sales = … aus. Auf diese Weise kann auch Datenkonsistenz gewährleistet werden. Auf Trigger muss bei einer Wiederherstellung Rücksicht genommen werden, da bei Wiederherstellung einer Tabelle, je nach Typ des Triggers, Aktionen ausgelöst werden können, die ungewollt den Datenbestand verändern. Über die Systemtabellen einer Datenbank lassen sich referenzierte Tabellen und Spalten eines Triggers auslesen, wie auch das Ereignis, auf welches der Trigger reagiert. 15 [War03 S. 152], diese Trigger reagieren auf die SQL Befehle INSERT, DELETE und UPDATE [Kon07 S. 259ff] 16 [War03 S. 152], sind auf Datenbankebene definiert und reagieren in der Hauptsache auf die SQL Befehle CREATE, DROP und ALTER [Kon07 S. 289ff] [Woo07 S. 73] [33] Dies kann durch folgenden Codeschnipsel erledigt werden: SELECT DISTINCT CASE WHEN OBJECT_NAME(a.parent_id) IS NULL THEN 'DATABASE' ELSE OBJECT_NAME(a.parent_id) END AS TableName, g.name AS ColumnName, d.name AS TableSchema, a.name AS TriggerName, f.name AS TriggerSchema FROM sys.triggers a INNER JOIN sys.sysdepends b ON a.object_id=b.id LEFT JOIN sys.objects c ON a.parent_id = c.object_id LEFT JOIN sys.schemas d ON c.schema_id = d.schema_id LEFT JOIN sys.objects e ON a.object_id = e.object_id LEFT JOIN sys.schemas f ON e.schema_id = f.schema_id LEFT JOIN sys.syscolumns g ON b.depid=g.id AND b.depnumber=g.colid WHERE a.is_disabled=0 Listing 2: Auslesen der Tabellenbeziehungen bei Triggern Der eigentliche Zweck eines Triggers bleibt jedoch für das Programm unverständlich. Das Skript, welches durch den Trigger ausgeführt wird, kann über Systemprozeduren von SQL Server ausgelesen werden. Um die Funktionsweise eines Triggers maschinell verstehen zu können, müsste dieses Skript aber unter Zuhilfenahme eines Parsers analysiert werden. Dieses Vorhaben wäre zu umfangreich für diese Arbeit und kann daher in diesem Rahmen nicht berücksichtigt werden. So kann für eine Datenbank, welche Trigger enthält, lediglich eine vollständige Wiederherstellung als konsistent angesehen werden, da eine Auswirkung des Triggers nicht voraussehbar ist. Lediglich Tabellenbeziehungen von Triggern können als Grundlage für die Reaktion auf vorhandene Trigger verwendet werden. Es bleibt zu sagen, dass Trigger vor einer Wiederherstellung deaktiviert und anschließend wieder aktiviert werden sollten, um unerwartete Nebenwirkungen auszuschließen oder minimieren zu können. 4.5. Views Views, also Sichten auf Tabellen, können anstatt der bekannten INSTEAD OF-Trigger (siehe Abschnitt 4.4) auch die Angabe WITH CHECK OPTION enthalten. Diese wird dafür verwendet, bei Datenänderungen, die direkt über den View ausgelöst werden, wie eine INSERT- oder UPDATE-Anweisung die Daten auf Korrektheit zu überprüfen [Fre98 S. 366]. Da dieses Verhalten in der Regel nur bei der direkten Arbeit mit der Datenbank Anwendung findet, und [34] alle Sicherungs- und Wiederherstellungsvorgänge des Programms bei der Arbeit mit Datenbeständen nur auf Tabellen und nicht auf Sichten 17 arbeiten soll, ist hier keine weitere Behandlung notwendig. 4.6. Referenzielle Integrität Die referenzielle Integrität gewährleistet die Konsistenz zwischen Tabellen und ist für den Fall der Wiederherstellung einer Tabelle der sicher häufigste Fall, bei dem Inkonsistenzen auftreten können. Um eine referenzielle Integrität zu definieren, müssen zwischen den entsprechenden Tabellen Schlüsselbeziehungen existieren [War03 S. 97f]. Man unterscheidet dabei: • Primärschlüssel (Primary Key, PK) • Fremdschlüssel (Foreign Key, FK) Ein Primärschlüssel in einer Tabelle definiert einen eindeutigen Schlüssel für eine Zeile und kann aus mehreren Spalten bestehen, aber nur ein einziges Mal für jede Tabelle existieren. Werden mehrere Spalten verwendet, muss die Kombination dieser Spalten einen eindeutigen Wert ergeben [Per03 S. 296f]. Ein Fremdschlüssel in einer Tabelle kann nun auf diesen Primärschlüssel oder auch einen UNIQUE-Schlüssel (siehe Abschnitt 4.2) verweisen. Dabei kann der Fremdschlüssel auch aus mehreren Spalten bestehen, muss sich aber auf den Primärschlüssel beziehungsweise UNIQUE-Schlüssel beziehen [Per03 S. 298f]. Mit diesem Schritt ist bereits eine Konsistenz der Daten gewährleistet, denn bei Definition des Fremdschlüssels kann festgelegt werden, was im Falle einer Schlüsselverletzung geschehen soll. CREATE TABLE sales ( sales_id INT PRIMARY KEY, cust_id INT NULL REFERENCES customers (cust_id) ON DELETE SET NULL ON UPDATE CASCADE, price MONEY, ); sales_date DATETIME, Listing 3: Fremdschlüsseldefinition bei Erstellung einer Tabelle 17 Sichten sind reine Schemaobjekte und somit nicht Träger von Daten [35] Dieses Beispiel zeigt die Syntax zum Erstellen der Schlüssel bei Erstellung einer Tabelle. Damit ist die Spalte sales_id als Primärschlüssel definiert und die Spalte cust_id bezieht sich auf Spalte cust_id aus der Tabelle customers. Voraussetzung für eine ordnungsgemäße Funktion der Schlüsselbeziehungen ist natürlich, dass in der Tabelle customers die Spalte cust_id ebenfalls als Primär- oder UNIQUE-Schlüssel angelegt wurde. Für die ON DELETE- und ON UPDATE-Anweisungen gibt es 4 unterschiedliche Aktionen, die ausgeführt werden können [Per03 S. 303] 18 [War03 S. 198ff]: • NO ACTION – von SQL wird ein Fehler ausgelöst und die ausgeführte Aktion wird rückgängig gemacht (Rollback) • CASCADE – betroffene Zeilen aus der verweisenden Tabelle werden gelöscht/aktualisiert • SET NULL – betroffene Zeilen aus der verweisenden Tabelle werden auf NULL gesetzt (Voraussetzung ist, dass die Fremdschlüsselspalte NULL als Wert zulässt) • SET DEFAULT – betroffene Zeilen aus der verweisenden Tabelle werden auf ihren definierten Standardwert gesetzt Im vorigen Beispiel bedeutet das nun, wenn ein Kunde in der customer-Tabelle gelöscht wird und für den Kunden Umsätze in der sales-Tabelle enthalten sind, wird die cust_id-Spalte in der sales-Tabelle für diese Kunden auf NULL gesetzt. Im zweiten Fall, bei einer Aktualisierung der Kundennummer, werden entsprechende Zeilen aus der sales-Tabelle ebenfalls aktualisiert und mit der neuen Kundennummer versehen. Insofern auf der zu wiederherzustellenden Datenbank Schlüsselbeziehungen existieren, können diese für die Wahrung der Integrität verwendet werden. An dieser Stelle muss aber beachtet werden, Wahrscheinlichkeit dass bei Vorhandensein Inkonsistenzen oder auch von Schlüsselbeziehungen Datenverlust auftreten, mit großer sobald eine wiederherzustellende Tabelle einer Schlüsselbeziehung einen älteren oder neueren Datenstand aufweist als die restlichen beteiligten Tabellen. In einem solchen Fall muss in geeigneter Weise durch das Programm in einem ersten Schritt geprüft werden, ob Schlüsselbeziehungen existieren, ob durch eine Wiederherstellung einer Tabelle Inkonsistenzen auftreten können und entsprechend den Nutzer zu einer Reaktion auf die Konsistenzprobleme auffordern. 18 In der Quelle wird von einer weiteren Reaktion RESTRICT gesprochen, welche in SQL Server aber nicht implementiert ist [36] 5. Produktdefinition 5.1. Problemanalyse Für das Backup und Restore von Datenbanken sind nur wenige Softwareprodukte von Drittanbietern am Markt verfügbar (siehe Abschnitt 1.2). Allen gemeinsam ist, dass sie kommerziell vertrieben werden und dass es sich um proprietäre Software handelt. Nur wenige dieser Produkte bieten laut Spezifikation die Möglichkeit aus einer Datenbanksicherung einzelne Elemente wiederherzustellen. Einem Einsatz von kommerziellen Produkten steht die fehlende Anpassbarkeit und Revisionsfähigkeit gegenüber. Bereits eingehend wurde erläutert, dass auch die Mechanismen von SQL Server nicht in der Lage sind, aus einer bestehenden Datenbanksicherung einzelne Elemente zu extrahieren. Es soll also eine Möglichkeit gefunden werden, Daten zu sichern und entsprechend so zu verwalten, dass daraus einzelne Schema- oder Datenobjekte wiederhergestellt werden können und den arbeitstechnischen wie auch zeitlichen Aufwand eines Restores zu minimieren. Eine Umsetzung dieser Lösung in TSQL bringt zudem Vorteile mit sich: • Revisionsfähigkeit und Anpassbarkeit, da TSQL eine Skriptsprache ist und somit der Quellcode offen liegt • Integration in Stored Procedures und SQL Server Agents Für einen einfacheren Umgang mit dem Programm und zur Hervorhebung in dieser Arbeit soll weiterhin der Name TSQL-Backup für das zu schaffende Werkzeug verwendet werden. 5.2. Spezifikation des Produkts 5.2.1. Zielbestimmungen Muss-Kriterien: • Sicherung und Wiederherstellung von Datenbanken • Wiederherstellung von Datenobjekten aus einer Sicherung • Logbuch-Funktion zur Speicherung der Textausgabe an der SQL Befehlszeile • Prüfung und Ausgabe der Syntax bei fehlerhaftem Aufruf Soll-Kriterien: • Sicherung einer Datenbank auf vollständiger, differenzieller oder inkrementeller Basis [37] • Auslesen und Wiederherstellen des Datenbankschemas • automatische Korrektur von Dateninkonsistenzen bei einem Wiederherstellungvorgang • Löschen von angefertigten Backups • Wiederherstellen von Datenbanken aus differenziellen und inkrementellen Sicherungen (dabei sollen alle abhängigen Sicherungen automatisch wiederhergestellt werden) • Zugriff auf Metadaten (Einsicht in alle gesicherten Elemente eines Backups) • Komprimierung erstellter Backups Kann-Kriterien: • Voreinstellungen sollen die Arbeit mit TSQL-Backup erleichtern • Verifikation zwischen zu sichernder Datenbank und zu erstellendem Backup, sowie wiederhergestellter Datenbank und zugehöriger Sicherung (Prüfung auf Richtigkeit der ausgeführten Vorgänge) Abgrenzungskriterien: • keine Sicherung in oder Wiederherstellung aus Microsoft-eigenem Backup-Format • keine grafische Oberfläche • es können keine Systemdatenbanken mit TSQL-Backup gesichert werden 5.2.2. Produkteinsatz Anwendungsbereich: TSQL-Backup stellt Sicherungs- und Wiederherstellungfunktionen für SQL Server Datenbanken bereit, dabei soll ein völlig neuer Ansatz verwendet werden. Basisfunktionen sollen die vollständige und partielle Sicherung und die Wiederherstellung von SQL Server Datenbanken sein. Alleinstellungsmerkmal ist aber die Wiederherstellung einzelner Objekte aus angefertigten Sicherungen. Durch diese Funktionalität des Object-Level-Recovery soll Datenbankadministratoren ein Programm zur Verfügung gestellt werden, welches Lücken in vorhandenen Sicherungsstrategien ergänzen und so den Prozess des Disaster Recovery optimieren soll. Nebensächlich wird es möglich sein, auf Basis von Schemadaten aus Sicherungen neue, leere Datenbanken zu erzeugen. [38] Zielgruppe: Die Arbeiten mit dem Programm geschehen direkt auf Datenbankebene und dienen der Sicherung einer Datenbank. Damit umfasst die Zielgruppe die Datenbankadministratoren. Da es somit nur eine Anwendergruppe gibt, werden kein Rollenkonzept oder verschiedene Berechtigungsstufen benötigt. Es wird ein Grundverständnis im Umgang mit SQL Server, der SQL Befehlsreferenz und dem Aufbau von Datenbanken vorausgesetzt. Ein Verständnis für Datenbankmodelle und Konsistenzbeziehungen innerhalb einer Datenbank sind ebenso Voraussetzung, da ein Eingreifen des Nutzers bei Konsistenzproblemen notwendig ist. Betriebsbedingungen: Der vom Programm selbst beanspruchte Speicherplatz wird zu vernachlässigen sein und sich im Bereich weniger hundert Kilobyte bewegen. Durch die Arbeit mit TSQL-Backup entstehen aber Datenmengen in nicht unerheblicher Größe. Es muss also ausreichend Speicherkapazität für die Backupdateien zur Verfügung stehen. Dies kann jeder in Windows als Laufwerk einzubindender Datenträger sein, auch die Einbindung eines Netzlaufwerks ist möglich. Für die Arbeit benötigt das Programm eine eigene Metadatenbank, welche auf dem Server liegen muss und auf dem sich auch die zu sichernden Datenbanken befinden. Der zu erwartende Speicherverbrauch durch Backups und die Metadatenbank wird abschließend im Abschnitt 8.3.2 ermittelt. 5.2.3. Produktübersicht Prinzipiell ist zu sagen, dass durch die Umsetzung in TSQL keine eigenständige Anwendung entsteht. Es wird sich bei TSQL-Backup um eine Erweiterung der Funktionalität von SQL Server handeln, genauer: eine Prozedur innerhalb von SQL Server. Hierbei wird auf eine bestehende Client-Server-Architektur von SQL Server aufgesetzt, TSQL-Backup wird dabei durch einen Client – dies wird in der Regel das SQL Server Management Studio sein – gesteuert. Nachfolgend soll daher eine Übersicht über die Strukturen um TSQL-Backup wiedergegeben werden: [39] Abbildung 7: Produktübersicht TSQL-Backup wird also in der bestehenden 2-Schichten-Architektur von SQL Server in die Server-Schicht integriert. 5.2.4. Produktfunktionen Systemfunktionen /PF010/ Syntaxausgabe: Ohne übergebene Parameter an TSQL-Backup soll eine Ausgabe der Syntax erfolgen, die optisch an den Stil der SQL Dokumentation in MSDN angelehnt ist /PF020/ Syntaxüberprüfung: Alle an TSQL-Backup übergebenen Parameter sollen vor Ausführung einer Funktion auf syntaktische und semantische Korrektheit geprüft werden /PF030/ Anzeige der Voreinstellungen: Bestimmte Parameter sollen mit Standardwerten initialisierbar sein, um den Aufruf von TSQL-Backup zu vereinfachen /PF040/ Ändern und Setzen der Voreinstellungen: Voreinstellungen sollen durch den Nutzer geändert oder hinzugefügt werden können; folgende Voreinstellungen sollen berücksichtigt werden: • Verzeichnisvorgaben • Komprimierungseinstellungen [40] Meta-Funktionen /PF110/ Anzeige der vorhandenen Backups: Alle angefertigten Sicherungen durch TSQL-Backup sollen tabellarisch angezeigt werden; darzustellen ist dabei: /PF120/ • ID des Backups • Name der gesicherten Datenbank • Typ der Sicherung • Datum des Sicherungsvorgangs • Erfolgsstatus des Vorgangs • Kurzbeschreibung Anzeige der gesicherten Elemente: Für ausgeführte Sicherungen sollen dem Nutzer die einbezogenen Elemente angezeigt werden, welche in der Sicherung enthalten sind; folgende Informationen sollen ausgegeben werden: /PF130/ • ID des gesicherten Elements • Typ des Elements • Besitzer • Name des Elements Führen eines Logbuchs: Für alle ausgeführten Vorgänge in TSQL-Backup soll ein Logbuch geführt werden, welches, mit Zeitstempel versehen, alle Ausgaben von TSQL-Backup mitschreibt /PF140/ Anzeige des Logbuchs: Für angefertigte Sicherungen soll der Nutzer das zugehörige Logbuch abrufen können, dabei sollen listenartig, chronologisch aufsteigend alle, beziehungsweise zu einem Sicherungsvorgang gehörende, Einträge ausgegeben werden /PF150/ Löschen von Sicherungen: Dem Nutzer soll es möglich sein, angefertigte Sicherungen zu Wartungszwecken und für Bereinigungsarbeiten durch TSQLBackup wieder löschen zu lassen, dabei sollen physikalisch vorhandene Backupdateien und zugehörige Metadaten gelöscht werden; folgende Löschvorgänge sollen umgesetzt werden: • Löschen aller vorhandenen Daten • Löschen eines bestimmten Backups unter Angabe der Backup-ID • Löschen aller Backups einer bestimmten Datenbank unter Angabe des Datenbanknamens [41] • Löschen von Backups unter Beibehaltung einer frei definierbaren Anzahl von zuletzt angefertigten Backups • Löschen von Backups unter Beibehaltung von gesonderten Schemasicherungen Sicherungsfunktionen /PF210/ Schemasicherung: Der Nutzer soll getrennt vom Datenbestand einer Datenbank nur das Schema dieser Datenbank sichern können /PF220/ Vollständige Sicherung: Eine Datenbank soll vollumfänglich gesichert werden, dabei sind Schemaobjekte und der Datenbestand zu erfassen /PF230/ Differenzielle Sicherung: Es sollen nur Unterschiede zur letzten vollständigen Sicherung dokumentiert und gesichert werden; das Datenbankschema ist ebenfalls zu sichern /PF240/ Inkrementelle Sicherung: Es sollen nur Unterschiede zur letzten inkrementellen beziehungsweise vollständigen Sicherung dokumentiert und gesichert werden; das Datenbankschema ist ebenfalls zu sichern /PF250/ Komprimierung von Sicherungen: Für angefertigte Sicherungen sollen physikalisch erzeugte Backupdaten komprimiert werden können Wiederherstellungsfunktionen /PF310/ Schemawiederherstellung: Aus allen Sicherungsarten soll es möglich sein, auf Basis des gesichertes Schemas eine neue, leere Datenbank zu erstellen; vorhandene Datenbanken sollen überschrieben werden können /PF320/ Wiederherstellung aus vollständiger Sicherung: Eine Datenbank soll aus einer vollständigen Sicherung mit allen gesicherten Daten wiederhergestellt werden; vorhandene Datenbanken sollen überschrieben werden können /PF330/ Wiederherstellung aus Teilsicherung: differenzielle und inkrementelle Sicherungen sollen wiederherstellbar sein, dazu sollen automatisch alle zugehörigen, vorhergehenden Sicherungen eingespielt werden (bei differenziellen Sicherungen betrifft dies die vorhergehende vollständige [42] Sicherungen und bei inkrementellen Sicherungen die vorhergehende vollständige und alle dazwischen angefertigten inkrementellen Sicherungen); vorhandene Datenbanken sollen überschrieben werden können /PF340/ Wiederherstellung eines Objektes aus einer Sicherung: Aus vollständigen, differenziellen und inkrementellen Sicherungen sollen sich folgende Objekte einzeln wiederherstellen lassen: • Tabellen • Sichten • Funktionen • Prozeduren vorhandene Objekte sollen dabei überschrieben werden können; bei der Wiederherstellung aus einer Teilsicherung sollen gemäß /PF330/ alle zugehörigen, vorhergehenden Sicherungen ebenfalls zur Wiederherstellung herangezogen werden /PF350/ Konsistenzprüfung: Bei der Wiederherstellung sollen, insofern notwendig, Konsistenzprüfungen stattfinden, um festzustellen, ob der Datenbestand nach der Wiederherstellung konsistent ist /PF360/ Vorgehen bei Konsistenzfehlern: Wenn die Konsistenzprüfung nach /PF350/ negativ ausfällt, dann soll der Nutzer die Möglichkeit haben eine Wiederherstellung mit folgenden Optionen zu erzwingen (andernfalls wird eine Wiederherstellung nicht ausgeführt): • Versuch der Konsistenzwiederherstellung durch TSQL-Backup, gegebenenfalls durch Löschen von Daten • Versuch, alle Beziehungen, welche den Konsistenzfehler hervorrufen würden, aufzulösen, um bei der Datenwiederherstellung keine Daten zu verlieren 5.2.5. Produktdaten /PD010/ Voreinstellungen (max. 10) Parameter – Text Wert – Text [43] /PD020/ Parameter (max. 50) ID – Zahl, eindeutig Parameter – Text Wert – Text, optional Typ – {INT/STRING/ARRAY} Elternelement – Zahl, optional (bildet eine Hierarchie ab) /PD030/ Backupdaten (unbegrenzt) ID – Zahl, eindeutig Typ – Text Datenbankname – Text Datum – Zeitstempel Kurzbeschreibung – Text, optional Zustand – {finished/not_finished} Hashs vorhanden – {ja/nein} Elternbackup – Zahl, optional (ID des vorgehenden Backups bei Teilsicherungen) Logbuch-ID – Zahl /PD040/ Objektdaten (unbegrenzt) ID – Zahl, eindeutig Backup-ID – Zahl (Zuordnung des Objekts zum Backup) Typ – Text Name – Text Besitzer – Text, optional Skript – Text, optional (SQL Befehl zur Erzeugung des Objekts) komprimiert – {ja/nein} (zeigt bei Tabellen an, ob diese komprimiert wurden) /PD050/ Hashwerte (unbegrenzt) Backup-ID – Zahl (Zuordnung zu einem Backup) Objekt-ID – Zahl (Zuordnung zu einem Objekt) Hash – Binärdaten (Hashwert über eine Datenzeile) gelöscht – {ja/nein} (zeigt an, ob es sich um einen Hashwert handelt, der bei [44] einer Teilsicherung nicht mehr existierte, das heißt, es handelt sich um eine gelöschte Datenzeile) /PD060/ Logbuch (unbegrenzt) ID – Zahl, eindeutig Log-ID – Zahl (ID eines Vorgangs) Datum – Zeitstempel Text – Text, optional 5.2.6. Produktleistungen /PL010/ Identität In der Metadatenbank erzeugte Einträge zu Sicherungsvorgängen im Logbuch und Daten zu gesicherten Objekten müssen aus Konsistenzgründen eindeutig identifizierbar sein /PL020/ Fehler Durch das Programm oder den Nutzer verursachte Fehler sollen akkumuliert ausgegeben werden /PL030/ Performanz Metadaten Eine Anfrage an die Metadaten muss, insofern keine Sicherungsvorgänge parallel laufen, innerhalb von 3 Sekunden beantwortet werden /PL040/ Performanz Ausführung Während der Arbeit mit TSQL-Backup sollen parallele Nutzerprozesse nicht behindert (blockiert) werden /PL050/ Bedienung Der Aufruf von TSQL-Backup soll für den Nutzer intuitiv und knapp möglich sein [45] 5.2.7. Qualitätsanforderungen nach ISO/IEC 9126 Produktqualität sehr gut gut normal irrelevant Funktionalität Angemessenheit X Richtigkeit X Interoperabilität Sicherheit X X Ordnungsmäßigkeit X Zuverlässigkeit Reife X Fehlertoleranz Robustheit X X Wiederherstellbarkeit X Benutzbarkeit Verständlichkeit X Erlernbarkeit X Bedienbarkeit X Effizienz Zeitverhalten X Verbrauchsverhalten X Änderbarkeit Analysierbarkeit X Modifizierbarkeit X Stabilität X Prüfbarkeit X Übertragbarkeit Anpassbarkeit X Installierbarkeit X Konformität X Austauschbarkeit X Tabelle 2: Qualitätsanforderungen an TSQL-Backup Funktionalität TSQL-Backup soll in jedem Fall Sicherungs- und Wiederherstellungsvorgänge korrekt durchführen, die enthaltenen beziehungsweise wiederhergestellten Daten müssen also „richtig“ sein, daher werden Funktionalität und Zuverlässigkeit hoch bewertet. Wichtigstes [46] Kriterium ist, die Quelldaten bei der Arbeit durch TSQL-Backup in keinster Weise zu verändern. Zuverlässigkeit Es ist ebensfalls wichtig einen unbefugten Zugriff zu verhindern, wie auch Fehleingaben des Nutzers und Fehler, die während der Arbeit mit TSQL-Backup entstehen, korrekt zur behandeln. Unvollständige oder fehlende Angaben in der Parameterliste des Programms sollen dem Anwender möglichst deskriptiv mitgeteilt werden. Diese Fehler werden auf der TSQL-Befehlszeile zurückgegeben und können somit durch den Anwender, beispielsweise durch Anpassung der Parameterliste, korrigiert werden. Insofern TSQL-Backup Hinweise oder Fehler während der Arbeit ausgibt, kann dies zwei Ursachen haben: 1. Tritt während der Arbeit ein Fehler auf, der durch TSQL-Backup festgestellt wurde, soll der Nutzer darauf hingewiesen werden und ihm die möglichen Optionen angeboten werden, mit denen er TSQL-Backup erneut aufrufen kann. Bei der Entwicklung muss also beispielsweise Rücksicht auf alle denkbaren Situationen genommen werden, bei denen durch ein Restore eine Inkonsistenz auftreten kann. Für diese Fälle soll dem Nutzer, insofern die Inkonsistenz durch das Programm überhaupt selbständig behoben werden kann, eine Option zur Verfügung stehen, die die Wiederherstellung erzwingt. 2. Handelt es sich hierbei aber um einen Fehler, der direkt durch SQL Server erzeugt wird, erhält der Nutzer zwar die Fehlerausgabe von SQL Server, muss aber an dieser Stelle den Fehler selbst behandeln, da TSQL-Backup auf diese Fehler nicht reagieren und diese auch nicht auswerten kann. Die Ursache hierfür liegt in dem Schweregrad des Fehlers, den SQL Server ausgibt. Ab einem bestimmten Schweregrad werden SQL Skripte sofort abgebrochen 19, somit ist auch keine Reaktion durch TSQL-Backup auf diese Fehler mehr möglich. Meist wird es sich hierbei um Konflikte in Schemaobjekten handeln. 19 Schweregrade zwischen 19 und 25 bewirken eine Beendigung der Verbindung zwischen Server und Client [Bau06 S. 376] [47] Benutzbarkeit Da die Zielgruppe für TSQL-Backup Datenbankadministratoren sind, wird ein gewisses Grundverständnis für SQL und die Funktionsweise von TSQL-basierten Befehlen vorausgesetzt, die Benutzbarkeit wird daher nicht so sehr gewichtet, obgleich die Bedienung von TSQL-Backup einfach sein soll. Effizienz Die Effizienz spielt an dem Punkt eine Rolle, wo Objekte aus Sicherungen wiederhergestellt werden sollen. Die Arbeit auf Basis von TSQL verdeutlicht, dass das Backup nur so schnell sein kann, wie der SQL Server selbst ist. Ein nativer Zugriff auf die Basisdateien ist an dieser Stelle sicher performanter. Nun ist auch zu bedenken, dass über jede einzelne Zeile eine Prüfsumme gebildet werden könnte, welche dann gegebenenfalls mit älteren Backups verglichen werden muss, um ein differenzielles oder inkrementelles Abbild zu erzielen. Dies ist ein sehr rechenintensiver Prozess. Ein abschließender Performanz-Test im Kapitel 8.3 soll schließlich Aufschluss über die Effizienz geben und zeigen, in welchen Größenordnungen hinsichtlich Speicherplatzverbrauch und Anzahl Datenzeilen das Programm am effizientesten arbeitet. Da ein Schwerpunkt von TSQL-Backup aber die Wiederherstellung einer einzelnen Tabelle aus einer Sicherung ist, sollte die Laufzeit des Wiederherstellungsvorgangs entstehende Laufzeitschwächen des Backups kompensieren. Der Verbrauch von Speicherplatz ist weniger relevant, da mit Komprimierungsverfahren gearbeitet werden kann. Änderbarkeit und Übertragbarkeit Änderbarkeit und Übertragbarkeit wurden sehr niedrig bewertet, da TSQL-Backup sehr nah am SQL-Standard von Microsoft arbeiten wird und daher der Einsatz auf anderen Betriebssystemen oder Datenbanksystemen ausgeschlossen wird. Für das Programm wird ein Initialisierungsskript erstellt, welches die Arbeitsumgebung einrichtet, Funktionen und Prozeduren einrichtet und Standardwerte einstellt. Diese Standardwerte und für TSQLBackup notwendige Prozeduren werden in einer Datenbank gespeichert. [48] 5.2.8. Benutzeroberfläche TSQL-Backup wird aus Sicht des Nutzers vollständig auf TSQL-Ebene arbeiten, es erfolgt also eine klassische Interaktion zwischen Programm und Nutzer auf der SQL-Befehlskonsole, daher ist auch kein dialogbasiertes Arbeiten möglich. Das heißt, bei jedem Schritt im Programm, der ein Eingreifen des Nutzers erfordert, muss die Prozedur mit Erweiterung der Befehlszeile um die notwendigen Eingaben erneut aufgerufen werden. Wichtig hierbei ist es, dem Nutzer bei Aufruf der Prozedur ohne Parameter oder mit unvollständigen Parametern eine Hilfestellung zur Syntax zu ermöglichen. Standardwerte sollen dem Nutzer ermöglichen, die am häufigsten verwendeten Funktionen ohne aufwändige und komplexe Parameterübergabe zu nutzen. Eine Benutzeroberfläche wird daher nicht von TSQL-Backup selbst, sondern durch den SQL Client zur Verfügung gestellt. 5.2.9. Nichtfunktionale Anforderungen Eine Revisionsfähigkeit ist durch den offen liegenden Quellcode gegeben. Insofern Daten gesichert werden, die für eine Buchführung relevant sind, sollen Bestimmungen des Handelsgesetzbuches bezüglich Aufbewahrung und Zugänglichmachung dieser Daten erfüllt werden 20 . Weitere Gesetze oder Normen, wie beispielsweise Datenschutzrichtlinien, sind nicht vorgegeben. Der Zugriffsschutz auf TSQL-Backup soll dadurch gegeben sein, dass eine Nutzung nur durch (Datenbank-) Administratoren möglich ist. Ein Zugriffsschutz auf die gesicherten Daten soll gewährleistet werden, dies kann durch einen Passwortschutz der erzeugten Daten und/oder einen physikalischen Zugriffsschutz (durch räumlich gesicherte) Lagerung der Daten erfolgen. Das zu erwartende Datenaufkommen ist nicht schätzbar, es sollten aber Speichermedien eingesetzt werden, die auf die Ablage großer Dateien optimiert sind. Es sollte auch keine Begrenzung einer Dateianzahl pro Verzeichnis geben. Eine redundante Auslegung der Hardware, beispielsweise durch gespiegelte Festplattensysteme, wird aus Sicherheitsgründen empfohlen. Die Speichermedien sollten zudem mit ausreichend groß dimensionierter Bandbreite angebunden werden, um keinen Engpass bei der Arbeit mit Sicherungen zu bilden. 20 § 257 HGB regelt unter anderem, dass elektronisch aufbewahrte Dokumente jederzeit lesbar gemacht werden müssen; http://www.gesetze-im-internet.de/hgb/__257.html [49] 5.2.10. Umgebungsbedingungen Die Entwicklung und der Testbetrieb finden in SQL Server 2005 Standard auf Basis eines Microsoft Windows Server 2003 Standard R2 statt. Durch Einsatz von SQL Server Standard können alle sonstigen Editionen von SQL Server bedenkenlos eingesetzt werden, da alle verwendeten SQL Funktionen in jeder Edition nutzbar sind. Einzige Ausnahme bildet die Express Edition von SQL Server, welche nur minimalistische Funktionen zum Betrieb von SQL Datenbanken bietet und an dieser Stelle ausgeschlossen wird. Durch den Einsatz von Microsoft SQL Server 2005 Standard bleiben auch Funktionen unberücksichtigt, welche nur in bestimmten Ausgaben des SQL Server 21 verfügbar sind. Dazu gehören beispielsweise partitionierte Tabellen und partitionierte Indizes, welche nur in der Enterprise, Developer und Evaluation Edition angeboten werden [Bau06 S. 25f]. Einem Einsatz in SQL Server 2008 steht nichts entgegen, auf SQL Server 2000 kann ein Betrieb nicht garantiert werden, da es Probleme in der Abwärtskompatibilität von SQL Befehlen geben kann. Die Programmierung geschieht in SQL Server Management Studio, welches als ClientApplikation die Verbindung zu SQL Server herstellt und in Form des Query Analyzers die SQL Befehlskonsole am Arbeitsplatz zur Verfügung stellt. Da SQL Server Management Studio keine Möglichkeiten zur Dokumentation bietet, wird die Dokumentation direkt im Quellcode vorgenommen. 21 Ausgenommen Microsoft SQL Server 2005 Express [50] 6. Analyse 6.1. Anwendungsfälle In Abschnitt 5.2.4 wurde durch die Produktfunktionen die funktionelle Sicht von TSQLBackup dargestellt. Folgend sollen nun die Anwendungsfälle erarbeitet werden. Akteur wird in jedem Fall ein Datenbankadministrator sein. Vorgänge, die das Datenbankschema betreffen, sind jeweils im entsprechenden Anwendungsfall des Backups oder Restores enthalten, weil diese Funktionen einen Teil einer vollständigen Sicherung oder Wiederherstellung darstellen. Abbildung 8: Anwendungsfalldiagramm [51] Nachfolgend soll exemplarisch auf einige wichtige Anwendungsfälle nach dem Schema von Cockburn [Sch07] näher eingegangen werden. Use-Case Datenbankschema auslesen Ziel Es sollen alle Schemaobjekte einer Datenbank extrahiert und in ein SQL Skript überführt werden Vorbedingung Die auszulesende Datenbank existiert im System Nachbedingung Erfolg In der Metadatenbank sind SQL Skripte abgelegt, mit denen die Schemaobjekte der Datenbank neu angelegt werden können Nachbedingung Fehlschlag Die Metadatenbank Datenbankschema Akteure Datenbankadministrator Auslösendes Ereignis Der Benutzer übergibt als Aktionsparameter „Schema auslesen“ an TSQL-Backup enthält keine Informationen über das Eingabedaten • Beschreibung 1. Nutzer übergibt den Namen der auszulesenden Datenbank 2. TSQL-Backup liest das Datenbankschema aus 3. Datenbankschema wird in Form eines SQL Skripts in der Metadatenbank abgelegt 4. TSQL-Backup gibt Informationen über die ausgelesenen Schemaobjekte aus Erweiterungen - Alternativen - Name der auszulesenden Datenbank Tabelle 3: Anwendungsfall "Datenbankschema auslesen" Use-Case Sicherung durchführen Ziel Eine Datenbank soll gesichert werden, dabei soll das Datenbankschema und der Datenbestand erfasst und gesichert werden Vorbedingung Die auszulesende Datenbank existiert im System Nachbedingung Erfolg In der Metadatenbank sind SQL Skripte zu den Schemaobjekten angelegt, sowie Informationen über das ausgeführte Backup und im physischen Backup-Speicher sind die exportierten Daten der Datenbank archiviert Nachbedingung Fehlschlag Die Metadatenbank enthält keine Informationen Datenbankschema und es wurden keine Daten exportiert Akteure Datenbankadministrator Auslösendes Ereignis Der Benutzer übergibt als Aktionsparameter „Sicherung durchführen“ an TSQL-Backup über das Eingabedaten • • • Beschreibung 1. Nutzer übergibt den Namen der auszulesenden Datenbank 2. Anwendungsfall „Datenbankschema auslesen“ wird gestartet 3. Zu exportierende Daten werden gesammelt Name der zu sichernden Datenbank Art der Sicherung (vollständig/differenziell/inkrementell) Option zur Aktivierung der Komprimierung [52] 4. Datenbestand wird aus Datenbank exportiert 5. Metainformationen über exportierte Daten werden in der Metadatenbank abgelegt 6. TSQL-Backup gibt Informationen über die gesicherten Objekte aus 3a. Bei differenziellen oder inkrementellen Sicherungen müssen nur die geänderten Daten zum Export markiert werden 4a. Daten können komprimiert werden, wenn vom Nutzer gewünscht Erweiterungen Alternativen - Tabelle 4: Anwendungsfall "Sicherung durchführen" Use-Case Element wiederherstellen Ziel Aus einer von TSQL-Backup angefertigten Sicherung soll ein einzelnes Datenbankobjekt wiederhergestellt werden Vorbedingung Die Sicherung, aus der ein Objekt wiederhergestellt und die Datenbank in der das Objekt angelegt werden soll, müssen existieren Nachbedingung Erfolg Datenbankobjekt wurde aus der Sicherung in der Zieldatenbank angelegt und mit Daten befüllt (wenn es sich um ein Datenobjekt handelt) Nachbedingung Fehlschlag Zieldatenbank ist unverändert und es wurde kein Objekt angelegt Akteure Datenbankadministrator Auslösendes Ereignis Der Benutzer übergibt als Aktionsparameter „vollständige Wiederherstellung“ an TSQL-Backup und übergibt weitere Parameter zur Wiederherstellung eines einzelnen Elements Eingabedaten • • • • • ID der Sicherung welche verwendet werden soll ID des Elements innerhalb der Sicherung welches wiederhergestellt werden soll Name der Zieldatenbank Optionen zur Konsistenzwahrung Option zum Überschreiben eines vorhandenen Objekts Beschreibung 1. Nutzer übergibt ID der Sicherung und des wiederherzustellenden Elements 2. Prüfung, ob Objekt noch nicht existiert, muss erfolgreich ablaufen 3. Sicherung wird ausgelesen und Element wird extrahiert 4. Konsistenzprüfung für Wiederherstellung muss erfolgreich ablaufen 5. Schema des wiederherzustellenden Objekts wird in der Zieldatenbank angelegt 6. Im Fall eines Datenobjekts werden ebenfalls die gesicherten Daten eingespielt 7. TSQL-Backup gibt Informationen über das Restore aus Erweiterungen 6a. Handelt es sich bei der Sicherung um eine Teilsicherung, werden automatisch alle vorhergehenden Backups verwendet, um ebenfalls enthaltene Datenbestände einzuspielen Alternativen 2a. Ist Option zum Überschreiben eines vorhandenen Objekts aktiviert, kann ein vorhandenes Element automatisch durch das [53] System gelöscht werden 4a. Ist entsprechende Option zur Konsistenzwahrung aktiviert, kann durch das System automatisch eine Korrektur von Inkonsistenzen vorgenommen werden Tabelle 5: Anwendungsfall "Element wiederherstellen" Use-Case vollständige Wiederherstellung Ziel Eine Datenbank soll aus einer Sicherung vollständig Schemaobjekten und Datenbestand wiederhergestellt werden Vorbedingung Sicherung, welche wiederhergestellt werden soll, muss existieren Nachbedingung Erfolg Datenbank wurde aus der Informationen wiederhergestellt Nachbedingung Fehlschlag Keine Veränderung am betreffenden Server, keine Datenbank wurde angelegt beziehungsweise wiederhergestellt Akteure Datenbankadministrator Auslösendes Ereignis Der Benutzer übergibt als Aktionsparameter Wiederherstellung“ an TSQL-Backup Sicherung mit allen mit enthaltenen „vollständige Eingabedaten • • • Beschreibung 1. Nutzer übergibt ID der Sicherung 2. Prüfung, ob Datenbank noch nicht existiert, muss erfolgreich ablaufen 3. Datenbank wird angelegt 4. Sicherung wird ausgelesen und für jedes enthaltene Element der Anwendungsfall „Element wiederherstellen“ gestartet 5. TSQL-Backup gibt Informationen über das Restore aus Erweiterungen Alternativen ID der Sicherung welche verwendet werden soll Name der Zieldatenbank Option zum Überschreiben eines vorhandenen Objekts 2a. Ist Option zum Überschreiben eines vorhandenen Objekts aktiviert, kann eine vorhandene Datenbank automatisch durch das System gelöscht werden Tabelle 6: Anwendungsfall "vollständige Wiederherstellung" Der komplexeste Anwendungsfall der vollständigen Wiederherstellung soll anschließend noch in einem Aktivitätsdiagramm dargestellt werden, um die internen Abläufe besser zu verdeutlichen. Erkennbar ist, und dieses Verhalten zieht sich durch jeden Anwendungsfall, dass es nur einen Interaktionspunkt mit dem Nutzer gibt. Wie bereits erwähnt, ist es auf Basis der Entwicklung in TSQL für den Nutzer nur beim Aufruf von TSQL-Backup möglich mit dem Programm zu interagieren. Ein weiteres Eingreifen des Nutzers ist nicht möglich. [54] Nutzer TSQL-Backup Aufruf von TSQL-Backup Prüfen, ob Sicherung mit der ID existiert Sicherung existiert nicht Sicherung existiert Prüfen, ob Zieldatenbank noch nicht existiert Option zum Überschreiben nicht aktiviert Zieldatenbank existiert Zieldatenbank existiert nicht Option zum Überschreiben aktiviert vorhandene Datenbank löschen neue Datenbank anlegen Anwendungsfall "Element wiederherstellen" starten Weitere Elemente in Sicherung vorhanden Alle Elemente aus Sicherung verarbeitet Ausgabe des Logbuchs Abbildung 9: Aktivitätsdiagramm "vollständige Wiederherstellung" 6.2. Untersuchung zum SQL Server Transaktionsprotokoll Für die folgenden Kapitel ist zu sagen, dass die verwendete Literatur meist nur unzureichend über bestimmte Interna von SQL Server informiert. Viele Fachbücher zu SQL Server enthalten einen hohen Anteil SQL Syntax, welche auch problemlos im Internet einsehbar ist, aber nur wenig Details über den internen Aufbau, was bei einem kommerziellen Produkt [55] verständlich erscheint. Hilfe konnte hier meist in speziellen SQL-Fachforen im Internet gefunden werden. Es soll untersucht werden, ob es möglich ist, dass SQL Transaktionsprotokoll auszulesen, um damit einerseits Transaktionsprotokollsicherungen und –rücksicherungen wie in SQL Server durchführen zu können, andererseits aber auch, um mit Hilfe des Protokolls durch Rollbackund Rollforwardvorgänge die Datenkonsistenz bei Wiederherstellungen zu wahren (vergleiche Abschnitt Fehler! Verweisquelle konnte nicht gefunden werden.). Das Transaktionsprotokoll von SQL Server liegt in einem binären, proprietären Format vor, welches nicht lesbar ist. Mit DBCC LOG(<dbname>,-1) lässt sich das Transaktionsprotokoll für eine Datenbank im höchsten Detailgrad ausgeben [Bau06 S. 133f], aber es ist nicht ohne Weiteres möglich, hieraus einen lesbaren und ausführbaren TSQL-Code zu erzeugen, der die angezeigten Transaktionen reproduzieren kann. Mit vorgenanntem DBCC-Befehl erhält man bei höchstem Detailgrad für jede Protokollfolgenummer 22 den Protokolleintrag in hexadezimaler Form. Um zu verdeutlichen, dass ein Lesen des Logs im Klartext nicht möglich ist, soll eine beliebiger solcher Protokolleintrag umgewandelt werden. Ein Beispiel für einen solchen hexadezimalen Eintrag lautet: 0x00003E000B02000015040000780002005E16000000000305AD52000001000D00590000000 B020000150400007700000100000A0000000001010000004600020034011400480026010000 ED2C0000000003004946204E4F5420455849535453202853454C454354202A2046524F4D207 379732E736368656D6173205748455245206E616D65203D204E2748756D616E5265736F7572 63657327290A45584543207379732E73705F6578656375746573716C204E274352454154452 0534348454D41205B48756D616E5265736F75726365735D20415554484F52495A4154494F4E 205B64626F5D270A474F0A4946204E4F5420455849535453202853454C454354202A2046524 F4D203A3A666E5F6C697374657874656E64656470726F7065727479284E274D535F44657363 72697074696F6E27202C204E27534348454D41272C4E2748756D616E5265736F75726365732 72C204E554C4C2C4E554C4C2C204E554C4C2C4E554C4C29290A0000000000000000DE130000 00000101000C000059ED607F00000102000402030004 Für die Umwandlung soll das Freeware-Tool „XVI32“ 23 behilflich sein. Dazu wird der Eintrag ohne die führenden Zeichen 0x, welche den Beginn einer hexadezimalen Zeichenkette kennzeichnen, in das Programm übertragen. 22 Log Sequence Number, LSN: eine Protokollfolgenummer identifiziert eine Transaktion im Protokoll eindeutig, dabei können mehrere Protokolleinträge zu einer Transaktion gehören und sind durch Zeiger verknüpft [Mic0812] 23 http://www.chmaas.handshake.de/delphi/freeware/xvi32/xvi32.htm [56] Das Programm erzeugt daraus folgende Ausgabe (übermäßige Leerzeichen und Zeilenumbrüche wurden dabei entfernt): > ­R x ^ w F 4H & í, Y IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = N'HumanResources') EXEC sys.sp_executesql N'CREATE SCHEMA [HumanResources] AUTHORIZATION [dbo]' GO IF NOT EXISTS (SELECT * FROM ::fn_listextendedproperty(N'MS_Description' , N'SCHEMA',N'HumanResources', NULL,NULL, NULL,NULL)) Þ Yí` Deutlich erkennbar sind TSQL-Befehle, aber auch binäre Steuerzeichen. Schon allein, dass der Befehl zum Auslesen des Transaktionsprotokolls in der Hilfe von SQL Server undokumentiert ist, weist darauf hin, dass ein direktes Eingreifen des Nutzers in das Protokoll durch Microsoft unerwünscht zu sein scheint. Auch in Fachbüchern ist dieser Befehl nur selten zu finden, wie beispielsweise in [Bau06 S. 133f]. Es existieren einige wenige Produkte, die das Transaktionslog auslesen können. Eines der bekanntesten Programme ist „ApexSQL Log Tool“ 24, welches kommerziell vertrieben wird. Trotz aktiviertem vollständigen Wiederherstellungsmodell lässt das Tool aber bestimmte SQL-Anweisungen vermissen. So werden beispielsweise DML-Anweisungen auf Spalten vom Typ TEXT nicht dokumentiert. Dieser Spaltentyp kann nur mit speziellen Anweisungen von SQL Server gelesen und geschrieben werden. Allein dieser Nachteil und der nicht unerhebliche Preis für dieses Produkt lassen das Tool aber für den Einsatz in dieser Arbeit ausscheiden. „SQL Log Rescue“ 25 von redgate ist zwar frei herunterzuladen, arbeitet hingegen aber nur auf der Version SQL Server 2000. 24 http://www.apexsql.com/sql_tools_log.asp 25 http://www.red-gate.com/products/SQL_Log_Rescue/index.htm [57] Eine Art Transaktionsprotokollsicherung und -rücksicherung, wie sie unter SQL Server möglich ist, kann somit nicht realisiert werden. Auch die Konsistenzwiederherstellung in der Datenbank auf Grundlage des Transaktionsprotokolls ist im Rahmen von TSQL-Backup nicht möglich. 6.3. Untersuchung zum Auslesen des Datenbankschemas 6.3.1. Möglichkeiten zum Auslesen Zweck von TSQL-Backup ist es, eine Datenbank (vollständig) zu sichern und wiederherstellen zu können. Neben den zu sichernden Daten gehört dazu auch das Schema der Datenbank, welches vorzugsweise auch einzeln ohne Daten gesichert werden soll. Angenehmer Nebeneffekt dieser Schemasicherung ist, dieses einzeln, ohne Wiederherstellung der Daten in einer neuen Datenbank, wieder einspielen zu können, um so eine neue, leere Datenbank nach dem Muster einer bereits vorhanden zu erhalten. Nicht beachtet werden müssen Systemobjekte, wie Systemtabellen, Systemsichten oder Systembenutzer, da diese bei einer CREATE DATABASE-Anweisung standardmäßig nach Vorgabe der model-Datenbank angelegt werden [Woo07 S. 66]. Für das Auslesen des Schemas einer Datenbank kann es verschiedene Methoden geben. Grob lassen sich diese wie folgt klassifizieren: • Skripterzeugung über grafische Oberflächen (wie SQL Server Management Studio) • Skripterzeugung durch direktes Auslesen von Systemsichten und -tabellen und Zusammensetzen zu einem Skript • Skripterzeugung durch Kommandozeilenbefehle/-programme Da ein automatisierter Prozess geschaffen werden soll, kommen nur die beiden letzten Möglichkeiten in Betracht. 6.3.2. Integrierte Funktionen in SQL Server Eine Erzeugung des Skripts für ein Schemaobjekt durch Auslesen von Systeminformationen ist die flexibelste Variante, da hier die durchaus komplexe TSQL-Syntax berücksichtigt werden kann und alle Parameter in die Erzeugung eines Skripts einfließen können. Für [58] bestimmte Schemaobjekte leistet SQL Server bereits Unterstützung, indem Systemprozeduren wichtige Informationen über Objekte liefern. Dazu gehören unter anderem: • sp_helpconstraint liefert alle Einschränkungstypen für eine bestimmte Tabelle • sp_helpindex gibt Informationen zu Indizes auf einer Tabelle zurück • sp_helptrigger liefert Informationen zu Triggern • sp_helptext zeigt die Definition einer nicht verschlüsselten Prozedur, einer Sicht, einer CHECK-Einschränkung, eines Triggers und anderer Objekte an Es existieren weitere, wichtige Objekte, die auf diese Weise nicht ausgelesen werden können: Tabellen. Weiterer Nachteil an den Systemprozeduren ist, dass diese oft unterschiedliche, aber wichtige Information gleichzeitig in mehreren Resultsets gleichzeitig zurückgeben und deshalb ein automatisiertes Auslesen dieser Ergebnisse nicht möglich ist. Werden die Skripte durch Auslesen von Systeminformationen zusammengestellt, müssen hierbei aber auch alle zulässigen Parameter beachtet werden, es muss also die SQL-Syntax semantisch und syntaktisch korrekt nachgebildet werden. Allein die Syntax zum Erstellen einer Tabelle ist derart umfangreich [Fre98 S. 346ff], dass im Rahmen dieser Arbeit von dieser Vorgehensweise Abstand genommen werden muss, da eine Prozedur zur Erzeugung von Skripten für alle möglichen Objekte den zeitlichen Rahmen bei Weitem überschreitet. 6.3.3. Auslesen durch Hilfstools DPW Daher soll die dritte Variante, das Auslesen des Schemas über ein Kommandozeilenprogramm, genauer untersucht werden. Häufig im Internet zu finden ist der Microsoft Database Publishing Wizard 26 (weiterhin DPW). Dies ist ein Microsoft-Tool, welches über eine grafische Oberfläche, als auch per Kommandozeile zu bedienen ist. Voraussetzung zum Einsatz dieses Tools ist die Komponente „Verwaltungsobjektauflistung“ aus dem Microsoft FeaturePack für SQL Server 2005 27. Sind beide Komponenten installiert, kann bereits ein Schema ausgelesen werden. Ein gravierender Unterschied zwischen der grafischen Oberfläche von DPW und der Kommandozeilenversion besteht darin, dass über die 26 http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=56e5b1c5-bf17-42e0-a410371a838e570a 27 http://www.microsoft.com/downloads/details.aspx?displaylang=de&FamilyID=df0ba5aa-b4bd-4705-aa0ab477ba72a9cb [59] GUI einzelne Objekte aus der Datenbank markiert werden können, für welche letztlich ein Skript erzeugt werden soll. In der Hilfe von DPW taucht -include als Option für die Kommandozeilenvariante auf, diese Option findet sich aber an keiner weiteren Stelle in der Hilfe wieder und erzeugt auch bei Verwendung an der Kommandozeile einen Fehler mit dem Hinweis, dass dies eine unbekannte Option sei. Somit besteht über die Kommandozeile nur die Möglichkeit, alle Schemaobjekt der Datenbank auf einmal auszulesen. Dies ist nicht schön und erhöht sicherlich die Laufzeit des Prozesses geringfügig, ist aber für einen weiteren Einsatz nicht unbedingt hinderlich. Ein Aufruf des Tools auf der Kommandozeile zum Auslesen des Schemas einer Datenbank AdventureWorks über eine vertrauenswürdige Verbindung und Abspeichern in einer Datei sieht wie folgt aus: “C:\Programme\Microsoft SQL Server\90\Tools\Publishing\SqlPubWiz.exe” script -f -q -d AdventureWorks -schemaonly -nodropexisting C:\AdventureWorks.sql Bei weiteren Experimenten mit diesem Tool stößt man an eine Grenze, sobald sich in der Datenbank ein verschlüsseltes Objekt befindet. Verschlüsselte Objekte können sein: • Views • Trigger • Prozeduren Diese sind zwar innerhalb von SQL Server ausführbar, sollen aber verhindern, dass Dritte Einblick in deren Aufbau erhalten. Mit dieser Tatsache kann auch DPW nicht umgehen, wirft einen entsprechenden Fehler auf der Kommandozeile und bricht die Ausführung ab. Ungewollter Nebeneffekt dieses Verhaltens ist, dass DPW in diesem Fall vollständig abbricht und keinerlei Skripte zurückgibt. Es existiert auch keine weitere Option für dieses Tool, um zu veranlassen, dass verschlüsselte Objekte ignoriert werden sollen. Wenn DPW also weitere Anwendung in dieser Arbeit findet, dann bedingt ein Abbruch aufgrund vorhandener verschlüsselter Objekte auch einen kompletten Abbruch von TSQL-Backup. Ein Beispiel, der einen Abbruch bedingen würde, zeigt folgende Ausgabe von DPW: Microsoft (R) SQL Server Datenbankveröffentlichungs-Assistent Version (1.1.1.0) Copyright (c) Microsoft Corporation. Alle Rechte vorbehalten. Skript für die AdventureWorks-Datenbank wird erstellt - Nur Metadatenskript generieren - Skript für SQL Server '2005' generieren Fehler: 'sp_encrypted_procedure' ist eine verschlüsselte gespeicherte [60] Prozedur. Die Skripterstellung für verschlüsselte gespeicherte Prozeduren wird nicht unterstützt. Im Internet finden sich Hinweise, dass diese verschlüsselten Objekte nicht tatsächlich verschlüsselt sind, sondern aufgrund einer Nachlässigkeit von Microsoft nur „verfremdet“ werden 28,29 und wieder zu entschlüsseln sind 30. Dabei wird eine Prozedur über verschiedene XOR-Befehle unlesbar gemacht. Weiterhin kursieren wenige kommerzielle Produkte, wie „DecryptSQL“ 31 von Devlib Inc. und „SQL Decryptor“ 32 von DMT Software Inc., sowie freie SQL Skripte 33 , welche ein vorhandenes verschlüsseltes Objekt entschlüsseln sollen. Meist sind diese freien Skripte aber an SQL Server 2000 gebunden und funktionieren oft nur bei Prozeduren. Nur kommerzielle Produkte, wie die genannten, werben mit der Fähigkeit, auch Objekte für SQL Server 2005 und 2008 entschlüsseln zu können. Da es keine verlässliche Freeware gibt und die verfügbaren freien SQL Skripte nicht in jedem Fall fehlerfrei funktionieren oder Einschränkungen aufweisen (beispielsweise bei der Größe von Datentypen haben33), muss der Aspekt des Abbruchs bei verschlüsselten Objekten als de facto angenommen werden. SMO Eine weitere Möglichkeit, um das Schema befehlszeilenorientiert auszulesen, besteht über SQL Server Management Objects (weiterhin SMO). SMO ist eine Bibliothek des Microsoft .NET-Frameworks 34, mit der es möglich ist, SQL Server zu verwalten und eine Verbindung mit SQL Server aufzubauen, um somit DML- wie auch DDL-Befehle ausführen zu können. Um SMO im Rahmen dieser Arbeit verwenden zu können, wird „Windows PowerShell 1.0“ 35 (weiterhin PowerShell) als Skriptsprache herangezogen. SMO lässt sich aus sehr vielen 28 http://blog.sqlauthority.com/2007/07/01/sql-server-explanation-of-with-encryption-clause-for-storedprocedure-and-user-defined-functions/#comment-38868 29 http://www.derkeiler.com/Newsgroups/microsoft.public.sqlserver.security/2006-08/msg00287.html 30 http://www.mssqltips.com/tip.asp?tip=1046 31 http://www.devlib.net/decryptsql.htm 32 http://www.sql-tools.net/sqldecryptor/ 33 http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=505&lngWId=5 34 http://www.microsoft.com/downloads/details.aspx?familyid=10CC340B-F857-4A14-83F525634C3BF043&displaylang=de 35 http://www.microsoft.com/downloads/details.aspx?familyid=C61FB27B-E71C-4ECF-9D2C9B299B149490&displaylang=de [61] Interpreter- und Programmiersprachen verwenden. Für diesen Zweck reicht die PowerShell aber aus. Fazit: Für diese Arbeit wird SMO nicht zum Einsatz kommen, da hierfür eine neue Skriptsprache angewandt werden muss, bei der der Aufwand zur Einarbeitung dem Nutzen überwiegt. Somit wird DPW als Möglichkeit zum Auslesen des Datenbankschemas genutzt. Um bei der weiteren Entwicklung eventuell auftretende Probleme schneller lösen zu können, seien hier die wichtigsten bekannten Probleme und Eigenarten von DPW aufgeführt [Mic07]: • Datenbanklogins werden in Rollen und ggf. Schemas umgewandelt • Rollen, welche anderen Rollen zugeordnet sind, können nicht verarbeitet werden • Es können Probleme auftreten, wenn eine durch DPW festgelegte Kollation einer Textspalte nicht mit der Kollation der Zieldatenbank übereinstimmt Datenbanknutzer in SQL Server an zwei Stellen im Server gespeichert, bei einer Wiederherstellung durch die Funktionalitäten von SQL Server selbst wird die interne Verbindung dieser zwei gespeicherten Nutzerdaten getrennt, so dass an dieser Stelle eine Korrektur erfolgen muss, um die Verbindung wiederherzustellen [Woo07 S. 144]. Aufgrund der Konvertierung von Datenbanklogins in Rollen ist zu abzusehen, dass bei der Wiederherstellung einer Datenbank mit umfassendem Nutzerkonzept eine nachträgliche Korrektur durch einen Administrator notwendig sein kann. 6.4. Untersuchung zur eindeutigen Kennzeichnung von Daten Da differenzielle und inkrementelle Backups vorgesehen sind, muss ein Weg gefunden werden, eine Datenzeile eindeutig zu kennzeichnen. Tabellen sind die Träger von Daten, daher müssen als Schemaobjekte für den Prozess der Datenextraktion aus der Datenbank auch nur Tabellen in Betracht gezogen werden. Eine Überführung von Relationen in Normalformen bedingt die Einführung von Schlüsseln, somit kann allgemein gesagt werden, dass Relationen in mindestens der dritten Normalform eindeutige Datenzeilen enthalten. Davon ausgehend, dass aber nicht immer Schlüsselbeziehungen oder eindeutige Indizes in einer Datenbank existieren, ein klassischer [62] Fall hierfür ist häufig ein Data Warehouse, oder auch das Vorliegen der dritten Normalform nicht immer gewünscht ist, muss ein anderer Weg gefunden werden. SQL Server bietet die Systemfunktion CHECKSUM an. Diese wurde entwickelt, um damit Hashwerte für Indizes zu erstellen. Schon bei den ersten Versuchen, wird klar, dass diese Funktion ungeeignet ist, da sie für unterschiedliche Zeichenketten die gleiche Prüfsumme liefert. Beispielsweise liefern folgende SQL-Befehle stets eine Prüfsumme von 142: SELECT CHECKSUM('a') SELECT CHECKSUM('A') SELECT CHECKSUM('a ') SELECT CHECKSUM('A ') Damit ist ersichtlich, dass bereits Änderungen an der Groß- und Kleinschreibung in der Datenzeile verloren gehen würden. Selbst Microsoft erläutert in seiner Dokumentation, dass für die Zwecke einer eindeutigen Kennzeichnung die Funktion HashBytes geeigneter ist [Mic0813]. Diese Funktion erwartet als ersten Parameter einen Hashalgorithmus und als zweiten Parameter eine Zeichenkette vom Typ VARBINARY mit einer Länge von maximal 8000 Zeichen. Als Hashalgorithmen werden MD2, MD4, MD5, SHA und SHA-1 verstanden. SHA1 erzeugt einen 160-Bit-Hashwert und gilt als sicherste der genannten Methoden. Auch wenn MD5 bereits aufgrund gefundener Kollisionen als unsicher gilt 36, sollte dessen Anwendung dennoch ausreichen. Letztlich bedeuten sicherere Verschlüsselungsalgorithmen auch mehr verbrauchte Rechenzeit. Da es sich hierbei aber nur um einen Parameter einer Funktion handelt, der leicht austauschbar ist, sollte sich zu jeder Zeit der Algorithmus ändern lassen. Zu beachten wäre dann aber, dass bereits erstellte differenzielle und inkrementelle Backups nach einer Umstellung des Hashalgorithmus nicht mehr einsetzbar sind. Tabellen enthalten meist mehrere Spalten. Um einen eindeutigen Hashwert zu erhalten, sollte man über jede einzelne Spalte der Tabelle einen Hashwert bilden, in der Reihenfolge, in der die Spalten in der Tabelle auch angeordnet sind und diese einzelnen Hashwerte dann auch in dieser Reihenfolge zu einer langen Zeichenkette verbinden. Durch Beachtung der Spaltenreihenfolge und das Nacheinanderverketten der Hashwerte kann eine Kollision von Hashwerten für unterschiedliche Datenzeilen nahezu ausgeschlossen werden. Hierbei tritt aber ein Nebeneffekt auf. Ohne Schlüssel in Tabellen, können Datenzeilen in einer Tabelle 36 MD5 wurde 1991 als sicherer Nachfolger von MD4 entwickelt. Bereits 1996 fand Hans Dobbertin zwei unterschiedliche Nachrichten, die bei MD5-Verschlüsselung den gleichen Hashwert ergaben. Technischer Hintergrund ist, dass der Schlüsselwert eines Textes T gleich dem Schlüsselwert eines anderen Textes T‘ entspricht, man sucht also zwei Texte T und T‘ welche diese Bedingung erfüllen. MD5 gilt somit als theoretisch geknackt. [63] identisch mehrfach vorkommen. Die gefundene Verfahrensweise würde diese Datenzeilen nur ein einziges Mal erfassen, da sie identisch sind. Inwiefern sich hieraus ein Nachteil ergibt, wird sich in der weiteren Arbeit zeigen. 6.5. Datenkonsistenz während eines Sicherungsvorgangs Für TSQL-Backup ist es bei Sicherungsvorgängen wichtig, stets einen konsistenten und sich nicht mehr ändernden Datenbestand vorzufinden, mit dem gearbeitet werden kann. Bereits in SQL Server 2005 gibt es die Möglichkeit echter Snapshots von Datenbanken, diese Möglichkeit ist aber nur der Enterprise Edition vorbehalten und scheidet daher hier aus [Kon07 S. 409]. Bei einem echten Snapshot wird von der betroffenen Datenbank ein Abbild erstellt, auf welchem gearbeitet werden kann. Daher muss auf Sperren und Isolationsstufen zurückgegriffen werden. Prinzipiell zu unterscheiden ist dabei, dass SQL Server in der Regel selbstständig Sperren auf Objekten vergibt, durch den Nutzer aber explizit Sperren auf Tabellenebene aber auch die Aktivierung von verschiedenen Isolationsstufen für Transaktionen vorgenommen werden können. Die internen Sperrtypen von SQL Server können sich auf verschiedenen Ebenen erstrecken, zu den Wichtigen gehören [Bau06 S. 388f]: • Zeilensperre („RID“) • Seitensperre („PAGE“) • Tabellensperre („TABLE“) • Dateisperren („FILE“) • Datenbanksperre („DATABASE“) Diese Sperren werden unter anderem je nach Anforderung, Anzahl zeitgleicher Transaktionen auf ein Objekt, vorhandener Ressourcen und Transaktionsisolationsstufe durch SQL Server automatisch gesetzt. Dabei gibt es grundlegend 4 Arten von Sperren [Bau06 S. 389f]: • gemeinsame Sperre – ermöglicht mehreren Transaktionen ein zeitgleiches Lesen von Daten • exklusive Sperre – wird bei INSERT-, UPDATE- oder DELETE-Vorgängen aktiviert • beabsichtigte Sperre – wird intern für das Sperrmanagement durch SQL Server verwendet • Aktualisierungssperre – ist eine Mischung aus gemeinsamer und exklusiver Sperre [64] Dabei werden Sperren aktiviert, sobald eine Transaktion gestartet wird. Dabei gilt das „Allesoder-nichts-Prinzip“. Das heißt, dass eine Transaktion, egal wie viele Befehle darin ausgeführt werden, erfolgreich abgeschlossen, oder bei einem Fehler vollständig durch ein Rollback rückabgewickelt wird [Lei03 S. 322f]. Der technische Hintergrund dabei ist, dass SQL Server alle Änderungen einer Transaktion erst im Speicher ausführt und nur bei Erfolg sowie einem COMMIT diese Änderungen auch auf der Festplatte schreibt [Hen04 S. 501f]. Von Interesse hingegen sind die Isolationsstufen für Transaktionen. Mit ihnen kann man steuern, wie isoliert voneinander verschiedene Transaktionen ablaufen dürfen. Folgende Stufen (aufsteigend nach Restriktion) sind in SQL Server implementiert [Bau06 S. 391ff] [Hen04 S. 508ff]: Isolationsstufe Dirty Reads Nichtwiederholbare Lesevorgänge Phantomwerte READ UNCOMMITTED ja ja ja keinerlei Benutzung von Sperren READ COMMITTED nein ja ja Standardeinstellung von SQL Server; gemeinsame Sperren beim Lesen; verhindert Dirty Reads REPEATABLE READ nein nein ja gemeinsame Sperren beim Lesen; verhindert nichtwiederholbare Lesevorgänge SNAPSHOT nein nein nein Schnappschuss auf Sicht der Daten, beim Beginn der Transaktion; verhindert Phantomwerte SERIALIZABLE nein nein nein sehr restriktiv, blockiert alle anderen Aktualisierungs- oder Einfügevorgänge Merkmale Tabelle 7: Isolationsstufen in SQL Server Aus der Tabelle ist ersichtlich, welche unangenehmen Nebeneffekte bei der Verwendung der Isolationsstufen auftreten können. Es ist nun nicht ratsam, immer die Isolationsstufe mit der höchsten Restriktion einzusetzen, da hier immer abgewägt werden muss, inwiefern parallele Transaktionen eingeschränkt beziehungsweise behindert werden. Die Snapshot-Isolationsstufe ist neu in SQL Server 2005 [Bau06 S. 23]. Hierbei werden geänderte Daten durch andere Transaktionen in der tempdb-Datenbank vorgehalten, bis die Transaktion per COMMIT oder ROLLBACK beendet wird und auch die Snapshot-Transaktion beendet ist [Bau06 S. 392]. Die Stufe ist dabei so flexibel, dass eine konsistente Datensicht gewährt wird, aber auch in gewissem Maße Änderungen an Daten durch andere [65] Transaktionen möglich sind. Sie ist daher nicht so restriktiv wie SERIALIZABLE und soll im Rahmen dieser Arbeit Verwendung finden. Zur Benutzung der Snapshot-Isolationsstufe muss in SQL Server eine administrative Option gesetzt werden: ALTER DATABASE {name} SET ALLOW_SNAPSHOT_ISOLATION ON Mit dieser gesetzten Option ist es möglich, eine Snapshot-Transaktion zu starten. Wichtig hierbei zu wissen: in allen Datenbanken, die in einer Snapshot-Transaktion beteiligt sind, muss diese Option aktiviert sein – also nicht nur in der zu sichernden Datenbank, sondern auch in der Metadatenbank 37. Eine Snapshot-Transaktion wird in TSQL dann wie folgt umgesetzt: SET TRANSACTION ISOLATION LEVEL SNAPSHOT BEGIN TRANSACTION […] COMMIT TRANSACTION SET TRANSACTION ISOLATION LEVEL READ COMMITTED Listing 4: Arbeiten mit einer Transaktions-Isolationsstufe Mit der abschließenden Anweisung wird der Transaktionslevel wieder auf den Standardwert zurückgesetzt (dieser kann natürlich abweichen, insofern durch den Nutzer eine andere Einstellung in SQL Server vorgenommen wurde). 6.6. Datenkonsistenz bei der Wiederherstellung Abschnitt 6.2 hat gezeigt, dass das Auslesen des Transaktionsprotokolls kompliziert ist und im Rahmen dieser Arbeit nicht für die Konsistenzwahrung verwendet werden kann. Daher muss TSQL-Backup eigenständig die Konsistenz sicherstellen. Auf Grundlage der Integritätsfaktoren aus dem Kapitel 4 können folgende Ansätze formuliert werden: 37 Ein Versuch, Daten zwischen zwei Datenbanken zu verknüpfen, bei denen nur für eine der SnapshotIsolationsmodus aktiviert war, scheiterte (der Befehl lief endlos), da entsprechende Ressourcen nicht gesperrt werden konnten [SQL10] [66] CHECK-Einschränkungen: Ziel-Element existiert bereits Ziel-Element existiert noch nicht Element in Ziel-DB anlegen Hinweis auf FORCE-Option Daten in Ziel-DB einspielen Es existieren keine CHECK-Einschr. CHECK-Einschr. existieren FORCE-Option Komplettes DBIst gesetzt Schema temporär anlegen FORCE-Option ist nicht gesetzt Struktur zwischen temp. DB und Ziel-DB vergleichen Struktur identisch Struktur ist nicht identisch Daten aus Backup in temporäre DB einspielen Fehlerausgabe Es existieren keine CHECK-Einschr. CHECK-Einschränkung anlegen CHECK-Einschr. Konsistenzprüfung existieren für CHECKEinschränkungen Vorhand. CHECKEinschränkungen in Ziel-DB deaktivieren Erfolgreich angelegt Prüfung erfolgreich Prüfung nicht erfolgreich CHECK-Behandl. aktiviert CHECK-Einschr. nicht erfolgreich angelegt Tabelle in Ziel-DB leeren und Daten neu einspielen Fehlerausgabe Vorhand. CHECK- CHECK-Behandl. nicht aktiviert Einschränkungen in Ziel-DB aktivieren CHECK-Behandlung wurde nicht aktiviert Hinweis auf zusätzlichen Parameter CHECK-Behandlung wurde aktiviert Daten löschen die CHECK-Einschr. nicht genügen Abbildung 10: CHECK-Einschränkung bei der Wiederherstellung Der einfachste Anwendungsfall besteht in der Wiederherstellung einer noch nicht vorhandenen Tabelle. Für den Fall einer existierenden Tabelle müssen Strukturvergleiche vorgenommen werden. Der Strukturvergleich zwischen vorhandener Tabelle und der gesicherten Tabelle im Backup kann nur über eine temporär wiederhergestellte Kopie aus dem Backup geschehen. Dabei müssen die Anzahl der Spalten, die Reihenfolge der Spalten und [67] die Spaltentypen übereinstimmen. Weiterhin müssen beide Tabellen auf inhaltliche Übereinstimmung der existierenden CHECK-Bedingungen geprüft werden. Eine Konsistenzprüfung bei Vorhandensein von CHECK-Einschränkungen kann in diesem Fall auf einfache Weise erfolgen. Es reicht die Gesamtanzahl Zeilen im Backup mit der Anzahl Zeilen zu vergleichen, die der CHECK-Einschränkung genügen. Hierzu muss diese Einschränkung in die WHERE-Klausel der Abfrage aufgenommen werden, welche die Anzahl zutreffender Datensätze zählt. Weichen beide Werte voneinander ab, so gehen Daten bei der Wiederherstellung unter Umständen verloren. Der Nutzer soll hier die Möglichkeit haben, die CHECK-Einschränkungen zu deaktivieren, um wirklich alle Daten aus dem Backup wiederherstellen zu können und als Alternative sollen die Daten bei aktivierter Einschränkung mit dem Risiko des Datenverlustes eingespielt werden. Trigger: Ziel-Element existiert bereits Ziel-Element existiert noch nicht Element in Ziel-DB anlegen FORCE-Option Komplettes DBIst gesetzt Schema temporär anlegen FORCE-Option ist nicht gesetzt Struktur zwischen temp. DB und Ziel-DB vergleichen Hinweis auf FORCE-Option Struktur identisch Daten in Ziel-DB einspielen Struktur ist nicht identisch Es existieren keine TRIGGER Fehlerausgabe TRIGGER existieren Vorhandene TRIGGER in Ziel -DB deaktivieren Tabelle in Ziel-DB leeren und Daten neu einspielen TRIGGER anlegen Vorhandene TRIGGER in Ziel -DB aktivieren Erfolgreich angelegt TRIGEGR nicht erfolgreich angelegt Fehlerausgabe Abbildung 11: Wiederherstellung mit vorhandenen Triggern [68] Auch hier ist ersichtlich, dass für den Fall einer nicht existierenden Tabelle keine besonderen Prüfungen stattfinden müssen. Andernfalls muss wieder ein Strukturvergleich zwischen bestehender Tabelle und existierender Tabelle durchgeführt werden. Wie in Abschnitt 4.4 erläutert, ist es im Rahmen dieser Arbeit nicht möglich, die Funktionsweise eines Triggers für das Programm verständlich zu machen, daher kann bei vorhandenen Triggern nur derart reagiert werden, dass diese Trigger vor dem Einspielen von Daten deaktiviert und anschließend wieder aktiviert werden. Fremdschlüssel: Komplettes DBSchema temporär anlegen Daten aus Backup in temporäre DB einspielen Vorhandene FK deaktivieren Tabelle in ZielDB leeren Ziel-Element existiert bereits Es existieren keine FK Ziel-Element existiert bereits Ziel-Element existiert noch nicht FK existieren Prüfung erfolgreich Prüfen, ob strukturelle und inhalt. Integrität des FK gewährleistet ist FORCE-Option Ist gesetzt Ziel-Element existiert noch nicht Struktur zwischen temp. DB und Ziel-DB vergleichen Ziel-Element existiert noch nicht und FKBehandlung aktiviert FK-Behandl. aktiviert Prüfung nicht erfolgreich Daten in ZielDB einspielen Element in ZielDB anlegen FK-Behandlung wurde nicht aktiviert Hinweis auf zusätzlichen Parameter Ziel-Element existiert oder FK-Behandl. nicht aktiviert Dummy-Schlüssel zur Integritätswahrung einfügen FORCE-Option ist nicht gesetzt Hinweis auf FORCE-Option Struktur identisch Prüfen, ob inhalt. Integrität des FK gewährleistet ist Struktur ist nicht identisch Es existieren keine FK FK existieren Ziel-Element existiert noch nicht Fehlerausgabe FK anlegen Ziel-Element existiert bereits Vorhandene FK aktivieren Erfolgreich angelegt FK nicht erfolgreich angelegt Fehlerausgabe Abbildung 12: Wiederherstellung bei vorhandenen Schlüsselbeziehungen [69] Bei Vorhandensein von Schlüsselbeziehungen muss zusätzlich zur Strukturprüfung der Tabelle auch eine strukturelle und inhaltliche Prüfung der beteiligten Schlüssel stattfinden. Ist die Zieltabelle bereits vorhanden, muss geprüft werden, ob der Aufbau des Schlüssels im Backup, bezüglich der verwendeten Spalten und Spaltentypen, dem Aufbau des Schlüssels in der Zieltabelle entspricht. Existiert die Zieltabelle nicht, muss geprüft werden, ob die verwendeten Spalten im Schlüssel in der referenzierten Tabelle existieren und vom Datentyp übereinstimmen. Diese Strukturprüfung muss ebenso für Fremdschlüssel stattfinden, die auf anderen Tabellen liegen, aber auf die wiederherzustellende Tabelle verweisen, da hier zwischen Sicherung und Wiederherstellung Änderungen am Schema geschehen sein könnten. In jedem Fall muss nachfolgend untersucht werden, ob es inhaltliche Differenzen gibt. Das heißt, handelt es sich um einen Fremdschlüssel, der auf der wiederherzustellenden Tabelle angelegt wurde und auf eine andere Tabelle verweist, dürfen die Schlüsselspalten der wiederherzustellenden Tabelle nur Werte annehmen, die auch in der referenzierten Tabelle enthalten sind. Insofern diese Inkonsistenzen durch TSQL-Backup korrigiert werden sollen, kann nur derart reagiert werden, dass die Datenzeilen, welche die Inkonsistenz hervorrufen, in der wiederherzustellenden Tabelle gelöscht werden. Weiterhin muss beachtet werden, dass auf anderen Tabellen Fremdschlüssel existieren können, welche auf die wiederherzustellende Tabelle verweisen. Es kann der Fall eintreten, dass in den referenzierenden Tabellen Daten enthalten sind, welche in der wiederherzustellenden Tabelle nicht mehr (oder noch nicht) existieren. An dieser Stelle könnte eine Korrektur durch TSQL-Backup so geschehen, dass Dummy-Werte in der wiederherzustellenden Tabelle angelegt werden, um die Konsistenz zu gewähren. Dieses Vorgehen ist aber sehr kompliziert, da Schlüssel auch aus mehreren Spalten bestehen (es müssen also die exakten Datentypen dieser Spalten berücksichtigt werden) und auf diesen Spalten weitere CHECK-Einschränkungen existieren können. Eine Aktivierung vorhandener CHECK-Einschränkungen, Trigger oder Schlüsselbeziehungen nach dem Einspielen von Daten auf der wiederhergestellten Tabelle könnte selbst dann durch TSQL-Backup automatisch erfolgen, wenn der Nutzer die Konsistenzbehandlung durch das Programm nicht aktiviert hat. Hierbei kann lediglich der Fall eintreten, dass eine Reaktivierung dieser Integritätsfaktoren aufgrund einer Verletzung der Integritätsbedingung nicht möglich ist. [70] 6.7. Einbindung von externen Hilfstools TSQL bietet nur einen begrenzten Sprach- und Funktionsumfang. Um insbesondere die Arbeit mit Dateien zu ermöglichen, muss auf die Windows-Kommandozeile ausgewichen werden. Dieser Weg kann erforderlich sein für: • Auflisten von Dateien in Verzeichnissen • Komprimierung/Dekomprimierung von Dateien („gzip“) • Arbeit mit DPW • Export/Import von Dateien aus/in SQL Server In TSQL steht hierzu die Systemfunktion xp_cmdshell zur Verfügung [Mic0814]. Diese Funktion arbeitet synchron, wartet also auf die Beendigung der Kommandozeile und kann die Ausgabe an der Kommandozeile an TSQL zurückgeben. Standardmäßig ist diese Funktion aus Sicherheitsgründen deaktiviert und muss per administrativem Eingriff aktiviert werden. Dazu ist folgendes Vorgehen notwendig [Bau06 S. 67f]: EXEC sp_configure 'show advanced options',1 GO RECONFIGURE GO EXEC sp_configure 'xp_cmdshell',1 GO RECONFIGURE GO EXEC sp_configure 'show advanced options',0 Listing 5: Aktivieren von xp_cmdshell 6.8. Datenmodell Zur Verwaltung von Einstellungen, sowie der Informationen über Sicherungen und Wiederherstellungen und zum Vorhalten der Logbücher wird eine Datenbank benötigt. [71] Nachfolgend sollen, auf Grundlage von Abschnitt 5.2.5, die Tabellen definiert werden, welche Metadaten enthalten: Tabelle: logs (enthält das Logbuch) Spalte Typ-Definition Beschreibung log_id INT NOT NULL ID des erzeugten Logs zum Programmaufruf entry_id INT IDENTITY(1,1) NOT NULL eindeutige ID einer Logbuch-Zeile date DATETIME NOT NULL Datum des Logbucheintrags log_text VARCHAR(MAX) NULL Log-Inhalt Tabelle: hashs_XYZ (enthält berechnete Hashwerte für gesicherte Tabellen) Spalte Typ-Definition Beschreibung hash VARBINARY(MAX) NOT NULL Hashwert der Datenzeile delflag BIT NOT NULL DEFAULT (0) Flag, das anzeigt, ob Datenzeile gelöscht wurde (bei diff./inkl. Backups wichtig) Tabelle: objects (enthält Grundinformationen gesicherter Objekte) Spalte Typ-Definition Beschreibung object_id INT IDENTITY(1,1) NOT NULL eindeutige ID eines gesicherten Objektes type VARCHAR(255) NOT NULL Typ des Objektes (aus Tabelle schema_lookup) name VARCHAR(255) NOT NULL Name des Objektes in der Datenbank Tabelle: objects_detail (enthält Detailinformationen zu den Objekten) Spalte Typ-Definition Beschreibung object_id INT NOT NULL Objekt-ID owner VARCHAR(255) NOT NULL Besitzer des Objektes in der Datenbank create_script TEXT NOT NULL SQL-Skript zur Wiedererzeugung des Objektes compressed BIT NOT NULL DEFAULT (0) Flag, das anzeigt, ob die exportierten Daten komprimiert wurden (nur bei Tabellen) [72] Tabelle: backups (enthält Informationen über Sicherungsvorgänge) Spalte Typ-Definition Beschreibung backup_id INT IDENTITY(1,1) NOT NULL eindeutige ID des ausgeführten Backups type VARCHAR(255) NOT NULL Typ des Backups (vollständig/diff./inkr./Schemasicherung) db_name VARCHAR(255) NOT NULL Name der gesicherten Datenbank date DATETIME NOT NULL Datum der Sicherung description VARCHAR(8000) NULL Beschreibung des Backups state VARCHAR(20) NOT NULL DEFAULT ('not_finished') Status des Backups: finished = ordnungsgemäß abgeschlossen not_finished = „kaputtes“ Backup hashs_exist BIT NOT NULL DEFAULT (0) Flag, das anzeigt, ob zu diesem Backup Hashwerte berechnet wurden parent_id INT NOT NULL DEFAULT (0) ID eines übergeordneten Backups (bei inkr. Backups das letzte inkr., bei diff. Backups das letzte vollständige Backup) master_id INT NOT NULL DEFAULT (0) ID des Hauptbackups (bei diff./inkr. Backups das letzte vollständige Backup) log_id INT NOT NULL DEFAULT (0) ID des zugehörigen Logbuchs Tabelle: backup_objects (Zuordnungstabelle von Objekten zu Backups) Spalte Typ-Definition Beschreibung backup_id INT NOT NULL ID des Backups object_id INT NOT NULL IDs der Objekte, die durch das Backup erfasst wurden Tabelle: schema_lookup (Referenztabelle für Schemaobjekte) Spalte Typ-Definition Beschreibung type VARCHAR(255) NOT NULL Kürzel für Objekttyp type_desc VARCHAR(255) NOT NULL Objekttyp, wie er aus DPW erzeugt wird user_desc VARCHAR(255) NOT NULL Alternativtext für die Ausgabe [73] Tabelle: settings (enthält Voreinstellungen) Spalte Typ-Definition Beschreibung setting_name VARCHAR(255) NOT NULL Parameter der Voreinstellung setting_value VARCHAR(255) NOT NULL Wert zu diesem Parameter Tabelle: allowed_arguments (enthält die zulässige Syntax und bildet eine Hierarchie ab) Spalte Typ-Definition Beschreibung argument_id INT IDENTITY(1,1) NOT NULL eindeutige ID einer Zeile in dieser Tabelle param VARCHAR(255) NULL erlaubter Parameter für Programmaufruf value VARCHAR(255) NULL erlaubter Wert für Parameter type VARCHAR(25) NOT NULL zulässige Wertebereiche für übergebene Werte ("string", "int", "{a, b ,c}") depends_on INT NULL ID des übergeordneten Elementes (nötig für zusätzliche Optionen für eine andere Option) needs_child BIT NOT NULL Flag, das kennzeichnet, ob dieser Parameter weitere Optionen erwartet must_be_given BIT NOT NULL Flag, das kennzeichnet, ob dieser Parameter beim Aufruf des Programms angegeben werden muss [74] Aus diesen Tabellen ergibt sich folgendes Datenbankschema: logs PK arguments settings entry_id log_id date log_text backups PK backup_id FK4 type db_name date description state hashs_exist parent_id master_id log_id argument param value setting_name setting_value backup_objects FK2 FK3 backup_id object_id hashs_XYZ hash delflag objects PK object_id FK4 name type hash_table schema_lookup PK type type_desc user_desc objects_detail FK1 object_id owner create_script compressed Abbildung 13: Entity-Relationship-Model der Metadatenbank Zu jeder Datentabelle, die durch TSQL-Backup erfasst wird, wird eine Hashtabelle erstellt. Der Tabellenname dieser Hashtabelle enthält dabei die durch das Programm erstellte eindeutige object_id der erfassten Tabelle. Da bei großen, zu sichernden Datenbanktabellen oder häufiger Nutzung des Backupprogramms schnell große Datenbestände in einer einzigen Hashtabelle auflaufen würden, sollte eine Trennung (auch „Partitionierung“) durchgeführt werden. Durch die Trennung wird ein Performanzgewinn erreicht. 6.9. Einsatz von Prozeduren oder Funktionen TSQL ist eine prozedurale Skriptsprache. Eine objektorientierte Entwicklung ist somit leider nicht möglich. Zur besseren Wiederverwendbarkeit und zur Übersichtlichkeit lassen sich aber bestimmte Funktionalitäten als Prozedur verfassen. TSQL unterstützt sowohl Funktionen als auch Prozeduren. [75] Nachfolgend eine Übersicht der Unterschiede beider Varianten: Eigenschaft Funktion Prozedur Parameterrückgabe Rückgabe direkt an Tabelle oder SELECT-Befehl Rückgabe an das aufrufende Programm DML-Aktionen nein ja DDL-Aktionen nein ja Änderung von Umgebungsvariablen nein ja Verwendung als Datenquelle in SELECT-Befehl (SELECT * FROM function/procedure) ja ja Fehlerbehandlung Abbruch bei Auftreten eines Fehlers Fehler können bis zu einem bestimmten Schweregrad abgefangen werden Aufruf Aufruf meist nur in Verbindung mit einem SELECT-Befehl Aufruf durch EXEC-Befehl, somit eigenständiges Unterprogramm möglich Tabelle 8: Unterschiede zwischen Funktionen und Prozeduren in TSQL Aufgrund der flexiblen Einsatzmöglichkeiten werden Unterprogramme und ausgelagerte Funktionalitäten fast ausschließlich als Prozeduren umgesetzt. Ausschlaggebend für diese Entscheidung ist die fehlende Unterstützung von DML- und DDL-Aktionen in Funktionen. Für die Berechnung von Hashwerten wird eine Funktion zum Einsatz kommen, da die Rückgabe dieser Funktion direkt in einer SELECT-Anweisung weiter verarbeitet wird und somit der Einsatz einer Prozedur für diesen Zweck ausscheidet. Parameterübergaben lassen sich in TSQL auch über temporären Tabellen lösen. Dabei können zur Laufzeit Tabellen durch das SQL Skript erstellt werden, die bei Beendigung des Skripts automatisch wieder gelöscht werden. Solche Tabellen können entweder lokal für das aktuell ausgeführte Skript oder global 38 , also auch übergreifend für andere Prozeduren innerhalb einer SQL-Sitzung, definiert werden. Hierbei geht aber die Übersichtlichkeit verloren, daher sollen vorrangig echte Parameterübergaben bei Prozeduren stattfinden. 38 Hierbei kann es unerwartet zu Namenskollisionen kommen, wenn bereits in anderen Prozeduren oder Prozessen globale temporäre Tabellen verwendet werden, daher sollte deren Einsatz nur bei Notwendigkeit erfolgen [SQL101] [76] 6.10. Abhängigkeitsdiagramm für Prozeduren An dieser Stelle soll auf Basis der bisherigen Erkenntnisse eine Übersicht gegeben werden, wie TSQL-Backup aufgebaut ist. Bestimmte Funktionen innerhalb des Programms lassen sich in Prozeduren oder Funktionen kapseln, da sie sich als eigenständiges Unterprogramm darstellen lassen, so die Übersichtlichkeit erhöhen und eine Wiederverwendbarkeit erreichen. Die verwendeten Prozeduren lehnen sich an die geforderten Produktfunktionen aus Abschnitt 5.2.4 an. Nachfolgend sollen diese Prozeduren und deren Verknüpfung durch eine UMLNotation verdeutlicht werden. Parametern, die an diese Prozedur übergeben werden müssen, ist ein „+“ (Plus) vorangestellt. Rückgabeparameter der Prozedur sind an einem „#“ (Doppelkreuz oder Raute) zu erkennen. Insofern intern Variablen verwendet werden, die einer eindeutigen Verwendung zuzuordnen sind, werden diese durch ein „-“ (Minus) ausgedrückt. Die verwendeten Datentypen sollen eine Orientierung sein und werden während der weiteren Entwicklung noch genauer spezifiziert. newBackup -action : char -log_id : int -db_name : char -backup_id : int -backup_type : char -save_path : char -zip_path : char -ptrval : object newBackupCheckArguments newBackupSyntaxOut +log_id : int +arguments : char +log_id : int +type : char -text : char 1 newBackupBackupList +log_id : int +db_name : char newBackupDBRestore +log_id : int +backup_id : int +db_name : char newBackupPurge +log_id : int +save_path : char -keep_last_full : int -keep_schema : char -backup_id : int -db_name : char 1 newBackupRestore 1 +log_id : int +restore_type : char #db_name : char +save_path : char +zip_path : char -backup_id : int -success : int newBackupKeyConsistence +log_id : int +db_name : char #success : int newBackupGetSchema +log_id : int +backup_id : int +db_name : char +save_path : char -script : char -object_id : int newBackupBackup +log_id : int +backup_id : int +db_name : char +backup_type : char +save_path : char +zip_path : char -parent_id : int Abbildung 14: Grobe Übersicht über den Aufbau von TSQL-Backup [77] 1 Um dem Benutzer nur eine Schnittstelle zur Verfügung zu stellen, wird eine Prozedur erstellt, über deren Aufruf alle Funktionen ausgelöst werden können. Als Konvention soll festgelegt sein, dass Prozeduren mit newBackup beginnen. Die in UML-Notation ausgedrückte Komposition stellt dabei eine Art "verwendet von" oder auch Abhängigkeit dar. So wird die Prozedur newBackupGetSchema von der Prozedur newBackupBackup verwendet. Ein logischer Programmfluss wird, insofern möglich, durch die Pfeile dargestellt. Ausgangspunkt ist der Aufruf der Prozedur newBackup. Erkennbar ist, dass im Programmablauf zuerst der Aufruf der Prozedur newBackupCheckArguments erfolgt, welche in jedem Fall die Korrektheit der übergebenen Argumente sicherstellen soll. Von da ausgehend erfolgt je nach übergebenem Aktionsparameter der Aufruf der zugehörigen Prozedur. Da eine prozedurale Programmierung von TSQL-Backup vorrangig auch der Übersichtlichkeit dient, ist es denkbar, dass kleinere Programmabschnitte, dies könnten beispielsweise die SQL-Anweisungen für die Voreinstellungen sein, nicht ausgelagert werden, sondern in der Prozedur newBackup erstellt werden. Dabei können die verwendeten Prozeduren aus Abbildung 14 wie folgt den Produktfunktionen aus Abschnitt 5.2.4 zugeordnet werden: newBackupBackup /PF220/, /PF230/, /PF240/, /PF250/ übernimmt die eigentliche Backup-Funktion newBackupCheckArguments /PF020/ prüft übergebene Parameter auf Korrektheit newBackupDBRestore /PF310/ stellt das Datenbankschema wieder her newBackupGetSchema /PF210/ liest das Datenbankschema aus newBackupKeyConsistence /PF350/, /PF360/ prüft Datenkonsistenz und behebt Konsistenzprobleme newBackupList /PF110/ gibt alle angefertigten Sicherungen aus newBackupPurge /PF150/ löscht vorhandene Sicherungen [78] newBackupRestore /PF320/, /PF330/, /PF340/ übernimmt die Restore-Funktion newBackupSyntaxOut /PF010/ gibt die Syntax von TSQL-Backup aus [79] 7. Entwurf 7.1. Einflussfaktoren 7.1.1. Einsatzbedingungen Bei TSQL-Backup handelt es sich um ein sequentielles Programm, welches durch eine Interaktion des Nutzers ausgelöst, und schrittweise, aufeinanderfolgend abgearbeitet wird. Eine Parallelisierung des eigentlichen Programms ist nicht möglich, dies wird durch SQL Server nicht unterstützt. Eine Mehr-Benutzer-Fähigkeit ist nicht erforderlich, da es nur eine Nutzerrolle – den Datenbankadministrator gibt – und davon auszugehen ist, dass keine zeitgleichen Sicherungsvorgänge mehrerer Nutzer an einem Server ausgeführt werden. 7.1.2. Umgebungs- und Randbedingungen TSQL-Backup wird auf jeder Plattform laufen, welche von SQL Server 2005 unterstützt wird. Darüberhinaus sind damit auch die Bedingungen für den Einsatz von DPW gegeben. Die Mindestanforderungen für ein 32-Bit-System ergeben sich damit wie folgt: Serverseitig • Prozessor: mind. 600 MHz • Betriebssystem: Microsoft Windows 2000 Server SP4 oder höher • Datenbank: Microsoft SQL Server 2005 Workgroup oder höher • Arbeitsspeicher: mind. 512 MB • Festplatte: 350 MB freier Speicherplatz zuzüglich ausreichend Kapazität für erstellte Sicherungen • Laufwerk: CD-ROM oder DVD-Laufwerk • Netzwerkanbindung • Sonstige Software: o Microsoft Internet Explorer 6.0 SP1 oder höher o Für die serverseitige Komprimierung der Backupdateien wird die freie Software „gzip“ 39 zum Einsatz kommen 39 http://gnuwin32.sourceforge.net/packages/gzip.htm [80] Clientseitig • Betriebssystem: Windows 95 oder höher, MAC/UNIX 40 • Client-Software für SQL Server • Netzwerkanbindung Bei Anwendung auf einem 64-Bit-System gelten entsprechend höhere Anforderungen durch SQL Server. Datenbankanforderungen Unter SQL Server können Datenbanken für sehr spezielle Umgebungen und Anforderungen, wie verteilte, replizierte, sowie hochverfügbare Datenbanken, eingerichtet werden. Für diese Szenarien muss ein Einsatz von TSQL-Backup ausgeschlossen werden. Auch wenn das entstehende Programm die Möglichkeit bieten soll, das Datenbankschema auszulesen und auf dieser Grundlage eine neue Datenbank anzulegen, ist allein eine Konfiguration von Replikationen zur Spiegelung einer Datenbank derart aufwendig [Woo07 S. 348ff], sodass bestimmte Einschränkungen an die zu sichernde Datenbank getroffen werden müssen. Der Befehl CREATE DATABASE { dbname } erstellt in SQL Server eine Datenbank mit Standardoptionen, also nach dem Standardschema der model-Datenbank [Woo07 S. 66] [Kon07 S. 75]. Auf eine solche Datenbank wird diese Arbeit ausgelegt sein und anhand einer solchen auch entwickelt. TSQL-Backup benötigt administrative Rechte für Eingriffe und auszuführende Aufgaben am SQL Server, dazu gehören: • Löschen von Tabellen und Datenbanken • Anlegen von Tabellen und Datenbanken • Ausführen der Windows Kommandozeile • Ändern von Grundeinstellungen einer Datenbank • datenbankübergreifende Lese- und Schreibzugriffe Daher soll vereinbart werden, dass nur ein angemeldeter Datenbankadministrator das Programm nutzen kann – dies ist in der Regel der Benutzer „sa“ oder ein Windows-Nutzer, der die Rolle „sysadmin“ bei Anmeldung am SQL Server übernimmt und somit über alle 40 Gesonderte Anforderungen zum Einsatz unter MAC oder UNIX sind den Systemanforderungen von Microsoft SQL Server Management Studio zu entnehmen und werden hier nicht berücksichtigt [81] Rechte verfügt [Bau06 S. 328]. Die Metadatenbank von TSQL-Backup wird ebenfalls unter den Rechten des Administrators erzeugt. Eine Einschränkung auf Microsoft SQL Server ist in diesem Fall notwendig, da vom üblichen SQL-Standardbefehlssatz 41 abgewichen wird. Durch den offenliegenden Quellcode kann, insofern identische Funktionen zur Verfügung stehen, eine Portierung auf ein anderes Datenbanksystem erfolgen. Selbst dann reicht es aber meist nicht, nur die benötigten SQLspezifischen Funktionen auszutauschen, weil der prinzipielle Aufbau einer Prozedur bei einem anderen Datenbanksystem abweichen wird [Lei03 S. 209]. 7.1.3. Nichtfunktionale Produkt- und Qualitätsanforderungen Da ein Einsatz in internationalem Gebiet nicht auszuschließen ist, wird die Anwendung in englischer Sprache mit dem Nutzer kommunizieren, eine Mehrsprachigkeit wird nicht angestrebt. Da es sich bei TSQL-Backup um ein Programm innerhalb von SQL Server handelt, welches seine Ausgaben lediglich durch ein SQL Client-Tool anzeigen lässt, ist ein plattformübergreifender Einsatz bereits dadurch gegeben, dass ein entsprechendes ClientProgramm zur Anbindung an SQL Server auf dem verwendeten PC eingesetzt wird. Zahlen und Zeitinformationen sollen deutschen Standards entsprechen. 7.2. Grundsatzentscheidungen 7.2.1. Datenhaltung Wie bereits erwähnt, müssen durch TSQL-Backup Metadaten über die angefertigten Backups verwaltet werden. Hier ist naheliegend, diese Daten in SQL Server abzulegen. Alle nötigen Tabellen, die Metadatenbank und auch alle Prozeduren und Funktionen werden durch ein gemeinsames Installationsskript eingerichtet. In diesem Skript wird der Name der zukünftigen Metadatenbank als Variable gespeichert, so dass eine freie Namenswahl ermöglicht wird. Standardmäßig soll diese Datenbank newBackupMeta heißen. Die exportierten Daten aus der zu sichernden Datenbank werden auf einem durch den Nutzer angegebenen Medium gesichert, dies wird in der Regel eine Festplatte oder Netzlaufwerk 41 Der Standardbefehlssatz für SQL ist mittlerweile SQL3 (auch SQL 2003) und definiert Datentypen, Funktionen und Anweisungen, welche grundsätzlich auch in jeder herstellerspezifischen SQL-Implementierung zur Verfügung stehen sollten [Fae07 S. 193f] [82] sein. Zur Ablage kommen dort lediglich die Dateninhalte aus Tabellen. Hierbei soll für jede Datenbank, auf die TSQL-Backup angewandt wird, ein eigener Unterordner erstellt werden, der wiederum für jedes erzeugte Backup ein einzelnes Unterverzeichnis enthält. Die eigentlichen Daten liegen dann je in einer einzelnen Textdatei, welches im Namen ebenso wie die zugehörige Hashtabelle die Objektnummer trägt, welche während des Backupprozesses vergeben wurde. 7.2.2. Verteilung im Netz TSQL-Backup stellt, als Gesamtprodukt gesehen, lediglich eine Prozedur innerhalb von SQL Server dar. Es existiert somit keine Client-Server-Architektur. Eine Bedienung, beziehungsweise Nutzung, von TSQL-Backup erfolgt hingegen über die bestehende ClientServer-Architektur von SQL Server. 7.3. Programmaufruf in TSQL Wie in Abschnitt 6.10 festgelegt, soll der Einstiegspunkt in TSQL-Backup für den Nutzer die Prozedur newBackup sein. In TSQL erfolgt der Aufruf einer gespeicherten Prozedur für gewöhnlich mit folgender Syntax: EXEC { procedure_name } { value } [ ,…n ] Es können also ein oder mehrere Parameter an die Prozedur übergeben werden, hierbei wird noch zwischen Eingabe- und Ausgabevariablen unterschieden. TSQL-Backup wird viele Funktionalitäten unter einer Prozedur zur Verfügung stellen, daher wird auch die Zahl der möglichen und erlaubten Argumente variieren. Um dies zu lösen, werden alle zu übergebenden Argumente in einer Zeichenkette zusammengefasst. Das heißt, sollen zwei Parameter mit Werten übergeben werden, würde der Aufruf wie folgt aussehen: EXEC newBackup ’parameter1=value1, parameter2=value2’ Damit können beliebig viele Argumente übergeben werden, es muss nur ein Trennzeichen festgelegt werden, anhand dessen die Argumente getrennt werden, dies soll das Komma sein. Bedingung für alle Argumente ist also, dass nie ein Komma als Wert an einen Parameter übergeben werden darf. Sollen einfache Hochkommata übergeben werden, müssen diese maskiert werden, dies geschieht in TSQL einfach durch Verdoppelung der Zeichen. Um also ein Hochkomma in der Argumentliste zu verwenden, müssen stattdessen zwei Hochkommas [83] eingegeben werden, andernfalls würde für TSQL die Zeichenkette schon eher enden und eine ungültige Syntax entstehen. Prinzipiell wird mindestens ein Parameter vom Nutzer erwartet, damit das Programm eine Funktion auslöst. Die möglichen Funktionen werden im folgenden Kapitel erläutert, und sollen als Wert dem Parameter action angehängt werden. Je nach Funktion werden gegebenenfalls weitere Argumente erwartet. Das Parsen der übergebenen Parameterzeichenkette geschieht unter Zuhilfenahme der Tabelle allowed_arguments. Diese Tabelle bildet in einer Hierarchie alle zulässigen Aufrufparameter mit zugehörigen Wertebereichen ab. Werden unzulässige Parameter oder ungültige Werte übergeben, bricht TSQL-Backup mit entsprechender Fehlerausgabe ab. Es bietet sich natürlich an, bestimmte wiederkehrende Prozesse, oder in sich abgeschlossene Teilprozesse, in einzelne Unterprozeduren auszulagern. Damit gibt es einen Schritt, der jeder Funktion des Programms vorgelagert sein wird – die Prüfung auf Korrektheit der übergebenen Argumente. 7.3.1. Funktionen des Programms In Kapitel 5.2 und Abschnitt 6.1 wurde der Funktionsumfang des Programms bereits definiert. An dieser Stelle soll genauer spezifiziert werden, wie diese Funktionen durch den Anwender angesprochen werden können: • get_settings – gibt alle gespeicherten Voreinstellungen aus • set_setting – setzt eine oder mehrere Voreinstellungen auf einen benutzerdefinierten Wert • schema_from_db – liest aus einer gegebenen Datenbank das Schema aus • schema_to_db – erzeugt aus einem ausgelesenen Schema eine neue Datenbank oder stellt daraus ein einzelnes Element wieder her • list – zeigt alle erstellten Backups an, bei Angabe eines Datenbanknamens werden nur die Backups der zugehörigen Datenbank angezeigt • list_elements – gibt alle durch ein Backup erfassten Elemente aus • show_low – gibt die Logbucheinträge zu einem bestimmten Programmaufruf aus • purge – löscht ein gegebenes Backup aus dem Archiv; bei Übergabe eines Datenbanknamens werden alle Backups zu dieser Datenbank gelöscht; ohne Angabe eines Datenbanknamens oder bestimmten Backups werden alle vorhandenen Backups [84] gelöscht; es soll möglich seinn eine bestimmte Anzahl X Backups vom Löschvorgang auszuschließen (dabei werden die letzten X erstellten Backups erhalten); Backups, die nur das Schema einer Datenbank enthalten, sollen auf Wunsch des Nutzers vollständig erhalten werden • backup – stellt die Funktion zur Erstellung eines vollständigen, differenziellen oder inkrementellen Backups einer Datenbank zur Verfügung; Backups sollen auf Wunsch komprimiert werden können • restore – ermöglicht die Wiederherstellung einer kompletten Datenbank oder eines ausgewählten Elements aus einem Backup; der Datenbankname, auf den die Wiederherstellung angewandt werden soll, soll übergeben werden Um also alle bereits erstellten Backups aufzulisten, soll der Prozeduraufruf wie folgt aussehen: EXEC newBackup ’action=list’ Wird die Prozedur ohne jegliche Argumente aufgerufen, wird dem Nutzer die vollständige Syntax des Programms ausgegeben. 7.3.2. Vollständige Syntax des Programmaufrufs Abhängig von der gewünschten Funktion sind weitere Argumente erforderlich oder optional anzugeben. Ausgehend von Abschnitt 7.3.1 baut sich die vollständige Syntax wie folgt auf: 1. EXEC newBackup ’action=<action_values>’ 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. <action_values>:={ get_settings | set_setting,<set_setting_options> | schema_from_db,db=(STRING),<schema_from_db_options> | backup,db=(STRING),<backup_options> | list,<list_options> | show_log,id=(INT) | purge,<purge_options> | list_elements,id=(INT) | schema_to_db,id=(INT),db=(STRING),<schema_to_db_options> | restore,id=(INT),db=(STRING),<restore_options> } 14. 15. 16. 17. 18. 19. 20. <set_setting_options>:={ save_path=(STRING) | schema_login=(user,win) | schema_script=(STRING) | compress=(yes,no) | zip_path=(STRING) } [85] 21. 22. 23. 24. <schema_from_db_options>:={ schema_pw=(STRING) | schema_user=(STRING) } 25. 26. 27. 28. 29. 30. 31. <backup_options>:={ type=(full,incr,diff) | quick=(yes,no) | compress=(yes,no) | schema_pw=(STRING) | schema_user=(STRING) } 32. 33. 34. <list_options>:={ db=(STRING) } 35. 36. 37. 38. 39. 40. 41. <purge_options>:={ force=(yes,no) | db=(STRING) | keep_last_full=(INT) | id=(INT) | keep_schema=(yes,no) } 42. 43. 44. <schema_to_db_options>:={ force=(yes,no) } 45. 46. 47. 48. <restore_options>:={ force=(yes,no) | element_id=(INT),<consistence_options> } 49. 50. 51. <consistence_options>:={ consistence=(handle,ignore) } Listing 6: Vollständige Syntax von TSQL-Backup Der Einstieg in die Syntax erfolgt über das Argument action, welches bei jedem Aufruf erwartet wird. Die weitere Syntax ist wie folgt zu verstehen: • mögliche Werte zu einem Parameter sind durch | (Pipe) getrennt, wobei nur einer der Werte gewählt werden kann • erfordert ein Wert weitere Argumente, schließen sich diese direkt durch Komma getrennt auf gleicher Zeile an; sind diese weiteren Argumente hingegen optional, wird durch spitze Klammern auf eine Untersyntax verwiesen • werden Parameter erwartet, die eine benutzerdefinierte Eingabe des Nutzers erwarten, wird der erlaubte Datentyp des einzugebenden Werts in runden Klammern aufgeführt, [86] wobei INT (Ganzzahl) oder STRING (Zeichenkette) zur Verfügung stehen, weiterhin können Aufzählungen angegeben werden (durch Komma getrennte Werte in runden Klammern), woraus ein Wert ausgewählt werden muss Aus dieser Syntax ergeben sich Abhängigkeiten und damit die Befüllungslogik für die Tabelle allowed_arguments, welche bereits bei Einrichtung des Programms entsprechend initialisiert werden soll. Eine Erklärung aller Optionen der Syntax kann dem Anhang entnommen werden. Die Optionen für die Konsistenzwahrung (Parameter consistence) wirken sich nur bei der Wiederherstellung eines einzelnen Elements aus und haben folgende Bedeutung: • handle – TSQL-Backup versucht Inkonsistenzen selbst zu korrigieren, dabei können überflüssige Datenzeilen im wiederhergestellten Element gelöscht, aber auch fehlende Schlüssel durch einen Dummy-Eintrag im wiederhergestellten Element angelegt werden. Ziel ist, die wiederhergestellten Daten in eine Form zu bringen, die allen vorhandenen und aktiven Schlüsselbeziehungen und Einschränkungen entspricht. • ignore – TSQL-Backup stellt in jedem Fall alle Daten aus dem Backup wieder her. Sollten hierbei Verletzungen von Schlüsselbeziehungen oder Einschränkungen auftreten, müssen diese deaktiviert werden. Ziel ist, keine Daten durch den Versuch einer Konsistenzwiederherstellung ungewollt zu verlieren. 7.3.3. Verwendete Prozeduren in TSQL-Backup Das bereits in Abschnitt 6.10 vorgestellte Abhängigkeitsdiagramm soll um zusätzliche Funktionalitäten erweitert werden. Somit können weitere Prozeduren definiert werden: • newBackupTextOut – übernimmt die Logbuchfunktion und wird zur Textausgabe verwendet • newBackupSyntaxFromDB – liest die möglichen Parameter zu den Programmfunktionen von TSQL-Backup aus der Metadatenbank aus und bildet eine an Grammatik nach, welche an die Standardnotation von SQL angelehnt ist • newBackupPrePathInit – liest Verzeichnispfade aus den Voreinstellungen und legt den physikalischen Speicherpfad an • newBackupIsolation – aktiviert die Snapshot-Isolationsstufe • newBackupPreDBInit – erzeugt eine eindeutige Backup-ID [87] • newBackupCreateDB – erzeugt ein CREATE DATABASE-Skript (DPW kann nur die in einer Datenbank enthaltenen Schemaobjekte auslesen, aber nicht das Skript, womit die Datenbank selbst erzeugt wird) • newBackupColToBin – konvertiert übergebene Spaltentypen in einen für die Hashfunktion verständlichen Datentyp • newBackupHashData – berechnet aus einer übergebenen Zeichenkette einen Hashwert • newBackupKeyTrigger – übernimmt das Aktivieren/Deaktivieren von Constraints Damit ergibt sich ein neues Abhängigkeitsdiagramm für die Prozeduren: newBackupTextOut newBackupBackupList newBackupSyntaxOut newBackupSyntaxFromDB +log_id : int +text : char +type : char +log_id : int +db_name : char +log_id : int +type : char -textTop : char -textBottom : char +depends_on : int #textTop : char #textBottom : char -textTopSub : char -textBottomSub : char -valuesPrefix : char 1 1 newBackup -action : char -log_id : int -db_name : char -backup_id : int -backup_type : char -save_path : char -zip_path : char -ptrval : object +get_settings() +set_setting() +schema_from_db() +backup() +list() +show_log() +purge() +list_elements() +schema_to_db() +restore() newBackupDBRestore +log_id : int +backup_id : int +db_name : char newBackupKeyTrigger +log_id : int +db_name : char +suffix : char +do : char #success : int newBackupKeyConsistence newBackupCheckArguments +log_id : int +arguments : char 1 newBackupIsolation newBackupPurge newBackupPrePathInit +log_id : int #save_path : char #zip_path : char 1 1 1 newBackupCreateDB newBackupRestore newBackupPreDBInit +log_id : int +restore_type : char #db_name : char +save_path : char +zip_path : char -ptrval : char -backup_id : int -tmp_backup_id : int -tmp_db_name : char -snapshot_state : int -success : int +backup_type : char +desc : char +log_id : int +db_name : char #backup_id : int #snapshot_state : int 1 +log_id : int +backup_id : int +db_name : char -script : char -ptrval : char 1 1 newBackupGetSchema +log_id : int +backup_id : int +db_name : char +save_path : char -script : char -object_id : int -ptrval : char newBackupColToBin +column_name : char +column_type : char #return : char 1 newBackupDataRestore +log_id : int +backup_id : int +db_name : char +save_path : char +zip_path : char +element_id : int +log_id : int +db_name : char #snapshot_state : int +log_id : int +save_path : char -keep_last_full : int -keep_schema : char -backup_id : int -db_name : char 1 1 newBackupBackup newBackupHashData 1 +algorithm : char +input_data : char -index : int -input_data_length : int #return_sum : char +log_id : int +db_name : char +tmp_db_name : char +type : char +do : char #success : int Abbildung 15: Abhängigkeiten der Prozeduren von TSQL-Backup [88] 1 +log_id : int +backup_id : int +db_name : char +backup_type : char +save_path : char +zip_path : char -parent_id : int 7.3.4. Schnittstellen- und Prozedurbeschreibung In diesem Abschnitt soll eine Übersicht über die Schnittstellen, konkret die Prozedurköpfe, und eine zusammenfassende Beschreibung aller Prozeduren in TSQL-Backup gegeben werden. Es werden hierbei Ein- und Ausgabeparameter der Prozeduren, sowie auch Variablen, die innerhalb einer Prozedur einer eindeutigen Verwendung zuordenbar sind, berücksichtigt. Die Schnittstellenbeschreibung ist dem Anhang zu entnehmen. 7.4. Entwurf der Backup-Funktionalität von TSQL-Backup An dieser Stelle soll exemplarisch die Backup-Funktionalität im Rahmen der schriftlichen Ausarbeitung erläutert werden, da diese umfangreicher ist als die weiteren geplanten Funktionen und einen guten Einblick in den Aufbau und Ablauf von TSQL-Backup geben wird. [89] 7.4.1. Aktivitätsdiagramm Abbildung 16: Aktivitätsdiagramm für die Backup-Funktionalität Hierbei handelt es sich nur um den Ausschnitt von TSQL-Backup, der die Sicherungsfunktion ausführt. Deutlich erkennbar ist auch hier, dass es, aufgrund der SQLBefehlskonsole, nur einen Interaktionspunkt des Nutzers mit dem Programm gibt - den Aufruf von newBackup. Jeder Fehler führt, unter Ausgabe einer Fehlermeldung, zum Abbruch. [90] Bereits direkt nach Programmausführung werden durch TSQL-Backup alle wichtigen Prüfprozesse ausgeführt, die eine korrekte Arbeitsweise garantieren sollen. Bis zum Auslesen des Datenbankschemas ist die Funktionsweise für ein vollständiges, differenzielles, inkrementelles oder ein Schema-Backup gleich. Danach werden je nach Art des Backups verschiedene Aktionen ausgeführt, lediglich bei einem Schema-Backup erfolgt sofort eine Beendigung des Programms. Ein Backup ohne Hashberechnung (vergleiche Programmaufruf aus Abschnitt 7.3.2), welches zweifelsohne schneller ablaufen wird als ein Backup mit aufwendiger Hashberechnung, steht nur bei vollständigem Backup zur Verfügung. Die Komprimierung der exportieren Daten aus der Datenbank kann wieder für die drei BackupArten (abgesehen vom Schema-Backup) ausgeführt werden. Zu erkennen sind auch diejenigen Aktionen, welche die Metadatenbank um Informationen über das aktuell ausgeführte Backup anreichern. Dazu gehören die Generierung einer backup_id, sowie das Speichern des Datenbankschema und der Hashwerte. Lesende Zugriffe auf die Datenbanken sollen hier nicht dargestellt werden, da prinzipiell jede Aktion in diesem Diagramm einen lesenden Zugriff ausführen wird. Nur die Aktivierung der Datenbanksnapshots ist noch zu erkennen, weil diese Modifikationen an der Datenbank vornimmt und somit als schreibende Aktivität zu bewerten ist. 7.4.2. Aufruffolge der Prozeduren Nach Funktionalität der Prozeduren aus den Abschnitten 0 und 7.3.4 sowie der Aktivität aus Abschnitt 7.4.1 ergibt sich folgende Aufrufreihenfolge, welche mittels einem UMLSequenzdiagramm dargestellt werden soll: [91] Abbildung 17: Sequenzdiagramm für die Backup-Funktionalität [92] Die Berechnung der Hashs und die Komprimierung der Daten sind optional und in der Abbildung durch entsprechende Pfeile dargestellt. Der Aufruf einiger Prozeduren folgt nicht dem logischen Programmfluss aus Abbildung 15. Auf diese Weise kann aber die Wiederverwendbarkeit der Prozeduren erhöht werden, indem nach Abschluss der Prozedur die Kontrolle wieder an die höhere Instanz (hier also in der Regel newBackup) zurückgegeben wird. Mit Hilfe dieses Sequenzdiagrammes kann nun ein erster Ansatz für die benutzten Prozeduren in Pseudocode erfolgen: 1. PROCEDURE newBackup() { 2. SystemparameterPrüfen 3. newBackupCheckArguments() 4. newBackupPrePathInit() 5. newBackupPreDBInit() 6. newBackupBackup() 7. } 1. PROCEDURE newBackupCheckArguments() { 2. ArgumentePrüfen 3. } 1. PROCEDURE newBackupPrePathInit() { 2. SpeicherpfadePrüfen 3. } 1. PROCEDURE newBackupPreDBInit() { 2. DatenbankAufExistenzPrüfen 3. newBackupIsolation() 4. BackupIdErzeugen 5. } 1. PROCEDURE newBackupIsolation() { 2. SnapshotsAktivieren 3. } 1. PROCEDURE newBackupBackup() { 2. newBackupGetSchema() 3. WENN BerechnungVonHashsAktiv DANN BerechneHashs 4. DatenExportieren 5. WENN KomprimierungVonDatenAktiv DANN DatenKomprimieren 6. } 1. PROCEDURE newBackupGetSchema() { 2. newBackupCreateDB() 3. SchemaAuslesen 4. } 1. PROCEDURE newBackupCreateDB() { 2. ErzeugeCreateDbSkript 3. } Listing 7: Pseudocode [93] Exemplarisch soll noch genauer auf die wichtigen Prozeduren newBackupGetSchema und newBackupBackup eingegangen werden. 7.4.3. Prozeduren newBackupGetSchema und newBackupBackup Um nun detailliert auf eine Prozedur einzugehen und deren Arbeitsweise zu verdeutlichen, bietet sich für den Entwurf ein Nassi-Shneiderman-Diagramm an (bekannt auch als Struktogramm), da hiermit insbesondere auch Schleifen und Verzweigungen gut dargestellt werden können. Es würden sich auch Programmablaufpläne eignen, jedoch ist bei Struktogrammen eine größere Übersichtlichkeit gewährleistet. Zudem sollen wichtige Codefragmente gelistet werden. Die zugehörigen Struktogramme können dem Anhang entnommen werden. Der Abschnitt vom Auslesen der Datenbank mit DPW bis zum Einlesen in eine temporäre Tabelle kann wie folgt aussehen: --Hilfsprogramm zum Auslesen der Datenbank starten und Ausgabe des Programms in eine Hilfstabelle schreiben SET @helperStr=CHAR(34)+@script+CHAR(34)+' script -f -q -d '+@db_name+' –schemaonly -nodropexisting '+@save_path+'\'+@db_name+'.sql' INSERT INTO #nB_schematmp EXEC master.dbo.xp_cmdshell @helperStr Listing 8: Auslesen des Datenbankschemas Die Variable @script enthält hierbei den Pfad von DPW zur Ausführung auf der Kommandozeile. Die temporäre Tabelle enthält nun die Kommandozeilenrückgabe von DPW und kann auf Fehler untersucht werden. [94] Das Einlesen der erzeugten Datei kann so aussehen, wobei die temporäre Tabelle für weitere Prüfungen verwendet werden kann : --Parsen der ausgegebenen Datei TRUNCATE TABLE #nB_schematmp SET @helperStr='dir /B '+CHAR(34)+@save_path+'\'+@db_name+'.sql'+CHAR(34) INSERT INTO #nB_schematmp EXEC master.dbo.xp_cmdshell @helperStr IF EXISTS (SELECT * FROM #nB_schematmp WHERE text='Datei nicht gefunden') BEGIN SET @helperStr ='database '''+@db_name+''' contains no objects – aborted' EXEC dbo.newBackupTextOut @log_id,@helperStr,'fail' END GOTO jumpFail --SQL-Skript in Hilfstabelle schreiben TRUNCATE TABLE #nB_schematmp SET @helperStr='BULK INSERT #nB_schematmp FROM '+CHAR(34)+@save_path+'\'+@db_name+'.sql'+CHAR(34)+' WITH (DATAFILETYPE=''widechar'')' EXEC(@helperStr) Listing 9: Einlesen der Ausgabe von DPW Wenn DPW bei seiner Arbeit keine Datei erzeugt, bedeutet dies, dass die Datenbank keine weiteren Schemaobjekte enthält, die durch Nutzer angelegt wurde. Es zeigt sich bereits hier, dass, aufgrund der begrenzten Syntax und Funktionen von TSQL, für die Arbeit im Dateisystem nur die Windowskommandozeile verwendet werden kann. Nachdem durch newBackupPreDBInit der Modus zur Snapshot-Isolationsstufe aktiviert wurde, laufen die nachfolgenden Schritte innerhalb der Prozedur in einer einzelnen Transaktion ab (siehe Abschnitt 6.5). In dieser Transaktion laufen dann gekapselt alle Schritte zur Erstellung einer Sicherung ab, um so einen konsistenten Datenstand zu gewährleisten. [95] Über ein etwas umfangreicheres SQL-Skript lässt sich vergleichen, ob die ausgelesenen Schemaobjekte des aktuellen Backups mit dem des letzten Backups übereinstimmen: SELECT x.name,y.owner,z.type_desc FROM dbo.backup_objects w INNER JOIN dbo.objects x ON w.object_id=x.object_id INNER JOIN dbo.objects_detail y ON x.object_id=y.object_id INNER JOIN dbo.schema_lookup z ON x.type=z.type WHERE w.backup_id=@backup_id AND EXISTS ( SELECT * FROM dbo.backup_objects c INNER JOIN dbo.objects a ON c.object_id=a.object_id INNER JOIN dbo.objects_detail b ON a.object_id=b.object_id WHERE c.backup_id=@parent_id AND a.name=x.name AND b.owner=y.owner AND a.type=x.type AND dbo.newBackupHashData('MD5',CAST(CAST(b.create_script AS NVARCHAR(MAX)) AS VARBINARY(MAX))) <> dbo.newBackupHashData('MD5',CAST(CAST(y.create_script AS ) NVARCHAR(MAX)) AS VARBINARY(MAX))) Listing 10: Vergleich von Schemaobjekten in der Metadatenbank Für die Erzeugung der Hashwerte müssen alle Spalten einer Tabelle herangezogen werden, die SQL-interne ID der Tabelle ist hierbei in der Variablen @helperInt enthalten: --alle Spalten zu aktueller Tabelle aus Datenbank auslesen SET @helperStr='SELECT x.name,y.name FROM '+@db_name+'.sys.syscolumns x INNER JOIN '+@db_name+'.sys.systypes y ON x.xusertype=y.xusertype WHERE x.id='+CAST(@helperInt AS VARCHAR(10))+' ORDER BY x.colorder' TRUNCATE TABLE #nB_cols INSERT INTO #nB_cols EXEC(@helperStr) SET @helperStr='' --SQL-String zur Erzeugung des Hashs aus allen Spalten der Tabelle zusammenbauen DECLARE columncur CURSOR FOR SELECT colname,coltype FROM #nB_cols OPEN columncur FETCH NEXT FROM columncur INTO @helperStr1, @helperStr2 WHILE @@FETCH_STATUS=0 BEGIN --aus allen Spalten einer Tabelle wird ein Hashwert gebildet und dieser zu einer langen Zeichenkette verbunden, damit entsteht ein eindeutiger Hashwert für jede Zeile einer Tabelle (unter [96] der Annahme, dass MD5 keine Kollisionen verursacht) SET @helperStr=@helperStr+'+'+db_name()+ '.dbo.newBackupHashData(''MD5'','+ dbo.newBackupColToBin('x.['+@helperStr1+']',@helperStr2)+')' END FETCH NEXT FROM columncur INTO @helperStr1, @helperStr2 CLOSE columncur DEALLOCATE columncur Listing 11: Alle Spalten zur Hashwertbildung verwenden Die erzeugte Zeichenkette verknüpft dann die Hashwerte aller Spalten zu einem GesamtHashwert, welcher dann für Vergleiche (mit den erzeugten Hashwerten aus dem letzten Backup) genutzt werden kann, um diese in die zugehörige Hashtabelle einzuspielen: SET @helperStr='INSERT INTO dbo.hashs_'+CAST(@helperInt AS VARCHAR(10))+' SELECT CASE WHEN y.hash IS NULL THEN x.hash ELSE y.hash END AS hash,CASE WHEN y.hash IS NULL THEN 0 ELSE 1 END AS delflag FROM ( SELECT '+@helperStr+' AS hash FROM '+@table+' x ) x FULL OUTER JOIN hashs_'+CAST(@lastBackup AS VARCHAR(10))+' y ON x.hash=y.hash WHERE y.hash IS NULL OR x.hash IS NULL' Listing 12: Hashwerte einer Tabelle berechnen @table ist hier der kanonische Name der Tabelle, zu der die Hashs erzeugt werden sollen und @lastBackup die ID der zugehörigen Hashtabelle aus dem letzten Backup. Auf Grundlage der erzeugten Hashtabelle können die Daten nun aus der Tabelle exportiert werden: SET @helperStr='bcp '+CHAR(34)+'SELECT * FROM '+@table+' x WHERE EXISTS (SELECT * FROM '+db_name()+'.dbo.hashs_'+CAST(@helperInt AS VARCHAR(10))+' y WHERE y.hash='+@helperStr+')'+CHAR(34)+' queryout '+CHAR(34)+@save_path+'\'+@db_name+'\backup_'+CAST(@backup_id AS VARCHAR(10))+'\table_'+CAST(@helperInt AS VARCHAR(10))+CHAR(34)+' -k -T -N -m 0' EXEC master.dbo.xp_cmdshell @helperStr, no_output Listing 13: Datenexport anhand der berechneten Hashs [97] Zum Verständnis der Arbeitsweise von TSQL-Backup soll nochmals verdeutlicht werden, dass bei aktivierter Hashberechnung (welche für die Erzeugung von differenziellen und inkrementellen Sicherungen notwendig ist), zuerst über alle Datenzeilen einer Tabelle Hashwerte gebildet und in der Metadatenbank gespeichert werden. Anhand dieser Hashwerte wird dann in einem weiteren Schritt der Datenbestand durch „bcp“ in das Backup exportiert. Hierzu werden die berechneten Hashwerte nochmals mit der zu sichernden Tabelle verknüpft, um alle Datenzeilen zu markieren, die exportiert werden sollen. 7.5. Sicherheitsaspekte Für gewöhnlich werden die zu sichernden Datenbanken sensible Daten (meist Kundendaten oder Firmendaten) enthalten, die es zu schützen gilt. Hierbei können drei Arten von Schutzmechanismen unterschieden werden: Physischer Schutz Die von TSQL-Backup erstellten Backupdateien sollten getrennt vom eigentlichen Datenbankserver auf einem gesonderten Laufwerk gespeichert werden. Meist steht in größeren Firmen ein eigener Serverraum zur Verfügung, der zusätzlich gegen physische Zugriffe von unberechtigten Personen gesichert ist und somit die Gefahr des Diebstahls durch Einbruch vermindert wird. Zusätzlich ist damit der Aspekt der Datensicherheit bei Ausfall des Datenbankserver gewährleistet. Unberechtigter Aufruf Weiterhin muss sichergestellt sein, dass ein Aufruf des Programms und damit das Löschen von Backups oder das Überschreiben einer Datenbank aus einer Sicherung durch unberechtigte Personen verhindert wird. Dies wird dadurch erreicht, dass eine Nutzung von TSQL-Backup nur durch ein Mitglied der Administratoren-Rolle möglich ist. Kennwortschutz Um die Daten vor Manipulation, und im Falle eines Diebstahls durch einen kompromittierten Rechner, zu schützen, sollten diese verschlüsselt werden. Eine Möglichkeit ist die Verschlüsselung direkt durch das Komprimierungsprogramm, insofern unterstützt. „gzip“ bietet diese Möglichkeit leider nicht. Prinzipiell lässt sich aber unter Anpassung Komprimierungsprogramm des Quellcodes für Windows [98] von TSQL-Backup einsetzen, welches jedes eine Kommandozeilenunterstützung anbietet. Ein geeignetes Programm, welches einen Passwortschutz bietet, ist "WinRAR" 42 (kommerziell). Durch den offenen Quellcode ist es aber auch möglich, ein zusätzliches Tool einzubinden, welches entsprechend nach dem Export oder vor dem Import von Daten die zugehörige physische Datei verschlüsselt. Hierzu muss der Quellcode lediglich um den entsprechenden EXECBefehl erweitert werden. Ein geeignetes, frei verfügbares Programm auf Kommandozeilenebene ist "GNU Privacy Guard" 43. 42 http://www.winrar.de/ 43 http://www.gnupg.org/ [99] 8. Implementierung und Praxistest 8.1. Installation auf dem Datenbankserver Die erstellten Prozeduren und das Skript zur Initialisierung der Metadatenbank wurden zu einem einzigen SQL-Skript zusammengefügt, um dem Nutzer eine unkomplizierte Installation zu ermöglichen. Für den Nutzer besteht die Möglichkeit der freien Namenswahl für die Metadatenbank, ausgenommen hiervon sind die Namen der Systemdatenbanken. Dazu muss im Installationsskript die Zeile 7 geändert werden: SET @metaDb='newBackupMeta' Zur Installation wird im SQL Server Management Studio die Installationsdatei TSQLinstall.sql und eine Verbindung zum Server, auf dem TSQL-Backup installiert werden soll, geöffnet. Schließlich muss das Skript nur noch mit dem Tastendruck F5 ausgeführt werden. Bei Vorhandensein einer Datenbank mit gleichem Namen wird ein Fehler ausgegeben: meta database already exists Durch Ändern der Zeile 8 im Installationsskript nach: SET @dropOld='true' kann die vorhandene Datenbank überschrieben werden (Achtung: vorhandene Daten gehen unwiderruflich verloren). Ein erfolgreiches Anlegen wird mit folgender Ausgabe bestätigt: meta database created scripts created Unter der Annahme, dass die Metadatenbank noch nicht existiert, kann so die Installation von TSQL-Backup einfach durch Ausführung des erstellten Skripts durchgeführt werden. Für einen fehlerfreien Start müssen neben der Installation von DPW (siehe Abschnitt 6.3.3) und „gzip“ auf dem entsprechenden Server noch die zugehörigen Pfade für TSQL-Backup gesetzt werden. [100] Standardmäßig ist der Pfad zu DPW für ein x64-System schon gesetzt und kann wie folgt abgerufen werden: Programmaufruf newBackup 'action=get_settings' Ausgabe predefined settings: log_level | all schema_login | win schema_script | C:\Program Files (x86)\Microsoft SQL Server\90\Tools\Publishing\SqlPubWiz.exe Der Speicherort für die Backups und „gzip“ muss noch angegeben werden, beispielsweise mit: Programmaufruf newBackup 'action=set_setting, zip_path=C:\Programme\GnuWin32\bin\gzip.exe, save_path=D:\backup' Ausgabe settings saved 8.2. Anwendungstest 8.2.1. Prüfung auf Fehlverhalten Nachfolgende Tests von TSQL-Backup sollen für den Nutzer zum einen als Einstieg in die Funktionsweise dienen, andererseits aber auch Fehlfunktionen bei der Arbeit aufdecken. Für den Fall der Syntaxausgabe durch TSQL-Backup wird die Syntax zur kürzeren Darstellung nachfolgend mit […] abgeschnitten. Die Testszenarien können dem Anhang entnommen werden. Die durchgeführten Tests (mit denen alle umgesetzten Funktionen, ausgenommen Sicherung und Wiederherstellung, getestet wurden) verliefen fehlerfrei, beziehungsweise zeigten das erwartete Verhalten (wie beispielweise die Prüfung auf Nutzung des Programms als Administrator). [101] 8.2.2. Durchführung eines Backups In diesem Abschnitt sollen folgende Funktionalitäten gezeigt werden: • Auslesen des Datenbankschemas • vollständige Sicherung • differenzielle Sicherung • inkrementelle Sicherung Diese Vorgänge werden an der AdventureWorks 44 -Datenbank ausgeführt. Bei Sicherungsvorgängen werden unter anderem auch die gesicherten Objekte ausgegeben. Da hierbei sehr lange Listen entstehen können, werden hier nur Auszüge der Ausgabe wiedergegeben. Die durchgeführten Sicherungsvorgänge können dem Anhang entnommen werden. Alle durchgeführten Sicherungsvorgänge wurden vollständig und korrekt durchgeführt. Zu sehen ist, dass auch bei differenzieller und inkrementeller Sicherung die Hashwerte für alle Tabellen berechnet werden, um auf Grundlage dieser Hashwerte ein Delta zum letzten gesicherten Datenstand zu ermitteln. Wie erwartet, bricht die Ausführung einer Sicherung bei Vorhandensein einer verschlüsselten Prozedur ab (vergleiche Abschnitt 6.3.3). 8.2.3. Durchführung einer Wiederherstellung In diesem Kapitel sollen folgende Funktionalitäten gezeigt werden: • Wiederherstellung eines Datenbankschemas • Wiederherstellung einer Datenbank • Wiederherstellung einer Tabelle aus einer Sicherung Diese Vorgänge werden mit den im vorigen Kapitel angefertigten Sicherungen ausgeführt. Zur Wiederherstellung muss die ID des zu verwendenden Backups angegeben werden. Die durchgeführten Wiederherstellungsvorgänge können dem Anhang entnommen werden. Die Wiederherstellungsvorgänge wurden erfolgreich abgeschlossen, auch wurde die erzeugte Schlüsselverletzung korrekt erkannt und eine Wiederherstellung verhindert, da an dieser Stelle ein Eingreifen des Nutzers notwendig war. Ein erneuter Aufruf von TSQL-Backup mit 44 Es handelt sich hierbei um eine Beispieldatenbank von Microsoft, welche bereits die verbreitetsten Schemaobjekte beinhaltet, siehe http://msdn.microsoft.com/de-de/library/ms124659%28SQL.90%29.aspx [102] aktivierter Korrektur von Schlüsselverletzungen führte schließlich zur erfolgreichen Wiederherstellung der Datenbank. 8.3. Vergleich mit vorhandenen Tools In diesem Abschnitt soll das entworfene Produkt den integrierten Möglichkeiten von SQL Server und einigen kommerziellen Produkten gegenübergestellt werden. Der Vergleich mit SQL Server selbst soll vollzogen werden, da TSQL-Backup nicht ausschließlich eine Funktionslücke in SQL Server schließen soll, sondern dazu dient, bestehende Lücken in Sicherungsstrategien zu ergänzen. Dazu werden zuerst die Funktionen der Programme verglichen und schließlich in einem Test Aussagen über Performanz und Ressourcenverbrauch gemacht. [103] 8.3.1. Funktionsumfang Funktion Quest LiteSpeed for SQL Server redgate SQL Backup Pro Microsoft SQL Server TSQLBackup Bezugsart kommerziell kommerziell - frei vollständige Sicherung ja ja ja ja differenzielle Sicherung ja ja ja ja inkrementelle Sicherung nein nein nein ja Schemasicherung nein nein nein ja Schemawiederherstellung bedingt nein nein ja Transaktionsprotokollsicherung ja ja ja nein Dateisicherung ja ja ja nein Object-Level-Recovery aus vollständiger Sicherung ja ja nein ja Object-Level-Recovery aus Teilsicherung (diff./inkr.) nein nein nein ja Object-Level-Recovery bei vorhandener Schlüsselverletzung bedingt 45 - 46 nein ja Sichern in Standard-SQLFormat ja nein ja nein Wiederherstellung aus Standard SQL-Format ja nein ja nein Wiederherstellung aus Teilsicherung (diff.) nein ja nein ja Passwortschutz/ Verschlüsselung ja ja nein nein Komprimierung ja ja nein ja GUI ja ja ja nein Integration in TSQL ja ja ja ja Benötigte Berechtigungsstufe sysadmin sysadmin serveradmin/ sysadmin sysadmin Löschen von Backups nein nein nein ja Installation von Systemdiensten / SQL Server Komponenten ja ja nein ja Tabelle 9: Funktionsvergleich mit anderen Tools 45 Siehe Auswertung in Kapitel 8.3.3 46 Kann aufgrund der unausgereiften Funktion nicht beurteilt werden [104] Bereits aus vorstehender Tabelle ist erkennbar, dass selbst die kommerziellen Produkte vom Funktionsumfang nicht das halten, was man von ihnen erwartet. Insbesondere das ObjectLevel-Recovery ist meist nur aus einer vollständigen Sicherung möglich und kann nur unter bestimmten Umständen ausgeführt werden (so kann bei redgate kein Restore bei einer Schlüsselverletzung erfolgen). Ansonsten ähneln diese Produkte stark der Funktionalität von SQL Server selbst. Deutlich ist auch erkennbar, dass TSQL-Backup versucht, bestimmte Lücken in diesem Funktionsumfang zu füllen. 8.3.2. Performanz Für die Performanztests wird die AdventureWorks-Datenbank verwendet, welche eine Dateigröße von 178,75 MB und einen freien Platz 47 von 16,02 MB aufweist. Um die Datenbank zu vergrößern (für verlässlichere Ergebnisse), werden folgende SQL Befehle ausgeführt: CREATE TABLE table_dummy ( ) text VARCHAR(MAX) GO DECLARE @i INT SET @i = 1 WHILE @i <= 10000000 BEGIN INSERT INTO table_dummy SELECT HashBytes('MD5',CAST(@i AS VARCHAR(10))) SET @i = @i + 1 END Listing 14: Erzeugen einer Dummy-Tabelle 47 Bei der Arbeit mit Datenbanken wächst in der Regel die Datenbankdatei (durch das Einfügen von Daten und das Anwachsen den Transaktionsprotokolls). Wird Speicher wieder freigegeben (durch Löschen von Objekten und Transaktionsprotokolleinträgen), wird die Datenbankdatei physikalisch nicht wieder verkleinert – der freie Platz wird für die folgenden Transaktionen verwendet. SQL Server bietet aber die Möglichkeit, insofern gewünscht, die Datenbankdateien manuell zu verkleinern („shrink“) [105] Die AdventureWorks-Datenbank hat nach der Vergrößerung eine Dateigröße von 466,75 MB. Es wird folgende Strategie für jedes zu testende Produkt angewandt (die vollständige Sicherung wird hierbei einmal mit maximaler und einmal ohne Komprimierung ausgeführt): • Löschen einer vorhandenen AdventureWorks-Datenbank • Einhängen einer neuen AdventureWorks-Datenbank in SQL Server • Ausführen einer vollständigen Sicherung • Einfügen einer neuen Tabelle in die AdventureWorks-Datenbank: CREATE TABLE table_diff ( ) text VARCHAR(MAX) GO DECLARE @i INT SET @i = 1 WHILE @i <= 1000000 BEGIN INSERT INTO table_diff SELECT HashBytes('MD5',CAST(@i AS VARCHAR(10))) SET @i = @i + 1 END • Ausführen einer differenziellen Sicherung • Löschen der AdventureWorks-Datenbank • Restore der vollständigen Sicherung • Restore der differenziellen Sicherung (wobei hierbei die vollständige Sicherung automatisch erkannt und eingespielt werden soll) • Object-Level-Recovery der Tabelle table_dummy (dazu wird diese gelöscht) • Object-Level-Recovery der Tabelle table_diff aus einer differenziellen Sicherung (dazu wird diese Tabelle gelöscht) Dabei werden Laufzeiten, Prozessorbelastung und Speicherplatzverbrauch untersucht. Die Ergebnisse sind Näherungswerte über den gesamten Prozess, da es prinzipiell zu zeigen gilt, welche grundsätzlichen Performanzunterschiede es gibt. Getestet wird in einer virtuellen Maschine auf 32-Bit-Basis. Physikalisch handelt es sich um einen Intel Xeon Quad-Core mit 4x 2666 MHz Taktfrequenz. Der virtuellen Maschine werden hierbei 2 CPU-Kerne und 4 GB RAM dediziert zugeteilt, wodurch sich realistische Leistungen messen lassen. Softwarebasis wird Windows Server 2003 Standard und SQL Server 2005 Standard sein. [106] Quest LiteSpeed for SQL Server redgate SQL Backup Pro Microsoft SQL Server TSQL-Backup mit Hashs TSQL-Backup ohne Hashs vollständige Sicherung ohne Komprimierung Laufzeit 0:08 Min. 0:15 Min. 0:11 Min. 32:10 Min. 1:17 Min. 5% 15% 3% ~45% ~20% 460 MB 460 MB 455 MB 456 MB + 701 MB 49 456 MB + 20 MB49 CPU-Auslastung Dateigröße 48 vollständige Sicherung mit maximaler Komprimierung Laufzeit 1:06 Min. 0:49 Min. / 37:11 Min. 5:34 Min. 91% 65% / ~45% ~20% 201 MB 188 MB / 231 MB + 701 MB49 231 MB + 20 MB49 CPU-Auslastung Dateigröße 48 differenzielle Sicherung ohne Komprimierung Laufzeit 0:03 Min. 0:03 Min. 0:03 Min. 18:38 Min / 4% 15% 8% ~46% / 35 MB 34 MB 31 MB 38 MB + 56 MB49 / CPU-Auslastung Dateigröße 48 vollständige Wiederherstellung Laufzeit 0:09 Min. 0:14 Min. 0:12 Min. 4:39 Min 4:37 Min 7% 16% 8% ~30% ~30% CPU-Auslastung Wiederherstellung aus differenzieller Sicherung (automatisch inkl. vollständiger Sicherung) Laufzeit CPU-Auslastung / 50 0:15 Min. /50 5:56 Min. /50 / 18% / ~26% / Object-Level-Recovery der Tabelle table_dummy Laufzeit 1:49 Min. / 51 /50 2:31 Min. 2:27 Min. 35% / / ~40% ~40% CPU-Auslastung Object-Level-Recovery der Tabelle table_diff Laufzeit CPU-Auslastung /50 /50 /50 0:49 Min. /50 / / / ~35% / Tabelle 10: Performanzvergleich mit anderen Tools 48 Dateigrößen basieren auf einem Faktor von 1024 (also 1 MB = 1024 kB) 49 Der Speicherplatzverbrauch bei Sicherungen mit Hashberechnung umfasst zusätzlich die Hashwerte und das Logbuch in der Metadatenbank 50 Funktion nicht verfügbar 51 Aufgrund Speicherplatzmangel auf der Festplatte ist dieses Restore abgebrochen, siehe nachfolgende Bemerkungen [107] 8.3.3. Auswertung Während der Tests sind einige Besonderheiten aufgetreten, die nachfolgend dokumentiert werden sollen. Quest LiteSpeed for SQL Server: • Ein Object-Level-Recovery einer Tabelle mit vorhandenen Schlüsseln wird von Quest derart umgesetzt, dass die Tabelle ohne jegliche Schlüssel wiederhergestellt wird. • Das Programm benötigt den SQL Befehl xp_cmdshell (und entsprechende Berechtigungen) darauf zum Betrieb. redgate SQL Backup Pro: • Ein Object-Level-Recovery der Tabelle table_dummy brach auf dem Testserver nach 7:26 Minuten mit dem Hinweis ab, dass der Festplattenspeicher nicht mehr ausreicht (Hintergrund: das Programm legt temporäre Daten unter C:\Temp ab, die ein Mehrfaches der Größe der AdventureWorks-Datenbank eingenommen haben; hierbei wurden bis zur Speicherplatzerschöpfung 2,91 GB verbraucht). • Ein weiterer Versuch, die HumanResources.EmployeeAddress Herstellung der Tabelle zur Simulation von Schlüsselverletzungen, brach mit dem Fehler ab, dass eine Spalte des Typs CHAR nicht in einen DATETIMEWert konvertiert werden kann. • Prinzipiell sind Object-Level-Recoverys bei diesem Programm nur aus Datenbanksicherungen möglich, die mit SQL Server selbst angefertigt wurden (programmeigene Sicherungen können dafür nicht verwendet werden). Allgemeine Hinweise: • Ein Schema-Restore bei den kommerziellen Tools ermöglicht meist nur die Wiederherstellung einer Tabelle, Sicht, Funktion oder Prozedur, nicht aber einer ganzen Datenbank. • Alle kommerziellen Tools stellen innerhalb von SQL Server Prozeduren zur Verfügung, mit denen man eine Sicherung und Wiederherstellung auch in eigenen SQL Skripten durchführen kann. Diesen Prozeduren ist aber gemeinsam, dass es sich um sogenannte erweiterte gespeicherte Prozeduren handelt, welche letztlich nur eine DLL-Datei des kommerziellen Tools ansprechen – es handelt sich also nicht um eine klassische Prozedur in SQL. [108] Es ist erkennbar, dass TSQL-Backup, insbesondere bei Vorgängen, bei denen die Hashberechnung eine Rolle spielt, deutlich länger brauchte als die kommerziellen Tools. Es gibt einige Faktoren, die dieses Verhalten erklären: • Kommerzielle Tools arbeiten nativ auf Dateiebene und sichern die Datenbank meist als ganze Einheit – TSQL-Backup hingegen exportiert aufwendig jede Tabelle einzeln mittels dem Befehl „bcp“ direkt aus dem SQL Server. • Kommerzielle Tools können bei entsprechender Softwareentwicklung von Multithreading und Parallelisierung profitieren und damit mehrere Kerne des Prozessors nutzen – eine Transaktion innerhalb von SQL Server wird aber auf nur einem Kern ausgeführt. • Die eingesetzten Hilfsprogramme „bcp“ und „gzip“ nutzten ebenfalls nur 1 Prozessorkern. „bcp“ erreichte damit beispielsweise nur die Hälfte des Datendurchsatzes der kommerziellen Produkte. Es ist also erkennbar, dass es sich bei den Performanzunterschieden hauptsächlich um Designprobleme der zugrundeliegenden Anwendungen handelt. SQL Server nutzt Threading für parallele Transaktionen, aber nicht zwingend innerhalb einer Transaktion. Eine Möglichkeit zur Optimierung von TSQL-Backup besteht darin, ein Komprimierungsprogramm einzusetzen, welches Multithreading unterstützt. Hier bietet sich das Programm „7zip“ 52 an, welches alle verfügbaren Prozessorkerne nutzen kann. Hierzu musste das Skript von TSQL-Backup geringfügig an die Syntax von „7zip“ angepasst werden. Um zu verdeutlichen, welchen Unterschied der Einsatz eines anderen Komprimierungsprogramms ausmacht, wurde zusätzlich zur Komprimierung mit „gzip“ ein vollständiger Sicherungsvorgang ohne Hashberechnung mit „7zip“ auf der AdventureWorksDatenbank durchgeführt: • „gzip“ erreichte mit maximaler Kompression eine Laufzeit von 05:34 Minuten und eine Backupgröße von 230 MB • „7zip“ hingegen erreichte mit kleinstmöglicher Kompressionsrate eine Laufzeit von 02:33 Minuten und eine Backupgröße von 201 MB Also bereits bei minimaler Kompression übertraf „7zip“ den Konkurrenten „gzip“ deutlich in Laufzeit und Speicherplatzverbrauch. Für „bcp“ existiert leider kein adäquater Ersatz. 52 http://www.7-zip.org/ [109] Letztlich spielt bei TSQL-Backup die Hashberechnung eine große Rolle, wenn es um die Laufzeit geht. Für jede zu exportierende Tabelle wird eine eigene Hashtabelle in der Metadatenbank angelegt. Allein für die angelegte Tabelle table_dummy, welche der Vergrößerung der Datenbank diente, sind für die 10.000.000 eingefügten Datenzeilen auch 10.000.000 Hashwerte zu erwarten, mit denen SQL umgehen muss – eine nicht unerhebliche Menge, die insbesondere dann kritisch wird, wenn anhand dieser Menge die zu exportierende Tabelle mit der Hashtabelle verknüpft wird (um die zu sichernden Zeilen zu markieren). Hier ist also nicht die eigentliche Datenbankgröße ausschlaggebend 53 , sondern die Anzahl der Datenzeilen in den Tabellen. Als handhabbare Größe sollten hier, je nach Leistung des Servers, 100.000 bis 1.000.000 Datenzeilen angesehen werden. Es muss natürlich auch berücksichtigt werden, dass TSQL-Backup bei einem Object-LevelRecovery erst das vollständige Datenbankschema temporär anlegt, um damit Strukturvergleiche mit der Datenbank durchzuführen, in welcher das Objekt wiederhergestellt werden soll. Dies ist ein Prozess, der durch kommerzielle Produkte nicht durchgeführt wird und auch unter Anpassung des Quellcodes von TSQL-Backup ausgelassen werden kann. Zur Wahrung der Datenkonsistenz ist dieser Prozess aber unabdingbar. Eine Deaktivierung kann einen Zeitgewinn von 20 bis 40 Sekunden bewirken, dies bringt TSQL-Backup insbesondere bei der Wiederherstellung kleinerer Tabellen nach vorn. Den größten Zeitanteil (wie auch bei Sicherungen) nimmt hier aber wieder die Arbeit mit dem Tool „bcp“ ein. 8.4. Anwendungsempfehlung Es hat sich im vorhergehenden Kapitel gezeigt, dass TSQL-Backup aufgrund der Architektur von SQL Server, aber auch der eigenen Arbeitsweise (Hashtabellen werden mit den zu exportierenden Daten verknüpft), von der Performanz deutlich hinter kommerziellen Tools zurückliegt. Der Einsatz eines alternativen Komprimierungsprogramms bringt deutliche Vorteile, insofern die Backupdaten komprimiert werden sollen. 53 Wie aus Tabelle 10 ersichtlich, liegt die Laufzeit von TSQL-Backup ohne Hashberechnung deutlich näher an denen der kommerziellen Produkte [110] Unter folgenden Voraussetzungen kann ein Einsatz von TSQL-Backup empfohlen werden: bei der Notwendigkeit von Teilsicherungen (differenziell/inkrementell) • Der Server sollte über ausreichend physikalischen Arbeitsspeicher verfügen, der SQL Server auch zugeteilt werden kann. Hierbei sollten mindestens 4 GB RAM zum Einsatz kommen. • Tabellen in der zu sichernden Datenbank sollten weniger als 1.000.000 Zeilen enthalten. wenn Teilsicherungen nicht zum Einsatz kommen sollen (Hashberechnung wird deaktiviert) • Hier sind bis auf die Datenbankanforderungen aus Abschnitt 7.1.2 keine Einschränkungen vorzunehmen. Die Leistung des Object-Level-Recovery kann sich, wenn man die Schemawiederherstellung außer Acht lässt, mit Quest LiteSpeed for SQL Server messen. Insbesondere, da durch TSQLBackup auch Konsistenzaspekte beachtet werden, ist ein Einsatz hier empfehlenswert. Weiterhin ist TSQL-Backup das einzige Produkt, welches auch ein Object-Level-Recovery aus einer differenziellen Sicherung umsetzt. Das ideale Einsatzszenario ergibt sich somit in der vollständigen Sicherung von Datenbanken ohne Hashberechnung, mit dem Einsatzhintergrund einer selektiven Wiederherstellung von Datenobjekten oder eines Datenbankschemas. 8.5. Einsatz unter SQL Server 2008 TSQL-Backup wurde unter SQL Server 2005 entwickelt, verschiedene Tests unter SQL Server 2008 verliefen aber ebenso erfolgreich. Grundlage für die Tests war ein SQL Server 2008 Enterprise auf Microsoft Windows 2003 Server. Folgende Vorgänge konnten ohne Fehler an der AdventureWorks-Datenbank durchgeführt werden: • Schema aus der Datenbank auslesen • Vollständige Sicherung mit und ohne Hashberechnung • Vollständige Sicherung mit Komprimierung • Wiederherstellung der Datenbank • Wiederherstellung der Tabelle HumanResources.EmployeeAddress [111] 9. Abschließende Betrachtungen Das Ziel dieser Arbeit war die Erstellung des Programms TSQL-Backup. Kapitel 8 hat gezeigt, dass ein funktionsfähiges Programm entstanden ist. Dennoch muss gesagt werden, dass der zeitliche Rahmen dieser Arbeit für den geplanten Funktionsumfang und die damit verbundene Realisierung nicht ausgereicht hat. Nachfolgende Tabelle gibt einen Überblick über die umgesetzten Funktionen (vergleiche Abschnitt 5.2.4): Funktion MussKriterium SollKriterium KannKriterium /PF010/ X X /PF020/ X X /PF030/ X /PF040/ X Vollständig umgesetzt X X X /PF120/ X X X X /PF140/ X X /PF150/ X X /PF210/ X X /PF220/ X X /PF230/ X X /PF240/ X X /PF250/ X X /PF310/ X X /PF320/ X /PF340/ X X /PF330/ Nicht umgesetzt X /PF110/ /PF130/ Teilweise umgesetzt X X X /PF350/ X X /PF360/ X X Tabelle 11: Übersicht über umgesetzten Funktionen Bei der teilweise umgesetzten Funktion /PF040/ handelt es sich um die Voreinstellungen für TSQL-Backup, wobei der Komprimierungsgrad noch nicht eingestellt werden kann. Die Funktionen /PF350/ und /PF360/ spezifizierten die Konsistenzprüfung und –korrektur. [112] Durch TSQL-Backup werden bereits folgende Integritätsfaktoren geprüft und korrigiert: • CHECK-Einschränkungen • Trigger • Fremdschlüssel (die auf der wiederherzustellenden Tabelle angelegt wurden) Offen geblieben ist die Behandlung von Fremdschlüsseln, welche auf anderen Tabellen existieren, und auf die wiederherzustellende Tabelle verweisen. Dieses Thema ist derart komplex [War03 S. 34ff, 92ff] [Fae07 S. 145ff], sodass hierzu erst ausführliche Untersuchungen stattfinden sollten, um auch das Zusammenwirken verschiedener Integritätsfaktoren (siehe Kapitel 4) zu berücksichtigen. Leider bleibt auch die Performanz hinter den Erwartungen zurück, die Gründe hierfür wurden im Abschnitt 8.3.3 eruiert. Ist der Einsatz der Hashberechnung aber nicht erforderlich, oder wird TSQL-Backup auf Datenbanken mit verhältnismäßig kleinen Tabellen eingesetzt (vergleiche Abschnitt 8.4), kann das Programm seine Stärken, insbesondere beim ObjectLevel-Recovery und der damit verbundenen Konsistenzprüfung und –korrektur, ausspielen. Unter den Gesichtspunkten einer softwaretechnischen Entwicklung [Sch07] wurde in verschiedenen Phasen die Entwicklung eines Softwareprodukts nachvollzogen. So war es wichtig, den Funktionsumfang während der Produktdefinition abzugrenzen und zu spezifizieren. Schwierigkeit hierbei war, dass keine klassische objektorientierte Entwicklung möglich war und eine Oberflächenentwicklung nicht stattfinden konnte. Die prozedurale Sprache TSQL hat die Entwicklung erschwert. Zudem mussten erst grundlegende Untersuchungen zu bestimmten Funktionalitäten, wie dem Auslesen des Datenbankschemas, den Transaktions-Isolationsstufen und der Hashwert-Berechnung angestellt werden, welche dann erst in die eigentliche Entwicklung einfließen konnten. So haben insbesondere die Kapitel 5 und 6 den Grundstein und die Rahmenbedingungen für die weitere Arbeit gelegt. Ein besonders wichtiger Aspekt war ebenso die umfangreiche Testreihe. Erlernte Methoden des Studiums konnten so angewandt und gefestigt werden. Folgende Erkenntnisse über TSQL-Backup sind zusätzlich während der Entwicklung entstanden: • Die Verwendung von Hashwerten zum Export von Tabellen hat den Nachteil, dass zwischen Hashberechnung und Export geänderte Datenzeilen nicht erfasst werden können und sich erst beim nächsten Sicherungsvorgang im Backup wiederfinden. Der Grund ist, dass die Snapshot-Isolation zwischen Hasherzeugung und Export unterbrochen werden muss, weil sonst auf die Hashwerte nicht zugegriffen werden kann. [113] • Ein paralleles Ausführen von Sicherungsvorgängen mit Hashberechnung ist nicht möglich, da es zu Überschneidungen der Snapshot-Isolationsstufe dieser Instanzen kommt, damit innerhalb eines Vorgangs zu Inkonsistenzen der Metadatenbank, und somit N-1 Prozesse (alle bis auf einen) durch SQL Server abgebrochen werden. • Bei Sicherungen ohne Hashberechnung tritt dieses Problem nicht auf, hierbei wird aber das Auslesen des Datenbankschemas durch mehrere Prozesse jeweils nacheinander ausgeführt, weil durch die Snapshot-Isolation immer nur ein Prozess in der Metadatenbank schreiben darf. Im Anschluss, beim Export der Datenbestände, werden aber alle Prozesse wieder parallel ausgeführt, so dass hier effektiv eine bessere Nutzung von mehreren CPU-Kernen möglich ist und entgegen Abschnitt 8.3.3 sogar ein Performanz-Gewinn erreicht werden kann. Bei Einsatz einer 2-Kern-CPU können so zwei parallele Sicherungsvorgängen um den Faktor zwei beschleunigt werden. Es kann zwar so kein einzelner Sicherungsvorgang beschleunigt werden, wohl aber der Gesamtprozess bei gleichzeitiger Durchführung mehrerer Datenbank-sicherungen. • Zur Hashberechnung wird über alle Spalten einer Tabelle eine Zeichenkette gebildet, welche dann in einem EXEC-Befehl ausgeführt wird. Hierbei kann bei vielen Spalten eine sehr lange Zeichenkette entstehen. SQL Server 2005 bietet mit dem Datentyp VARCHAR(MAX) die Möglichkeit mit diesem Befehl Zeichenketten mit einer Größe von fast 2 GB auszuführen. Sobald aber in dieser Zeichenkette Variablen eingebunden werden, die nicht vom Typ VARCHAR(MAX) sind, wird die ausführbare Länge der Zeichenkette auf 8000 Zeichen begrenzt – dies ist ein Relikt aus älteren Versionen von SQL Server. Um also die maximale Zeichenlänge in EXEC verwenden zu können, müssen alle verwendeten Variablen innerhalb dieser Zeichenkette vom Typ VARCHAR(MAX) sein. TSQL-Backup hat einen Grad an Reife erreicht, der einen produktiven Einsatz ermöglicht. Damit ist auch ein Anreiz gegeben, das Programm um noch fehlende, wünschenswerte oder aufgrund Zeitmangels nicht mehr umsetzbare Funktionen zu erweitern: • Eine mehrfache Ausführung von TSQL-Backup zur Sicherungen mit Hashberechnung sollte verhindert werden. • Es sind weitere Prüfungen und Tests bei Ausführungsbeginn von TSQL-Backup durchzuführen. So müssen unter anderem Schreibrechte im Backup-Speicherort und die physikalische Existenz von DPW und „gzip“ geprüft werden. • Eine Reaktion auf Fehler von der Kommandozeile, beispielsweise bei der Ausführung von „gzip“, wäre wünschenswert. [114] • Über einen optionalen Aufrufparameter und die Voreinstellungen sollte der Komprimierungsgrad für „gzip“ einstellbar sein. • In den Voreinstellungen war bereits die Möglichkeit vorgesehen, DPW nicht nur über eine vertrauenswürdige Verbindung auf SQL Server zugreifen zu lassen (diese Art der Verbindung ist nicht immer möglich), sondern ein Zugriff sollte auch explizit über Nutzername und Passwort erfolgen – hierzu sind Anpassungen erforderlich. • Eine wünschenswerte Funktion ist auch, bei der Wiederherstellung einer Tabelle einen weiteren Parameter (beispielsweise restore_depencies) einzuführen, der abhängige Datenbankobjekte vom wiederherzustellenden Element auf Basis von Trigger und Schlüsselbeziehungen erkennt und deren Wiederherstellung automatisch durchführt. • Ein Vergleich von ausgeführten Sicherungen mit der Datenbank, beziehungsweise zwischen wiederhergestellter Datenbank und Backup, sollte umgesetzt werden. • Es sollte untersucht werden, ob ein schnelleres und platzsparenderes Hashverfahren eingesetzt werden kann, um die Metadatenbank klein zu halten. In Abschnitt 7.1.2 wurde bereits angesprochen, dass TSQL-Backup in der Umgebung von Microsoft SQL Server entwickelt wurde. Hintergrund dabei ist unter anderem, dass sehr nah am Betriebssystem gearbeitet wird. So kann im Rahmen dieser Arbeit der Einsatz von Hilfsprogrammen nur durch einen Aufruf der Windows-Kommandozeile durch die erweiterte Prozedur xp_cmdshell innerhalb von TSQL erfolgen. Weiterhin werden sehr spezifische Funktionen von TSQL verwendet, wie die zur Hashberechnung oder auch die SnapshotIsolationsstufe. Eine Portierung auf andere Datenbankmanagementsysteme – zu den bekannten Produkten gehören Oracle Database und MySQL – sowie andere Betriebssysteme ist nicht möglich. In TSQL-Backup kommen spezifische TSQL-Funktionen zum Einsatz, für die möglicherweise ein Pendant im anderen Datenbankmanagementsystem gefunden werden kann, beispielsweise für die Hashberechnung und den Einsatz der Windows Kommandozeile durch xp_cmdshell. Aber selbst die SQL-Syntax differiert zwischen den Systemen. Für den Abruf der ersten N Zeilen aus einer Tabelle sieht der SQL-Befehl wie folgt aus: Microsoft SQL Server SELECT TOP N * FROM <table> Oracle SELECT * FROM <table> WHERE rownum<=N MySQL SELECT * FROM <table> LIMIT N [115] Weiterhin unterscheidet sich auch grundsätzlich die Verwaltung der Datenbankschemata von System zu System [Fae07 S. 279ff], so dass hier grundlegende Untersuchungen zum Auslesen des Schemas erfolgen müssen. Somit ist zu erwarten, dass ein Wechsel des Datenbankmanagementsystems eine vollständige und aufwändige Überarbeitung des Quellcodes erfordert. Eine Portierung auf ein anderes Betriebssystem erfordert neben der Anpassung des Quellcodes bezüglich des Aufbaus von Verzeichnispfaden auch einen Ersatz für alle Programme, die an der Windows Kommandozeile ausgeführt werden. Dies betrifft hauptsächlich DPW, da dieses nur unter Microsoft Windows lauffähig ist. TSQL-Backup kann unter Berücksichtigung der Anforderungen aus Abschnitt 7.1.2 und unter Ausschluss der Express-Edition von SQL Server 2008 (vergleiche Abschnitt 5.2.10) auch unter Microsoft SQL Server 2008 eingesetzt werden (vergleiche Abschnitt 8.5). Ein Betrieb in zukünftigen Versionen von SQL Server ist möglich, insofern DPW eingesetzt werden kann und die Strukturen von Systemtabellen gleich bleiben. Dies ist notwendig, da Systemtabellen für die Konsistenzprüfung (siehe auch Listings aus Kapitel 4) abgefragt werden. Weitere Einschränkungen sind nicht zu erwarten. TSQL-Backup hat gezeigt, dass es fehlende Funktionen in existierenden BackupProgrammen ersetzen kann. Der offene Quellcode ermöglicht darüber hinaus weitere Anpassungen und die Implementation zusätzlicher Funktionen, insbesondere zur Konsistenzwahrung. Inhalte für weitere Projekt- oder Abschlussarbeiten können sein: • Untersuchung von Faktoren zur Wahrung der referenziellen Integrität bei ObjectLevel-Recovery und Implementation einer Korrekturroutine in TSQL • Erarbeitung und Umsetzung eines Prüfalgorithmus zur Verifikation von Sicherungen und Wiederherstellungen auf Basis von TSQL-Backup Das Programm eignet sich somit zur Erweiterung bestehender Sicherungsstrategien. Insbesondere die Anforderung des Restores der eingangs beispielhaft erwähnten LookupTabellen in einem Data Warehouse kann erfüllt werden. Weiterhin wird der wichtige Aspekt der Beachtung und Korrektur von Schlüsselverletzungen bei einem Wiederherstellungsvorgang gewährleistet – dies konnte bisher kein kommerzieller Anbieter umsetzen (siehe Abschnitt 8.3.1). [116] Anhang – Syntaxerklärung für TSQL-Backup Zeile Parameter Wert Bedeutung 3 action get_settings Ausgabe der Voreinstellungen 4 action set_setting Verändern der Voreinstellungen 5 action schema_from_db Datenbankschema auslesen 5 db (STRING) Name der auszulesenden Datenbank 6 action backup Sicherung einer Datenbank 6 db (STRING) Name der zu sichernden Datenbank 7 action list Ausgabe aller vorhandenen Backups 8 action show_log Log zu einem Vorgang betrachten 8 id (INT) ID des Vorgangs (erhältlich durch action=list) 9 action purge Löschen von Backups 10 action list_elements Elements in einem Backup auflisten 10 id (INT) ID des zu verwendenden Backups 11 action schema_to_db Schema aus einem Backup wiederherstellen 11 id (INT) ID des zu verwendenden Backups 11 db (STRING) Name der Datenbank, in die das Schema wiederhergestellt werden soll 12 action restore Wiederherstellung einer Datenbank oder eines Elements aus einer Datenbank 12 id (INT) ID des zu verwendenden Backups 12 db (STRING) Name der Datenbank, in der das Backup oder Element wiederhergestellt werden soll 15 save_path (STRING) Physischer Speicherort für Backups 16 schema_login (user,win) Verbindungsmethode für DPW (Login mit Zugangsdaten oder vertrauenswürdige Verbindung) 17 schema_script (STRING) Pfad zu DPW 18 compress (yes,no) Voreinstellung zur Komprimierung von Backups [117] 19 zip_path (STRING) Pfad zu gzip 22 schema_pw (STRING) Passwort für Login mit Zugangsdaten für DPW 23 schema_user (STRING) Benutzername für Login mit Zugangsdaten für DPW 26 type (full,incr,diff) Art des Backups (vollständig, inkrementell oder differenziell) 27 quick (yes,no) Schnelles Backup (es werden keine Hashs erzeugt) 28 compress (yes,no) Komprimieren des Backups (überschreibt Voreinstellung) 29 schema_pw (STRING) Passwort für Login mit Zugangsdaten für DPW 30 schema_user (STRING) Benutzername für Login mit Zugangsdaten für DPW 33 db (STRING) Datenbankname, zu dem alle Backups ausgegeben werden sollen 36 force (yes,no) Löschen von Backups erzwingen 37 db (STRING) Löschen von Backups zu einer bestimmten Datenbank 38 keep_last_full (INT) Erhält beim Löschen die letzten X vollständigen Backups 39 id (INT) Löschen eines bestimmten Backups (ID des Backups) 40 keep_schema (yes,no) Erhält beim Löschen von Backups reine Schema-Backups 43 force (yes,no) Erzwingen der Wiederherstellung eines Datenbankschemas 46 force (yes,no) Erzwingen der Wiederherstellung einer Datenbank oder eines Elements 47 element_id (INT) ID des Elements, welches wiederhergestellt werden soll 50 consistence (handle,ignore) Behandlung von auftretenden Konsistenzproblemen bei der Wiederherstellung [118] Anhang – Schnittstellenbeschreibung newBackup Diese Prozedur stellt das Hauptprogramm von TSQL-Backup dar und wird in Abhängigkeit der übergebenen Parameter die passenden Unterprozeduren aufrufen. Für jeden Aufruf werden hier bereits die Prozeduren zur Argumentprüfung und die Prüfung von Systemparametern durchgeführt. Parameter Art Datentyp Beschreibung action intern VARCHAR(MAX) an das Hauptprogramm übergebene, auszuführende Funktion von TSQL-Backup log_id intern INT ID des aktuellen Logs backup_id intern INT ID des aktuellen/zu verwendenden Backups backup_type intern VARCHAR(255) Typ des Backups ("schema", "full", "incr", "diff") save_path intern VARCHAR(MAX) Speicherort der Backupdateien zip_path intern VARCHAR(MAX) Speicherort von gzip ptrval intern BINARY(16) Zeiger für die Arbeit mit TEXT-Feldern newBackupBackup Das Kernstück von TSQL-Backup bildet die eigentliche Backupfunktionalität, welche in dieser Prozedur bereitgestellt wird. Dies umfasst die vollständige, differenzielle und inkrementelle Sicherung der Dateninhalte. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs backup_id Eingabe INT ID des aktuellen Backups db_name Eingabe VARCHAR(255) Name der Datenbank, die gesichert werden soll backup_type Eingabe VARCHAR(255) Typ des Backups ("schema", "full", "incr", "diff") save_path Eingabe VARCHAR(MAX) Speicherort der Backupdateien zip_path Eingabe VARCHAR(MAX) Speicherort von gzip [119] parent_id intern INT ID des übergeordneten Backups (für diff./inkr. Backups) newBackupBackupList Hiermit können alle von TSQL-Backup erzeugten Backups ausgegeben werden. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs db_name Eingabe VARCHAR(255) Name der Datenbank, zu welcher Backups ausgegeben werden sollen newBackupCheckArguments Zur Gewährleistung der korrekten Funktionsweise von TSQL-Backup überprüft diese Prozedur alle übergebenen Argumente auf syntaktische Korrektheit – es handelt sich also um einen Parser für die Argumente-Zeichenkette – und veranlasst im Fehlerfall die Ausgabe der Syntax. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs arguments Eingabe VARCHAR(MAX) an das Hauptprogramm übergebene Parameterkette newBackupColToBin Die Funktion zur Erzeugung von Hashwerten erwartet die Eingabe der Daten in einem bestimmten Datentyp. Sie gibt, wenn nötig, eine Zeichenkette zur Umwandlung des übergebenen Spaltentyps in das notwendige Format VARBINARY zurück. Parameter Art Datentyp Beschreibung column_name Eingabe NVARCHAR(128) Name der Spalte, welche umgewandelt werden soll column_type Eingabe NVARCHAR(128) aktueller Typ der Spalte return Ausgabe NVARCHAR(255) Rückgabe einer SQL-Zeichenkette zur weiteren Verarbeitung in einem SQL-Befehl, welcher die Spalte entsprechend umwandelt [120] newBackupCreateDB DPW kann lediglich die Schemaelemente einer Datenbank auslesen, aber nicht das Skript zur Erzeugung der Datenbank selbst. Mit dieser Prozedur wird ein solches CREATE DATABASESkript erzeugt. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs backup_id Eingabe INT ID des aktuellen Backups db_name Eingabe VARCHAR(255) Name der Datenbank, für welche das Skript erzeugt werden soll script intern VARCHAR(MAX) Hilfsvariable, die letztlich das vollständige CREATE-Skript enthält ptrval intern BINARY(16) Zeiger für die Arbeit mit TEXT-Feldern newBackupDataRestore Diese Prozedur spielt alle Tabelleninhalte (also auch zugehörige differenzielle und inkrementelle Backups) in eine angegebene Datenbank ein und bildet damit einen Teil der Restore-Funktion. Dabei ist die Wiederherstellung aller Daten einer Datenbank möglich, aber auch die Wiederherstellung eines einzelnen Elementes. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs backup_id Eingabe INT ID des zu verwendenden Backups db_name Eingabe VARCHAR(255) Name der Datenbank, in welcher die Daten wiederhergestellt werden sollen save_path Eingabe VARCHAR(MAX) Speicherort der Backupdateien zip_path Eingabe VARCHAR(MAX) Speicherort von gzip element_id intern INT Hilfsvariable, die ungleich 0 ist, falls ein bestimmtes Element (Tabelle) angegeben wurde, welches wiederhergestellt werden soll newBackupDBRestore Mit dieser Prozedur kann ein Datenbankschema vollständig wieder eingespielt werden. Sie stellt somit auch ein Teil der Restore-Funktion dar. [121] Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs backup_id Eingabe INT ID des zu verwendenden Backups db_name Eingabe VARCHAR(255) Name der Datenbank, in welcher das Schema wiederhergestellt werden soll newBackupGetSchema Mit dieser Prozedur wird das Datenbankschema ausgelesen. Damit können alle Schemaelemente einer Datenbank als SQL-Skript erzeugt werden. Sie stellt einen Teil der Backup-Funktion dar. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs backup_id Eingabe INT ID des aktuellen Backups db_name Eingabe VARCHAR(255) Name der Datenbank, für welche das Schema ausgelesen werden soll save_path Eingabe VARCHAR(255) Speicherort der Backupdateien script intern VARCHAR(MAX) Speicherort von DPW object_id intern INT eindeutige ID des Schema-Objektes ptrval intern BINARY(16) Zeiger für die Arbeit mit TEXT-Feldern newBackupHashData Dies soll eine echte Funktion sein und den Hashwert zu einer übergebenen Zeichenkette erzeugen. Parameter Art Datentyp Beschreibung algorithm Eingabe NVARCHAR(4) Algorithmus, der für die Hashfunktion verwendet werden soll input_data Eingabe VARBINARY(MAX) Zeichenkette, welche umgewandelt werden soll index intern INT Hilfsvariable zur Arbeit mit Zeichenketten, die länger als 8000 Zeichen sind [122] input_data_length intern INT Hilfsvariable zur Arbeit mit Zeichenketten, die länger als 8000 Zeichen sind return_sum Ausgabe VARBINARY(MAX) berechneter Hashwert für die Zeichenkette newBackupIsolation Hiermit kann ein Snapshot für eine Datenbank aktiviert werden. Dies ist notwendig, um die Konsistenz beim Auslesen des Datenbankschemas oder der Erstellung eines Backups zu gewährleisten. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs db_name Eingabe VARCHAR(255) Name der Datenbank, für welche ein Snapshot aktiviert werden soll snapshot_state Ausgabe INT Flag über den Zustand des Snapshot-Modus newBackupKeyConsistence Zur Wahrung der Konsistenz von Schlüsselbeziehungen und Triggern bei einem Restore soll diese Prozedur bestimmte Prüfungen und Korrekturen durchführen. Dazu gehört die Prüfung, ob bei einem Fremdschlüssel in der Zieltabelle alle Spalten enthalten sind, oder auch das Einfügen von Primärschlüsseln zur Wahrung der Integrität. Diese Prozedur ist Teil der Restore-Funktion. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs db_name Eingabe VARCHAR(255) Name der Zieldatenbank, in der die Konsistenzprüfungen laufen sollen tmp_db_name Eingabe VARCHAR(255) Name der temporären Schema-Datenbank, welche als Referenz für Schema-Prüfungen verwendet wird type Eingabe VARCHAR(255) Typ des zu prüfenden Elements ("all", "fk", "trigger", "check") do Eingabe VARCHAR(255) Flag, welches angibt, ob die Konsistenz nur geprüft werden soll, oder ob auch Korrekturen vorgenommen werden sollen success Ausgabe INT Flag, welches den Erfolg der Aktion zurückgibt [123] newBackupKeyTrigger Diese Prozedur hilft, alle vorhandenen Schlüsselbeziehungen und Trigger in einer Datenbank oder für ein Element temporär zu aktivieren oder zu deaktivieren, und ist ebenfalls Teil der Restore-Funktion. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs db_name Eingabe VARCHAR(255) Name der Datenbank, in der Schlüssel und Trigger de-/aktiviert werden sollen suffix Eingabe VARCHAR(255) wird genutzt, um die Art der Schlüssel und Trigger anzugeben, welche de-/aktiviert werden sollen (beispielsweise "_ref" für verweisende Schlüssel auf ein Objekt) do Eingabe VARCHAR(255) gibt an, ob Schlüssel /Trigger aktiviert oder deaktiviert werden sollen success Ausgabe INT Flag, welches den Erfolg der Aktion zurückgibt newBackupPreDBInit Wenn ein Backup erstellt oder ein Datenbankschema ausgelesen werden soll, dient diese Prozedur dazu, alle notwendigen Vorbereitungen zu treffen. Dazu gehört, in der Metadatenbank einen entsprechenden Eintrag für das Backup zu erzeugen und somit eine backup_id zu erhalten. Parameter Art Datentyp Beschreibung backup_type Eingabe VARCHAR(255) Art des Backups ("schema", "full", "diff", "incr") desc Eingabe VARCHAR(MAX) Beschreibung für den aktuellen Backupvorgang log_id Eingabe INT ID des aktuellen Logs db_name Eingabe VARCHAR(255) Name der zu sichernden Datenbank backup_id Ausgabe INT eindeutige ID für das aktuell ausgeführte Backup snapshot_state Ausgabe INT Flag über den Zustand des Snapshot-Modus [124] newBackupPrePathInit Für viele Funktionen in TSQL-Backup ist es notwendig, dass bestimmte Speicherpfade korrekt sind. Dazu gehört die Übergabe des physischen Pfads von DPW und von gzip an das Hauptprogramm, aber auch die Erzeugung des physischen Pfads zur Speicherung der Daten, wenn ein Backup erstellt wird. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs save_path Ausgabe VARCHAR(MAX) aus Voreinstellungen ausgelesener Speicherort der Backupdateien zip_path Ausgabe VARCHAR(MAX) aus Voreinstellungen ausgelesener Speicherort von gzip newBackupPurge Zur Löschung von alten Backups aus TSQL-Backup stellt diese Prozedur alle Funktionen bereit. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs save_path Eingabe VARCHAR(MAX) Speicherort der Backupdateien keep_last_full intern INT enthält den Wert der letzten X zu erhaltenden vollständigen Backups (in der Regel 0) keep_schema intern VARCHAR(25) Flag, ob Schema-Backups erhalten bleiben sollen (in der Regel 0) backup_id intern INT Hilfsvariable, die ungleich 0 ist, falls als Parameter beim Programmaufruf ein bestimmtes Backup angegeben wurde, welches gelöscht werden soll db_name intern VARCHAR(255) Hilfsvariable, die nicht leer ist, falls als Parameter beim Programmaufruf eine bestimmte Datenbank angegeben wurde, zu welcher alle Backups gelöscht werden sollen newBackupRestore Diese Prozedur stellt die Funktionalität zur Wiederherstellung eines einzelnen Datenbankschemas, einer ganzen Datenbank oder eines bestimmten Elementes aus einer [125] Datenbank zur Verfügung. Ein Grundgedanke ist, dass bei einem Restore das ausgelesene Schema eines Backups hilfsweise in eine temporäre Datenbank eingespielt wird, um dann mithilfe dieser Datenbank das Schema von Objekten zu vergleichen und auch Schlüsselbeziehungen und Trigger zu finden. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs restore_type Eingabe VARCHAR(255) Art der Wiederherstellung (vollständiges Restore oder Wiederherstellung eines Datenbankschemas) db_name Ausgabe VARCHAR(255) Ausgabe des Namens der Datenbank, in welcher die Wiederherstellung stattgefunden hat save_path Eingabe VARCHAR(MAX) Speicherort der Backupdateien zip_path Eingabe VARCHAR(MAX) Speicherort zu gzip ptrval intern BINARY(16) Zeiger für die Arbeit mit TEXT-Feldern backup_id intern INT verwendetes Backup zur Wiederherstellung tmp_backup_id intern INT Hilfsvariable für den Vergleich von Schemaobjekten tmp_db_name intern VARCHAR(255) Name der Datenbank, in welcher das Schema des Backups hilfsweise eingespielt wurde snapshot_state intern INT Flag über den Zustand des Snapshot-Modus success intern INT Flag, welches den Erfolg von newBackupKeyTrigger anzeigt newBackupSyntaxFromDB Die Syntax von TSQL-Backup wird rekursiv in der Datenbank gespeichert (siehe Abschnitt 6.8). Diese Prozedur erzeugt in Abhängigkeit vom übergebenen Elternknoten die zugehörige Syntax. Parameter Art Datentyp Beschreibung depends_on Eingabe INT Elternknoten der auszugebenden Elemente; Einstieg für gewöhnlich über die Wurzel (Element 0) textTop Ausgabe VARCHAR(MAX) Kopf der Syntax (entsteht durch rekursiven Aufruf) [126] textBottom Ausgabe VARCHAR(MAX) Rest der Syntax (entsteht durch rekursiven Aufruf) textTopSub intern VARCHAR(MAX) Hilfsvariable für rekursiven Aufruf textBottomSub intern VARCHAR(MAX) Hilfsvariable für rekursiven Aufruf valuesPrefix intern CHAR(2) jeder Parameter erscheint in Anlehnung an TSQL auf einer eigenen Zeile, diese Variable steuert den vor dem Parameter auszugebenden Text newBackupSyntaxOut Die Ausgabe der Syntax von TSQL-Backup soll syntaktisch an TSQL angelehnt sein. Dazu dient diese Prozedur. Die benötigten Daten werden von newBackupSyntaxFromDB bereit gestellt. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs type Eingabe VARCHAR(25) Information welche Syntax ausgegeben werden soll; prinzipiell wird die vollständige Syntax ausgegeben; über diesen Parameter liese sich steuern, ob nur ein bestimmter Ausschnitt aus der Syntax angezeigt werden soll textTop intern VARCHAR(MAX) enthält den Kopf der Syntax textBottom intern VARCHAR(MAX) enthält den Rest der Syntax newBackupTextOut Diese Prozedur dient der Textausgabe innerhalb der SQL Befehlszeile und einen zur Textausgabe identischen Eintrag im Log. Es wird somit kein PRINT-Befehl in SQL ausgeführt, sondern an jeder Stelle, an der Text ausgegeben werden soll, die Prozedur aufgerufen. Parameter Art Datentyp Beschreibung log_id Eingabe INT ID des aktuellen Logs text Eingabe VARCHAR(MAX) auszugebender Text type Eingabe VARCHAR(25) Logstufe (Klassifizierung in beispielsweise "info", "warning", "error") [127] Anhang – Struktogramm für newBackupGetSchema Abbildung 18: Struktogramm für newBackupGetSchema [128] Anhang – Struktogramm für newBackupBackup Abbildung 19: Struktogramm für newBackupBackup [129] Anhang – Testszenarien in TSQL-Backup Szenario korrektes Verhalten Aufruf ohne Parameter ja Programmaufruf newBackup Ausgabe no arguments given syntax: […] Szenario korrektes Verhalten Aufruf mit fehlender Berechtigung ja Programmaufruf newBackup 'action=list' Ausgabe Execute only as 'sa' Szenario korrektes Verhalten Aufruf mit fehlenden Systemeinstellungen (I) ja Programmaufruf newBackup 'action=list' Ausgabe Please set option 'show advanced options' to 1 via sp_configure: EXEC master.dbo.sp_configure 'show advanced options', 1 RECONFIGURE [130] Szenario korrektes Verhalten Aufruf mit fehlenden Systemeinstellungen (II) ja Programmaufruf newBackup 'action=list' Ausgabe Please set option 'xp_cmdshell' to 1 via sp_configure: EXEC master.dbo.sp_configure 'xp_cmdshell', 1 RECONFIGURE Szenario korrektes Verhalten Aufruf mit fehlendem Parameter ja Programmaufruf newBackup 'action=backup' Ausgabe missing expected arguments for given parameters: param: action | value: backup syntax: […] Szenario korrektes Verhalten Aufruf mit mehrfachen Parametern ja Programmaufruf newBackup 'action=backup,db=AdventureWorks,db=OtherDb' Ausgabe parameters given multiply: param: db [131] Szenario korrektes Verhalten Aufruf mit ungültigem Parameter ja Programmaufruf newBackup 'action=backup,some=parameter' Ausgabe disallowed parameter settings: param: some | disallowed value: parameter syntax: […] Szenario korrektes Verhalten Aufruf mit falschem Werttyp ja Programmaufruf newBackup 'action=set_setting,compress=1' Ausgabe wrong data type for parameter values: param: compress has to be {yes|no} syntax: […] Szenario korrektes Verhalten Aufruf mit fehlendem Pfad zu DPW ja Programmaufruf newBackup 'action=backup,db=AdventureWorks' Ausgabe no save path for backup files given, please set one syntax: […] Szenario korrektes Verhalten Aufruf mit fehlendem Pfad zu gzip ja Programmaufruf newBackup 'action=backup,db=AdventureWorks' Ausgabe no path to app gzip given, please set one syntax: […] [132] Szenario korrektes Verhalten Aufruf mit nicht existierender Datenbank ja Programmaufruf newBackup 'action=backup,db=NonExistent' Ausgabe database 'NonExistent' does not exist Szenario korrektes Verhalten Aufruf mit nicht existierender Backup-ID ja Programmaufruf newBackup 'action=list_elements,id=-1' Ausgabe backup for given ID -1 does not exist [133] Anhang – Durchgeführte Sicherungsvorgänge Szenario Sicherung des Datenbankschemas Programmaufruf newBackup 'action=schema_from_db,db=AdventureWorks' Ausgabe using backup id 1 generate script for database 'AdventureWorks' script for database 'AdventureWorks' (id 1) saved getting database schema for 'AdventureWorks' schema for object 'AdventureWorks' (id 2) saved schema for object 'HumanResources' (id 3) saved schema for object 'Person' (id 4) saved […] Szenario Vollständige Sicherung ohne Hash-Erzeugung Programmaufruf newBackup 'action=backup,db=AdventureWorks,quick=yes' Ausgabe using backup id 2 generate script for database 'AdventureWorks' script for database 'AdventureWorks' (id 533) saved getting database schema for 'AdventureWorks' schema for object 'AdventureWorks' (id 534) saved schema for object 'HumanResources' (id 535) saved schema for object 'Person' (id 536) saved […] export data for tables in 'AdventureWorks' data for table 'AdventureWorks.dbo.AWBuildVersion' (id 554) exported data for table 'AdventureWorks.Production.TransactionHistoryArchive' (id 555) exported data for table 'AdventureWorks.Sales.CreditCard' (id 558) exported […] [134] Szenario Vollständige Sicherung mit Komprimierung Programmaufruf newBackup 'action=backup,db=AdventureWorks,compress=yes' Ausgabe using backup id 3 generate script for database 'AdventureWorks' script for database 'AdventureWorks' (id 1065) saved getting database schema for 'AdventureWorks' schema for object 'AdventureWorks' (id 1066) saved schema for object 'HumanResources' (id 1067) saved schema for object 'Person' (id 1068) saved […] computing hashs and export data for tables in 'AdventureWorks' hashs for table 'AdventureWorks.dbo.AWBuildVersion' (id 1086) computed hashs for table 'AdventureWorks.Production.TransactionHistoryArchive' (id 1087) computed hashs for table 'AdventureWorks.Sales.CreditCard' (id 1090) computed […] compress exported file for table 'AdventureWorks.dbo.AWBuildVersion' (id 1086) data for table 'AdventureWorks.dbo.AWBuildVersion' (id 1086) exported compress exported file for table 'AdventureWorks.Production.TransactionHistoryArchive' (id 1087) data for table 'AdventureWorks.Production.TransactionHistoryArchive' (id 1087) exported compress exported file for table 'AdventureWorks.Sales.CreditCard' (id 1090) data for table 'AdventureWorks.Sales.CreditCard' (id 1090) exported […] Szenario Differenzielles Backup Programmaufruf newBackup 'action=backup,db=AdventureWorks,type=diff' Ausgabe using backup id 4 using backup with ID 3 as last master backup generate script for database 'AdventureWorks' script for database 'AdventureWorks' (id 1597) saved getting database schema for 'AdventureWorks' schema for object 'AdventureWorks' (id 1598) saved schema for object 'HumanResources' (id 1599) saved schema for object 'Person' (id 1600) saved […] computing hashs and export data for tables in 'AdventureWorks' hashs for table 'AdventureWorks.dbo.AWBuildVersion' (id 1618) computed hashs for table 'AdventureWorks.Production.TransactionHistoryArchive' [135] (id 1619) computed hashs for table 'AdventureWorks.Sales.CreditCard' (id 1622) computed […] data for table 'AdventureWorks.dbo.AWBuildVersion' (id 1618) exported data for table 'AdventureWorks.Production.TransactionHistoryArchive' (id 1619) exported data for table 'AdventureWorks.Sales.CreditCard' (id 1622) exported[…] Szenario Inkrementelles Backup Programmaufruf newBackup 'action=backup,db=AdventureWorks,type=incr' Ausgabe using backup id 5 using backup with ID 3 as last master backup generate script for database 'AdventureWorks' script for database 'AdventureWorks' (id 2129) saved getting database schema for 'AdventureWorks' schema for object 'AdventureWorks' (id 2130) saved schema for object 'HumanResources' (id 2131) saved schema for object 'Person' (id 2132) saved […] computing hashs and export data for tables in 'AdventureWorks' hashs for table 'AdventureWorks.dbo.AWBuildVersion' (id 2150) computed hashs for table 'AdventureWorks.Production.TransactionHistoryArchive' (id 2151) computed hashs for table 'AdventureWorks.Sales.CreditCard' (id 2154) computed […] data for table 'AdventureWorks.dbo.AWBuildVersion' (id 2150) exported data for table 'AdventureWorks.Production.TransactionHistoryArchive' (id 2151) exported data for table 'AdventureWorks.Sales.CreditCard' (id 2154) exported […] Szenario Vollständige Sicherung bei vorhandener verschlüsselter Prozedur Programmaufruf newBackup 'action=backup,db=AdventureWorks' Ausgabe using backup id 6 generate script for database 'AdventureWorks' script for database 'AdventureWorks' (id 2661) saved getting database schema for 'AdventureWorks' failed Fehler: 'sp_encrypted' ist eine verschlüsselte gespeicherte Prozedur. Die Skripterstellung für verschlüsselte gespeicherte Prozeduren wird nicht unterstützt. [136] Anhang – Durchgeführte Wiederherstellungsvorgänge Szenario Ausgabe der angefertigten Backups Programmaufruf newBackup 'action=list' Ausgabe BACKUP LIST FOR DB AdventureWorks ID DB TYP DEPENDS DATE STATE DESCRIPTION ---------------------------------------------------------------------------------------------6 AdventureWorks full 6 08.04.2010 10:43:17 failed full backup for database 5 AdventureWorks incr 3 08.04.2010 09:22:15 finished incr backup for database 4 AdventureWorks diff 3 08.04.2010 09:11:00 finished diff backup for database 3 AdventureWorks full 3 07.04.2010 14:06:19 finished full backup for database 2 AdventureWorks full 2 07.04.2010 14:01:11 finished full backup for database 1 AdventureWorks schema 1 07.04.2010 13:56:07 finished schema for database REMEMBER: backups with state 'not_finished' or 'failed' are not available for restore or following diff/incr backups Für alle folgenden Wiederherstellungsvorgänge wird das Backup mit der ID 3 verwendet. Szenario Wiederherstellung eines Datenbankschemas bei vorhandener Datenbank Programmaufruf newBackup 'action=schema_to_db,db=AdventureWorks,id=3' Ausgabe database 'AdventureWorks' exists, use force option to overwrite database (CAUTION: all data will be lost) Szenario Wiederherstellung eines Datenbankschemas mit Überschreiben einer vorhandenen Datenbank Programmaufruf newBackup 'action=schema_to_db,db=AdventureWorks,id=3,force=yes' [137] Ausgabe dropping existing database 'AdventureWorks' getting database schema from backup ID 3 executing database schema script on database AdventureWorks database AdventureWorks created element 'AdventureWorks' (type: database, id 1066) created element 'HumanResources' (type: schema, id 1067) created element 'Person' (type: schema, id 1068) created […] schema elements restored Szenario Wiederherstellung einer Datenbank Programmaufruf newBackup 'action=restore,db=AdventureWorks,id=3,force=yes' Ausgabe dropping existing database 'AdventureWorks' getting database schema from backup ID 3 executing database schema script on database AdventureWorks database AdventureWorks created element 'AdventureWorks' (type: database, id 1066) created element 'HumanResources' (type: schema, id 1067) created element 'Person' (type: schema, id 1068) created […] schema elements restored disable all triggers and constraints temporary handle fk FK_PurchaseOrderHeader_Vendor_VendorID handle fk FK_VendorAddress_Address_AddressID handle fk FK_VendorAddress_AddressType_AddressTypeID […] compressed file for table 'dbo.AWBuildVersion' (id 1086) decompressed data for table 'dbo.AWBuildVersion' (id 1086) in database 'AdventureWorks' imported compressed file for table 'Production.TransactionHistoryArchive' (id 1087) decompressed data for table 'Production.TransactionHistoryArchive' (id 1087) in database 'AdventureWorks' imported compressed file for table 'Sales.CreditCard' (id 1090) decompressed data for table 'Sales.CreditCard' (id 1090) in database 'AdventureWorks' imported […] re-enable all disabled triggers and constraints handle fk FK_PurchaseOrderHeader_Vendor_VendorID handle fk FK_VendorAddress_Address_AddressID handle fk FK_VendorAddress_AddressType_AddressTypeID […] database 'AdventureWorks' restored [138] Für die Simulation einer Schlüsselverletzung müssen ein paar Eingriffe an der AdventureWorks-Datenbank vorgenommen werden. Dazu werden folgende Befehle ausgeführt: USE AdventureWorks GO DROP TABLE HumanResources.EmployeeAddress DELETE FROM Sales.CustomerAddress WHERE AddressID<=10 DELETE FROM Sales.SalesOrderHeader WHERE ShipToAddressID<=10 DELETE FROM Person.Address WHERE AddressID<=10 Damit wird eine Relationstabelle gelöscht und nachträglich werden Adressen gelöscht, welche in der gelöschten Relation verwendet wurden. Um die ID des wiederherzustellenden Elementes (hier: der Tabelle HumanResources.EmployeeAddress) zu erfahren, kann eine Elementliste abgerufen werden. Szenario Ausgabe der Elemente einer Sicherung Programmaufruf newBackup 'action=list_elements,id=3' Ausgabe ID […] 1194 1109 1110 […] TYP OWNER NAME trigger usertable usertable dVendor HumanResources Employee HumanResources EmployeeAddress Szenario Wiederherstellen einer Tabelle mit bestehenden Schlüsselbeziehungen Programmaufruf newBackup 'action=restore,db=AdventureWorks,id=3,element_id=1110' Ausgabe getting database schema from backup ID 3 executing database schema script on database newBackupMeta_20100409135301513 database newBackupMeta_20100409135301513 created element 'AdventureWorks' (type: database, id 1066) created element 'HumanResources' (type: schema, id 1067) created element 'Person' (type: schema, id 1068) created [139] […] schema elements restored handle fk (tmp) FK_EmployeeAddress_Address_AddressID handle fk (tmp) FK_EmployeeAddress_Employee_EmployeeID handle trigger (tmp) uEmployeeAddress compressed file for table 'HumanResources.EmployeeAddress' (id 1110) decompressed data for table 'HumanResources.EmployeeAddress' (id 1110) in database 'newBackupMeta_20100409135301513' imported CAUTION: fk (tmp) FK_EmployeeAddress_Address_AddressID could not be created, because rows in element violate constraint, use consistence option to handle or ignore constraints CAUTION: trigger (tmp) uEmployeeAddress could not be created, because referred object 'HumanResources.EmployeeAddress' does not exist, use consistence option to ignore constraints Szenario Wiederherstellen einer Tabelle mit bestehenden Schlüsselbeziehungen und aktivierter Behandlung Programmaufruf newBackup 'action=restore,db=AdventureWorks,id=3,element_id=1110, consistence=handle' Ausgabe getting database schema from backup ID 3 executing database schema script on database newBackupMeta_20100409140011960 database newBackupMeta_20100409140011960 created element 'AdventureWorks' (type: database, id 1066) created element 'HumanResources' (type: schema, id 1067) created element 'Person' (type: schema, id 1068) created […] schema elements restored handle fk (tmp) FK_EmployeeAddress_Address_AddressID handle fk (tmp) FK_EmployeeAddress_Employee_EmployeeID handle trigger (tmp) uEmployeeAddress compressed file for table 'HumanResources.EmployeeAddress' (id 1110) decompressed data for table 'HumanResources.EmployeeAddress' (id 1110) in database 'newBackupMeta_20100409140011960' imported element 'EmployeeAddress' (type: usertable, id 1110) in database 'AdventureWorks' created compressed file for table 'HumanResources.EmployeeAddress' (id 1110) decompressed data for table 'HumanResources.EmployeeAddress' (id 1110) in database 'AdventureWorks' imported data will be deleted to create fk_tmp FK_EmployeeAddress_Address_AddressID creating triggers and constraints element successfully restored [140] Glossar API Programmierschnittstelle („application programming interface“), welche Funktionen des Programms für andere Anwendungen zur Anbindung an das eigene System zur Verfügung stellt Backup Begriff für den Vorgang der Sicherung von Daten oder Dateien auf einem externen Medium zum Schutz vor Datenverlust Commit Vorgang, welcher eine offene Transaktion in SQL abschließt und temporär vorgenomme Änderungen und vorgehaltene Daten permanent festschreibt, insofern keine Inkonsistenzen auftreten Disaster Recovery Umfassender Begriff für alle Maßnahmen, die im Fall des Datenverlusts durchgeführt werden. Dies umfasst die Datenwiederherstellung, wie auch das Ersetzen defekter Hardware und Infrastruktur DDL Datenbeschreibungssprache („data definition language“), die das Anlegen, Modifizieren oder Löschen von Datenbankobjekten, also dem Schema, ermöglicht Differenzielles Backup Sicherungsvorgang, der nur die Unterschiede zur letzten vollständigen Sicherung dokumentiert DML Datenmanipulationssprache („data manipulation language“), die die möglichen Operationen in Bezug auf die Datenbasis (wie Einfügen, Modifizieren, Löschen, Abfragen) festlegt DPW „Database Publishing Wizard“ – Tool von Microsoft zum Auslesen des Datenbankschemas und der Dateninhalte auf einer grafischen Oberfläche oder der Kommandozeile Flatfile Datei, die im Klartext vorliegt und mit einem gängigen Texteditor bearbeitet werden kann; in [141] Verbindung mit einem Trennzeichen zur Separierung der Daten in der Datei entsteht eine CSV-Datei Inkrementelles Backup Sicherungsvorgang, der nur die Unterschiede zur letzten inkrementellen Sicherung beziehungsweise, falls es sich um die erste inkrementelle Sicherung handelt, der letzten vollständigen Sicherung dokumentiert LSN Protokollsequenznummer („log sequence number“), welche einen Eintrag im Transaktionsprotokoll von SQL Server eindeutig identifiziert MSDN Grundsätzlich kostenfreie Informationsplattform von Microsoft („Microsoft Developer Network“), auf Datenträger oder im Internet verfügbar; gibt Hilfestellung zu den Entwicklerprodukten von Microsoft Normalformen Die Normalformenlehre umfasst Regeln, die zur Optimierung einer Datenbank (allgemein eines Relationenmodells) dienen, um beispielsweise die Performanz zu erhöhen, Redundanzen und Datenanomalien zu verhindern und die Datenintegrität zu wahren Object-Level-Recovery Wiederherstellung eines einzelnen Objektes (einer Datenbank) aus seiner Vollsicherung Prüfsumme Berechnung eines (eindeutigen) Wertes – in der Regel eine Summe - über eine Zeichenkette, eine Datei oder einen Datenträger zur Gewährleistung der Datenintegrität Recovery Wiederherstellung von Daten, einer Datei oder eines Systems aus einer zuvor angefertigten Sicherung Resultset Ergebnis einer SQL-Abfrage in tabellenartiger Form Rollback Rückabwicklung einer SQL Transaktion; erfolgt im Fehlerfall oder explizit ausgelöst durch den Nutzer, dabei werden alle ausgeführten Aktionen seit Beginn einer Transaktion rückgängig gemacht [142] Rollforward Anwenden von abgeschlossenen Transaktionen aus einer Protokollsicherung auf eine wiederhergestellte Datenbank SMO Bei „Server Management Object“ handelt es sich um eine .NET-Bibliothek von Microsoft zur Interaktion mit SQL Server aus anderen Programmiersprachen heraus Snapshot Abbild eines (Datenbank-) Systems in Form einer Kopie, welche einen lesenden Zugriff auf die konsistenten Daten ermöglicht und dabei im Hintergrund für andere Anwendungen einen unveränderten Zugriff gewährleistet SQL Server-Agent Systemdienst, welcher zeitgesteuert Prozesse in SQL Server ausführt SQL-Injection Ausnutzen einer Sicherheitslücke in einer Anwendung, um durch Manipulation der übergebenen Argumente an die SQL-Anweisung Zugriff auf die Datenbank zu erhalten Stored Procedure In SQL Server gespeicherte Abfolge von SQL-Anweisungen (Prozedur) Transaktion Ein Vorgang, der eine Menge von SQL-Anweisungen umfasst, die in einem „Zug“ abgearbeitet werden sollen TSQL „Transact SQL“ ist die Erweiterung des SQL Standards durch Microsoft und stellt die Sprache dar, in der alle Anweisungen in SQL Server abgearbeitet werden TSQL-Backup Name der in dieser Arbeit zu schaffenden Anwendung UNC-Pfad Standard zur Bezeichnung von (Speicher-) Ressourcen innerhalb eines Netzwerkes, um auf lokale oder entfernte Medien zugreifen zu können Vertrauenswürdige Verbindung Art der Verbindungsherstellung zu SQL Server über ein in Windows integriertes Benutzerkonto mit ausreichender Berechtigung [143] Literaturverzeichnis [Adm08] Administrator Technology GmbH, administrator.de. Netzwerke und Protokolle. Grundlagen. [Online] 2008. [Zitat vom: 21. 09 2009.] http://www3.administrator.de/index.php?content=85305. [Bau06] Bauder, Irene. SQL Server 2005 für Administratoren. München : Carl Hanser Verlag, 2006. [Fae07] Faeskorn-Woyke, Heide, et al. Datenbanksysteme. s.l. : Pearson Studium, 2007. [Fre98] Freeze, Wayne. Die SQL-Referenz. [Übers.] Gerhard Franken. 1. Auflage. Bonn : ITP, 1998. [Hen04] Henderson, Ken. The Guru's Guide to SQL Server Architecture and Internals. sixth printing. s.l. : Addison-Wesley, 2004. [Inf05] Informationstechnik, Bundesamt für Sicherheit in der. IT-Grundschutz-Kataloge. M 4.169 Verwendung geeigneter Archivmedien. [Online] 2005. [Zitat vom: 08. 01 2010.] https://www.bsi.bund.de/cln_183/ContentBSI/grundschutz/kataloge/m/m04/m04169.ht ml. [Inf06] Informationstechnik, Bundesamt für Sicherheit in der. IT-Grundschutz-Kataloge. B 2.5 Datenträgerarchiv. [Online] 2006. [Zitat vom: 08. 01 2010.] https://www.bsi.bund.de/cln_183/ContentBSI/grundschutz/kataloge/baust/b02/b02005. html. [Inf061] Informationstechnik, Bundesamt für Sicherheit in der. IT-Grundschutz-Kataloge. M 6.20 Geeignete Aufbewahrung der Backup-Datenträger. [Online] 2006. [144] [Zitat vom: 08. 01 2010.] https://www.bsi.bund.de/cln_183/ContentBSI/grundschutz/kataloge/m/m06/m06020.ht ml. [Inf08] Informationstechnik, Bundesamt für Sicherheit in der. IT-Grundschutz-Kataloge. B 5.7 Datenbanken. [Online] 2008. [Zitat vom: 08. 01 2010.] https://www.bsi.bund.de/cln_183/ContentBSI/grundschutz/kataloge/baust/b05/b05007. html. [Inf09] Informationstechnik, Bundesamt für Sicherheit in der. IT-Grundschutz-Kataloge. G 4.13 Verlust gespeicherter Daten. [Online] 2009. [Zitat vom: 24. 03 2010.] https://www.bsi.bund.de/cln_165/ContentBSI/grundschutz/kataloge/g/g04/g04013.htm l. [Inf091] Informationstechnik, Bundesamt für Sicherheit in der. IT-Grundschutz-Kataloge. B 1.12 Archivierung. [Online] 2009. [Zitat vom: 24. 03 2010.] https://www.bsi.bund.de/ContentBSI/grundschutz/kataloge/baust/b01/b01012.html. [Kon07] Konopasek, Klemens und Tiemeyer, Ernst. SQL Server 2005 Der schnelle Einstieg. 2., aktualisierte Auflage. s.l. : Addison-Wesley, 2007. [Lei03] Leitenbauer, Günter. Datenbank Modellierung. s.l. : Franzis', 2003. [Mic07] Corporation, Microsoft. SQL Server Hosting Toolkit. Known Issues with Database Publishing Wizard 1.0. [Online] 2007. [Zitat vom: 27. 01 2010.] http://sqlhost.codeplex.com/wikipage?title=DPW%20Known%20Issues. [Mic08] Corporation, Microsoft. SQL Server Development Center. Getting started with SQL Server. [Online] 2008. [Zitat vom: 21. 09 2009.] http://social.msdn.microsoft.com/Forums/en-US/sqlgetstarted/thread/49c25238-3cc644a6-a3cf-63acf4543a11. [145] [Mic081] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Sicherungs- und Wiederherstellungs-APIs für unabhängige Softwareanbieter. [Online] 2008. [Zitat vom: 21. 09 2009.] http://msdn.microsoft.com/de-de/library/ms189096(SQL.90).aspx. [Mic0810] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Grundlegendes zur Funktionsweise der Wiederherstellung von Sicherungen in SQL Server. [Online] 2008. [Zitat vom: 20. 01 2010.] http://msdn.microsoft.com/de-de/library/ms191455%28SQL.90%29.aspx. [Mic0811] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. RESTORE (Transact-SQL). [Online] 2008. [Zitat vom: 20. 01 2010.] http://msdn.microsoft.com/de-de/library/ms186858%28SQL.90%29.aspx. [Mic0812] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Logische Architektur des Transaktionsprotokolls. [Online] 2008. [Zitat vom: 21. 01 2010.] http://msdn.microsoft.com/de-de/library/ms180892%28SQL.90%29.aspx. [Mic0813] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. CHECKSUM (Transact-SQL). [Online] 2008. [Zitat vom: 27. 01 2010.] http://msdn.microsoft.com/de-de/library/ms189788%28SQL.90%29.aspx. [Mic0814] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. xp_cmdshell (Transact-SQL). [Online] 2008. [Zitat vom: 09. 04 2010.] http://msdn.microsoft.com/de-de/library/ms175046%28SQL.90%29.aspx. [Mic082] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Sichern und Wiederherstellen von Datenbanken in SQL Server. [Online] 2008. [Zitat vom: 25. 08 2009.] http://msdn.microsoft.com/de-de/library/ms187048(SQL.90).aspx. [146] [Mic083] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Vollständige Datenbanksicherungen. [Online] 2008. [Zitat vom: 17. 09 2009.] http://msdn.microsoft.com/de-de/library/ms186289%28SQL.90%29.aspx. [Mic084] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. bcp (Dienstprogramm). [Online] 2008. [Zitat vom: 17. 09 2009.] http://msdn.microsoft.com/de-de/library/ms162802%28SQL.90%29.aspx. [Mic085] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Vorgehensweise: Erstellen eines Skripts (SQL Server Management Studio). [Online] 2008. [Zitat vom: 17. 09 2009.] http://msdn.microsoft.com/de-de/library/ms178078%28SQL.90%29.aspx. [Mic086] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Übersicht über die Wiederherstellungsmodelle. [Online] 2008. [Zitat vom: 25. 09 2009.] http://msdn.microsoft.com/de-de/library/ms189275%28SQL.90%29.aspx. [Mic087] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Sicherungen mit dem einfachen Wiederherstellungsmodell. [Online] 2008. [Zitat vom: 25. 09 2009.] http://msdn.microsoft.com/de-de/library/ms191164%28SQL.90%29.aspx. [Mic088] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. Sichern beim vollständigen Wiederherstellungsmodell. [Online] 2008. [Zitat vom: 25. 09 2009.] http://msdn.microsoft.com/de-de/library/ms190217%28SQL.90%29.aspx. [Mic089] Corporation, Microsoft. SQL Server 2005-Onlinedokumentation. BACKUP (Transact-SQL). [Online] 2008. [Zitat vom: 20. 01 2010.] http://msdn.microsoft.com/de-de/library/ms186865%28SQL.90%29.aspx. [147] [Per03] Pernul, Günther und Unland, Rainer. Datenbanken im Unternehmen. 2., korrigierte Auflage. Essen : Oldenbourg Verlag, 2003. [Sch07] Schubert, Prof. Dr.-Ing. Wilfried. Vorlesung Softwaretechnik Grundlagen. Mittweida : Hochschule Mittweida (FH), 2007. [SQL10] SQLServerCentral. xp_cmdshell and bcp problems. [Online] [Zitat vom: 22. 04 2010.] http://www.sqlservercentral.com/Forums/Topic795656-338-1.aspx. [SQL101] SQLServerCentral. Problem with global temporary tables in EXEC statement. [Online] [Zitat vom: 22. 04 2010.] http://www.sqlservercentral.com/Forums/Topic867831-338-1.aspx. [War03] Warner, Daniel. SQL Das Praxishandbuch. Oerlinghausen : Franzis', 2003. [Wik09] Wikipedia. Versionsverwaltung. Hauptaufgaben eines Versionsverwaltungssystems. [Online] 2009. [Zitat vom: 08. 01 2010.] http://de.wikipedia.org/wiki/Versionsverwaltung#Hauptaufgaben_eines_Versionsverw altungssystems. [Wik10] Wikipedia. Generationenprinzip. [Online] 2010. [Zitat vom: 20. 01 2010.] http://de.wikipedia.org/wiki/Generationenprinzip. [Woo07] Woody, Buck. SQL Server 2005 - Das Handbuch für Administratoren. [Übers.] G&U Technische Dokumentation GmbH. s.l. : Addison-Wesley, 2007. [148] Selbständigkeitserklärung Ich erkläre, dass ich die vorliegende Arbeit selbständig und nur unter Verwendung der angegebenen Literatur und Hilfsmittel angefertigt habe. _____________________ _____________________ Ort, Datum Unterschrift [149]