SQL Datenbanken zusammenführen

Marvolo schrieb:
Das verstehe ich nicht. Bei mir war es sogar maximal zielführend
ich schaue nur auf Lösungen die beide Funktionen mitbringen.

Wenn du die DB nicht wieder in den letztendlich benötigten Zustand versetzen kannst, ist es doch unerheblich wie einfach oder schnell du anfangs Erfolge hattest. Und für das eigentliche Datenkopieren bietet es sich an, diese Möglichkeit zum Verproben der Aktionen erst einzurichten. Andernfalls wird die Fehlersuche unnötig schwerer.
Wenn du mit Gewißheit sagst, auch eine entschlüsselte DB wird von Whatsapp akzeptiert, ist das eine Lösung.
 
Zuletzt bearbeitet:
Micke schrieb:
Wenn du die DB nicht wieder in den letztendlich benötigten Zustand versetzen kannst, ist es doch unerheblich wie einfach oder schnell du anfangs Erfolge hattest. Und für das eigentliche Datenkopieren bietet es sich an, diese Möglichkeit zum Verproben der Aktionen erst einzurichten. Andernfalls wird die Fehlersuche unnötig schwerer.
Wenn du mit Gewißheit sagst, auch eine entschlüsselte DB wird von Whatsapp akzeptiert, ist das eine Lösung.

In der Vergangenheit wurde eine entschlüsselte DB von WhatsApp in einem "gerooteten" Handy akzeptiert. Ob das jetzt immer noch so ist, konnte ich erstens mangels Root und zweitens mangels fertiger DB noch nie testen.

ABER...

Ich weiß, dass das erneute Verschlüsseln mit den WaEnCrypt-Tools funktioniert, nicht nur theoretisch, sondern auch in der Praxis, denn das hat der User und auch einige andere auf GitHub hier ja beschrieben - sprich, was er gemacht hat, wie er vorgegangen ist und dann letztlich Erfolg hatte und nicht nur er, auch ein anderer User (sogar ein Deutscher, den ich dort angeschrieben hatte in der Hoffnung auf Hilfe, er aber leider nicht geantwortet hat) hat genau diese Schritte befolgt und dann ebenfalls Erfolg gehabt.

Ein richtig großer Schritt für mich wäre jetzt aber erstmal, mein Datenbanken-Problem in den Griff zu bekommen. Wenn am Ende die Datenbank wieder stimmt und alles so ist, wie ich's gern hätte, dann ist das Wiederverschlüsseln bzw. ins WhatsApp spielen (meiner Ansicht nach) das weitaus geringere und vermutlich auch technisch weitaus weniger anspruchsvolle Unterfangen. Zur Not krame ich ein altes Samsung raus, roote das, knall WA drauf und lass es die entschlüsselte Datenbank erkennen, mach ein Google Drive Backup und das kann man dann auf dem S24 Ultra wieder ganz normal runterladen. Et Voila.

Und falls dieser Schritt nicht mehr geht, obwohl es in der Vergangenheit so war, gäbe es noch die Möglichkeit, eine der zahlreichen "inoffiziellen", gemoddeten WA-Versionen, wie etwa GBWhatsApp oder Fouad-WhatsApp zu installieren, DIE erkennen auf alle Fälle entschlüsselte DBs. Damit dann ein offizielles WA-Backup machen (dabei wird es von WA wieder verschlüsselt), offizielle Version wieder installieren und Backup erkennen lassen. Et Voila.

Und falls auch dieser Schritt NICHT gehen sollte, DANN bliebe immer noch der anscheinend erfolgreiche Weg über die WaEnCrypt-Tools, auch wenn das für mich wieder eher problematisches Neuland darstellen würde, da ich keine Coding-Erfahrung habe.

Wie man's dreht und wendet - ich bin mir sicher, das Rückspielen in WA am Ende ist eher das verhältnismäßig kleinste Unterfangen und wird vermutlich viel eher von Erfolg gekrönt sein als das eigentliche Vorhaben, nämlich die Bearbeitung der Datenbank an sich...

