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

我目前使用的是MySQL 4.0。


当前回答

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

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

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

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

其他回答

请注意,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

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

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

一个SQL,显示SQL命令,需要运行复制一个数据库从一个数据库到另一个。对于每个表,都有创建表语句和插入语句。它假设两个数据库都在同一台服务器上:

select @fromdb:="crm";
select @todb:="crmen";

SET group_concat_max_len=100000000;


SELECT  GROUP_CONCAT( concat("CREATE TABLE `",@todb,"`.`",table_name,"` LIKE `",@fromdb,"`.`",table_name,"`;\n",
"INSERT INTO `",@todb,"`.`",table_name,"` SELECT * FROM `",@fromdb,"`.`",table_name,"`;") 

SEPARATOR '\n\n')

as sqlstatement
 FROM information_schema.tables where table_schema=@fromdb and TABLE_TYPE='BASE TABLE';

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

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

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

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