NEWS
MYSQL Profis unter uns?
-
Moin,
vielleicht kann mich unter uns jemand durch die Lösung meiner Frage leiten.
Eine meiner Tabellen war abgeschmiert und meldete einen Fehler. Da ich zu dem Zeitpunkt weder Zeit noch Muse hatte diese zu reparieren, habe ich einfach eine neue angelegt, in die der SQL Adapter fleißig die Daten schreibt.
Datenbank MARIADB auf einem Raspi.
Nun möchte ich die Datenbanken zusammenführen, damit es wieder eine ist, und ich die Daten der letzten 12 Monate auswerten kann.
Wie kann ich das bewerkstelligen?
Danke und einen schönen Tag
-
Wenn beide Tabellen in der gleichen Datenbank sind, dann mit einem
INSERT INTO ... SELECT
Befehl
https://mariadb.com/kb/en/adding-and-changing-data-in-mariadb/#contingent-additions -
@OliverIO sagte in MYSQL Profis unter uns?:
Wenn beide Tabellen in der gleichen Datenbank sind, dann mit einem
INSERT INTO ... SELECT
Befehl
https://mariadb.com/kb/en/adding-and-changing-data-in-mariadb/#contingent-additionsGuten morgen,
und danke für die schnelle Antwort.
Es sind 2 verschiedene Datenbanken
iobrokerdb_1
iobrokerdb_2Alle Tabellen sind also doppelt vorhanden. Die fortlaufenden id´s der neuen Tabelle beginnen wieder bei 1. Die der alten enden irgendwo bei 4000000. Gibt es da Probleme wegen einer Doppelung der Ids?
Ich würde gerne eine iobroker db_3 anlegen, und dann beide Datenbanken in die neue Zusammenführen. Vorallem um Datenverlust zu vermeiden. Backups werden vorher trotzdem erstellt.
-
@AxelF1977 du wirst wahrscheinlich beide Tabellen aus beiden DBs auslesen müssen, die nach ts sortieren und in eine dritte Tabelle mit neuen ids schreiben müssen. Ohne jetzt ins Detail zu gehen, wäre das meine Strategie.
-
@a200 sagte in MYSQL Profis unter uns?:
@AxelF1977 du wirst wahrscheinlich beide Tabellen aus beiden DBs auslesen müssen, die nach ts sortieren und in eine dritte Tabelle mit neuen ids schreiben müssen. Ohne jetzt ins Detail zu gehen, wäre das meine Strategie.
Klingt erstmal logisch. Ich muss nur gucken wie ich das mache. Da die "alte" Datenbank über 6GB groß ist, muss ich das alles über die Konsole machen. Denn über MYSQL komme ich bei der Größe nicht mehr weit...
Hier fehlt mir mir nun nämlich genau die Erfahrung. Da habe ich keinen blassen schimmer wie ich das machen kann. WIe ich die Tabellen über die Konsole sichere weiß ich, das bekomme ich hin, aber wie ich die dann gezielt wieder mit neuen Ids in die neue Datenbank schiebe über die Konsole, das weiß ich nicht.
Zumal ich ja den anderen Tabellen die neuen Ids der Tabelle z.B. ts_numbers auch mitteilen muss, oder?
-
Moin, schau Dir mal HeidiSQL oder Dbeaver an. Erleichtert den Überblick und zumindest bei Dbeaver kannst Du zwischen DB‘s Daten hin und her schieben.
Gruß
Ulli -
- Daten aus einer DB in die zweite DB mit anderen Tabellennamen kopieren.
INSERT INTO DB1.TABLE1 SELECT * FROM DB2.TABLE1;
- schau dir mal das hier an: https://stackoverflow.com/questions/16117306/combine-two-mysql-table-with-same-column-name
-
stehen diese tabellen für sich? oder hat diese noch eine datenrelation zu einer anderen tabelle.
wenn ja, dann musst du mit den ids aufpassen, da ja dann die relation in der anderen datenbank nicht mehr passt.wenn nein, dann kannst du die daten in dern neuen tabelle:
a) wenn die spalte für ids nicht mit dem unique kenner angelegt wurde einfach einfügen.
b) wenn die id spalte mit unique kenner, dann entwender ohne id einfügen so dass die id neu vergeben wird oder neu nummerieren.aber erst einmal mit alternative a probieren.
eine Oberfläche wie heidiSQL ist auf jeden fall hilfreich, da es dir das nachschlagen einiger befehle für die console erspart. -
Ok, dann hab ich viel zu lesen.
Ich hatte auch überlegt alles in eine Influx Datenbank umzuziehen, geht das evtl. einher mit der Migration der Datenbanken? Evtl. kann ich mir so gleich einen Überblick verschaffen.
Ich stelle hier nach der Arbeit Screenshots ein, dann kann ich es besser erklären.
Vielen Dank für die vielen Antworten
-
So sieht die ganze Geschichte aus. Bevor ich es falsch beschreibe, sagt Euch der Screenshot bestimmt mehr.
Zusammengefügt werden sollen die Datenbanken ...maticdb und ..maticdb_02. Wobei ...maticdb_02 in ...maticdb eingefügt werden soll
Wobei wohl nur die Tabellen mit ts_ hinzugefügt werden müssen. Bei allen anderen hat sich nichts geändert. Diese haben, soweit ich es sehe, keine eindeutige id, sondern dieses ts, was wohl ein Zeitstempel ist?
Was dans ganze sicherlich einfacher macht, denke ich
-
ts ist der UNIXTIMESTAMP, ein Wert in Sekunden seit 00:00:00 am 01.01.1970
kannst Du hier online checken: https://www.epochconverter.com
Solange nicht mehrere Werte innerhalb einer Sekunde in die Tabelle eingetragen werden, ist ts eindeutig.
-
@Daddeldu Danke, Unixtime, genau das war es.
Habe jetzt mal eine 3. Datenbank angelegt, die Struktur der alten kopiert und fülle sie jetzt. Scheint zu finktionieren
ALTER TABLE ...maticdb_03.ts_number DISABLE KEYS; INSERT INTO ...maticdb_03.ts_number SELECT * FROM ...maticdb.ts_number; ALTER TABLE ...maticdb_03.ts_number ENABLE KEYS;
Jedenfalls gab es keinen Fehler und zu den ursprünglichen 190308147 Einträgen wurden 102398438 Einträge hinzugefügt.
Danke Euch
-
Nun kommen aber die Fehler...
sobald ich einen Zeitraum auswähle der länger zurück liegt, z.B. November 2019, bekomme ich einen #1040 - Too many connections Fehler und komme erst weider in phpMyAdmin rein, wenn ich die mysql Instanz stoppe.
-
Google findet Treffer ohne Ende zu dem Fehler...
https://stackoverflow.com/questions/730953/how-to-fix-mysql-connect-too-many-connections
oder auch
Hängt wahrscheinlich mit der Checkbox“Parallelanfragen erlauben“ im Adapter zusammen. Standard sind laut der Links oben max 151 Verbindungen gleichzeitig.
-
@Daddeldu sagte in MYSQL Profis unter uns?:
Google findet Treffer ohne Ende zu dem Fehler...
https://stackoverflow.com/questions/730953/how-to-fix-mysql-connect-too-many-connections
oder auch
Hängt wahrscheinlich mit der Checkbox“Parallelanfragen erlauben“ im Adapter zusammen. Standard sind laut der Links oben max 151 Verbindungen gleichzeitig.
Ja, da bin ich dran mich durch Google zu kämpfen. Da gibt es so viele verschiedene Möglichkeiten.
Größtes Problem gerade, ich weiß das Passwort des root user nicht
-
Ich würde auch mal nen select count auf einen bestimmten Zeitraum machen, um zu sehen, wieviele Datensätze da kommen um den dann irgendwie sinnvoll zu begrenzen. Ob das nötig ist weiß ich zwar nicht, aber bei zig 1000 Datensätzen könnte es irgendwann eng werden.
Vom MySQL-Server oder vom Raspi/Tinkerboard? Kannst Du doch notfalls beides zurücksetzen. -
@Daddeldu sagte in MYSQL Profis unter uns?:
Ich würde auch mal nen select count auf einen bestimmten Zeitraum machen, um zu sehen, wieviele Datensätze da kommen um den dann irgendwie sinnvoll zu begrenzen. Ob das nötig ist weiß ich zwar nicht, aber bei zig 1000 Datensätzen könnte es irgendwann eng werden.
Vom MySQL-Server oder vom Raspi/Tinkerboard? Kannst Du doch notfalls beides zurücksetzen.Irgendwie geht gar nichts, alles was ich im Netz finde, bewirkt entweder nichts, oder es fehlen die root Rechte, wo ich das Passwort nicht habe.
Die Tipps, wie ich das root Passwort von MYSQL zurück setze, funktionieren irgendwie auch alle nicht.
Wahrscheinlich stelle ich mich zu dumm an...
-
Erstmal mysql stoppen, siehe 2. hier unter diesem Link:
https://tableplus.com/blog/2018/10/how-to-start-stop-restart-mysql-server.html
danach ohne Anmeldedaten starten und Passwort zurücksetzen:
https://www.patrick-gotthard.de/mysql-root-passwort-zuruecksetzen
und zum Schluß wieder starten und mit neuem root-pow anmelden
-
Ich habe mir mal gerade die Unix Timestamps angesehen, ich denke hier liegt das Problem
1539144518784: Realzeit: 20.07.50743 - 17:06:24
Kann der Fehler daher kommen? Ich habe jetzt mal 20 Werte wild aus der alten DB probiert, von der ersten bis zur letzten Seite, die sind alle Murks
-
Dieser Zeitstempel ist vom 10. Oktober 2018 und beinhaltet Millisekunden.
1539144518784 Wobei die 784 die Millisekunden sind. Laß die 3 Stellen weg und teste nur die 1539144518 dann siehst Du es.
Die alte DB beinhaltet wahrscheinlich Millisekunden im Zeitstempel, die aktuelle nicht. Ob dem so ist und die Werte plausibel sind, kannst nur Du checken. Beide Datenbanken einfach nur mergen dürfte damit sinnlos sein. Für jedes Datum müsste der Zeitstempel beim Kopieren entsprechend manipuliert werden, so daß beide dieselbe Zeitbasis haben.
Wenn Du beim SQL-Statement die einzelnen Spalten anstelle von * angibst, kannst Du bei den VALUES dann z.B. ts/1000 als Zeitstempel einfügen.
Das Prinzip ist im Link unten beschrieben, alternativ in der alten DB erstmal den Zeitstempel mit ts/1000 updaten und dann 1:1 mergen.https://www.w3resource.com/sql/update-statement/update-columns-using-arithmetical-expression.php