Dennoch aber nochmals ein Dankeschön, dass du dich dieser Thematik immerhin mal annimmst, während von den anderen nur rhetorische Fragen nach der Sinnhaftigkeit meines Vorhabens kamen. Vielleicht erscheint das für manche eben als nicht wichtig oder gar sinnlos. Für MICH erscheinen Scripts oder Codes zur Erstellung von automatisierten Chat-Bots oder mit was sonst sich manche Leute hier so den ganzen Tag beschäftigen, auch nicht als wichtig oder sinnvoll. So hat halt jeder seine eigenen Interessen...

Wenn ich das alles durchblicken würde, würde ich's selber machen und mir selber helfen. Freundlicherweise hat @Yuuri da ja schon sehr detaillierte Anweisungen gegeben, wie das in der Theorie lösbar wäre.
Für mich ist das aber, wie wenn man einem Ölgemälde-Künstler detailliert mitteilt, wie man in der Theorie einen neuen Motor in ein Auto einbaut. Ich weiß dann zwar vielleicht die einzelnen Schritte, aber in der Umsetzung bin ich genauso fähig wie der Ölgemälde-Maler...

Der Github-Thread dort ist der Beweis, dass das Ganze machbar & lösbar ist, gleich von mehreren Leuten bewiesen. Nur brauche ich eben fähige und wissende Leute, die das lösen können. Wie schon geschrieben, gerne auch gegen eine Aufwandsentschädigung, falls notwendig.
 
Zuletzt bearbeitet:
Marvolo schrieb:
....während von den anderen nur rhetorische Fragen nach der Sinnhaftigkeit meines Vorhabens kamen. Vielleicht erscheint das für manche eben als nicht wichtig oder gar sinnlos. Für MICH erscheinen Scripts oder Codes zur Erstellung von automatisierten Chat-Bots oder mit was sonst sich manche Leute hier so den ganzen Tag beschäftigen, auch nicht als wichtig oder sinnvoll. So hat halt jeder seine eigenen Interessen...
Es ist wenig schlau sich über die Leute zu beschweren die einem Potentiell helfen sollen. Und trotz der ganzen Textwände dreht es sich am Ende im Kreis. Du hast auf Github Leute gefunden die es geschafft haben, die haben aber wohl keine lust zu helfen.

Der Punkt mit dem Rückspielen der Datenbank ist nicht so unerheblich wie du denkst. Potentielle Helfer haben vielleicht kein Root oder sind gewillt ihre Whattsapp Daten an dubiosen Drittanbieter Apps zu geben. Und ein uralt Handy hat auch nicht jeder liegen. Sofern es keinen einfachen weg des imports gibt ist es auch schwer zu verifizieren ob der Datenbank merge erfolgreich war, das macht das debugging ungemein schwieriger.
 
M-X schrieb:
Es ist wenig schlau sich über die Leute zu beschweren die einem Potentiell helfen sollen.

Diejenigen, die ich mit dieser Aussage meinte, wollten hier von Vorneherein schon erst gar nicht helfen, von daher ist schon alles gut. Diejenigen, die mir dankenswerterweise helfen wollen, sind damit auch nicht gemeint.

M-X schrieb:
Und trotz der ganzen Textwände dreht es sich am Ende im Kreis. Du hast auf Github Leute gefunden die es geschafft haben, die haben aber wohl keine lust zu helfen.

Eher keine Zeit als keine Lust. Hilfe habe ich von dem einen besagten User nämlich durchaus schon sehr viel bekommen, der mein Problem über mehere Posts hinweg analysiert hat und dann zum Schluss kam, dass es fast identisch zu seinem eigenen war. Der auch wichtige Key-Informationen zur potentiellen Lösung des Problems gab. Kann man ja dort im Diskussionsthread alles nachlesen.

M-X schrieb:
Der Punkt mit dem Rückspielen der Datenbank ist nicht so unerheblich wie du denkst. Potentielle Helfer haben vielleicht kein Root oder sind gewillt ihre Whattsapp Daten an dubiosen Drittanbieter Apps zu geben. Und ein uralt Handy hat auch nicht jeder liegen.

