没有本地访问服务器,有没有办法复制/克隆一个MySQL数据库(有内容和没有内容)到另一个不使用mysqldump?

我目前使用的是MySQL 4.0。


当前回答

请注意,mysql实用工具....上有一个mysqldbcopy命令作为添加的一部分 https://dev.mysql.com/doc/mysql-utilities/1.5/en/utils-task-clone-db.html

其他回答

运行以下命令可以复制一个没有数据的表:

CREATE TABLE x LIKE y;

(参见MySQL CREATE TABLE文档)

您可以编写一个脚本,从一个数据库的SHOW TABLES中获取输出,并将模式复制到另一个数据库。你应该能够像这样引用模式+表名:

CREATE TABLE x LIKE other_db.y;

至于数据,你也可以在MySQL中做,但不一定快。创建引用后,可以运行以下命令复制数据:

INSERT INTO x SELECT * FROM other_db.y;

如果使用MyISAM,最好复制表文件;这样会快得多。如果你使用的是INNODB的每个表空间,你应该也能做到这一点。

如果你最终要执行INSERT INTO SELECT操作,请确保使用ALTER TABLE x DISABLE KEYS临时关闭索引!

EDIT Maatkit也有一些脚本,可能有助于同步数据。它可能不会更快,但您可能可以在没有太多锁定的情况下对实时数据运行他们的同步脚本。

在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

Mysqldump是个不错的解决方案。复制数据库的最简单方法:

mysqldump -uusername -ppass dbname1 |MySQL -uusername -ppass dbname2

此外,您可以通过以下方式更改存储引擎:

mysqldump -uusername -ppass dbname1 |sed 's/InnoDB/RocksDB/' |MySQL -uusername -ppass dbname2

实际上,我想在PHP中实现这一点,但这里没有一个答案是非常有用的,所以这里是我的-相当直接-使用MySQLi的解决方案:

// Database variables

$DB_HOST = 'localhost';
$DB_USER = 'root';
$DB_PASS = '1234';

$DB_SRC = 'existing_db';
$DB_DST = 'newly_created_db';



// MYSQL Connect

$mysqli = new mysqli( $DB_HOST, $DB_USER, $DB_PASS ) or die( $mysqli->error );



// Create destination database

$mysqli->query( "CREATE DATABASE $DB_DST" ) or die( $mysqli->error );



// Iterate through tables of source database

$tables = $mysqli->query( "SHOW TABLES FROM $DB_SRC" ) or die( $mysqli->error );

while( $table = $tables->fetch_array() ): $TABLE = $table[0];


    // Copy table and contents in destination database

    $mysqli->query( "CREATE TABLE $DB_DST.$TABLE LIKE $DB_SRC.$TABLE" ) or die( $mysqli->error );
    $mysqli->query( "INSERT INTO $DB_DST.$TABLE SELECT * FROM $DB_SRC.$TABLE" ) or die( $mysqli->error );


endwhile;

如果你使用的是Linux,你可以使用这个bash脚本: (它可能需要一些额外的代码清理,但它工作…它比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