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

我目前使用的是MySQL 4.0。


当前回答

没有mysqldump克隆数据库表的最好方法:

创建一个新数据库。 使用query创建clone-queries: SET @NewSchema = 'your_new_db'; SET @OldSchema = 'your_exists_db'; SELECT CONCAT('CREATE TABLE ',@NewSchema,')。',table_name,' LIKE ', TABLE_SCHEMA,'.',table_name,';插入',@NewSchema,'。”,table_name“SELECT * FROM”,TABLE_SCHEMA。“table_name,”,”) 从information_schema。TABLE_SCHEMA = @OldSchema AND TABLE_TYPE != 'VIEW'; 运行输出!

但是请注意,上面的脚本只是快速克隆表-而不是视图,触发器和用户函数:你可以通过mysqldump——no-data——triggers -uroot -ppassword快速获得结构,然后使用仅克隆插入语句。

为什么这是实际问题?因为如果DB超过2Gb, mysqldump的上传速度非常慢。你不能仅仅通过复制DB文件来克隆InnoDB表(比如快照备份)。

其他回答

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

在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

我真的不知道你说的“本地访问”是什么意思。 但是对于这个解决方案,你需要能够通过ssh访问服务器来复制数据库存储的文件。

我不能使用mysqldump,因为我的数据库很大(7Go, mysqldump失败) 如果2个mysql数据库的版本差异太大,可能无法工作,您可以使用mysql -V检查您的mysql版本。

1)将数据从远程服务器复制到本地计算机(vps是远程服务器的别名,可以用root@1.2.3.4代替)

ssh vps:/etc/init.d/mysql stop
scp -rC vps:/var/lib/mysql/ /tmp/var_lib_mysql
ssh vps:/etc/init.d/apache2 start

2)导入在本地复制的数据

/etc/init.d/mysql stop
sudo chown -R mysql:mysql /tmp/var_lib_mysql
sudo nano /etc/mysql/my.cnf
-> [mysqld]
-> datadir=/tmp/var_lib_mysql
/etc/init.d/mysql start

如果您有不同的版本,则可能需要运行

/etc/init.d/mysql stop
mysql_upgrade -u root -pPASSWORD --force #that step took almost 1hrs
/etc/init.d/mysql start

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

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

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

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