Die oben besagten WaEnCrypt-Tools haben ja als eine von vielen verschiedenen Lösungen auch funktioniert (das ist ja mehrfach auf Github dokumentiert), ganz ohne Modded-Versions, Uralt-Handys oder Root. Da sollte also für "jeden" irgendeine präferierte Lösung dabei sein, wenn man's so will.

M-X schrieb:
Sofern es keinen einfachen weg des imports gibt ist es auch schwer zu verifizieren ob der Datenbank merge erfolgreich war, das macht das debugging ungemein schwieriger.

Vor dem finalen Rückspielen kann man sehr wohl die modifizierte Datenbank "simulieren" und schauen, ob alles passt. Etwa, indem man sie hiermit als HTML exportiert und damit den gesamten Chatverlauf inklusive Medien, Sprachnachrichten, etc. als lokale HTML-Page bekommt (habe ich selbst schon so gemacht, auch dieses Script habe ich beim ersten Mal direkt hinbekommen).

Wenn die Simulation stimmt, dann war der Datenbank-Merge bzw. die Modifikation erfolgreich und dann kann kaum noch was im letzten Schritt schiefgehen. Die eigentliche Rückverschlüsselung ist ja auf Github im verlinkten Post vom besagten User detailliert beschrieben. Die muss man ja dann nur noch nachbasteln. DAS würde vermutlich auch ich noch hinkriegen.
 
Zuletzt bearbeitet:
Kleiner Tipp: Man kann unter Win10/11 den WSA (Windows Subsystem für Android) rooten (WSAMagisk googeln), dort WhatsApp installieren und Backup wiederherstellen.
So einfach kann man dann die Keys rausziehen und mit dem Datenbanken herumspielen und experimente testen, ob die merges geklappt haben.
Ich habe mich auch paar Wochen damit beschäftigt, Backups zu mergen, musste aber leider zeitmangels aufgeben.
Also würde ich freuen, falls Ihr da tiefer bohrt und eine Lösung rausfindet :)
 
  • Gefällt mir
Reaktionen: Marvolo
Dein erster Beitrag, obwohl du schon seit Ende 2020 hier angemeldet bist :D
Das freut mich natürlich, dass er direkt zu diesem Thema hier ist und du offensichtlich ein ähnliches bzw. gleiches Problem hast wie ich.

ermek schrieb:
Kleiner Tipp: Man kann unter Win10/11 den WSA (Windows Subsystem für Android) rooten (WSAMagisk googeln), dort WhatsApp installieren und Backup wiederherstellen.

Diesen Schritt habe ich aber noch nicht ganz verstanden. Installiert man sich WhatsApp da auf einen Android-Emulator innerhalb Windows, oder rootet man sich dadurch das Handy?
Letzteres führt ja direkt zum Garantieverlust, oder? Zumindest bei meinem aktuellen S24 Ultra, weshalb ich solche Schritte zurzeit nicht gehen will und deswegen bislang auf den obigen Key Database Extractor zurückgegriffen habe, der aber mangels 32bit-Architektur nicht mehr auf aktuellen 64bit-Smartphones wie meinem Ultra läuft.

Ansonsten gäbe es für Windows ja auch den Bluestacks Android Emulator, bei dem man auch Rootrechte ganz leicht einstellen kann. Problem ist halt, dass dann WhatsApp nur innerhalb dieses Emulators bei eingeschaltetem PC läuft und nicht mehr auf meinem Handy, was mir als Dauerlösung nichts bringt, da ich es ja auf dem Handy täglich brauche.

ermek schrieb:
Ich habe mich auch paar Wochen damit beschäftigt, Backups zu mergen, musste aber leider zeitmangels aufgeben.
Also würde ich freuen, falls Ihr da tiefer bohrt und eine Lösung rausfindet :)

Ja, ich bin da auch gerade (nicht nur in CB) intensiv dran. Irgendwie wird das bestimmt möglich sein. Es wurde ja auch schon bewiesen, dass es möglich ist. Nur nicht aufgeben!! Ist ja gut, dass man schonmal zu zweit ist.
 
