1145 Stimmen

Wie kann ich eine MySQL-Datenbank schnell umbenennen (Schemanamen ändern)?

Das MySQL-Handbuch unter MySQL deckt dies ab.

Normalerweise lösche ich die Datenbank und importiere sie unter einem neuen Namen erneut. Bei sehr großen Datenbanken ist das keine Option. Anscheinend RENAME {DATABASE | SCHEMA} db_name TO new_db_name; macht schlechte Dinge, existiert nur in einer Handvoll Versionen und ist insgesamt eine schlechte Idee .

Dies muss funktionieren mit InnoDB die Dinge ganz anders speichert als MyISAM .

5 Stimmen

7 Stimmen

Diese Anweisung RENAME DATABASE Syntax wurde in MySQL 5.1.7 hinzugefügt, wurde aber als gefährlich eingestuft und in MySQL 5.1.23 entfernt.

18 Stimmen

Hoffentlich wird MySQL eine neue, funktionierende RENAME DATABASE Anweisung, die keine Gefahren birgt, da es derzeit keine einfache Möglichkeit gibt, diese Aufgabe zu erledigen. Es gibt keinen offensichtlichen Grund, warum es in der Vergangenheit gefährlich war. Dokumentation Sie sollten also in der Lage sein, Ersatz zu beschaffen. Wenigstens haben die Leute auf ihrer Website Fehler in den Funktionsanforderungen angegeben. Zum Beispiel, bugs.mysql.com/fehler.php?id=58593 y bugs.mysql.com/fehler.php?id=1698 .

1010voto

Thorsten Punkte 2216

Für InnoDB Die folgende Vorgehensweise scheint zu funktionieren: Erstellen Sie eine neue leere Datenbank, und benennen Sie dann die einzelnen Tabellen nacheinander in die neue Datenbank um:

RENAME TABLE old_db.table TO new_db.table;

Danach müssen Sie die Berechtigungen anpassen.

Für die Skripterstellung in einer Shell können Sie eine der folgenden Möglichkeiten verwenden:

mysql -u username -ppassword old_db -sNe 'show tables' | while read table; \ 
    do mysql -u username -ppassword -sNe "rename table old_db.$table to new_db.$table"; done

OR

for table in `mysql -u root -ppassword -s -N -e "use old_db;show tables from old_db;"`; do mysql -u root -ppassword -s -N -e "use old_db;rename table old_db.$table to new_db.$table;"; done;

Anmerkungen:

  • Es gibt kein Leerzeichen zwischen der Option -p und das Passwort. Wenn Ihre Datenbank kein Passwort hat, entfernen Sie das Feld -u username -ppassword Teil.

  • Wenn eine Tabelle einen Trigger hat, kann sie nicht mit der obigen Methode in eine andere Datenbank verschoben werden (dies führt zu Trigger in wrong schema Fehler). Wenn dies der Fall ist, klonen Sie eine Datenbank auf herkömmliche Weise und löschen Sie die alte Datenbank:

    mysqldump old_db | mysql new_db

  • Wenn Sie gespeicherte Prozeduren haben, können Sie diese anschließend kopieren:

    mysqldump -R old_db | mysql new_db

503voto

hendrasaputra Punkte 1470

Verwenden Sie diese wenigen einfachen Befehle:

mysqldump -u username -p -v olddatabase > olddbdump.sql
mysqladmin -u username -p create newdatabase
mysql -u username -p newdatabase < olddbdump.sql

Zur Verringerung der E/A können Sie, wie von @Pablo Marin-Garcia vorgeschlagen, auch Folgendes verwenden:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase

245voto

raphie Punkte 3229

Ich denke, die Lösung ist einfacher und wurde von einigen Entwicklern vorgeschlagen. phpMyAdmin hat eine Funktion dafür.

Wählen Sie in phpMyAdmin die Datenbank aus, die Sie auswählen möchten. In den Registerkarten gibt es eine mit dem Namen Operationen, gehen Sie zum Abschnitt Umbenennen. Das war's schon.

Es wird, wie von vielen vorgeschlagen, eine neue Datenbank mit dem neuen Namen erstellt, alle Tabellen der alten Datenbank in die neue Datenbank kopiert und die alte Datenbank gelöscht.

Enter image description here

UPDATE 2022-09-22: Mit MySQL 8.0+ wurde eine einfachere Lösung hinzugefügt:

Nicht sicher, seit wann er hinzugefügt wurde RENAME TO Schlüsselwörter, aber es ist sicher einfacher. Allerdings würde ich vor dem Ausprobieren eine Sicherungskopie der Tabelle erstellen, vor allem wenn Sie eine sehr große Tabelle haben. Wie auch immer, es kann wie folgt implementiert werden:

ALTER TABLE `schema_name`.`table_name` 
RENAME TO  `schema_name`.`new_table_name` ;

Ich habe ihn der Einfachheit halber in zwei Zeilen geschrieben, aber er kann auch in einer einzigen Zeile stehen, wie folgt:

ALTER TABLE `schema_name`.`table_name` RENAME TO `schema_name`.`new_table_name` ;

122voto

ErichBSchulz Punkte 13834

Sie können SQL verwenden, um ein SQL-Skript zu erstellen, das jede Tabelle in Ihrer Quelldatenbank in die Zieldatenbank überträgt.

Sie müssen die Zieldatenbank erstellen, bevor Sie das aus dem Befehl generierte Skript ausführen.

Sie können eines der beiden Skripte verwenden (ich hatte ursprünglich ersteres vorgeschlagen, aber jemand hat meine Antwort dahingehend "verbessert", dass ich nun GROUP_CONCAT . Sie haben die Wahl, aber ich bevorzuge das Original):

SELECT CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name, '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

ou

SELECT GROUP_CONCAT('RENAME TABLE $1.', table_name, ' TO $2.', table_name SEPARATOR '; ')
FROM information_schema.TABLES 
WHERE table_schema='$1';

($1 und $2 sind Quelle bzw. Ziel)

Dadurch wird ein SQL-Befehl generiert, den Sie anschließend ausführen müssen.

Beachten Sie, dass GROUP_CONCAT hat eine Standardlängenbegrenzung, die bei Datenbanken mit einer großen Anzahl von Tabellen überschritten werden kann. Sie können diese Grenze ändern, indem Sie SET SESSION group_concat_max_len = 100000000; (oder eine andere große Zahl).

82voto

Marciano Punkte 123

Die Nachahmung des Fehlenden RENAME DATABASE Befehl in MySQL:

  1. Erstellen Sie eine neue Datenbank

  2. Erstellen Sie die Umbenennungsabfragen mit:

     SELECT CONCAT('RENAME TABLE ',table_schema,'.`',table_name,
         '` TO ','new_schema.`',table_name,'`;')
     FROM information_schema.TABLES
     WHERE table_schema LIKE 'old_schema';
  3. Diese Ausgabe ausführen

  4. Alte Datenbank löschen

Sie wurde entnommen aus Den fehlenden RENAME DATABASE-Befehl in MySQL emulieren .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X