(5-2) Möglichkeiten zum Migrieren einer großen SQL-Tabelle

Einführung


Hallo allerseits! Dies ist mein erster Artikel und ich schreibe ihn im Auftrag eines Junior Development Engineer in C #. Es wird also keine detaillierten Informationen über SQL geben, sondern nur praktische Informationen und Gedanken zur Lösung eines eher nicht offensichtlichen Problems, mit dem ich für dieselben Neulinge wie mich konfrontiert war.

Zunächst werde ich die Formulierung meines Problems als Beispiel beschreiben, in dem es wirklich notwendig ist, einen großen Tisch zu verschieben.

Angenommen, Sie haben einen Webdienst und eine SQL-Datenbank (MS-SQL) mit einer Tabelle mit HTML-Buchstaben, die Ihr Dienst an Benutzer sendet. Briefe werden mehrere Jahre gespeichert und können nicht gelöscht werden, da sie zum Sammeln von Statistiken und Analysen benötigt werden. Jedes Jahr wächst jedoch die Anzahl der Buchstaben, die Datenbank wächst und der Speicherplatz auf dem SQL Server wird kleiner (in unserem Fall war ein weiterer Faktor die Wiederherstellung der Datenbank auf dem Teststandort, da ihre Zeit proportional zunahm), und dies muss getan werden tun. Glücklicherweise gibt es in unserem Fall einen freien Server mit viel freiem Speicherplatz (in Wirklichkeit ist dies möglicherweise nicht der Fall, und dies ist natürlich eine vorübergehende Lösung, die jedoch den Rahmen des Artikels sprengt). Das Problem bestand also darin, einen großen Tisch zu bewegen (und „groß“ zu sagen, ich meine einen wirklich großen Tisch. Alles, was ich bei der Suche nach ähnlichen Lösungen sah, lag im Bereich von 60 bis 100 GB, in unserem Fall wog der Tisch mehr als 300 GB).

Wir werden verschiedene Möglichkeiten zur Lösung dieses Problems in Betracht ziehen, aber nicht alle beziehen sich auf die Übertragung des Server-Server-Typs. Manchmal kann es erforderlich sein, eine Tabelle zwischen Datenbanken auf demselben Server zu übertragen. Außerdem sind einige Methoden rein theoretisch, ich habe sie nicht alle in der Praxis getestet, aber sie sollten wahrscheinlich funktionieren.

Methode -1. Daten


Egal wie offensichtlich es klingt, Sie sollten wissen, welche Daten Sie übertragen werden. In den meisten Fällen werden Daten nicht optimal gespeichert, und es können auch überschüssige Informationen gespeichert werden. In Ihrem speziellen Fall können Sie wahrscheinlich auf die Übertragung aller Daten verzichten.

Erstens kann das Löschen einer Spalte wahrscheinlich hilfreich sein. Dies ist jedoch ein Blockierungsvorgang, und es ist nicht immer möglich, einen Webdienst zu stoppen. Und auf Habré gibt es einen Artikel, in dem erklärt wird, wie es durchgeführt werden kann.

Zweitens vergessen Sie nicht die Normalisierung. Möglicherweise können einige Daten in das Wörterbuch übertragen werden (bei Briefen konnten nicht die Buchstabenkörper, sondern Vorlagen mit den dort eingefügten Daten gespeichert werden), und nur die ID dieser Elemente konnte in einer großen Tabelle gespeichert werden. Dadurch kann viel Platz für Sie frei werden.

Methode 0. SELECT INTO


Witz =) Du kannst dir also nur eine Basis setzen. Wenn es sich jedoch um die geringe Größe der Tabelle handelt (was machen Sie dann hier), können Sie versuchen, die Datenbank mithilfe dieser Anweisung zu übertragen. Wenn Sie eine Testbasis haben, können Sie auch ein Experiment durchführen, um die Gesamtübertragungszeit mit dieser Methode "auf der Stirn" zu bewerten.

Methode 1. Sicherung


