Wie kann ich eine Datenbank von einem Server auf einen anderen verschieben?


136

Wie kann ich MySQL-Tabellen von einem physischen Server auf einen anderen verschieben?

Genau wie dieses Szenario: Ich besitze einen MySQL-Server, der eine Innodb-Tabelle verwendet und ungefähr 20 GB groß ist.

Ich möchte es auf einen neuen Server verschieben. Was ist der effizienteste Weg, dies zu tun?


4
Ich würde xtrabackup percona.com/docs/wiki / ... verwenden. Es ist sehr ähnlich wie beim Kopieren, aber Sie können den Server am Laufen halten und davon ausgehen, dass Sie hauptsächlich Innodb-Tabellen verwenden (von denen Sie sagten, dass Sie sie haben). Sie können es als "heiß" betrachten. Backup auch.
Jonathan

Ich profitiere nicht davon, dass andere Leute dieses Tool verwenden. Es ist kostenlos / Open-Source und obwohl es von einer Firma hergestellt wurde, ist es einfach genug zu verwenden, dass Sie nicht in Betracht ziehen müssen, Unterstützung von dieser Firma zu kaufen.
Jonathan

Antworten:


80

Mein Lieblingsweg ist es, einen sqldump-Befehl an einen sql-Befehl weiterzuleiten. Sie können alle Datenbanken oder eine bestimmte Datenbank erstellen. So zum Beispiel,

mysqldump -uuser -ppassword myDatabase | mysql -hremoteserver -uremoteuser -premoteserverpassword 

Sie können alle Datenbanken mit

mysqldump --all-databases -uuser -ppassword | mysql -hremoteserver -uremoteuser -premoteserver 

Das einzige Problem ist, wenn die Datenbank zu groß ist und die Pipe zusammenbricht. In diesem Fall können Sie Tabelle für Tabelle oder eine der folgenden Methoden ausführen.


4
Tipp: Wenn keine der beiden Datenbanken Remoteverbindungen zulässt, leiten Sie durch netcat.
Bart van Heukelom

1
Damit dies für mich funktioniert, musste ich eine leere Datenbank mit demselben Namen auf dem Remote-Server erstellen und den Namen dieser Datenbank am Ende des Befehls hinzufügen.
Zugwalt 18.11.13 um 15.05

1
Dies ist elegant, aber ohne Komprimierung kaum schnell genug für 20 GB Datenbank.
Daddy32

Diese Lösung eignet sich nur für ein vollständig kontrolliertes Netzwerk (wenn und nur wenn Sie sich in einem sicheren privaten Netzwerk befinden, lesen Sie: nicht im Internet)! Aber schnelle und einfache Lösung!
30.

Das ist blitzschnell! Aber was @Zugwalt sagte, traf auch auf mich zu. Der Befehl funktionierte nicht, bis ich die Datenbank erstellt hatte (leer). Add fügte den Datenbanknamen am Ende des Befehls hinzu.
Skeets

65

Ich habe kürzlich eine 30-GB-Datenbank mit der folgenden Strategie verschoben:

Alter Server

  • Stoppen Sie den MySQL-Server
  • Kopieren Sie den Inhalt von datadir an einen anderen Ort auf der Festplatte ( ~/mysqldata/*)
  • Starten Sie den MySQL-Server erneut (die Ausfallzeit betrug 10-15 Minuten)
  • komprimiere die Daten ( tar -czvf mysqldata.tar.gz ~/mysqldata)
  • Kopieren Sie die komprimierte Datei auf einen neuen Server

Neuer Server

  • Installiere MySQL (starte nicht)
  • komprimierte Datei entpacken ( tar -xzvf mysqldata.tar.gz)
  • Verschieben Sie den Inhalt von mysqldata in den Datadir
  • Stellen Sie sicher, dass Ihre innodb_log_file_size auf dem neuen Server identisch ist. Wenn dies nicht der Fall ist , kopieren Sie die alten Protokolldateien nicht ( mysql generiert diese ).
  • Starten Sie MySQL

1
Überspringen Sie die Kopie nach dem Komprimieren / Dekomprimieren. Streamen Sie den Teer mit ssh über das Netzwerk, oder verwenden Sie (genau dann, wenn Sie sich in einem sicheren privaten Netzwerk befinden: nicht im Internet) netcat, um den Verschlüsselungsaufwand zu vermeiden. Auch wenn in einem lokalen Netzwerk das Gzipping überspringt, wenn Sie ein schnelles Netzwerk Rohr haben finden Sie die Übertragung auf einem verdübelt Kernspinn Engpass die Kompression zu tun
atxdba

Dies funktioniert sowohl für Innodb und Myisam? Auch MySQL-Benutzer sind in datadir als auch?
Giorgio79

2
@ giorgio79 sicher solange du die ibdata dateien mit verschiebst. Standardmäßig befinden sich diese im Datadir. MySQL-Benutzer werden im Ordner mysql in einem Benutzertabellenbereich gespeichert.
Derek Downey

2
Funktioniert dieses Verfahren für die Umstellung von Windows auf Linux?
ypercubeᵀᴹ

2
@TypoCubeᵀᴹ Es tut mir leid, dass ich über zwei Jahre gebraucht habe, um zu antworten, aber es hätte mir geholfen, wenn jemand definitiv gesagt hätte: "Ja, es funktioniert von Windows zu Linux". In meinem Fall habe ich von Windows Server 2012 R2 auf Cent OS (Red Hat 4.8.5-11) umgestellt . Die spezifische MySQL-Version war Maria DB 10.1 . Wie vorgeschrieben habe ich beide mysql-Dienste gestoppt, das Datenverzeichnis synchronisiert und beim Starten des mysql-Dienstes auf dem neuen Server waren alle Datenbanken, Datenbanktabellen und Datenbankbenutzer vollständig intakt.
WEBjuju

30

In Kapitel 32, Abschnitt 32.3.4, Seiten 456, 457 werden gemäß dem MySQL 5.0 Certification Study Guide die Bedingungen für die binäre Portabilität beschrieben , die Folgendes hervorheben :

Die Binärportabilität ist wichtig, wenn Sie eine auf einem Computer erstellte Binärsicherung auf einem anderen Computer mit einer anderen Architektur verwenden möchten. Die Verwendung einer Binärsicherung ist beispielsweise eine Möglichkeit, Datenbanken von einem MySQL-Server auf einen anderen zu kopieren.

Für MyISAM bedeutet die binäre Portabilität, dass Sie die Dateien für eine MyISAM-Tabelle direkt von einem MySQL-Server auf einen anderen auf einem anderen Computer kopieren können und der zweite Server auf die Tabelle zugreifen kann.

Binäre Portabilität bedeutet für InnoDB, dass Sie die Tablespace-Dateien direkt von einem MySQL-Server auf einem Computer auf einen anderen Server auf einem anderen Computer kopieren können und der zweite Server auf den Tablespace zugreifen kann. Standardmäßig werden alle von einem Server verwalteten InnoDB-Tabellen zusammen im Tablespace gespeichert. Die Portabilität des Tablespace hängt also davon ab, ob alle einzelnen InnoDB-Tabellen portierbar sind. Wenn auch nur eine Tabelle nicht portierbar ist, ist auch der Tablespace nicht portierbar.

MyISAM-Tabellen und InnoDB-Tablespaces können binär von einem Host auf einen anderen übertragen werden, wenn zwei Bedingungen erfüllt sind:

  • Beide Maschinen müssen eine Zweierkomplement-Ganzzahl-Arithmetik verwenden
  • Beide Maschinen müssen das IEEE-Gleitkommaformat verwenden, andernfalls dürfen die Tabellen keine Gleitkomma-Spalten enthalten (FLOAT oder DOUBLE).

In der Praxis sind diese beiden Bedingungen wenig einschränkend. Integer-Arithmetik mit Zweierkomplement und IEEE-Gleitkomma-Format sind die Norm für moderne Hardware. Eine dritte Bedingung für die Binärportabilität von InnoDB ist, dass Sie für Tabellen und Datenbanken Namen in Kleinbuchstaben verwenden. Dies liegt daran, dass InnoDB diese Namen intern (in seinem Datenwörterbuch) in Windows in Kleinbuchstaben speichert. Die Verwendung von Kleinbuchstaben ermöglicht die binäre Portabilität zwischen Windows und Unix. Um die Verwendung von Kleinbuchstaben zu erzwingen, können Sie die folgenden Zeilen in eine Optionsdatei einfügen:

[mysqld]
lower_case_table_names=1

Wenn Sie InnoDB für die Verwendung von tabellenbezogenen Tablespaces konfigurieren, werden die Bedingungen für die Binärportabilität erweitert, um auch die .ibd-Dateien für InnoDB-Tabellen einzuschließen. (Die Bedingungen für die freigegebenen Tablespaces gelten weiterhin, da sie das Datenwörterbuch enthalten, in dem Informationen zu allen InnoDB-Tabellen gespeichert sind.)

Wenn die Bedingungen für die Binärportabilität nicht erfüllt sind, können Sie MyISAM- oder InnoDB-Tabellen von einem Server auf einen anderen kopieren, indem Sie sie in einem Textformat (z. B. mit mysqldump) sichern und sie erneut auf den Zielserver laden.

Es gibt zwei Hauptmethoden, die auf der Speicherengine basieren, um einzelne Tabellen zu verschieben.

Für das gegebene Beispiel nehmen wir folgendes an:

  1. Datadir ist / var / lib / mysql
  2. Datenbank namens mydb
  3. Tabelle in der Mydb- Datenbank mit dem Namen mytable .

MyISAM-Tabellen

Wenn mydb.mytable die MyISAM-Speicher-Engine verwendet, wird die Tabelle physisch als drei separate Dateien dargestellt

  1. /var/lib/mysql/mydb/mytable.frm (.frm-Datei)
  2. /var/lib/mysql/mydb/mytable.MYD (.MYD-Datei)
  3. /var/lib/mysql/mydb/mytable.MYI (.MYI-Datei)

Die .frm enthält die Tabellenstruktur.
Die .MYD enthält die Tabellendaten.
Die .MYI enthält die Tabellenindexseite

Diese Dateien werden voneinander abhängig verwendet, um die Tabelle von einem logischen Standpunkt in MySQL aus darzustellen. Da diese Dateien keine weitere logische Zuordnung haben, migrieren Sie eine Tabelle von einem DB-Server auf einen anderen. Sie können dies sogar von einem Windows-Server auf einen Linux-Server oder ein MacOS. Natürlich können Sie mysql herunterfahren und die 3 Tabellendateien kopieren. Sie könnten Folgendes ausführen:

LOCK TABLES mydb.mytable READ;
SELECT SLEEP(86400);
UNLOCK TABLES;

Halten Sie in einer SSH-Sitzung die Tabelle als schreibgeschützt und halten Sie das Schloss 24 Stunden lang. Führen Sie die Kopie eine Sekunde später in einer anderen SSH-Sitzung aus. Beenden Sie dann die MySQL-Sitzung mit der 24-Stunden-Sperre. Sie müssen nicht 24 Stunden warten.

InnoDB-Tabellen

Basierend auf dem oben genannten Zitat aus dem Zertifizierungsbuch gibt es viele Faktoren, die das Sichern einer bestimmten InnoDB-Tabelle bestimmen. Führen Sie der Einfachheit, Klarheit und Kürze halber einfach einen mysqldump der gewünschten Tabelle mit den --single-transaction-Parametern durch, um einen perfekten Zeitpunkt-Dump der Tabelle zu erhalten. Sie müssen sich nicht mit der InnoDB-Semantik befassen, wenn Sie nur eine Tabelle benötigen. Sie können dieses Dumpfile auf einen beliebigen MySQL-Server Ihrer Wahl laden.

Da wurden hier zwei Fragen zusammengeführt (jcolebrand): EDIT

Wenn Sie mehr als gewillt sind, mit einer langsamen DB-Leistung zu leben, können Sie eine Reihe von Rsyncs vom alten Server (ServerA) zum neuen Server (ServerB) ausführen, auch wenn mysql noch auf ServerA ausgeführt wird.

Schritt 01) Installieren Sie auf ServerB dieselbe Version von MySQL wie auf ServerA

Schritt 02) Führen Sie auf ServerA eine Ausführung SET GLOBAL innodb_max_dirty_pages_pct = 0;von MySQL aus und ungefähr 10 Minuten (dies löscht schmutzige Seiten aus dem InnoDB- Pufferpool. Dies hilft auch, ein schnelleres Herunterfahren von MySQL durchzuführen.) Wenn Ihre Datenbank ausschließlich MyISAM ist, können Sie diesen Schritt überspringen.

Schritt 03) rsync --archive --verbose --stats --partial --progress --human-readable ServerA:/var/lib/mysql ServerB:/var/lib/mysql

Schritt 04) Wiederholen Sie Schritt 03, bis eine Synchronisierung weniger als 1 Minute dauert

Schritt 05) service mysql stopauf ServerA

Schritt 06) Führen Sie eine weitere rsync durch

Schritt 07) scp ServerA:/etc/my.cnf ServerB:/etc/

Schritt 08) service mysql startauf ServerB

Schritt 08) service mysql startauf ServerA (optional)

Versuche es !!!

VORBEHALT

Sie können einen solchen Replikationsslave erstellen. Denken Sie daran, die Server-ID explizit in der master /etc/my.cnf und eine andere Nummer für die Server-ID in der slave /etc/my.cnf festzulegen


29

Sie brauchen mysqldump nicht einmal, wenn Sie ein ganzes Datenbankschema verschieben, und Sie sind bereit, die erste Datenbank zu stoppen (sie ist also konsistent, wenn sie übertragen wird).

  1. Stoppen Sie die Datenbank (oder sperren Sie sie)
  2. Wechseln Sie in das Verzeichnis, in dem sich die MySQL-Datendateien befinden.
  3. Übertragen Sie den Ordner (und seinen Inhalt) in das mysql-Datenverzeichnis des neuen Servers
  4. Starten Sie die Sicherung der Datenbank
  5. Setzen Sie auf dem neuen Server den Befehl "Datenbank erstellen" ab.
  6. Erstellen Sie die Benutzer neu und erteilen Sie Berechtigungen.

Ich kann mich nicht erinnern, ob mysqldump mit Benutzern und Berechtigungen oder nur mit den Daten umgeht. Aber selbst wenn dies der Fall ist, ist dies viel schneller als ein Dump & Ausführen. Ich würde das nur verwenden, wenn ich eine MySQL-Datenbank ausgeben müsste, um sie dann erneut in ein anderes RDBMS einzufügen, wenn ich die Speicheroptionen ändern müsste (innodb vs. myisam) oder wenn ich die Hauptversionen von MySQL ändern würde (aber Ich glaube, ich habe das zwischen 4 und 5 gemacht.)


Dies ist effizienter, insbesondere wenn es sich um einen Sysadmin / DBA handelt. BTW mysqldump using --all-databasesspeichert das mysql-Schema. Wenn Sie mysql auf dem nächsten Computer starten, werden die Berechtigungen angezeigt, sofern Sie den Datenordner mit derselben Hauptversion von MySQL auf den anderen Computer übertragen haben. (MySQL 5.5.x zu MySQL 5.5.x, MySQL 5.1.x zu MySQL 5.1.x, MySQL 5.0.x zu MySQL 5.0.x)
RolandoMySQLDBA

4
@Joe, ja, mysqldumpbehandelt Benutzer und Berechtigungen, da diese im mysqlSchema gespeichert sind .
Shlomi Noach

Dieser Ansatz eignet sich besonders für Cloud-Hosting wie AWS. Sie können mysql stoppen, die Bereitstellung aufheben und die Verbindung zum aktuellen Server trennen. Verbinde und mounte den neuen Server und starte mysql. Kein Kopieraufwand, wenn das Volume in derselben Serverfarm verbleibt.
LateralFractal

12

Wenn Sie nur eine bestimmte Tabelle verschieben möchten, versuchen Sie Folgendes:

mysqldump -u username -ppassword databasename tablename > databasename.tablename.sql

Sie können weitere Tabellennamen im selben Befehl angeben. Verschieben Sie nach Abschluss des Befehls die Datei databasename.tablename.sql auf den anderen Server und stellen Sie sie mithilfe der folgenden Schritte wieder her:

mysql -u username -ppassword databasename < databasename.tablename.sql

Beachten Sie, dass die SQL-Back-Datei mit dem Programm mysqldump erstellt wird und die Wiederherstellung direkt in mysql erfolgt .


7
  1. Wenn Sie ssh-Zugriff haben, können Sie mysqldump über die Befehlszeile verwenden
  2. Wenn Sie keinen ssh-Zugang haben, aber phpMyAdmin-Zugang haben, können Sie ihn zum Exportieren / Importieren verwenden
  3. Wenn Sie keinen phpMyAdmin-Zugang haben, gibt es einige handliche php-Skripte, die kopiert und importiert werden (allerdings habe ich aus eigener Erfahrung noch nie eines gefunden, das so zuverlässig ist wie phpMyAdmin).

Es könnte diese Möglichkeit geben, in der Sie die tatsächlichen Datenbankdateien verschieben (für meine Installation befinden sie sich unter / var / lib / mysql), aber ich bin nicht wirklich sicher, wie es sich verhalten wird.


5

Sie müssen eine Ausfallzeit in Kauf nehmen. Es wird eine Weile dauern, je nachdem, wie schnell Ihr Netzwerk ist. Ich gehe davon aus, dass Sie MySQL unter Linux / Unix ausführen. Hier ist der Prozess, den ich benutze:

  1. Stoppen Sie den mysql-Daemon auf dem Quellhost.
  2. Erstellen Sie einen tmp-Ordner auf Ihrem Zielhost, um die Dateien zu empfangen.
  3. Verwenden Sie screen , um eine Shell-Sitzung zu erstellen, die überlebt, wenn die Verbindung zu Ihrem ssh getrennt wird.
  4. Verwenden Sie rsync , um die Dateien zwischen Hosts zu übertragen. So etwas wie: rsync -avhP source user @ targethost: / path / to / folder /
  5. Führen Sie Ihre Testfälle aus, um sicherzustellen, dass Sie bei der Übertragung nichts verloren haben.

Fahren Sie dann wie gewohnt fort, und richten Sie das lokale MySQL-Setup ein.

* Hinweis: Sie können auch den Parameter -c mit rsync verwenden, um der Übertragung eine Prüfsumme hinzuzufügen. Dies ist jedoch abhängig von der CPU-Geschwindigkeit langsam.


4

Ich kann bestätigen, dass die Methode von DTest auch für das Kopieren zwischen Ubuntu und Osx funktioniert.

So kopieren Sie alle Datenbanken, ohne dass ein Dump oder ähnliches ausgeführt werden muss:

Stellen Sie sicher, dass Sie ein sauberes mysql von mysql haben (installiert das von mysql heruntergeladene dmg http://cdn.mysql.com/Downloads/MySQL-5.1/mysql-5.1.63-osx10.6-x86_64.dmg ), das (VERY WICHTIG) wurde noch nie ausgeführt.

Kopieren Sie den Inhalt des Ordners / var / lib / mysql / vom Ubuntu-Computer über / usr / local / mysql / data / contents auf den Mac. Um Zugriff auf den Ordner auf dem Ubuntu-Computer zu erhalten, musste ich sudo verwenden, dh:

sudo cp /var/lib/mysql /home/foouser/mysql_data_folder
sudo chown -R foouser /home/foouser/mysql_data_folder

Ich habe den Ordner mit scp kopiert.

Bevor Sie anfangen, machen Sie eine Kopie des mysql-Ordners auf dem Mac, um sicherzustellen, dass Sie nichts vermasseln.

Führen Sie nach dem Kopieren des Ordners auf dem Mac-Computer die folgenden Schritte aus:

sudo chown -R _mysql /usr/local/mysql/data/
sudo chgrp -R wheel /usr/local/mysql/data/
sudo chmod -R g+rx /usr/local/mysql/data/

Starten Sie den MySQL-Server zum ersten Mal (im Einstellungsbereich unter Systemeinstellungen-> MySQL). Alle Benutzer und Datenbanken sollten jetzt korrekt eingerichtet sein.

Dies funktionierte mit MySQL 5.1.61 auf Ubuntu 64 Bit 11.10 und MySQL 5.1.63 auf OSX Lion (MacBook Pro).


4

Ich denke, dass alle früheren Antworten wahrscheinlich gut funktionieren, aber das Problem des Festlegens eines Datenbanknamens während der Übertragung nicht wirklich ansprechen.

So habe ich es gerade mit bash gemacht:

Sie könnten besser dran mit rsyncals scpund nicht komprimiert die Datei , wenn Sie dies oft tun.

Auf meinem Quellserver:

me@web:~$ d=members
me@web:~$ mysqldump $d | gzip > $d.sql.gz
me@web:~$ scp -i .ssh/yourkeynamehere $d.sql.gz $sbox:$d.sql.gz

Auf meinem Zielserver:

me@sandbox:~$ d1=members
me@sandbox:~$ d2=members_sb
me@sandbox:~$ mysqladmin create $d2
me@sandbox:~$ cat $d1.sql.gz | gunzip |  mysql $d2

Auf beiden Rechnern wird der Fortschritt angezeigt:

me@sandbox:~$ ls *.gz 
me@sandbox:~$ cat $d.sql.gz | gunzip |  less

Dies alles setzt voraus, dass Sie auf beiden Computern eine MySQL-Konfigurationsdatei in Ihrem Home-Verzeichnis haben und die Berechtigungen festlegen:

$ echo "
[client]
user=drupal6
password=metoknow
host=ord-mysql-001-sn.bananas.com
[mysql]
database=nz_drupal" > .my.cnf
$ chmod 0600 ~/.my.cnf

3

Verschieben Sie es auf einen anderen MySQL-Server DB? Wenn dies der Fall ist, exportieren Sie es

# mysqldump -u username -ppassword database_name > FILE.sql

Mysqldump? Dann haben Sie es mit kleinen Datenmengen zu tun?
Oh Chin Boon

2
Ich denke, klein / groß ist heutzutage ziemlich subjektiv. Als ich den Titel der Frage sah, erwartete ich, dass die Datenbank viel größer als 20 GB ist, um als "groß" eingestuft zu werden ...
Aaron Bertrand

3

Generische Linux-Methode:

/etc/init.d/mysqld stop
rsync -avz source_files destination
vi /etc/my.cnf

Bearbeiten Sie den Datadir (und den Socket) für mysqld und mysqld_safe (falls zutreffend), um auf den neuen Speicherort zu verweisen

/etc/init.d/mysql start

Ich habe dies gepostet, weil niemand einfach die geringste Anzahl von Schritten aufzulisten schien, um dies zu tun, und ich denke, es ist der einfachste Weg persönlich.


2

Vielleicht ist dies eine bessere Möglichkeit:

Version 1 : Kopie der Datendateien (nur MYISAM)

ssh server1
service mysql stop
cd $mysql-data-dir
rsync -avz dirs-or-files server2:$mysql-data-dir
service mysql start

SSH Server2-Dienst starten Sie MySQL neu

  • Wenn Ihre Datenbankdateien schreibgeschützt sind, können Sie das Stoppen des Servers überspringen.

Version 2 : mysqldump

Installieren Sie pigz - auf modernen Xeon- oder Opteron-Prozessoren ist es VIEL schneller als gzip, insbesondere wenn Sie zwei oder mehr CPUs haben.

ssh server1 
mysqldump ... | pigz > backup-YYMDD.sql.gz
rsync backup-YYMDD.sql.gz server:location

ssh server2
pigz -dc location/backup-YYMDD.sql.gz | mysql ..

Version 3 : master / slave + mysqldump / file-copy

In HA environment you should use the following trick:
setup slave server & do all backups from it
before backups - do "slave stop"; 
then do version 1 or version 2

Skript:

touch full.start
mysqladmin -h slave-db stop-slave
echo "show slave status \G" | mysql -h slave-db > FULL/comfi-$NOW.master-position
/usr/bin/mysqldump -h slave-db --default-character-set=utf8 -A --opt --skip-lock-tables | pigz > "FULL/XXXX-$NOW.sql.gz"
mysqladmin -h slave-db start-slave
touch full.end

ln -fs "FULL/XXXX-$NOW.sql.gz" FULL.sql.gz

PS:

um kleine Tabellen zu kopieren, benutze:

ssh server1 mysqldump schematabelle | SSH Server2 MySQL-Schema


2

Ich würde die zwei einfachen Schritte vorschlagen, um die gesamte Datenbank von einem Server auf einen anderen zu übertragen.

Schritt 1 : Führen Sie mit mysqldump eine vollständige Sicherung der Datenbanken auf dem Quellserver durch .

Schritt 2 : Mit dem Befehl rsync können Sie die gesamten Datenbanken auf den Zielserver übertragen.

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.