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

959

Das MySQL-Handbuch unter MySQL behandelt dies.

Normalerweise speichere ich die Datenbank einfach und importiere sie mit einem neuen Namen erneut. Dies ist keine Option für sehr große Datenbanken. AnscheinendRENAME {DATABASE | SCHEMA} db_name TO new_db_name; macht es schlechte Dinge, existiert nur in einer Handvoll Versionen und ist insgesamt eine schlechte Idee .

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

Csaba
quelle
3
Ebenfalls auf Serverfehler: serverfault.com/questions/195221/how-to-rename-a-mysql-database
Yves Martin
5
Diese Anweisung RENAME DATABASE Syntax wurde in MySQL 5.1.7 hinzugefügt, jedoch als gefährlich eingestuft und in MySQL 5.1.23 entfernt.
Zloctb
11
Hoffentlich wird MySQL eine neue, funktionierende RENAME DATABASEAnweisung implementieren, die keine Gefahren birgt, da es derzeit keine einfache Möglichkeit gibt, diese Aufgabe auszuführen. Es gibt keinen offensichtlichen Grund, warum dies in der Dokumentation gefährlich war, sodass sie in der Lage sein sollten, einen Ersatz vorzunehmen. Zumindest haben die Leute Fehler bei der Funktionsanforderung auf ihrer Website veröffentlicht. Zum Beispiel bugs.mysql.com/bug.php?id=58593 und bugs.mysql.com/bug.php?id=1698 .
Edward
Links sind jetzt kaputt ...
Oldboy

Antworten:

833

Für InnoDB scheint Folgendes zu funktionieren: Erstellen Sie die neue leere Datenbank und benennen Sie dann jede Tabelle der Reihe nach 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 Methoden 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

ODER

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:

  • Zwischen der Option -pund dem Passwort ist kein Leerzeichen . Wenn Ihre Datenbank kein Kennwort hat, entfernen Sie das -u username -ppasswordTeil.
  • Wenn eine Tabelle einen Trigger hat, kann sie mit der obigen Methode nicht in eine andere Datenbank verschoben werden (führt zu einem Trigger in wrong schemaFehler). Wenn dies der Fall ist, verwenden Sie eine herkömmliche Methode, um eine Datenbank zu klonen, und löschen Sie dann die alte:

    mysqldump old_db | mysql new_db

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

    mysqldump -R old_db | mysql new_db

Benoit Duffez
quelle
26
Ich habe dies gerade mit einer InnoDB-Datenbank mit mehr als 30 Tabellen unter Verwendung der Einstellung file_per_table gemacht, und obwohl einige Tabellen mehr als 3 Millionen Zeilen enthielten, wurde sie in <1 Sekunde abgeschlossen. Es scheint nur, die Dateien auf dem Speicher zu verschieben, anstatt etwas komplizierteres zu tun ... +2 wenn möglich :)
Dave Rix
87
"RENAME DATABASE wurde als gefährlich befunden und in MySQL 5.1.23 entfernt" - von dev.mysql.com/doc/refman/5.1/en/rename-database.html
Palani
13
Bitte beachten Sie, dass dies für Ansichten nicht funktioniert. Sie können Ansichten nicht umbenennen, damit sie von einer Datenbank in eine andere springen. Verwenden Sie DROP VIEWund CREATE VIEWstattdessen. Unbeholfen, ja. Möglicherweise möchten Sie a ausführen mysqldump, um die Ansichten zu verschieben, nachdem Sie zuerst alle Tabellen verschoben haben. Beachten Sie auch, dass SHOW TABLESTabellen UND Ansichten angezeigt werden.
Tuomassalo
9
Dies funktioniert auch nicht für Tabellen mit Triggern. Sie müssen Trigger suchen, sichern und löschen, bevor Sie die Tabelle verschieben, und dann die ausgelagerten Trigger in die Zieldatenbank importieren.
Olfan
5
Aktualisierter (dh funktionierender) Link, der dokumentiert, warum RENAME DATABASEentfernt wurde: dev.mysql.com/worklog/task/?id=4030
alexis
443

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

Um die E / A zu reduzieren, verwenden Sie Folgendes, wie von @Pablo Marin-Garcia vorgeschlagen:

mysqladmin -u username -p create newdatabase
mysqldump -u username -v olddatabase -p | mysql -u username -p -D newdatabase
Hendrasaputra
quelle
86
Wie das OP sagte: "Dies ist keine Option für sehr große Datenbanken."
Pilcrow
3
Vergessen Sie nicht, die ursprüngliche Datenbank zu löschen
Pavel Radzivilovsky
3
Geniale Antwort! Einige Vorschläge zur weiteren Verbesserung, da dies wahrscheinlich von allen Fähigkeiten gegoogelt wird: (1) Verschieben Sie das Codefragment von Pablo Marin-Garcia nach oben, da es die beste Antwort zu sein scheint. (2) Setzen Sie -p<password>statt -püberall, damit die Anweisungen ohne Aufforderung ausgeführt werden .
Steve Chambers
9
Bei Verwendung der Piped-Version erhalte ich zwei Eingabeaufforderungen wie folgt: Enter password: Enter password: Es scheint ein Passwort zu sein, aber nicht beide. Vermisse ich ein Detail?
Ryan
33
Ich bin überrascht, dass dies niemand erwähnt hat, aber Sie sollten das --routinesFlag auch wirklich zu den mysqldump-Befehlen hinzufügen , um sicherzustellen, dass gespeicherte Prozeduren kopiert werden.
Carlos P
205

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

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 ist alles.

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

Geben Sie hier die Bildbeschreibung ein

