Stellen Sie die MySQL-Datenbank mit einem anderen Namen wieder her

41

Wie können wir MySQL-Datenbank mit anderen Namen aus MySQL-Dump-Datei wiederherstellen. Ich möchte die Dump-Datei nicht öffnen und bearbeiten. Irgendwelche anderen besseren Methoden?

Praveen Prasannan
quelle

Antworten:

58

Sie können mysqldump den Dump so erstellen lassen, dass er die Datenbank nicht erstellt oder auswählt.

BEISPIEL: Sie sichern die Datenbank db1 und laden sie in die Datenbank db2

Dadurch werden die Befehle CREATE DATABASE und USE in den Speicherauszug eingefügt

mysqldump -u... -p... --routines --triggers --databases db1 > /root/db1.sql

Dadurch werden die Befehle CREATE DATABASE und USE nicht in den Dump eingefügt ( dies ist das, was Sie möchten ).

mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql

Sie können es auf eine von vier (4) Arten in eine andere Datenbank (wie z. B. db2) laden:

OPTION 1

$ mysqldump -u... -p... --routines --triggers db1 | mysql -u... -p... -A -Ddb2

OPTION 2

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2 < /root/db1.sql

OPTION 3

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A -Ddb2
mysql> source /root/db1.sql

OPTION 4

$ mysqldump -u... -p... --routines --triggers db1 > /root/db1.sql
$ mysql -u... -p... -A
mysql> use db2
mysql> source /root/db1.sql

Versuche es !!!

RolandoMySQLDBA
quelle
Falls jemand anderes damit zu kämpfen hat, -Ddb2sollte kein Bindestrich davor stehen. Zumindest habe ich einen MySQL-Syntaxfehler erhalten, als ich ihn eingefügt habe.
GWG
Das scheint nicht zu funktionieren. Mein Dump hat keine CREATE- oder USE-Datenbank, aber es enthält immer noch eine ALTER DATABASE ... CHARACTER SET ..., die meinen Import bricht. Bearbeiten: Oracle ignoriert den Fehler grundsätzlich .
19.
5

Ich bin ein großer Fan von Dump, Edit und Insert. Sie müssen die Textdatei (Dump-Datei) jedoch nicht öffnen, um sie zu ändern (dies ist besonders nützlich, wenn sie mehrere Millionen Zeilen lang ist). wenn Sie die Datenbank sichern wollen MYDATABASE.

mysqldump MYDATABASE > mydump.sql

Verwenden Sie dann sed, um den alten Datenbanknamen durch einen neuen wie diesen zu ersetzen

sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql

dann können Sie einfach die neue Datenbank erstellen und erneut importieren, und es werden alle Tabellen mit in der neuen Datenbank MYNEWDATABASE erstellt. '

mysqladmin create MYNEWDATABASE

mysql MYNEWDATABASE < mydump.sql

Edit: Wie einige nette Leute im Kommentarbereich hervorgehoben haben, kann dies gefährlich sein, wenn einige der Daten auch dadurch verändert werden, so dass konkrete Möglichkeiten bestehen, dies zu vermeiden.

1) Greife dazu in den Dump, bevor du ihn änderst.

cat mydump.sql | grep "MYDATABASE"

und

2) Wir können einige hinzufügen, um es sicherer zu machen:

sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql

Wenn noch jemand konkrete Vorschläge hat, bearbeite ich meine Antwort gerne in weiteren 4 Jahren.