Zuletzt bearbeitet:
Marvolo schrieb:
Dein erster Beitrag, obwohl du schon seit Ende 2020 hier angemeldet bist
Bin meistens eher Leser, aber dieses Thema hat meine Wunde wieder geöffnet haha
Marvolo schrieb:
Installiert man sich WhatsApp da auf einen Android-Emulator innerhalb Windows
Genau, WSA ist im Windows eingebaute Android Emulator, wo Du auch ganz normale Android Apps installieren und nutzen kannst.

Durch die möglichkeit diesen Emulator zu rooten (WSAMagisk), ist es sehr einfach, Key auszulesen, da du dann auf interne Dateisystem mit beliebigem File Manager (zB Total Commander) zugreifen kannst.

Vorteil gegenüber anderen Emulatoren: es gibt auch Schnittstelle zwischen WSA und Windows, sodass die Dateien hin und her einfacher kopiert/verschoben werden können; Geschwindigkeit/Leistung ist viel besser; zerstört nicht Netzwerkeinstellungen und installiert keine Bloatware.
Marvolo schrieb:
Problem ist halt, dass dann WhatsApp nur innerhalb dieses Emulators bei eingeschaltetem PC läuft und nicht mehr auf meinem Handy, was mir als Dauerlösung nichts bringt, da ich es ja auf dem Handy täglich brauche.

Bei WhatsApp ist mittlerweile möglich, mehrere Handys für eine Nummer zu nutzen, sodass man Haupthandy nicht zwingend eingeschaltet lassen muss, sollte also für die kurzfristigen Tests keinen Problem darstellen.

Ich habe WSA auch nur zum Keys rauszuholen und zu testen genutzt, andere Zeiten habe ich immer auf meinem Handy wieder als Haiptkonto wiederherstellt.
 
ermek schrieb:
Bei WhatsApp ist mittlerweile möglich, mehrere Handys für eine Nummer zu nutzen,

Ach, das wusste ich noch gar nicht. Dass man mehrere Accounts (mit verschiedenen Nummern) nun alle auf ein Handy mit derselben WA-Version kriegt, wusste ich. Das ist ja bei Instagram schon länger so.

Aber dass man jetzt auch schon mehrere Handy/Accounts mit demselben Account nutzen kann, ist mir neu.
 
Yuuri schrieb:
Ggf. auch ein Tool schreiben, was die DB analysiert und lediglich die relevanten Querys ausspuckt.

Ich habe Chat-GPT gefragt, ob es mir einen Code geben kann, mit dem ich SQL-Datenbanken (speziell WhatsApp) analysieren kann.

Das hier war seine Antwort:

Sure! WhatsApp stores its data in an encrypted SQLite database on your device. To analyze WhatsApp databases, you'll first need to decrypt them, and then you can use SQL queries to extract information from them.
Make sure you have the pyaes module installed (pip install pyaes) to decrypt the WhatsApp database. Replace "whatsapp_backup.db.crypt12" with the path to your WhatsApp database file, and "key" with the path to your WhatsApp encryption key file.

This script will decrypt the WhatsApp database, analyze its structure, and print out information about all the tables and columns in the database along with their data types. If you want to retrieve some sample data from each column, you can uncomment the relevant lines in the script.

Here's an example Python script that decrypts a WhatsApp database and analyzes its structure:


Python:
import sqlite3
import os
import sys

def decrypt_whatsapp_database(db_path, key_path):
    try:
        import pyaes
    except ImportError:
        print("Please install the 'pyaes' module: pip install pyaes")
        sys.exit(1)

    if not os.path.exists(db_path):
        print("WhatsApp database file not found.")
        sys.exit(1)

    if not os.path.exists(key_path):
        print("WhatsApp encryption key file not found.")
        sys.exit(1)

    with open(key_path, 'rb') as f:
        key = f.read()

    with open(db_path, 'rb') as f:
        encrypted_data = f.read()

    aes = pyaes.AESModeOfOperationCBC(key)
    decrypted_data = aes.decrypt(encrypted_data)

    # Write decrypted data to a temporary file
    temp_db_path = "decrypted_whatsapp_database.db"
    with open(temp_db_path, 'wb') as f:
        f.write(decrypted_data)

    return temp_db_path