Raphie
quelle
76
Angenommen, Sie haben sogar PHP in Ihrer Umgebung oder verwenden PHpmyadmin.
Chris
26
Ziemlich gefährlich, selbst wenn Sie phpMyAdmin haben - das Back-End kann während des Prozesses fehlschlagen und die beiden Datenbankdaten in einem unbekannten Zustand belassen, oder es kann sehr lange dauern, was dazu führt, dass das Front-End hängt oder das PHP-Timeout abläuft.
Mozboz
20
Das stimmt @mozboz, aber ich mache das seit 10 Jahren und hatte dieses Problem nie. Ist das gleiche, wenn Sie den Befehl über eine Shell ausführen und Ihr Computer abstürzt. Es gibt eine Möglichkeit, aber was? 1 zu 1 Billiarde?
Raphie
24
Ein Skript über die Konsole ist auch ein Front-End, das mit denselben Problemen hängen bleiben kann.
Greg
11
Konsolenoperationen sind jedoch weitaus zuverlässiger als PhpMyAdmin, insbesondere wenn große Datenbanken betroffen sind, was im Fall des OP der Fall ist. Persönlich würde ich dringend eine Konsolenmethode anstelle von PMA empfehlen, wenn Sie eine relativ große Datenbank haben. Bei kleinen Datenbanken ist PMA natürlich genauso gut.
Teodor Sandu
107

Mit SQL können Sie ein SQL-Skript generieren, um jede Tabelle in Ihrer Quellendatenbank in die Zieldatenbank zu übertragen.

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