Sverre
quelle
Ich glaube, es ging um die Wiederherstellung einer vollständigen Datenbank, aber mit einem anderen Namen, und nicht nur um das Kopieren einer Tabelle innerhalb einer vorhandenen Datenbank.
Michael Green
3
Der Sed-Teil wird benötigt
Steve Buzonas 22.01.15
10
Dieser Befehl ist eine schlechte Idee und ich würde abstimmen, wenn ich könnte. Wenn Sie Zeichenfolgen ersetzen möchten, passen Sie mindestens die Zeilen CREATE TABLE und USE an, damit Sie keine anderen Daten ersetzen.
Mittwoch,
1
Bevor Sie den sed-Befehl ( sed -i 's/MYDATABASE/MYNEWDATABASE/g' mydump.sql) ausführen, überprüfen Sie alle Vorkommen von MYDATABASE mit cat mydump.sql | grep "MYDATABASE", um sicherzustellen, dass nur der Datenbankname geändert wird. Andere Daten bleiben unberührt.
Rafaf Tahsin
1
sed -i 's/`MYDATABASE`/`MYNEWDATABASE`/g' mydump.sql # potenziell sicherer dampf bearbeiten. Mein Datenbank-Dump enthält keine USE- oder CREATE DATABASE-Anweisungen, aber der Datenbankname steht in SQL-Kommentaren, Ansichten und Triggern (MySQL 5.7). Dies ersetzt NICHT den Datenbanknamen in den Kommentaren, hat jedoch keine Auswirkungen auf die resultierende Datenbank. Das hat bei mir gut funktioniert.
Jonathan
3

Das habe ich schon vor langer Zeit gemacht.

Wenn Sie alle Ihre Daten exportieren, können Sie den Datenbanknamen am Anfang der Datei wie folgt festlegen: "use database x"

Sie können diese Deklaration also ändern.

Sieger
quelle
3

Wenn die Datei ist , was Sie in der Hand haben und Sie es von einer Shell / Konsole manipulieren, würde ich verwenden sedString Ersatz auf den Leitungen zu tun , beginnend mit CREATE DABATASE, CREATE TABLE, USEund optionnally --(mysqldump Kommentare)

Ersetzen des Datenbanknamens in Zeilen, die den Kommentaren Create Database, Create Table, Use und mysqldump entsprechen

dbfile="yoursqldumpfile.sql";
dbname="current_db_name";
dbnewname="new_db_name";
dbnewfile="/tmp/$dbnewname.sql";
cat $dbfile | sed "/^CREATE DATABASE/ s=$dbname=$dbnewname=" | sed "/^CREATE TABLE/ s=$dbname=$dbnewname=" | sed "/^USE / s=$dbname=$dbnewname=" | sed "/^-- / s=$dbname=$dbnewname=" > $dbnewfile


Wie in vielen Antworten erwähnt, ist es natürlich einfacher, wenn das mysqldump-Backup keine CREATE DATABASE- und keine USE-Zeile enthält. Bedeutung der Optionen --all-databases, --databasesoder die Kurzversionen -Aoder -Bnicht verwendet wurden.

bksunday
quelle
In MySQL 5.7 enthält mysqldump den Datenbanknamen in Triggern und Ansichten, auch mit --no-create-dbund ohne --databaseoder --databases.
Jonathan
2

Wenn Sie einen Dump nach den folgenden zwei Regeln ausführen:

  1. Verwenden Sie keine Optionen wie --databases, --databaseund einfach nur den Namen der Datenbank ohne diese Optionen am Ende des Befehls gesetzt.
  2. Fügen Sie die Option hinzu --no-create-db

Wenn Sie folgendermaßen vorgehen, erstellt mysqldump die SQL, ohne auf die Datenbank zu verweisen, und Sie können den neuen Datenbanknamen am Ende Ihres mysql-Befehls während des Imports verwenden!

mysqldump  --no-create-db old_db_name --single-transaction --compress --order-by-primary --host old_db_host -u old_db_user -pOld_db_password | mysql --host new_host -u new_user -pnewpassword new_db_name
Neo
quelle
In MySQL 5.7 enthält mysqldump den Datenbanknamen in Triggern und Ansichten, auch mit --no-create-dbund ohne --databaseoder --databases.
Jonathan
1

Hier ist das Shell-Skript, mit dem Sie alle Schemanamen im Handumdrehen mit einem Suffix / Affix versehen können.

http://snippets.dzone.com/posts/show/13749

shantanuo
quelle
Der verfügbare Link für den Code ist nicht mehr verfügbar.
Michael Minter