def analyze_whatsapp_database(decrypted_db_path):
    # Connect to the decrypted SQLite database
    conn = sqlite3.connect(decrypted_db_path)
    cursor = conn.cursor()
  
    # Get a list of all tables in the database
    cursor.execute("SELECT name FROM sqlite_master WHERE type='table';")
    tables = cursor.fetchall()
  
    for table in tables:
        table_name = table[0]
        print("Table:", table_name)
      
        # Get a list of all columns in the table
        cursor.execute(f"PRAGMA table_info({table_name});")
        columns = cursor.fetchall()
      
        for column in columns:
            column_name = column[1]
            data_type = column[2]
            print("  Column:", column_name)
            print("    Data Type:", data_type)
          
            # If you want to retrieve some sample data from the column, you can uncomment the following lines
            # cursor.execute(f"SELECT {column_name} FROM {table_name} LIMIT 5;")
            # sample_data = cursor.fetchall()
            # print("    Sample Data:", sample_data)
  
    # Close the connection
    conn.close()

# Example usage
# Replace "whatsapp_backup.db.crypt12" with the path to your WhatsApp database file
# Replace "key" with the path to your WhatsApp encryption key file
decrypted_db_path = decrypt_whatsapp_database("whatsapp_backup.db.crypt12", "key")
analyze_whatsapp_database(decrypted_db_path)

Hoch lebe die künstliche Intelligenz!
Hilft das in irgendeiner Weise weiter? (Auch an @Micke speziell)

-------------------------------------------------------

Und dann wollte ich es ganz genau wissen und habe Chat-GPT ganz explizit nach einem Weg gefragt, 2 WhatsApp-Datenbanken so miteinander zu verschmelzen, dass nur die neue Information der neueren Datenbank mit der bestehenden Information der älteren verschmolzen wird.

Die Antwort:

Yes, I can guide you through the process. Merging two databases while incorporating only the new information can be achieved by comparing the data between the two databases and selectively adding the new records. Here's a general approach to accomplish this:

  1. Decrypt both WhatsApp databases: You need to decrypt both databases using the method I provided earlier.
  2. Connect to the databases: Use SQLite3 to connect to both decrypted databases.
  3. Identify new records: Compare the records between the two databases and identify the new records. You can do this by comparing unique identifiers like message IDs, timestamps, or any other relevant identifier.
  4. Merge new records into the older database: Once you identify the new records, insert them into the older database.
  5. Close connections and clean up: Close the database connections and delete any temporary files created during the process.
Make sure to replace "old_database.db" with the path to your older WhatsApp database and "new_database.db" with the path to your newer WhatsApp database.

This script compares the timestamps of messages between the two databases and merges only the new messages from the newer database into the older one. You may need to adjust the comparison criteria based on the structure of your databases and the specific data you want to merge.

Here's a basic Python script outline to illustrate this process:

Python:
import sqlite3

def merge_whatsapp_databases(old_db_path, new_db_path):
    # Connect to the old and new databases
    conn_old = sqlite3.connect(old_db_path)
    cursor_old = conn_old.cursor()
    
    conn_new = sqlite3.connect(new_db_path)
    cursor_new = conn_new.cursor()
    
    try:
        # Identify new records from the new database
        cursor_new.execute("SELECT * FROM messages WHERE timestamp > (SELECT MAX(timestamp) FROM messages);")
        new_records = cursor_new.fetchall()
        
        # Merge new records into the old database
        for record in new_records:
            # Insert new record into the old database
            cursor_old.execute("INSERT INTO messages VALUES (?, ?, ?, ?, ?)", record)
        
        # Commit the changes
        conn_old.commit()
        print("New records merged successfully.")
        
    except Exception as e:
        print("Error merging databases:", e)
        conn_old.rollback()
    
    # Close connections
    conn_old.close()
    conn_new.close()

