Post´s aus einem SQL Backup zurück spielen

Started by stucki, June 03, 2014, 03:59:42 AM

Previous topic - Next topic

stucki

Moin Leute,

ich hab mal eine Frage zum Thema Wiederherstellung einer Datenbank.

SMF 2.0.7
Mein Hoster verwendet phpMyAdmin
Versionsinformationen: 3.5.1



Folgender Fall:

Ich habe folgende Datenbankstände:20.5,30.5
und den aktuellen Stand

Ich musste nun am 30.5 die Datenbank mit dem Stand vom 20.5 überspielen bzw. ersetzen und dabei sind nun natürlich die Post´s im Zeitram 20.5-30.5 verloren gegangen.

Kann man aus einem Backup von einer SQL DB nur die Post´s wiederherstellen? In welcher Liste innerhalb der SQL BD sind die Post´s von SMF? SMF_Boards?

Wie kann ich diese Daten exportieren und so wieder in die aktuelle DB importieren, dass nichts überschrieben wird, sondern nur ergänzt?

Wäre schönn wenn mir jemand eine exakte Anleitung geben könnte, da ich noch nicht so Fit in dem Thema bin.

Gruß

Stucki

Tekkla

Das ist in Abhängigkeit der zwischen dem 20. und 30.05. erfolgten Änderungen vielleicht sehr komplex aber in jedem Fall zeitaufwendig. Wie viel Erfahrung hast du im Umgang mit Sql Befehlen?

stucki

Eigentlich hab ich keine Erfahrung mit SQL.

Tekkla

Und woher stammt das Backup? Mit welchem Tool wurde das erstellt?

stucki

Hi,

also ich hab in sofern Erfahrung, dass ich selbst via phpMyAdmin v. 3.5.1 ein Backup erstellen kann und wieder selbst einspielen kann. Meine Erfahrungen in Sachen SQL (behaupte ich mal) sind unterhalb der Basics.

Das Thema ist absolut neu für mich.

Tekkla

Eines vorweg: Ich will nicht garantieren, dass es am Ende wirklich so wird, wie du es dir erhoffst. Die Seiteneffekte können sich erst später zeigen. Deswegen probiere das NICHT live, sondern auf einer Arbeitskopie. Und erst wenn du dir ganz sicher bist, dass am Ende in der Arbeitskopie alles läuft wie gewünscht, dann erstellst du von selbiger ein DB Backup und spielst dieses ins Livesystem ein.

Das ist im Groben und Ganzen der Ablauf. Versuche dein Glück.

       
  • Erstelle eine Kopie (Seite und DB) deines Forums lokal oder wo auch immer. Ich nenne das jetzt Arbeitskopie.
  • Spiele in die Arbeitskopie das Backup vom 30. ein.
  • Lösche in der Arbeitskopie (über das Forum) alles (Topics, Posts, Boards etc) was im Livesystem vorhanden ist, damit nur noch das überbleibt, was Dir im Livesystem fehlt.
  • Führe alle Wartungsaufgaben im Admincenter der Arbeitskopie durch und leere ebenfalls über das Admincenter die Protokolle (Logs).
  • Erstelle ein DB Backup deiner Arbeitskopie und entferne in diesem Backup alle Drop und Create Anweisungen einschliesslich des den Befehl beendenden Semikolons.
  • Spiele in die Arbeitskopie das an Punkt 1 erstelle DB Backup des Livesystems ein
  • Spiele das an Punkt 5 erstellte und bearbeitet Backup ein
  • Schau nach, ob das Ergebnis wie gewünscht ist.
Ich halte das für einen Laien für zu kompliziert, und es wird dich einiges an Zeit und Hirnschmalz kosten. Auf der anderen Seite kannst du dabei einiges über die Struktur und den Aufbau von SMF lernen. Viel Erfolg!

stucki

Hey Tekkla,

vielen Dank für deine Hilfe ich werde es testen sobald ich Zeit dafür haben.

Bei dem 5. Punkt welche Auswirkung hat das entfernen von Create und Drop?

Tekkla

Create erstellt Tabellen, Drop entfernt vorhandene Tabellen. Da du weder das eine noch das andere willst, werden diese Befehle gelöscht. Es geht dir ja nur um die Daten, oder nicht?

stucki

Richtig, es geht mir nur um die verlorenen Posts.

Werde mich jetzt mal mit einer Forum Test Installation ran machen. Mal sehen ob es klappt.

stucki

Ich bin jetzt grade an den Punkt:
Quote from: Tekkla on June 03, 2014, 09:41:13 AM
   
  • Spiele in die Arbeitskopie das an Punkt 1 erstelle DB Backup des Livesystems ein
  • Spiele das an Punkt 5 erstellte und bearbeitet Backup ein
  • Schau nach, ob das Ergebnis wie gewünscht ist.

Aber ich versteh jetzt nicht, warum ich jetzt die DB, wo nur noch die fehlen Post enthalten sind mit dem Backup vom Livesystem überspielen soll? Ich würde doch mit dem Backup vom Livesystem alles überschreiben! Oder nicht?