Sie können eines dieser beiden Skripte verwenden (ich habe ursprünglich das erstere vorgeschlagen und jemand hat meine Antwort "verbessert" GROUP_CONCAT. Treffen Sie Ihre 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';

oder

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 dann ausführen müssen.

Beachten Sie, dass GROUP_CONCATdie Standardlängenbeschränkung für Datenbanken mit einer großen Anzahl von Tabellen überschritten werden kann. Sie können dieses Limit ändern, indem Sie SET SESSION group_concat_max_len = 100000000;(oder eine andere große Anzahl) ausführen.

ErichBSchulz
quelle
@BlakeFrederick Es wird keine RENAME DATABASE verwendet. Worum geht es also?
Smoking
Funktioniert dies, wenn die Tabelle referenzielle Einschränkungen aufweist? Ich erwarte nicht.
Dolmen
42

Emulieren des fehlenden RENAME DATABASEBefehls 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. Führen Sie diese Ausgabe aus

  4. Alte Datenbank löschen

Es wurde aus dem Emulieren des fehlenden Befehls RENAME DATABASE in MySQL übernommen .

Marciano
quelle
1
Perfekt! Ich habe dies mit InnoDB- und MyISAM-Tabellen getestet. Die schnellste Lösung, die ich getestet habe (das Umbenennen der Tabelle erfolgt fast sofort, ohne Verzögerung)!
Philipp
Großartig! Denken Sie daran, die Berechtigungen anschließend festzulegen.
Adam Faryna
ps. Tun Sie dies besser, bevor Sie die Umbenennungsabfragen ausführen, wenn Sie an einer Live-Datenbank arbeiten.
Adam Faryna
Funktioniert dies, wenn die Tabelle referenzielle Einschränkungen aufweist? Ich erwarte nicht.
Dolmen
24

Drei Optionen:

  1. Erstellen Sie die neue Datenbank, fahren Sie den Server herunter, verschieben Sie die Dateien von einem Datenbankordner in den anderen und starten Sie den Server neu. Beachten Sie, dass dies nur funktioniert, wenn ALLE Ihre Tabellen MyISAM sind.

  2. Erstellen Sie die neue Datenbank, verwenden Sie die Anweisungen CREATE TABLE ... LIKE und dann die Anweisungen INSERT ... SELECT * FROM.

  3. Verwenden Sie mysqldump und laden Sie es mit dieser Datei neu.

Longneck
quelle
+ für die Myisam-Referenz. Ich konnte nicht herausfinden, warum das bei mir nicht funktioniert hatte.
Christian Payne
5
Die Frage besagt, dass dies für InnoDB funktionieren muss, nicht für MyISAM
D-Rock
@ D-Rock sagt das Google, der die Leute anhand des Titels hierher bringt.
Jiggunjer
24

Der einfache Weg

Wechseln Sie in das Datenbankverzeichnis:

cd /var/lib/mysql/

MySQL herunterfahren ... Das ist wichtig!

/etc/init.d/mysql stop

Okay, dieser Weg funktioniert nicht für InnoDB- oder BDB-Datenbanken.

Datenbank umbenennen:

mv old-name new-name

... oder der Tisch ...

cd database/

mv old-name.frm new-name.frm

mv old-name.MYD new-name.MYD

mv old-name.MYI new-name.MYI

Starten Sie MySQL neu

/etc/init.d/mysql start

Erledigt...

OK, diese Methode funktioniert nicht mit InnoDB- oder BDB-Datenbanken. In diesem Fall müssen Sie die Datenbank sichern und erneut importieren.

DeeCee
quelle
16
Das Umbenennen von Ordnern zerstört Spielzeug.
ViniciusPires
1
@Rahly, selbst wenn eine Datei pro Tabelle gesetzt ist, ist es immer noch gefährlich, dass die Tabellen, die vor dem Setzen einer Datei pro Tabelle erstellt wurden, Probleme haben, es sei denn, Sie wissen sicher, dass die Datenbank nach dem Setzen dieses Flags erstellt wird.
Qian Chen
Im Allgemeinen werden die meisten Leute ihre Systeme entweder auf die eine oder die andere Weise haben, aber die Leute werden nicht zufällig umdrehen, ob sie eine Tabelle pro Datei haben wollen oder nicht. Außerdem würden die Tabellen selbst in Ihrem Szenario, wenn sie vor dem Flag erstellt würden, überhaupt nicht als separate Dateien existieren, sodass der Umzug nicht funktioniert und immer noch sicher ist, keine Gefahr. Denken Sie daran, dass die Datenbank NICHT ausgeführt wird, wenn der Umzug stattfindet.
Rahly
Das Äquivalent für MySQL, das mit Homebrew unter OS X installiert wurde:launchctl unload -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist cd /usr/local/var/mysql mv old-name new-name launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mysql.plist
Coberlin
22

Sie können dieses Shell-Skript verwenden:

Referenz: Wie benenne ich eine MySQL-Datenbank um?

#!/bin/bash
set -e # terminate execution on command failure

mysqlconn="mysql -u root -proot"
olddb=$1
newdb=$2
$mysqlconn -e "CREATE DATABASE $newdb"
params=$($mysqlconn -N -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES \
                           WHERE table_schema='$olddb'")
for name in $params; do
      $mysqlconn -e "RENAME TABLE $olddb.$name to $newdb.$name";
done;
$mysqlconn -e "DROP DATABASE $olddb"

Es funktioniert:

$ sh rename_database.sh oldname newname
Grijesh Chauhan
quelle
6
Sei vorsichtig damit. Wenn Sie sich nicht mit dem Root-Benutzer anmelden, haben Sie möglicherweise nur eingeschränkte Berechtigungen. Das Umbenennen schlägt fehl, aber das Löschen ist erfolgreich, was zu einer gelöschten Datenbank führt. Sonst schönes Skript.
Lex
3
Ich set -ehabe am Anfang des Skripts hinzugefügt , wodurch die Ausführung bei einem Fehler beendet wird und das Problem behoben werden sollte.
Mikkel
19

Ich bin erst kürzlich auf eine sehr schöne Art und Weise gestoßen, arbeite mit MyISAM und InnoDB und bin sehr schnell:

RENAME TABLE old_db.table TO new_db.table;

Ich erinnere mich nicht, wo ich es gelesen habe, aber das Verdienst geht an jemand anderen, nicht an mich.

Amr Mostafa
quelle
@ArkadijKuzhel glaube nicht. Ich denke, Sie sprechen von RENAME DATABASE.
Rob Grant
Das hat wirklich geholfen, ich habe eine neue leere Datenbank erstellt und dann den Code verwendet, alle Tabellen wurden mit den gewünschten Namen importiert.
Juli
3
Dies hat das gleiche Problem wie die akzeptierte Antwort - "RENAME DATABASE wurde als gefährlich befunden und in MySQL 5.1.23 entfernt" - von dev.mysql.com/doc/refman/5.1/en/rename-database.html
Blake Frederick
16

Einfachste kugelsichere Methode zum vollständigen Umbenennen (einschließlich des Löschens der alten Datenbank am Ende, sodass es sich eher um eine Umbenennung als um eine Kopie handelt) :

mysqladmin -uroot -pmypassword create newdbname
mysqldump -uroot -pmypassword --routines olddbname | mysql -uroot -pmypassword newdbname
mysqladmin -uroot -pmypassword drop olddbname

Schritte:

  1. Kopieren Sie die Zeilen in den Editor.
  2. Ersetzen Sie alle Verweise auf "olddbname", "newdbname", "mypassword" (+ optional "root") durch Ihre Entsprechungen.
  3. Führen Sie eine nach der anderen in der Befehlszeile aus (geben Sie "y" ein, wenn Sie dazu aufgefordert werden).
Steve Chambers
quelle
Vermeiden Sie es, Ihr Kennwort zur Konsole hinzuzufügen, da es nicht sicher ist. Wenn Sie dies bereits getan haben, verwenden Sie zum Entfernen den Verlauf -cw. Lassen Sie stattdessen das Passwort leer und geben Sie es nach der Eingabeaufforderung ein.
Tommie C.
Es dauert ungewöhnlich lange, mehr als 20 Minuten, ohne fertig zu sein. Ist es in Ordnung abzubrechen?
Sigu Magwa
15

Das benutze ich:

$ mysqldump -u root -p olddb >~/olddb.sql
$ mysql -u root -p
mysql> create database newdb;
mysql> use newdb
mysql> source ~/olddb.sql
mysql> drop database olddb;
eaykin
quelle
14
Nicht machbar für große Datenbanken.
Mikel
14

MySQL unterstützt derzeit das Umbenennen einer Datenbank über die Befehlsoberfläche nicht. Sie können die Datenbank jedoch umbenennen, wenn Sie Zugriff auf das Verzeichnis haben, in dem MySQL seine Datenbanken speichert. Bei Standardinstallationen von MySQL befindet sich diese normalerweise im Datenverzeichnis unter dem Verzeichnis, in dem MySQL installiert wurde. Suchen Sie den Namen der Datenbank, die Sie umbenennen möchten, im Datenverzeichnis und benennen Sie ihn um. Das Umbenennen des Verzeichnisses kann jedoch zu Berechtigungsproblemen führen. Sei vorsichtig.

Hinweis: Sie müssen MySQL stoppen, bevor Sie die Datenbank umbenennen können

Ich würde empfehlen, eine neue Datenbank zu erstellen (unter Verwendung des gewünschten Namens) und die benötigten Daten von der alten in die neue zu exportieren / importieren. Ziemlich einfach.

bryanpearson
quelle
13

Wenn Sie eine Datenbank in PHPMyAdmin umbenennen, wird ein Speicherauszug erstellt. Anschließend wird die Datenbank gelöscht und unter dem neuen Namen neu erstellt.

UnkwnTech
quelle
4
Beachten Sie, dass diese Funktion auf der Registerkarte "Vorgänge" etwas ausgeblendet ist, wenn Sie auf Datenbank klicken.
Maris B.
13

Nun, es gibt 2 Methoden:

Methode 1: Eine bekannte Methode zum Umbenennen des Datenbankschemas besteht darin, das Schema mit Mysqldump zu sichern, es in einem anderen Schema wiederherzustellen und dann das alte Schema zu löschen (falls erforderlich).

Von Shell

 mysqldump emp > emp.out
 mysql -e "CREATE DATABASE employees;"
 mysql employees < emp.out 
 mysql -e "DROP DATABASE emp;"

Obwohl die obige Methode einfach ist, ist sie zeit- und platzaufwendig. Was ist, wenn das Schema mehr als 100 GB umfasst?Es gibt Methoden, mit denen Sie die oben genannten Befehle zusammenfügen können, um Platz zu sparen. Dies spart jedoch keine Zeit.

Um solche Situationen zu beheben, gibt es eine andere schnelle Methode zum Umbenennen von Schemas. Dabei muss jedoch einige Sorgfalt angewendet werden.

Methode 2: MySQL bietet eine sehr gute Funktion zum Umbenennen von Tabellen, die sogar in verschiedenen Schemas funktioniert. Diese Umbenennungsoperation ist atomar und niemand anderes kann auf die Tabelle zugreifen, während sie umbenannt wird. Dies dauert nur kurze Zeit, da das Ändern des Namens oder des Schemas einer Tabelle nur eine Änderung der Metadaten ist. Hier ist ein prozeduraler Ansatz beim Umbenennen:

Erstellen Sie das neue Datenbankschema mit dem gewünschten Namen. Benennen Sie die Tabellen mit dem MySQL-Befehl "RENAME TABLE" vom alten in das neue Schema um. Löschen Sie das alte Datenbankschema. If there are views, triggers, functions, stored procedures in the schema, those will need to be recreated too. MySQLs "RENAME TABLE" schlägt fehl, wenn Trigger in den Tabellen vorhanden sind. Um dies zu beheben, können wir folgende Dinge tun:

1) Dump the triggers, events and stored routines in a separate file. Dies erfolgt mit -E, -R-Flags (zusätzlich zu -t -d, das die Trigger ausgibt) für den Befehl mysqldump. Sobald die Trigger ausgegeben wurden, müssen sie aus dem Schema entfernt werden, damit der Befehl RENAME TABLE funktioniert.

 $ mysqldump <old_schema_name> -d -t -R -E > stored_routines_triggers_events.out

2) Erstellen Sie eine Liste mit nur "BASE" -Tabellen. Diese können mithilfe einer Abfrage in der information_schema.TABLESTabelle gefunden werden.

 mysql> select TABLE_NAME from information_schema.tables where 
    table_schema='<old_schema_name>' and TABLE_TYPE='BASE TABLE';

