SQL Datenbanken zusammenführen

Kenne mich mit DB grundsätzlich aus.
 
  • Gefällt mir
Reaktionen: Marvolo
M-X schrieb:

Ich denke, ich werde mich dort mal umschauen. Zwar haben hier einige sicherlich sehr wertvolle Anregungen und Inputs gegeben, wie das alles in der Theorie machbar wäre, aber wie schon öfters gesagt: ich hatte mit Coding / Programmiersprache(n) und Scripts noch keine einzige Berührung bisher. Ich weiß noch nicht mal, wo ich eure ganzen hier vorgeschlagenen Queries eingeben muss, in CMD? Oder sonst irgendeinem Programm?

Da WhatsApp in erschreckender Regelmäßigkeit immer mal wieder Updates und damit verbunden auch wieder neue Funktionen etc. rausbringt - es steht jetzt gerade erst wieder etwas größeres an - rennt hier in gewisser Weise auch etwas die Zeit davon. Zwar gibt sich @Micke ja gerade dankenswerterweise große Mühe, dieses Merger-Tool von Github dem aktuellen WA anzupassen, aber wenn WA seine Struktur wechselt wie andere ihre Unterhosen, dann fürchte ich, wird's nicht lange dauern, bis die Bemühungen bzw. Ergebnisse von Micke direkt wieder veraltet sein werden und man das Tool erneut wieder auf die aktuellen Schemata anpassen müsste oder aber in die Tonne kloppen könnte.

Bis ich soweit bin, mich hier nebenberuflich und freizeitmäßig in totalem Selbststudium so tief in Informatik und Datenbanken eingelesen zu haben, dass ich auch verstehe, was wie wo gemacht werden muss, haben wir schon wieder mindestens 20 neue WA-Versionen mit vermutlich wieder ganz anderem Layout und Aufbau.

Ohne eine wirklich idiotensichere Schritt-für-Schritt-Anleitung (und das würde schon damit losgehen, wo ich den Code wie genau eingeben müsste), bin ich da glaube ich eher aufgeschmissen und selbst DANN befürchte ich, könnte noch sehr viel schiefgehen, weil ich einfach auch gar nicht wüsste, was ich da jetzt genau tue und weshalb. Verstehen würde ich es gerne, neugierig bin ich da schon, aber ich bezweifle, dass ich das jetzt alles innerhalb von ner Woche gelernt bringe.

Mit jedem neuen Tag wächst zudem ja auch wieder meine eigene WA-Chatdatenbank, da ich die App ja täglich nutze und somit dann auch wieder die Menge an Daten, die man bei einem dann immer weiter in der Vergangenheit liegenden Chatstand, den es zu mergen gilt (Januar-März), verarbeiten müsste.

Ich habe in der Theorie ein ungefähres Verständnis dafür, was bei meinen Datenbanken das Problem ist und wüsste in der Theorie glaub auch, wie es zu lösen wäre, nur geht das ohne Automatisierung per Hand nicht. Das ist, als würde man mit einem Buttermesser versuchen, eine dicke Eiche zu fällen.
 
Zuletzt bearbeitet:
Update:

Die WA-Datenbanken wurden mithilfe eines auf SQLITE3 basierenden Scripts innerhalb der Linux-basierten Handyanwendung TERMUX alle vollständig vereint.

Da ich verschiedene Datenbanken hatte, die sich alle zu großen Teilen inhaltlich überschnitten haben, ich von allen aber jeweils immer nur einen ganz bestimmten Teil bzw. Range brauchte, mussten die zu vereinenden Teile aus den einzelnen Gesamtdatenbanken erst mithilfe eines weiteren Scripts "herausgeschnitten" werden (basierend auf Message_ID), sodass man sie jeweils ans Ende der jeweils vorhergehenden anfügen konnte nach dem Muster:

msgstore1.db +
msgstore1.db + msgstore2.db +
msgstore1.db + msgstore2.db + msgstore3.db +
msgstore1.db + msgstore2.db + msgstore3.db + msgstore4.db