Der „kanonischste“ Weg war dies, der zur Lösung meines Problems wurde. Wir machen eine Sicherung der Datenbank, die unsere Tabelle enthält, und stellen sie auf einem anderen Server wieder her und löschen sie von allem Unnötigen. Wenn es möglich ist, den Webdienst zu stoppen, können Sie ihn erneut bereitstellen, indem Sie den Datensatz in der übertragenen Tabelle einrichten und das alte * * löschen (hier kann es höchstwahrscheinlich einen Moment dauern, bis Abfragen mit Verknüpfungen an ihn geschrieben werden müssen, damit Google Google SQL verknüpft). Server). Wenn dies nicht möglich ist, korrigieren wir die ID des letzten Buchstabens (zur Synchronisation), dann müssen wir * alle übertragenen Buchstaben löschen (wir werden weiterhin in die alte Tabelle schreiben).

* Wenn Sie ein separates Gesprächsthema entfernen, scheint es viel schneller zu sein als das Übertragen. Dies ist jedoch nicht der Fall. Im Allgemeinen empfehle ich, es in Teilen zu löschen.

Methode 2: MS-SQL Management Studio


Wenn Sie über dieses Studio verfügen, können Sie versuchen, das integrierte Tool zum Exportieren und Importieren von Daten zu verwenden. Persönlich habe ich beim Stapelüberlauf gelesen, dass dieses Ding an einem 60-Gig-Tisch hing und kein Risiko einging.

Methode 3. Partition


Verbesserte Stirnmethode. Die Idee ist, Daten auf übliche Weise mit einem Timer zwischen den Iterationen zu übertragen. Sie unterteilen alle Zeilen in Portionen (z. B. jeweils 100.000), übertragen die Portion (und können sie sofort löschen, sind sich aber nicht sicher, wie sicher sie ist), schlafen dann ein und so weiter bis zum bitteren Ende. Es ist besser, vom Ende zu übertragen, damit Sie am Ende keine Daten synchronisieren müssen. Die Methode ist offensichtlich sehr langsam, aber auf diese Weise übertragen Sie alles, ohne den Webdienst zu stoppen. Höchstwahrscheinlich ist es bequemer, es nicht mit einem SQL-Skript, sondern mit Hilfe eines ORM zu implementieren.

Zusammenfassung


Das Übertragen einer großen Datenmenge dauert immer eine gewisse Zeit, und Sie sollten darauf vorbereitet sein. Es gibt keine magische Möglichkeit, Ihr Problem sofort zu lösen. In jedem Fall müssen Sie auf Ihren Volumes und Einschränkungen aufbauen. Wenn keine der Methoden für Sie funktioniert, prüfen Sie, ob Sie eine Kombination davon verwenden können.

Am Ende möchte ich 2 wichtige Punkte hinzufügen.

Jeder Prozess zum Übertragen / Löschen von Zeilen in SQL wird im Transaktionsprotokoll protokolliert, damit im Fehlerfall alles zurückgesetzt werden kann (ich habe zuvor angenommen, dass dies nur im Rahmen einer Transaktion ausgeführt wird). Darüber hinaus ist die Größe des Protokolls sogar etwas größer als die Datenmenge. Stellen Sie sicher, dass Sie über den erforderlichen Speicherplatz verfügen, oder deaktivieren Sie die Protokollierung. Dies ist jedoch nicht sicher.

Vor dem Übertragen müssen Sie sicherstellen, dass die Datendatei und die Protokolldatei die richtige Größe haben, da Erweiterungsvorgänge nehmen viel Zeit in Anspruch und konfigurieren sie entsprechend. Auf diese Weise optimieren Sie die Migration.
Vielen Dank an alle, die gelesen haben! Ich freue mich über Kritik, Kommentare und Klarstellungen. Teilen Sie Ihre Methoden und Techniken für die Arbeit mit Big Data mit Oft sind dies sehr wichtige und notwendige Informationen, die nicht so leicht zu finden sind.

Source: https://habr.com/ru/post/de434800/


All Articles