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

我目前使用的是MySQL 4.0。


当前回答

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

其他回答

如果你使用的是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

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

我可以看到你说你不想使用mysqldump,但我在寻找类似的解决方案时到达了这个页面,其他人也可能会找到它。考虑到这一点,这里有一个从windows服务器的命令行复制数据库的简单方法:

使用MySQLAdmin或您喜欢的方法创建目标数据库。在本例中,db2是目标数据库,源数据库db1将在其中复制。 在命令行中执行以下语句:

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

注意:-p和[password]之间没有空格

实际上,我想在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;

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

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