# [MySQL] Tabelle ersetzen im laufenden Betrieb



## Shuro (28. Juli 2008)

Hallo,

Ich habe da ein kleines Problem, denn ich soll im laufenden Datenbank-Betrieb (am besten ohne Ausfallzeit) eine Tabelle, nennen wir sie 'test', austauschen durch eine identische Tabelle mit anderen Datensätzen, nennen wir diese 'test_neu'.

Diese Tabellen ('test' und 'test_neu') enthalten in etwa 450.000 Datensätze.

An sich ist das ja kein Problem, wären da nicht 2 Harken:

Der Datenbank-Typ ist InnoDB
In anderen Tabellen ist die Tabelle 'test' als foreign key angegeben

Zuerst hatte ich an einfaches Tabellen-Renamen gedacht, jedoch funktioniert das nicht wirklich, da in denn anderen Tabellen weiterhin die alte Tabelle (die nun 'test_old' heißt) als foreign key angegeben ist.

Über Konsole (via mv oder cp) geht es auch nicht da es InnoDB ist.

Darum würde ich euch gern um Hilfe und um konkrete Ratschläge bitten.

Danke im Voraus,
Shuro


----------



## ripkens (2. August 2008)

Erstelle erst die neue Tabelle, nennen wir sie "Test_Neu", fülle Sie mit den Daten die Du brauchts.

Dann eine Transaktion starten
Tabelle Test leeren mit TRUNCATE TABLE Test;
Alle Daten aus Tabelle_Neu mit einer INSERT INTO Test_Neu SELECT * FROM Test; Abfrage nach Test kopieren
Transaktion committen

Wenn Du keine Transaktionen machen willst, mach das TRUNCATE und das INSERT SELECT in einer Anfrage oder mache ein LOCK TABLES vorher.


----------



## Shuro (4. August 2008)

ripkens hat gesagt.:


> Erstelle erst die neue Tabelle, nennen wir sie "Test_Neu", fülle Sie mit den Daten die Du brauchts.



So hab ich es auch machen wollen.



ripkens hat gesagt.:


> Dann eine Transaktion starten
> Tabelle Test leeren mit TRUNCATE TABLE Test;
> Alle Daten aus Tabelle_Neu mit einer INSERT INTO Test_Neu SELECT * FROM Test; Abfrage nach Test kopieren
> Transaktion committen



^^ Naja, das SQL am ende ist ein wenig verdreht. INSERT INTO Test SELECT * FROM Test_Neu; meinst du wohl.

Naja und bei 1 - 3 Mio Datensätzen entsteht dadurch ne menge Traffic. :-/ Sonnst hätte ich es so schon gemacht
Edit: Auserdem sollten die 1-3 Mio. Datensätze im laufenden Betrieb getauscht werden, d.h. es sollen keine Update-Downs entstehen.


----------



## Dunas (5. August 2008)

Shuro hat gesagt.:


> ^^ Naja, das SQL am ende ist ein wenig verdreht. INSERT INTO Test SELECT * FROM Test_Neu; meinst du wohl.



Nein das war richtig.
Du willst doch die Datensätze aus Test in deine neue Tabelle bekommen.
Also INSERT INTO Test_Neu SELECT * FROM Test


----------



## Shuro (5. August 2008)

Dunas hat gesagt.:


> Nein das war richtig.
> Du willst doch die Datensätze aus Test in deine neue Tabelle bekommen.
> Also INSERT INTO Test_Neu SELECT * FROM Test



Ich weise drauf hin das er erst 'TRUNCATE TABLE Test;' macht und dann Daten aus 'Test' beziehen will.


----------

