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?
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?
Antworten:
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 !!!
ALTER DATABASE ... CHARACTER SET ...
, die meinen Import bricht. Bearbeiten: Oracle ignoriert den Fehler grundsätzlich .
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.
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.
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.
Wenn die Datei ist , was Sie in der Hand haben und Sie es von einer Shell / Konsole manipulieren, würde ich verwenden sed
String Ersatz auf den Leitungen zu tun , beginnend mit CREATE DABATASE
, CREATE TABLE
, USE
und 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
, --databases
oder die Kurzversionen -A
oder -B
nicht verwendet wurden.
--no-create-db
und ohne --database
oder --databases
.
Wenn Sie einen Dump nach den folgenden zwei Regeln ausführen:
--databases
, --database
und einfach nur den Namen der Datenbank ohne diese Optionen am Ende des Befehls gesetzt.--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
--no-create-db
und ohne --database
oder --databases
.
Hier ist das Shell-Skript, mit dem Sie alle Schemanamen im Handumdrehen mit einem Suffix / Affix versehen können.
-Ddb2
sollte kein Bindestrich davor stehen. Zumindest habe ich einen MySQL-Syntaxfehler erhalten, als ich ihn eingefügt habe.