# Example usage
# Replace "old_database.db" with the path to your older WhatsApp database
# Replace "new_database.db" with the path to your newer WhatsApp database
merge_whatsapp_databases("old_database.db", "new_database.db")
 
Zuletzt bearbeitet:
Hast Du einen funktionierenden Code auf Lager, der eine WA-Datenbank analysiert und queries rausspuckt, so wie @Yuuri es vorgeschlagen hat? Es geht ja zuerst mal noch nicht um's eigentliche Mergen, sondern erstmal die Analyse der Datenbank - wie ist sie wie genau aufgebaut...

Mit dem Wissen ist dann vermutlich auch das eigentliche Bearbeiten kein großes Problem mehr.
 
Ich würde wie gesagt den Ansatz fahren, dass du dir ein PowerShell Script o.ä. schreibst, in dem du lediglich deine Statements ausgibst und du diese dann einfach mittels
Code:
$ sqlite3 merge.db < merge-script.sql
importieren kannst, in der Hoffnung, dass du irgendwann an dem Punkt bist, an dem alles klappt und beides korrekt gemerged wurde.

Deine DBs ATTACHen kannst du mit
SQL:
ATTACH DATABASE 'path/to/your/copy/of/big/database.db' AS "big";
ATTACH DATABASE 'path/to/your/copy/of/small/database.db' as "small";
Tabellen auslesen kannst du mit
SQL:
SELECT * FROM small."sqlite_master" WHERE "type" = 'table' ORDER BY "name";
Die musst du dann in ner Schleife iterieren und auf deine DB schreiben. Also quasi was in der sql Spalte steht, wieder ins Script schreiben. Die Trigger sollten dort nicht enthalten sein, das sind separate Queries.

Mit
SQL:
PRAGMA FOREIGN_KEY_CHECKS = 0;
deaktivierst du die Foreign Key Checks, damit du die Daten aus der großen DB einfach rüberziehen kannst.
SQL:
INSERT INTO "merge-tabelle-x"
SELECT * FROM big."alte-tabelle-x";
Weiß nicht ob SQLite das so unterstützt, ggf. musst du die Spalten manuell auflisten... Erledigt ja sowieso das Script.

Die Spalten einer Tabelle kannst du mit
SQL:
PRAGMA big.TABLE_INFO('alte-tabelle-x');
auslesen. Und da auch einfach drüber iterieren und als Quelle für deine Queries verwenden.

FK Checks wieder aktivieren, der große Blob ist durch:
SQL:
PRAGMA FOREIGN_KEY_CHECKS = 1;
Ich weiß jetzt nicht, ob das ggf. die Sequences automatisch erhöht, aber das kannst du mit
SQL:
SELECT * FROM sqlite_sequence;
nachprüfen. Dort sollten dann entsprechende Zahlen stehen, die dem großten Datensatz in jeder Tabelle entsprechen.

Falls nicht, kannst du mit
SQL:
UPDATE sqlite_sequence SET "seq" = 123456789 WHERE "name" = 'tabelle-x';
gegensteuern.

Anschließend gehst du die aktuellen Sequences von oben durch und UPDATEst deine kleine DB um die Offsets zu korrigieren, damit keine Kollisionen entstehen.

Das Update sieht dann so aus:
SQL:
UPDATE small.tabelle-x
SET "pk-spalte-tabelle-x" = wert-aus-sequences-von-tabelle-x + 1 + pk-spalte-tabelle-x;
Heißt auf deutsch, die ID des "neuen" Datensatzes ist
Code:
max ID/Sequence-Wert der großen Tabelle
+ 1
+ fortlaufende ID der aktuellen Tabelle
Das dann für jede Tabelle, jeden PK. Wenn die Foreign Key Constraints gesetzt sind und FK Checks aktiviert (sollte sein, siehe oben), sollte nun alles konsistent bleiben.

Wenn alles gesetzt ist, kannst du wieder mit
SQL:
INSERT INTO "merge-tabelle-x"
SELECT * FROM small."alte-tabelle-x";
die Daten aus der kleinen DB in die Merge DB migrieren.