Das Endprodukt war eine msgstore.db-Datenbank, die alle einzelnen Teile vereint hatte (was ja das Ziel war).
Die Rückführung in WhatsApp gestaltete sich allerdings etwas schwierig. Wer ein gerootetes Handy hat (wie ich - habe extra ein altes Samsung S6 Edge Plus rausgekramt und gerootet), der hat dank Root Zugriff auf das Root-Verzeichnis, wo WhatsApp seine Datenbank für die Benutzung unverschlüsselt speichert:

ROOT /data/data/com.whatsapp/databases

Normalerweise klappt es, dass man nun die vereinte Datenbank dort einfach reinkopiert und die vorhandene ersetzt/überschreibt, danach WA öffnet und et voila, die Änderungen in den Chats sind dann da.

Bei mir gestaltete sich das aufgrund der Tatsache, dass beim S6 Edge Plus WhatsApp als sog. System-App vorinstalliert war, die man nicht deinstallieren kann, etwas schwieriger, denn das Verhalten war da aus irgendwelchen Gründen anders als bei frei installierbaren WhatsApp-Versionen.

Zwar klappte es mithilfe eines weiteren Scripts, die Berechtigungen der neuen msgstore.db im Rootverzeichnis so anzugleichen, dass sie mit den üblichen Dateien in diesem Verzeichnis übereinstimmen und dann akzeptiert auch mein WhatsApp die fremde Datei - allerdings klappte dieses Vorgehen nur, wenn Änderungen innerhalb derselben Datenbank vorgenommen wurde (z.B. 2 verschiedene Chats in einen zusammenschmelzen).

Da ich aber verschiedene Datenbanken (aus verschiedenen Zeitpunkten) miteinander verschmolzen habe, klappte es trotz Setzen der Berechtigungen auf diese Weise nicht.

Ich musste mir also eines anderen Tricks behelfen und der ging so:

Ich musste WhatsApp dazu bekommen, dass es denkt, die nun neue, vereinte Datenbank sei ein von ihm selbst erzeugtes Backup, das es dann auch wiederherstellen kann. WhatsApp erzeugt Chatbackups (entweder automatisch oder manuell, indem man in den Einstellungen auf "Backup" drückt) und speichert den Chatstand der aktuellen Datenbank als sog. msgstore.db.crypt14 oder crypt15-Datei im Benutzerordner (nicht ROOT) unter

/sdcard/WhatsApp/databases

Ich musste nun also die vereinte Datenbank, die ja unverschlüsselt vorlag, wieder rückverschlüsseln in eine crypt14 bzw. crypt15-Datei, sodass WA denkt, es sei ein eigenes von ihm angelegtes Backup, das man dann beim neuen Einloggen wiederherstellen kann.

Dafür musste ich mir eine bestehende Backup-Datei "msgstore.db.crypt15" nehmen und deren Header-Informationen auslesen, sodass ich diese Header-Informationen nutzen konnte, um die vereinte, unverschlüsselte Datenbank zu verschlüsseln.

Die Headerinformationen sehen z.B. so aus:

