441 Stimmen

Datenbank kopieren/duplizieren ohne mysqldump

Gibt es eine Möglichkeit, ohne lokalen Zugriff auf den Server eine MySQL-DB (mit und ohne Inhalt) in eine andere zu duplizieren/zu klonen, ohne mysqldump ?

Ich verwende derzeit MySQL 4.0.

687voto

Rafe Punkte 6983

Wie ich sehe, wollten Sie keine mysqldump aber ich bin auf diese Seite gestoßen, als ich nach einer ähnlichen Lösung suchte, und vielleicht finden andere sie auch. In diesem Sinne finden Sie hier eine einfache Möglichkeit, eine Datenbank über die Befehlszeile eines Windows-Servers zu duplizieren:

  1. Erstellen Sie die Zieldatenbank mit MySQLAdmin oder der von Ihnen bevorzugten Methode. In diesem Beispiel, db2 ist die Zieldatenbank, wobei die Quelldatenbank db1 kopiert werden.
  2. Führen Sie die folgende Anweisung in einer Befehlszeile aus:

mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2

Hinweis: Es gibt KEIN Leerzeichen zwischen -p y [password]

137voto

Gary Richardson Punkte 15543

Sie können eine Tabelle ohne Daten duplizieren, indem Sie den Befehl ausführen:

CREATE TABLE x LIKE y;

(Siehe die MySQL CREATE TABLE Docs)

Sie könnten ein Skript schreiben, das die Ausgabe von SHOW TABLES aus einer Datenbank und kopiert das Schema in eine andere. Sie sollten in der Lage sein, auf Schema+Tabellennamen zu verweisen wie:

CREATE TABLE x LIKE other_db.y;

Was die Daten betrifft, so können Sie das auch in MySQL machen, aber das ist nicht unbedingt schnell. Nachdem Sie die Verweise erstellt haben, können Sie folgendes ausführen, um die Daten zu kopieren:

INSERT INTO x SELECT * FROM other_db.y;

Wenn Sie MyISAM verwenden, ist es besser, die Tabellendateien zu kopieren; das geht viel schneller. Sie sollten dasselbe tun können, wenn Sie INNODB mit pro Tisch Tischplätze .

Wenn Sie am Ende doch eine INSERT INTO SELECT müssen Sie vorübergehend Indizes abschalten con ALTER TABLE x DISABLE KEYS !

エディテージ Maatkit hat auch einige Skripte, die für die Synchronisierung von Daten hilfreich sein können. Es ist vielleicht nicht schneller, aber Sie könnten deren Synchronisierungsskripte wahrscheinlich mit Live-Daten ausführen, ohne viel zu blockieren.

60voto

jozjan Punkte 739

Wenn Sie Linux verwenden, können Sie dieses Bash-Skript verwenden: (es muss vielleicht noch etwas Code bereinigt werden, aber es funktioniert ... und es ist viel schneller als mysqldump|mysql)

#!/bin/bash

DBUSER=user
DBPASSWORD=pwd
DBSNAME=sourceDb
DBNAME=destinationDb
DBSERVER=db.example.com

fCreateTable=""
fInsertData=""
echo "Copying database ... (may take a while ...)"
DBCONN="-h ${DBSERVER} -u ${DBUSER} --password=${DBPASSWORD}"
echo "DROP DATABASE IF EXISTS ${DBNAME}" | mysql ${DBCONN}
echo "CREATE DATABASE ${DBNAME}" | mysql ${DBCONN}
for TABLE in `echo "SHOW TABLES" | mysql $DBCONN $DBSNAME | tail -n +2`; do
        createTable=`echo "SHOW CREATE TABLE ${TABLE}"|mysql -B -r $DBCONN $DBSNAME|tail -n +2|cut -f 2-`
        fCreateTable="${fCreateTable} ; ${createTable}"
        insertData="INSERT INTO ${DBNAME}.${TABLE} SELECT * FROM ${DBSNAME}.${TABLE}"
        fInsertData="${fInsertData} ; ${insertData}"
done;
echo "$fCreateTable ; $fInsertData" | mysql $DBCONN $DBNAME

13voto

mr_app Punkte 1264

In PHP:

function cloneDatabase($dbName, $newDbName){
    global $admin;
    $db_check = @mysql_select_db ( $dbName );
    $getTables  =   $admin->query("SHOW TABLES");   
    $tables =   array();
    while($row = mysql_fetch_row($getTables)){
        $tables[]   =   $row[0];
    }
    $createTable    =   mysql_query("CREATE DATABASE `$newDbName` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;") or die(mysql_error());
    foreach($tables as $cTable){
        $db_check   =   @mysql_select_db ( $newDbName );
        $create     =   $admin->query("CREATE TABLE $cTable LIKE ".$dbName.".".$cTable);
        if(!$create) {
            $error  =   true;
        }
        $insert     =   $admin->query("INSERT INTO $cTable SELECT * FROM ".$dbName.".".$cTable);
    }
    return !isset($error);
}

// usage
$clone  = cloneDatabase('dbname','newdbname');  // first: toCopy, second: new database

4voto

furicle Punkte 1107

Beachten Sie, dass es einen mysqldbcopy-Befehl als Teil der zusätzlichen mysql-Utilities gibt.... https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html

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