Doppelte gesamte MySQL-Datenbank


88

Ist es möglich, eine gesamte MySQL-Datenbank auf einem Linux-Server zu duplizieren?

Ich weiß, dass ich exportieren und importieren kann, aber die ursprüngliche Datenbank ist> 25 MB groß, das ist also nicht ideal.

Ist es möglich, mysqldump zu verwenden oder die Datenbankdateien direkt zu duplizieren?

Antworten:


172

Erstellen Sie zuerst die doppelte Datenbank:

CREATE DATABASE duplicateddb;

Stellen Sie sicher, dass der Benutzer und die Berechtigungen vorhanden sind und:

 mysqldump -u admin -p originaldb | mysql -u backup -pPassword duplicateddb; 

28
Ich denke nicht, dass es ein Leerzeichen zwischen "-p" und "Passwort" im 2. Teil Ihrer 2. Befehlszeile geben sollte

16
Nein, der Raum sollte nicht da sein! Die Antwort ist so richtig. Auf der MySQL-Manpage stand: --password [= Passwort], -p [Passwort] Das Passwort, das beim Herstellen einer Verbindung zum Server verwendet werden soll. Wenn Sie das kurze Optionsformular (-p) verwenden, darf zwischen der Option und dem Kennwort kein Leerzeichen stehen. Wenn Sie den Kennwortwert nach der Option --password oder -p in der Befehlszeile weglassen, fordert mysql zur Eingabe eines Kennworts auf. Die Angabe eines Kennworts in der Befehlszeile sollte als unsicher angesehen werden. Siehe Abschnitt 6.1.2.1, "Endbenutzerrichtlinien für P ...
nils petersohn

2
Beachten Sie, dass mysqldump standardmäßig die Trigger, aber nicht die gespeicherten Prozeduren sichert. Fügen Sie in --routinesdiesem Fall als Option hinzu.
LinuxDevOps

1
Wenn Sie dies so tun und nicht möchten, dass das MySQL-Kennwort dieses Benutzers im Bash-Verlauf verfügbar ist, bearbeiten Sie es ~/.bash_historynach der Ausführung aus Ihrer Datei. Sie können das Ergebnis des ersten Befehls auch in eine temporäre Datei ausgeben und anschließend Folgendes ausführen (wodurch Sie zur Eingabe des Kennworts aufgefordert werden) mysql -p -u admin duplicatedb < temporaryfile.sql.
Mike

1
Diese Antwort funktioniert sicherlich, aber die Frage lautet: "Ich weiß, dass ich Export und Import verwenden kann, aber die ursprüngliche Datenbank ist> 25 MB, das ist also nicht ideal." Diese Antwort legt nahe, dass es sich im Grunde um Export und Import handelt.
el.pescado


5

Manchmal mache ich einen mysqldump und leite die Ausgabe in einen anderen mysql-Befehl, um sie in eine andere Datenbank zu importieren.

mysqldump --add-drop-table -u wordpress -p wordpress | mysql -u wordpress -p wordpress_backup

Ich erhalte die Fehlermeldung, dass die Zieldatenbank nicht vorhanden ist, wenn ich diese verwende. Sie benötigen also auch eine CREATE DATABASE-Zeile.
Blak3r

3

Erstellen Sie eine mysqldump-Datei im System, die die Daten enthält, und geben Sie diese mysqldump-Datei mithilfe von pipe als Eingabe für das neue System ein. Das neue System kann mit dem Befehl ssh verbunden werden.

mysqldump -u user -p'password' db-name | ssh user@some_far_place.com mysql -u user -p'password' db-name

kein Leerzeichen zwischen -p [Passwort]


1
Können Sie eine Beschreibung hinzufügen, wie dies funktioniert, z. B. die Verwendung des Rohrs?
Kalyfe

1

Hier ist eine Windows Bat-Datei, die ich geschrieben habe und die Vincent und Pauls Vorschläge kombiniert. Der Benutzer wird zur Eingabe von Quell- und Zielnamen aufgefordert.

Ändern Sie einfach die Variablen oben, um die richtigen Pfade zu Ihren ausführbaren Dateien / Datenbankports festzulegen.

:: Creates a copy of a database with a different name.
:: User is prompted for Src and destination name.
:: Fair Warning: passwords are passed in on the cmd line, modify the script with -p instead if security is an issue.
:: Uncomment the rem'd out lines if you want script to prompt for database username, password, etc.

:: See also: http://stackoverflow.com/questions/1887964/duplicate-entire-mysql-database

@set MYSQL_HOME="C:\sugarcrm\mysql\bin"
@set mysqldump_exec=%MYSQL_HOME%\mysqldump
@set mysql_exec=%MYSQL_HOME%\mysql
@set SRC_PORT=3306
@set DEST_PORT=3306
@set USERNAME=TODO_USERNAME
@set PASSWORD=TODO_PASSWORD

:: COMMENT any of the 4 lines below if you don't want to be prompted for these each time and use defaults above.
@SET /p USERNAME=Enter database username: 
@SET /p PASSWORD=Enter database password: 
@SET /p SRC_PORT=Enter SRC database port (usually 3306): 
@SET /p DEST_PORT=Enter DEST database port: 

%MYSQL_HOME%\mysql --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="show databases;"
@IF NOT "%ERRORLEVEL%" == "0" GOTO ExitScript

@SET /p SRC_DB=What is the name of the SRC Database:  
@SET /p DEST_DB=What is the name for the destination database (that will be created):  

%mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% --execute="create database %DEST_DB%;"
%mysqldump_exec% --add-drop-table --user=%USERNAME% --password=%PASSWORD% --port=%SRC_PORT% %SRC_DB% | %mysql_exec% --user=%USERNAME% --password=%PASSWORD% --port=%DEST_PORT% %DEST_DB%
@echo SUCCESSFUL!!!
@GOTO ExitSuccess

:ExitScript
@echo "Failed to copy database"
:ExitSuccess

Beispielausgabe:

C:\sugarcrm_backups\SCRIPTS>copy_db.bat
Enter database username: root
Enter database password: MyPassword
Enter SRC database port (usually 3306): 3308
Enter DEST database port: 3308

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="show databases;"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sugarcrm_550_pro   |
| sugarcrm_550_ce    |
| sugarcrm_640_pro   |
| sugarcrm_640_ce    |
+--------------------+
What is the name of the SRC Database:  sugarcrm
What is the name for the destination database (that will be created):  sugarcrm_640_ce

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 --execute="create database sugarcrm_640_ce;"

C:\sugarcrm_backups\SCRIPTS>"C:\sugarcrm\mysql\bin"\mysqldump --add-drop-table --user=root --password=MyPassword --port=3308 sugarcrm   | "C:\sugarcrm\mysql\bin"\mysql --user=root --password=MyPassword --port=3308 sugarcrm_640_ce
SUCCESSFUL!!!

1

Dies funktioniert bei InnoDB nicht. Verwenden Sie diese Problemumgehung nur, wenn Sie versuchen, MyISAM-Datenbanken zu kopieren.

Wenn das Sperren der Tabellen während der Sicherung und möglicherweise das Anhalten von MySQL während des Datenbankimports akzeptabel ist, funktioniert mysqlhotcopy möglicherweise schneller.

Z.B

Backup:

# mysqlhotcopy -u root -p password db_name /path/to/backup/directory

Wiederherstellen:

cp /path/to/backup/directory/* /var/lib/mysql/db_name

mysqlhotcopy kann Dateien auch über SSH (scp) und möglicherweise direkt in das doppelte Datenbankverzeichnis übertragen.

Z.B

# mysqlhotcopy -u root -p password db_name /var/lib/mysql/duplicate_db_name

1

Erstellen einer Kopie einer Datenbank

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

0

Dies funktionierte bei mir mit der Eingabeaufforderung von der OUTSIDE MySQL-Shell:

# mysqldump -u root -p password db1 > dump.sql
# mysqladmin -u root -p password create db2
# mysql -u root -p password db2 < dump.sql

Das sieht für mich am besten aus. Wenn Sie "dump.sql" komprimieren, können Sie es einfach als komprimiertes Backup speichern. Cool! Für eine 1-GB-Datenbank mit Innodb-Tabellen etwa eine Minute zum Erstellen von "dump.sql" und etwa drei Minuten zum Speichern von Daten in der neuen DB db2.

Das direkte Kopieren des Hole-DB-Verzeichnisses (mysql / data / db1) hat bei mir aufgrund der InnoDB-Tabellen nicht funktioniert.


-2

Es war einmal in MySQL, als Sie einfach alle Tabellendateien in ein anderes Verzeichnis im MySQL-Baum kopieren konnten

mysql cli - Datenbank db2 erstellen

linux cli - cp db1 db2


Das funktioniert nur mit MyISAM, oder? Gut, diese schlechten alten Zeiten sind vorbei.
Laurenz Albe

Gut für die Geschichtsbücher, aber nicht mehr sehr nützlich.
JJJ
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.