←[38;20mINFO - wadecrypt.py:222 : Header information in your crypt15 file:←[0m
←[38;20mINFO - wadecrypt.py:223 : IV: a902fb72341e7c7201f3dd2866a6a01e←[0m
←[38;20mINFO - wadecrypt.py:231 : Key type: 1←[0m
←[38;20mINFO - wadecrypt.py:232 : WhatsApp version: 2.24.3.81←[0m
←[38;20mINFO - wadecrypt.py:234 : The last two numbers of the user's Jid: 73←[0m
←[38;20mINFO - wadecrypt.py:235 : Backup version: 1←[0m
←[38;20mINFO - wadecrypt.py:238 : Features: [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 39]←[0m
←[38;20mINFO - wadecrypt.py:239 : Max feature number: 39←[0m

Diese konnte ich also in die vereinte Datenbank rüberkopieren und dadurch in eine neue msgstore.db.crypt15-Backupdatei verschlüsseln, diese dann in den Backupordner in WA laden und WA sie finden und wiederherstellen lassen.

Damit sind die Chatstände wieder vereint. So, als wäre es nie anders gewesen.
 
  • Gefällt mir
Reaktionen: ermek, nonick65, NJay und 2 andere
Oha wow cool, freut mich sehr, dass Du es geschafft hast.
Hast Du Dein Script für SQLITE3 zum aufschneiden der Chats?
Würde mich freuen, wenn Du die alle Tools/Scripts, die Du verwendet hast, kurz auflistest 😍😍
 
  • Gefällt mir
Reaktionen: Marvolo
ermek schrieb:
Hast Du Dein Script für SQLITE3 zum aufschneiden der Chats?
Würde mich freuen, wenn Du die alle Tools/Scripts, die Du verwendet hast, kurz auflistest 😍😍

Also ganz am Ziel bin ich noch nicht. Zwar vereint das Script nun alle einzelnen DBs miteinander, aber es gibt noch hie und da ein paar kleinere Fehler in der vereinten DB am Ende, denen ich noch auf den Grund gehen muss. Größtenteils sind das aber Fehler, die nicht durch das Script selber entstehen, sondern weil teilweise die einzelnen zu vereinenden Datenbanken fehlerhaft sind. Leider habe ich einige DBs, die größtenteils korrupt sind und da muss ich vor dem Merge Vieles reparieren.

Das Schneide-Script, mit dem ich die einzelnen Sektionen aus der WhatsApp-Datenbank herausgeschnitten habe, ist z.B. das hier:

Das schneidet in der Tabelle "Message" die dort gespeicherten Chat-Nachrichten nach jeweiliger Message_ID.
Sprich: ich möchte nur Nachrichten behalten, die von Message_ID 280571 bis 280795 gehen, dann sähe das Schneide-Script so aus:

Bash:
##Create temp databases

cp "/storage/emulated/0/msgstore.db" "/storage/emulated/0/msgstore.output.db"

dir="/storage/emulated/0/msgstore.output.db"

sqlite3 $dir "delete from message where _id < 280571 or _id > 280795;"

Aufgrund der in der WA-Datenbank gesetzten Triggers werden dadurch auch in allen restlichen Tabellen nur jene Inhalte behalten, die exakt nur mit dieser ausgeschnittenen Range an Nachrichten zu tun haben. Also auch gesendete Medien (bzw deren Verweise in der Datenbank), zitierte Nachrichten in der Tabelle "message_quoted", etc.

Einzig die Tabelle media_refs ist dadurch nicht betroffen - dort muss man die jeweiligen Verweise manuell so rauslöschen, dass am Ende nur jene der gewünschten Range übrig bleiben. Von einigen Tabellen habe ich zudem auch noch nicht richtig verstanden, was genau sie machen. Diese Media_Refs-Tabelle z.B. scheint nur weitergeleitete Nachrichten aufzulisten.

Der letzte große Knackpunkt, den ich noch lösen muss, ist, dass nach dem Merge die Chat-Suchfunktion nur global funktioniert - das heißt, wenn ich von der Chatliste aus Suche. NICHT aber, sobald ich innerhalb eines bestimmten Chats suche. Da funktioniert die Suchfunktion nur für die ehemals nicht-gemergten Chat-Teile.

Der Übeltäter liegt in der Tabelle "ftsv2_message_content", die eine Index-Tabelle zur Text_data-Spalte innerhalb der Message-Tabelle ist, die die Nachrichten auflistet.
Beim Merge wird diese "ftsv2_message_content"-Tabelle nicht exakt kopiert.

Falls hier jemand Tipps und/oder Lösungen hat, wäre ich dankbar. Ansonsten funktioniert bis auf diese In-Chat-Suchfunktion aber alles soweit ich sehen kann.
 
  • Gefällt mir
Reaktionen: NJay
Zurück
Oben