Hier ist jetzt die Frage das Wie. Theoretisch kannst du die FK Checks deaktivieren, da sie zumindest in der alten DB konsistent sein sollten. Theoretisch kann beim Übertragen was schief gehen, deshalb sollten sie hier auch aktiviert sein. Mit aktivierten Checks, musst du aber die Daten so übernehmen, dass FK-Checks nicht fehlschlagen.

Heißt, wenn du eine Messages-Tabelle hast und die sich auf die User-Tabelle referenziert, musst du ergo erst die User-Tabelle übernehmen, da ja sonst die Foreign Keys aus der Message-Tabelle fehlschlagen. Im Script würde man sich fix nen Baum mit Dependencies hochziehen und die Abhängigkeiten auflösen... Theoretisch kann sich die User-Tabelle ja auch noch auf weitere Tabellen referenzieren. Bspw. könnte der Status eines jeden Users irgendwo getrackt sein, d.h. du hättest ne Abhängigkeit von
Code:
Messages -> Users -> UserStates
Die richtige Reihenfolge der Übernahme wäre dann statt v.l.n.r eben v.r.n.l.

Der Einfachheit halber könntest du stattdessen die FK-Checks deaktivieren und einfach ein
SQL:
PRAGMA FOREIGN_KEY_CHECKS = 0;

INSERT INTO "merge-tabelle-x"
SELECT * FROM small."alte-tabelle-x";

PRAGMA_FOREIGN_KEY_CHECKS = 1;
absetzen. Das umgeht zwar das Problem mit den Dependencies, ruft aber eben ggf. genannte Konsistenzprobleme in der Merge DB hervor.

Zum Schluss musst du noch die Trigger in der Merge DB setzen. Auslesen kannst du die mit
SQL:
SELECT * FROM small.sqlite_master WHERE type = 'trigger';
Ich hab hier nirgends welche gesetzt, aber ggf. kannst du einfach wieder die sql Spalte nehmen und diese 1:1 auf die Merge DB absetzen.

So viel zur Theorie...
 
  • Gefällt mir
Reaktionen: Marvolo
@Yuuri

Wieder einmal herzlichen Dank für deine ausführliche Mühe.
Auch wenn ich leider wieder nur wie die Kuh vor'm Berg stehe und in der Praxis nicht wirklich was mit anfangen kann.

Am liebsten würde ich einfach mal meine real-existierende msgstore.db.crypt14 Datei hier beifügen, damit du/ihr sie euch mal anschauen könnt - aber die würde halt auch sämtliche (privaten) Nachrichten enthalten, was dann natürlich wieder eher suboptimal wäre. Und die Nachrichten weglassen hätte auch keinen Sinn, denn am Ende geht's ja eigentlich grade genau um die... Also das Hinzufügen / Mergen von verschiedenen Chat-Ständen.

Oh jee... Wie fang ich da als absoluter Laie nun am besten an?!
Eventuell versuche ich mal damit anzufangen, die DB zu analysieren / auszulesen, damit man überhaupt erstmal weiß, was da alles wie genau zusammenhängt.

Ich stecke die DB-Datei also in einen leeren Ordner, navigiere mit CMD dort hin und gebe dann das:

Yuuri schrieb:
Tabellen auslesen kannst du mit
SQL:
SELECT * FROM small."sqlite_master" WHERE "type" = 'table' ORDER BY "name";

dort ein? Ist das dann quasi eine Komplettanalyse der vorliegenden Datenbank? Oder wie erreicht man das?

Ich krieg das alleine höchstens mit Schritt-für-Schritt-Anleitung hin. Also quasi einfach ein simples Befolgen von Schritten ohne Verständnis dahinter wieso und weshalb. :l
 
Also wenn du von SQL gar keine Ahnung hast, wäre eine alternative Idee, dass du die Daten nach CSV exportierst und dann mit Excel zusammenführst und bereinigst. Zum Schluss dann wieder die CSV Dateien in SQLite importieren.

Dieser Ansatz ist zwar wesentlich mehr Aufwand, als es direkt in SQL zu machen, aber gleichzeitig vielleicht etwas einfacher/anschaulicher.
 
  • Gefällt mir
