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?
Antworten:
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,
Sie können alle Datenbanken mit
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.
quelle
netcat
.Ich habe kürzlich eine 30-GB-Datenbank mit der folgenden Strategie verschoben:
Alter Server
~/mysqldata/*
)tar -czvf mysqldata.tar.gz ~/mysqldata
)Neuer Server
tar -xzvf mysqldata.tar.gz
)quelle
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 :
Es gibt zwei Hauptmethoden, die auf der Speicherengine basieren, um einzelne Tabellen zu verschieben.
Für das gegebene Beispiel nehmen wir folgendes an:
MyISAM-Tabellen
Wenn mydb.mytable die MyISAM-Speicher-Engine verwendet, wird die Tabelle physisch als drei separate Dateien dargestellt
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:
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 stop
auf ServerASchritt 06) Führen Sie eine weitere rsync durch
Schritt 07)
scp ServerA:/etc/my.cnf ServerB:/etc/
Schritt 08)
service mysql start
auf ServerBSchritt 08)
service mysql start
auf 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
quelle
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).
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.)
quelle
--all-databases
speichert 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)mysqldump
behandelt Benutzer und Berechtigungen, da diese immysql
Schema gespeichert sind .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:
Beachten Sie, dass die SQL-Back-Datei mit dem Programm mysqldump erstellt wird und die Wiederherstellung direkt in mysql erfolgt .
quelle
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.
quelle
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:
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.
quelle
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:
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:
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).
quelle
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
rsync
alsscp
und nicht komprimiert die Datei , wenn Sie dies oft tun.Auf meinem Quellserver:
Auf meinem Zielserver:
Auf beiden Rechnern wird der Fortschritt angezeigt:
Dies alles setzt voraus, dass Sie auf beiden Computern eine MySQL-Konfigurationsdatei in Ihrem Home-Verzeichnis haben und die Berechtigungen festlegen:
quelle
Verschieben Sie es auf einen anderen MySQL-Server DB? Wenn dies der Fall ist, exportieren Sie es
quelle
Generische Linux-Methode:
Bearbeiten Sie den Datadir (und den Socket) für mysqld und mysqld_safe (falls zutreffend), um auf den neuen Speicherort zu verweisen
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.
quelle
Vielleicht ist dies eine bessere Möglichkeit:
Version 1 : Kopie der Datendateien (nur MYISAM)
Version 2 : mysqldump
Version 3 : master / slave + mysqldump / file-copy
Skript:
PS:
um kleine Tabellen zu kopieren, benutze:
quelle
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.
quelle