3) Speichern Sie die Ansichten in einer Out-Datei. Ansichten können mithilfe einer Abfrage in derselben information_schema.TABLESTabelle gefunden werden.

mysql> select TABLE_NAME from information_schema.tables where 
   table_schema='<old_schema_name>' and TABLE_TYPE='VIEW';
 $ mysqldump <database> <view1> <view2>  > views.out

4) Löschen Sie die Trigger in den aktuellen Tabellen im old_schema.

mysql> DROP TRIGGER <trigger_name>;
...

5) Stellen Sie die obigen Speicherauszugsdateien wieder her, sobald alle in Schritt 2 gefundenen "Basistabellen" umbenannt wurden.

mysql> RENAME TABLE <old_schema>.table_name TO <new_schema>.table_name;
...
$ mysql <new_schema> < views.out
$ mysql <new_schema> < stored_routines_triggers_events.out

Komplikationen mit den oben genannten Methoden: Möglicherweise müssen wir die GRANTS für Benutzer so aktualisieren, dass sie mit dem richtigen Schemanamen übereinstimmen. Diese können mit einem einfachen UPDATE für die Tabellen mysql.columns_priv, mysql.procs_priv, mysql.tables_priv und mysql.db behoben werden, indem der Name des alten Schemas auf new_schema aktualisiert und "Flush privileges;" aufgerufen wird. Obwohl "Methode 2" etwas komplizierter erscheint als "Methode 1", ist dies vollständig skriptfähig. Ein einfaches Bash-Skript, mit dem Sie die oben genannten Schritte in der richtigen Reihenfolge ausführen können, kann Ihnen helfen, beim nächsten Umbenennen von Datenbankschemata Platz und Zeit zu sparen.

Das Percona Remote DBA-Team hat ein Skript namens "rename_db" geschrieben, das folgendermaßen funktioniert:

[root@dba~]# /tmp/rename_db
rename_db <server> <database> <new_database>

Um die Verwendung dieses Skripts zu demonstrieren, wurde ein Beispielschema "emp" verwendet, Testauslöser erstellt und Routinen in diesem Schema gespeichert. Versucht, das Datenbankschema mithilfe des Skripts umzubenennen. Der Vorgang dauert einige Sekunden, im Gegensatz zur zeitaufwändigen Dump / Restore-Methode.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp                |
| mysql              |
| performance_schema |
| test               |
+--------------------+


[root@dba ~]# time /tmp/rename_db localhost emp emp_test
create database emp_test DEFAULT CHARACTER SET latin1
drop trigger salary_trigger
rename table emp.__emp_new to emp_test.__emp_new
rename table emp._emp_new to emp_test._emp_new
rename table emp.departments to emp_test.departments
rename table emp.dept to emp_test.dept
rename table emp.dept_emp to emp_test.dept_emp
rename table emp.dept_manager to emp_test.dept_manager
rename table emp.emp to emp_test.emp
rename table emp.employees to emp_test.employees
rename table emp.salaries_temp to emp_test.salaries_temp
rename table emp.titles to emp_test.titles
loading views
loading triggers, routines and events
Dropping database emp

real    0m0.643s
user    0m0.053s
sys     0m0.131s


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| emp_test           |
| mysql              |
| performance_schema |
| test               |
+--------------------+

Wie Sie in der obigen Ausgabe sehen können, wurde das Datenbankschema "emp" in weniger als einer Sekunde in "emp_test" umbenannt. Schließlich ist dies das Skript von Percona, das oben für "Methode 2" verwendet wird.

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "show create database $2\G" -sss | grep ^Create | awk -F'CHARACTER SET ' '{print $2}' | awk '{print $1}'`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi
Sathish D.
quelle
Was ist mit referenziellen Einschränkungen?
Dolmen
13

Schritte :

  1. Hit http: // localhost / phpmyadmin /
  2. Wählen Sie Ihre Datenbank aus
  3. Klicken Sie auf die Registerkarte Operationen
  4. Es wird eine Registerkarte als "Datenbank umbenennen in" angezeigt. Fügen Sie einen neuen Namen hinzu und aktivieren Sie die Option Berechtigungen anpassen.
  5. Klicken Sie auf Los.

Geben Sie hier die Bildbeschreibung ein

Shubham Jain
quelle
1
Eine phpMyAdmin-Lösung ist normalerweise eine schlechte Lösung, da einige Umgebungen eine eingeschränkte Umgebung haben.
Daniel Antunes Pinto
Keine "gute" Lösung, aber trotzdem danke, denn es war das, wonach ich gesucht habe.
Jamie
1
Bitte stimmen Sie ab, wenn es für Sie funktioniert .. es wird helfen .. danke
Shubham Jain
1
Dies funktioniert für mich in der phpMyAdmin-Umgebung, +1
William
12

Für Mac-Benutzer bietet Sequel Pro im Menü "Datenbank" die Option "Datenbank umbenennen". http://www.sequelpro.com/

Herzog
quelle
5
Achten Sie auf diese Option, wenn Ihre Datenbank Ansichten oder Auslöser enthält. Hinter dieser Menüoption befindet sich ein Skript, das eine neue Datenbank erstellt und alle Tabellen verschiebt. Dies funktioniert nicht für Ansichten oder Trigger, sodass sie in Ihrer alten Datenbank zurückbleiben. Das Ergebnis sind zwei defekte Datenbanken, die repariert werden müssen.
Olfan
10

Die meisten Antworten hier sind aus einem von zwei Gründen falsch:

  1. Sie können RENAME TABLE nicht einfach verwenden, da möglicherweise Ansichten und Trigger vorhanden sind. Wenn Trigger vorhanden sind, schlägt RENAME TABLE fehl
  2. Sie können mysqldump nicht verwenden, wenn Sie "schnell" (wie in der Frage gefordert) eine große Datenbank umbenennen möchten

Percona hat einen Blog-Beitrag darüber, wie man das gut macht: https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/

und ein Skript von Simon R Jones, das das tut, was in diesem Beitrag vorgeschlagen wird. Ich habe einen Fehler behoben, den ich im Skript gefunden habe. Sie können es hier sehen:

https://gist.github.com/ryantm/76944318b0473ff25993ef2a7186213d

Hier ist eine Kopie davon:

#!/bin/bash
# Copyright 2013 Percona LLC and/or its affiliates
# @see https://www.percona.com/blog/2013/12/24/renaming-database-schema-mysql/
set -e
if [ -z "$3" ]; then
    echo "rename_db <server> <database> <new_database>"
    exit 1
fi
db_exists=`mysql -h $1 -e "show databases like '$3'" -sss`
if [ -n "$db_exists" ]; then
    echo "ERROR: New database already exists $3"
    exit 1
fi
TIMESTAMP=`date +%s`
character_set=`mysql -h $1 -e "SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '$2'" -sss`
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
STATUS=$?
if [ "$STATUS" != 0 ] || [ -z "$TABLES" ]; then
    echo "Error retrieving tables from $2"
    exit 1
fi
echo "create database $3 DEFAULT CHARACTER SET $character_set"
mysql -h $1 -e "create database $3 DEFAULT CHARACTER SET $character_set"
TRIGGERS=`mysql -h $1 $2 -e "show triggers\G" | grep Trigger: | awk '{print $2}'`
VIEWS=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='VIEW'" -sss`
if [ -n "$VIEWS" ]; then
    mysqldump -h $1 $2 $VIEWS > /tmp/${2}_views${TIMESTAMP}.dump
fi
mysqldump -h $1 $2 -d -t -R -E > /tmp/${2}_triggers${TIMESTAMP}.dump
for TRIGGER in $TRIGGERS; do
    echo "drop trigger $TRIGGER"
    mysql -h $1 $2 -e "drop trigger $TRIGGER"
done
for TABLE in $TABLES; do
    echo "rename table $2.$TABLE to $3.$TABLE"
    mysql -h $1 $2 -e "SET FOREIGN_KEY_CHECKS=0; rename table $2.$TABLE to $3.$TABLE"
done
if [ -n "$VIEWS" ]; then
    echo "loading views"
    mysql -h $1 $3 < /tmp/${2}_views${TIMESTAMP}.dump
fi
echo "loading triggers, routines and events"
mysql -h $1 $3 < /tmp/${2}_triggers${TIMESTAMP}.dump
TABLES=`mysql -h $1 -e "select TABLE_NAME from information_schema.tables where table_schema='$2' and TABLE_TYPE='BASE TABLE'" -sss`
if [ -z "$TABLES" ]; then
    echo "Dropping database $2"
    mysql -h $1 $2 -e "drop database $2"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.columns_priv where db='$2'" -sss` -gt 0 ]; then
    COLUMNS_PRIV="    UPDATE mysql.columns_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.procs_priv where db='$2'" -sss` -gt 0 ]; then
    PROCS_PRIV="    UPDATE mysql.procs_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.tables_priv where db='$2'" -sss` -gt 0 ]; then
    TABLES_PRIV="    UPDATE mysql.tables_priv set db='$3' WHERE db='$2';"
fi
if [ `mysql -h $1 -e "select count(*) from mysql.db where db='$2'" -sss` -gt 0 ]; then
    DB_PRIV="    UPDATE mysql.db set db='$3' WHERE db='$2';"
fi
if [ -n "$COLUMNS_PRIV" ] || [ -n "$PROCS_PRIV" ] || [ -n "$TABLES_PRIV" ] || [ -n "$DB_PRIV" ]; then
    echo "IF YOU WANT TO RENAME the GRANTS YOU NEED TO RUN ALL OUTPUT BELOW:"
    if [ -n "$COLUMNS_PRIV" ]; then echo "$COLUMNS_PRIV"; fi
    if [ -n "$PROCS_PRIV" ]; then echo "$PROCS_PRIV"; fi
    if [ -n "$TABLES_PRIV" ]; then echo "$TABLES_PRIV"; fi
    if [ -n "$DB_PRIV" ]; then echo "$DB_PRIV"; fi
    echo "    flush privileges;"
fi

Speichern Sie es in einer Datei namens rename_dbund machen Sie das Skript ausführbar mit chmod +x rename_dbund verwenden Sie es dann wie folgt./rename_db localhost old_db new_db

Ryantm
quelle
Ich mag dieses Skript, es ist fast universell. Es konnte jedoch kein Fall verarbeitet werden, wenn mehrere verkettete ANSICHTEN vorhanden sind, in denen der Definierer nicht root ist.
ENargit
9

Es ist möglich, alle Tabellen in einer Datenbank so umzubenennen, dass sie sich unter einer anderen Datenbank befinden, ohne einen vollständigen Speicherauszug durchführen und wiederherstellen zu müssen.

DROP PROCEDURE IF EXISTS mysql.rename_db;
DELIMITER ||
VERFAHREN ERSTELLEN mysql.rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
START
SELECT CONCAT ('CREATE DATABASE', new_db, ';') `# create new database`;
SELECT CONCAT ('RENAME TABLE `', old_db, '` .`', table_name, '`TO`', new_db, '` .`', table_name, '`;')` # alter table` FROM information_schema.tables WHERE table_schema = old_db;
SELECT CONCAT ('DROP DATABASE `', old_db, '`;') `# drop old database`;
ENDE ||
DELIMITER;

$ time mysql -uroot -e "rufe mysql.rename_db ('db1', 'db2') auf;" | mysql -uroot

Auslöser in der Ziel-Datenbank sind jedoch nicht zufriedenstellend. Sie müssen sie zuerst löschen und nach dem Umbenennen neu erstellen.

mysql -uroot -e "call mysql.rename_db ('test', 'blah2');" | mysql -uroot
FEHLER 1435 (HY000) in Zeile 4: Auslöser im falschen Schema
TodoInTX
quelle
Kleine Optimierung, mit der dies mit MySQL 5.x funktioniert mysql --batch-uroot -e "call mysql.rename_db('test', 'blah2');" | mysql -uroot Beachten Sie, dass Sie --batch verwenden müssen, um die Formatierung in eine Rohformatierung zu ändern, die die Ergebnisse ohne Formatierung ausgibt.
Mikel
8

Hier ist eine Batch-Datei, die ich geschrieben habe, um sie über die Befehlszeile zu automatisieren, aber für Windows / MS-DOS.

Die Syntax lautet rename_mysqldb database newdatabase -u [Benutzer] -p [Passwort]

:: ***************************************************************************
:: FILE: RENAME_MYSQLDB.BAT
:: ***************************************************************************
:: DESCRIPTION
:: This is a Windows /MS-DOS batch file that automates renaming a MySQL database 
:: by using MySQLDump, MySQLAdmin, and MySQL to perform the required tasks.
:: The MySQL\bin folder needs to be in your environment path or the working directory.
::
:: WARNING: The script will delete the original database, but only if it successfully
:: created the new copy. However, read the disclaimer below before using.
::
:: DISCLAIMER
:: This script is provided without any express or implied warranties whatsoever.
:: The user must assume the risk of using the script.
::
:: You are free to use, modify, and distribute this script without exception.
:: ***************************************************************************

:INITIALIZE
@ECHO OFF
IF [%2]==[] GOTO HELP
IF [%3]==[] (SET RDB_ARGS=--user=root) ELSE (SET RDB_ARGS=%3 %4 %5 %6 %7 %8 %9)
SET RDB_OLDDB=%1
SET RDB_NEWDB=%2
SET RDB_DUMPFILE=%RDB_OLDDB%_dump.sql
GOTO START

:START
SET RDB_STEP=1
ECHO Dumping "%RDB_OLDDB%"...
mysqldump %RDB_ARGS% %RDB_OLDDB% > %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=2
ECHO Creating database "%RDB_NEWDB%"...
mysqladmin %RDB_ARGS% create %RDB_NEWDB%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=3
ECHO Loading dump into "%RDB_NEWDB%"...
mysql %RDB_ARGS% %RDB_NEWDB% < %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=4
ECHO Dropping database "%RDB_OLDDB%"...
mysqladmin %RDB_ARGS% drop %RDB_OLDDB% --force
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
SET RDB_STEP=5
ECHO Deleting dump...
DEL %RDB_DUMPFILE%
IF %ERRORLEVEL% NEQ 0 GOTO ERROR_ABORT
ECHO Renamed database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:ERROR_ABORT
IF %RDB_STEP% GEQ 3 mysqladmin %RDB_ARGS% drop %NEWDB% --force
IF %RDB_STEP% GEQ 1 IF EXIST %RDB_DUMPFILE% DEL %RDB_DUMPFILE%
ECHO Unable to rename database "%RDB_OLDDB%" to "%RDB_NEWDB%".
GOTO END

:HELP
ECHO Renames a MySQL database.
ECHO Usage: %0 database new_database [OPTIONS]
ECHO Options: Any valid options shared by MySQL, MySQLAdmin and MySQLDump.
ECHO          --user=root is used if no options are specified.
GOTO END    

:END
SET RDB_OLDDB=
SET RDB_NEWDB=
SET RDB_ARGS=
SET RDB_DUMP=
SET RDB_STEP=
Johnny
quelle
7

Die gespeicherte Prozedur von TodoInTX hat bei mir nicht ganz funktioniert. Hier ist mein Stich:

- gespeicherte Prozedur rename_db: Benennen Sie eine Datenbank um, um Tabellen zu kopieren.
- Vorsichtsmaßnahmen: 
- Überlastet alle vorhandenen Datenbanken mit demselben Namen wie der 'neue' Datenbankname.
- NUR Tabellen kopieren; gespeicherte Prozeduren und andere Datenbankobjekte werden nicht kopiert.
- Tomer Altman ([email protected])

Trennzeichen //
DROP PROCEDURE IF EXISTS rename_db;
CREATE PROCEDURE rename_db (IN old_db VARCHAR (100), IN new_db VARCHAR (100))
START
    DECLARE current_table VARCHAR (100);
    DECLARE done INT DEFAULT 0;
    DECLARE old_tables CURSOR FOR Wählen Sie table_name aus information_schema.tables aus, wobei table_schema = old_db;
    DECLARE CONTINUE HANDLER FÜR NICHT GEFUNDENES SET erledigt = 1;

    SET @output = CONCAT ('DROP SCHEMA IF EXISTS', new_db, ';'); 
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    SET @output = CONCAT ('SCHEMA ERSTELLEN, WENN NICHT EXISTIERT', new_db, ';');
    PREPARE stmt FROM @output;
    EXECUTE stmt;

    OPEN old_tables;
    WIEDERHOLEN
        FETCH old_tables INTO current_table;
        WENN NICHT DANN getan
        SET @output = CONCAT ('alter table', old_db, '.', Current_table, 'rename', new_db, '.', Current_table, ';');
        PREPARE stmt FROM @output;
        EXECUTE stmt;

        END IF;
    BIS END REPEAT erledigt;

    CLOSE old_tables;

ENDE//
Trennzeichen;
user757945
quelle
Dies funktioniert nur für Tabellen und nur, wenn diese Tabellen keine Trigger haben. Ansichten und Trigger werden dadurch nicht verschoben.
Olfan
7

Die einfachste Methode ist die Verwendung der HeidiSQL-Software. Es ist kostenlos und Open Source. Es läuft unter Windows und unter jedem Linux mit Wine (führen Sie Windows-Anwendungen unter Linux, BSD, Solaris und Mac OS X aus).

Um HeidiSQL herunterzuladen, gehen Sie zu http://www.heidisql.com/download.php .

Um Wine herunterzuladen, gehen Sie zu http://www.winehq.org/ .

Um eine Datenbank in HeidiSQL umzubenennen, klicken Sie einfach mit der rechten Maustaste auf den Datenbanknamen und wählen Sie 'Bearbeiten'. Geben Sie dann einen neuen Namen ein und drücken Sie 'OK'.

Es ist so einfach.

Fathah Rehman P.
quelle
1
Wenn es Prozeduren gespeichert hat, kann es nicht umbenannt werden.
Abksharma
@abksharma Tatsächlich erhalten Sie eine Nachricht. Database "database_name" contains stored routine(s) which cannot be moved.Trigger (zumindest für die MariDB-Datenbank) werden als gespeicherte Routinen gezählt. Ich hatte keine gespeicherten Prozeduren, konnte die Datenbank jedoch nicht umbenennen, bis ich alle Trigger gelöscht hatte.
izogfif
7

Für Mac-Benutzer können Sie Sequel Pro(kostenlos) verwenden, die nur die Option zum Umbenennen von Datenbanken bieten. Die alte Datenbank wird jedoch nicht gelöscht.

Sobald Sie die entsprechende Datenbank geöffnet haben, klicken Sie einfach auf: Database->Rename database...

Roee Gavirel
quelle
Manchmal bleibt die alte Datenbank am Leben, aber sie ist leer. Wenn es dennoch eine Kopie erstellt, können Sie die Kopie erstellen und die alte löschen. Dies sind immer noch zwei einfache Schritte.
Roee Gavirel
6

Ich habe eine Frage zu Server Fault gestellt, bei der versucht wurde, Ausfallzeiten beim Wiederherstellen sehr großer Datenbanken mithilfe von MySQL Proxy zu umgehen. Ich hatte keinen Erfolg, aber am Ende wurde mir klar, dass ich die RENAME DATABASE-Funktionalität wollte, da Dump / Import aufgrund der Größe unserer Datenbank keine Option war.

In MySQL ist eine RENAME TABLE-Funktion integriert, sodass ich ein einfaches Python-Skript geschrieben habe, um die Aufgabe für mich zu erledigen. Ich habe es auf GitHub gepostet, falls es für andere von Nutzen sein könnte.

cclark
quelle
2
RENAME DATABASE wurde aus der Syntax entfernt, nicht RENAME TABLE.
Duke
6

Im Folgenden finden Sie ein kleines Shellscript, das mit zwei Parametern ausgeführt werden muss: Datenbankname und neuer Datenbankname.

Möglicherweise müssen Sie den MySQL-Zeilen Anmeldeparameter hinzufügen, wenn Sie die Datei .my.cnf nicht in Ihrem Home-Verzeichnis verwenden. Bitte erstellen Sie ein Backup, bevor Sie dieses Skript ausführen.


#!/usr/bin/env bash

mysql -e "CREATE DATABASE $2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;"
for i in $(mysql -Ns $1 -e "show tables");do
    echo "$1.$i -> $2.$i"
    mysql -e "rename TABLE $1.$i to $2.$i"
done
mysql -e "DROP DATABASE $1"
gerrit damen
quelle
1
Auch dies funktioniert nicht für Tabellen mit angehängten Triggern oder für Ansichten, die nicht in andere Datenbanken umbenannt werden können.
Olfan
6

Es scheint, dass niemand dies erwähnt hat, aber hier ist ein anderer Weg:

create database NewDatabaseName like OldDatabaseName;

dann für jede Tabelle:

create NewDatabaseName.tablename like OldDatabaseName.tablename;
insert into NewDataBaseName.tablename select * from OldDatabaseName.tablename;

dann, wenn du willst,

drop database OldDatabaseName;

Dieser Ansatz hätte den Vorteil, dass die gesamte Übertragung auf einem Server mit nahezu null Netzwerkverkehr durchgeführt wird, sodass er viel schneller abläuft als ein Dump / Restore.

Wenn Sie Prozeduren / Ansichten / usw. gespeichert haben, möchten Sie diese möglicherweise auch übertragen.

Tuncay Göncüoğlu
quelle
2
Soweit ich weiß, unterstützt 5.x das Schlüsselwort "like" in der create databaseAnweisung nicht? Woher hast du das?
Dragas
Hier ist der Link für die create table likeSyntax: dev.mysql.com/doc/refman/5.7/en/create-table-like.html . In Bezug auf das Erstellen einer Datenbank scheint MySQL diese Klausel seitdem fallen gelassen zu haben.
Tuncay Göncüoğlu
4

Hier ist eine schnelle Möglichkeit, ein SQL-Umbenennungsskript zu generieren, wenn Sie viele Tabellen verschieben müssen.

SELECT DISTINCT CONCAT('RENAME TABLE ', t.table_schema,'.', t.table_name, ' TO ',     
t.table_schema, "_archive", '.', t.table_name, ';' ) as Rename_SQL 
FROM information_schema.tables t
WHERE table_schema='your_db_name' ;
yantaq
quelle
Sieht gut aus, verschiebt jedoch die gespeicherten Prozeduren oder Ansichten nicht.
Davidpricedev
Sie sollten wahrscheinlich Hash-Markierungen hinzufügen, um den Tabellennamen und den Schemanamen zu
umschließen
4

ALTER DATABASEist der von MySQL vorgeschlagene Weg, dies zu umgehen, und RENAME DATABASEwird verworfen.

Ab 13.1.32 RENAME DATABASE Syntax :

RENAME {DATABASE | SCHEMA} db_name TO new_db_name;

Diese Anweisung wurde in MySQL 5.1.7 hinzugefügt, wurde jedoch als gefährlich eingestuft und in MySQL 5.1.23 entfernt.

FancyPants
quelle
7
Haben Sie eine Beispielsyntax? Ich kenne keine Möglichkeit alter database, die Datenbank selbst umzubenennen, und die Dokumentation, auf die Sie verlinkt haben, deutet nicht darauf hin, dass dies möglich ist.
Jordanien
@ Jordan Ich wäre auch interessiert. Ich habe versucht und versucht und herausgefunden, dass es nur mit Version> 5.1 funktioniert, aber ich kann momentan nicht aktualisieren.
FancyPants
5
-1: Um über vorgeschlagene Wege zu schreiben und dann ein Beispiel für den nicht vorgeschlagenen Weg zu geben, während es völlig fehlt, um überhaupt ein Beispiel zu zeigen.
hakre
3
Das ist falsch. In der Dokumentation zur MySQL-Datenbank zum Umbenennen heißt es, dass rename_database für eine ganz bestimmte Umbenennungsaufgabe vorgesehen war (kein allgemeiner Fall für das Umbenennen von DBs), die jetzt mit alter database behandelt wird: 'Verwenden Sie ALTER DATABASE db_name UPGRADE, um die Datenbanknamen mit der neuen Codierung zu aktualisieren DATA DIRECTORY NAME statt 'Sie können dies nicht verwenden, um die Datenbank nach Ihren Wünschen umzubenennen. In diesem Befehl ist nicht einmal Platz für einen neuen Datenbanknamen!
Kanat Bolazar
3

Gehen Sie in MySQL Administrator wie folgt vor:

  1. Erstellen Sie unter Kataloge ein neues Datenbankschema.
  2. Gehen Sie zu Backup und erstellen Sie eine Sicherung des alten Schemas.
  3. Backup ausführen.
  4. Gehen Sie zu Wiederherstellen und öffnen Sie die in Schritt 3 erstellte Datei.
  5. Wählen Sie unter Zielschema die Option 'Ein anderes Schema' aus und wählen Sie das neue Datenbankschema aus.
  6. Starten Sie die Wiederherstellung.
  7. Überprüfen Sie das neue Schema und löschen Sie das alte, wenn es gut aussieht.
Tom
quelle
MySQL Administrator kann nicht mit großen Datenbanken umgehen und es gibt nichts schnelles
Deadprogrammer
3

In phpmyadmin können Sie die Datenbank einfach umbenennen

select database 

  goto operations tab

  in that rename Database to :

  type your new database name and click go

Bitten Sie darum, die alte Tabelle zu löschen und die Tabellendaten neu zu laden. Klicken Sie in beiden Fällen auf OK

Ihre Datenbank wird umbenannt

murtaza.webdev
quelle
3

Wenn Sie phpMyAdmin verwenden , können Sie zur Registerkarte "Operationen" wechseln, nachdem Sie die Datenbank ausgewählt haben, die Sie umbenennen möchten. Gehen Sie dann zum letzten Abschnitt "Datenbank kopieren nach" (oder so ähnlich), geben Sie einen Namen ein und wählen Sie die folgenden Optionen aus. In diesem Fall müssen Sie vermutlich die Kontrollkästchen "Struktur und Daten" und "Datenbank vor dem Kopieren erstellen" aktivieren und schließlich in diesem Abschnitt auf die Schaltfläche "Los" klicken.

Übrigens verwende ich phpMyAdmin auf Spanisch, daher bin ich mir nicht sicher, wie die Namen der Abschnitte auf Englisch lauten.

Peter Mortensen
quelle