Reaktionen: Marvolo
cx01 schrieb:
Also wenn du von SQL gar keine Ahnung hast, wäre eine alternative Idee, dass du die Daten nach CSV exportierst und dann mit Excel zusammenführst und bereinigst. Zum Schluss dann wieder die CSV Dateien in SQLite importieren.

Danke für die Anregung! Im XDA-Thread zum Thema Datenbanken-Mergen bin ich allerdings irgendwo mal auf einen Post gestoßen, der dringend davon abrät, das mit CSV zu machen. Angeblich soll WhatsApp das dann am Ende nicht mehr akzeptieren, sobald das mal in CSV (und zurück) gewandelt wurde.

Inwieweit das jetzt technisch so ist oder nicht - keine Ahnung. Ich habe nur diese Warnung gelesen.
 
vom Konzept her sieht whatsapp-database-merger ganz gescheit aus, da es die Aktualisierung der PKs berücksichtigt. Allerdings ist das verwendete Schema veraltet. Ich plane das morgen anzupassen, hatte aber bislang noch kein Kotlin, mit dem das Tool geschrieben wurde, in den Händen.

edit: Hab whatsapp-database-merger heute nicht mal eben builden können. Leider wollen Cradle, Java und die buildsettings nicht ohne Zuarbeit.

Yuuri schrieb:
SQL:
PRAGMA FOREIGN_KEY_CHECKS = 0;
Muss man leider nicht, da Whatsapp nach dem was ich sehe keine FK constraints verwendet.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Marvolo
Micke schrieb:
vom Konzept her sieht whatsapp-database-merger ganz gescheit aus, da es die Aktualisierung der PKs berücksichtigt. Allerdings ist das verwendete Schema veraltet.

Inwieweit haben sich die Schemata in der aktuellen WA-Version denn verändert im Vergleich zum Zeitpunkt dieses Mergers?

Und wer weiß, wie schnell WA künftig die Schemata wieder verändert. Bis ich irgendwann so weit bin, mich in SQL und dem allen reingelernt zu haben, gibt's vermutlich schon wieder 10 neue WA-Updates und der Merger wird dann schon wieder veraltet sein bezüglich Schemata :(
 
Marvolo schrieb:
Inwieweit haben sich die Schemata in der aktuellen WA-Version denn verändert im Vergleich zum Zeitpunkt dieses Mergers?
z.B. Tabellennamen, Details siehe hier Schema des Tools

Marvolo schrieb:
Gäbe es eine simple Möglichkeit, einfach die JID-Tabelle und die Chat-Tabelle von der korrekten Datenbank in die korrupte einzufügen bzw. dort zu ersetzen?
Im folgenden Beispiel wird die Spalte hidden in Tabelle chat mit den Werten der gleichen Spalte der DB angehangeneDB überschrieben
Code:
UPDATE chat
SET hidden = a.hidden
FROM angehangeneDB.chat a
WHERE chat._id = a._id;
 
Micke schrieb:
Im folgenden Beispiel wird die Spalte hidden in Tabelle chat mit den Werten der gleichen Spalte der DB angehangeneDB überschrieben
Code:
UPDATE chat
SET hidden = a.hidden
FROM angehangeneDB.chat a
WHERE chat._id = a._id;

Und so eine Änderung kann ich vollends ohne vorherige Deaktivierung von Triggern vornehmen? Eigentlich warnte mich der Github-User davor, dass man vorher alle Trigger vorübergehend deaktivieren müsse, da sonst irgendeine Änderung ohne zu bemerken an einer anderen Stelle in der Datenbank aufgrund von Triggern irgendwas verändert.

Wenn man Glück hat, ist so eine Veränderung dann nicht wirklich relevant bzw. hat keine Auswirkungen. Wenn man Pech hat, dann aber schon.
 
Wenn dir die Daten so extreme wichtig sind, dann wende dich an professionelle Leute. Ich würde es für 300+ Euro machen.
 
  • Gefällt mir
Reaktionen: Micke
Zurück
Oben