5 Stimmen

Erzwingen Sie einen neuen Datenbanknamen beim Importieren mit MySQL und PHP

Ich habe eine große Datenbank dump.sql Datei, die ich von der Befehlszeile in Linux importiere. Der .sql Dump erstellt eine Datenbank namens "database_name". Ich möchte die Datenbank aus dieser .sql Datei importieren, aber ich möchte sie dazu zwingen, in eine Datenbank mit einem anderen Namen zu importieren, da das Skript derzeit "database_name" überschreibt und "database_name" bereits vorhanden ist und Daten enthält, die ich nicht überschreiben kann.

Ist es die beste Option, innerhalb der .sql Datei zu suchen und zu ersetzen? Was ist die beste Methode dafür, da die Datei 50 MB groß ist. Kann ich nicht einfach file_get_contents() darauf verwenden? Kann ich?

Im Folgenden sind die Zeilen aufgeführt, die ich in der .sql Datei ersetzen müsste:

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `database_name` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `database_name`;

9voto

fab Punkte 1829

Beim Dumpen der Datenbank mit mysqldump verwenden Sie die Option --no-create-db. Dadurch wird die CREATE DATABASE-Anweisung in Ihrer Dump-Datei unterdrückt.
Dann stellen Sie die Datenbank wieder her mit
mysql -h -u -p < dump.sql
Auf diese Weise können Sie Ihre Daten in einer beliebigen Datenbank wiederherstellen (Aber diese Datenbank muss existieren!)

8voto

T. Brian Jones Punkte 12290

Sie müssen den Datenbanknamen in der .sql-Datei ersetzen.

Sie können dies über die Shell mit sed 's/database_name/new_database_name/' dumpFile.sql > newDumpFile.sql machen.

Dies ist die richtige Antwort auf meine Frage, wurde jedoch von 'fab' in den Kommentaren einer anderen Antwort zur Verfügung gestellt.

HINWEIS: Wie @Diego in den Kommentaren angemerkt hat, wird, falls der String 'database_name' irgendwo anders in diesem .sql-Dump auftaucht, er auch dort ersetzt. Sie sollten den Inhalt der .sql-Datei mit less file_name.sql anzeigen und dann bei Ihrer Suche/Ersetzung genauer vorgehen.

0voto

Der einzige zuverlässige Weg besteht darin, die Datei zu öffnen, die folgende Zeile zu finden (etwa 10 bis 15 Zeilen vom Anfang entfernt):

CREATE DATABASE /!32312 IF NOT EXISTS/ old_database_name ...

USE old_database_name;

und ersetze old_database_name an beiden Stellen durch den neuen Namen. Ich habe dies gerade auf einer 5,9 GB großen Datei mit vim gemacht. Es dauerte etwa 15 Sekunden, um die Datei zu öffnen, 3 Sekunden, um die Zeile zu bearbeiten und 30 Sekunden, um die Datei zu speichern. Bin mir nicht sicher, ob ein anderer Texteditor dies erlaubt!

0voto

Dies ist zwar eine alte Frage, aber ich stand heute genau vor demselben Problem. Hier ist, wie ich es gelöst habe:

pv 20171212.dump.bz2 | bunzip2 | sed -e '/^\(CREATE DATABASE\|USE\|.*DROP DATABASE\).*``/d' | mysql 

pv ist nur dazu da, um eine Fortschrittsanzeige anzuzeigen. Die Zeile hätte auch so geschrieben werden können:

bunzip2 20171212.dump.bz2 | sed -e '/^\(CREATE DATABASE\|USE\|.*DROP DATABASE\).*``/d' | mysql 

sed entfernt die Zeilen, die die Änderung des Datenbanknamens verhindern, ohne den Text im Dump-Datei zu ändern.

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