Mit meinem gefährlichen Halbwissen, würde ich jetzt die DB (mit den fehlenden Post) nehmen und in die DB vom Livesystem Backup einspielen ???

stucki

Ähhh, ich nehme alles zurück, wer lesen kann ist klar im Vorteil:)

stucki

Hab jetzt folgendes gemacht.

1. Backup vom Livesystem SQL DB und die Daten auf dem Webspace
2. Beides auf einem zweiten Webspace installiert

- Läuft -

3. Nun habe ich das Backup eingespielt, alle Post, Themen, Kategorien via Admin Menü "Forum" gelöscht die im Livesystem vorhanden sind.
4. Alle Wartungsarbeiten durchgeführt und von der aktuellen SQL DB ein Backup gemacht.
5. In einer Kopie vom erstellen Backup (Punkt 4) alle DROP, CREATE Befehle einschließlich Semikolon gelöscht.

6. Backup vom Livesystem auf den 2. Webspace eingespielt.

7. Nun habe ich versucht das in Punkt 5 erstelle Backup wieder einzuspielen und habe eine Fehlermeldung erhalten Fehler
SQL-Befehl:

-- ========================================================== -- -- Database dump of tables in `db_xxxx_1` -- Juni 07, 2014, 17:56:35 -- -- ========================================================== -- -- Table structure for table `xxxx_2sichat` -- -- -- Dumping data in `FCSForumSMF_2sichat` -- INSERT INTO `xxxx_2sichat` (`id`, `to`, `from`, `msg`, `inactive`, `rd`, `isrd`, `sent`) VALUES (43, 20, 1, 'Hey:)', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00'), (45, 14, 1, 'dsfsdfsdsdfsdsfdsa', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00'), (46, 14, 1, 'du eimer', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00'), (47, 14, 1, 'sadfsadfdsada', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00'), (48, 14, 1, 'asdfsad', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00'), (49, 14, 1, 'asdfas', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00'), (50, 14, 1, 'tach', 0, 0, '0000-00-00 00:00:00', '0000-00-00 00:00:00'), (51, 33[...]

MySQL meldet: Dokumentation

#1062 - Duplicate entry '43' for key 'PRIMARY'


Tekkla kannst Du mir da weiterhelfen?

PS: Die XXXX habe ich eingefügt.

Tekkla

Die Tabelle für SI Chat hat bereits einen Eintrag mit dem Wert 43 für die Spalte id. Das ist einer der Fallstricke von denen ich sprach. Wahrscheinlich begegnet dir das noch in anderen Tabellen. Es kommt dadurch zustande, dass du die DB zurückgesetzt hast, dann Leute wieder Dateien eingetragen haben und du nun die Daten vom 30.5. zurückspielen willst. Die IDs von damals sind halt neu belegt worden. In Abhängigkeit der Datenmenge kommt in solch einem Fall viel Handarbeit auf einen zu.

Wenn du dir das INSERT Statement anschaust, dann siehst du INSERT INTO tabelle (feld1, feld2, feld3...) VALUES (1. Eintrag - Wert Feld 1, 1. Eintrag - Wert Feld 2, 1. Eintrag - Wert Feld 3...), (2. Eintrag - Wert Feld 1, 2. Eintrag - Wert Feld 2, 2. Eintrag - Wert Feld 3...), usw

Welches Feld vom Fehler betroffen ist, das steht in der Fehlermeldung: 'Primary'. Das ist in aller Regel das Feld mit dem Name "id" oder "id_sonstwas". Die Spalte mit dem eindeutigen Primärschlüssel. Deine einzige Chance besteht nun bei solch einem Fehler in der manuellen Nachbearbeitung der Wert für dieses Feld. Schau dazu die jeweilige Tabelle im Livesystem an, welcher der letzte verwendete Wert ist, und nehme den +100 als deinen Wert, mit dem du den beginnst. Mal angenommen der letzte Livewert ist 122, dann ist der neue Wert für die Fehlerhafte 43 was? 149 + 100 = 249. Und damit kannst du dann aller folgenden IDs in den Zeilen nach für nach mit +1 anpassen.

Schwierig wird es dann, wenn du Tabellen mit einer Beziehung zueinander hast. Z.B. ein Board, in dem Topics sind, die wiederum Posts haben. Änderst du da einen Primärschlüssel, dann muss das jeweilig verknüpfte Feld (Fremdschlüssel) in anderen Tabellen angepasst werden. Wenn du beispielsweise in der boards Tabelle den Wert id_board veränderst, dann musst du diesen Wert auch in der Spalte id_board der Tabellen topics und messages ändern. Änderst du id_topic in der Tabelle topics, dann musst du diese ebenfalls in der tabelle messages ändern. In Abhängikeit der Datenmenge ein recht umfangreiches Projekt.

Du kannst das nun mit der Hand oder aber, und da muss man eigentlich etwas technisches Knowhow haben, das Ganze per Sql machen. Es gibt dazu auch ein passendes Topic hier auf der Seite. Die Sektionen I und II beschreiben das Handling. http://www.simplemachines.org/community/index.php?topic=332894.0



Viel Erfolg! :)

Advertisement: