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.
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.
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:
db2
ist die Zieldatenbank, wobei die Quelldatenbank db1
kopiert werden.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]
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.
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
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
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 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.