在不使用mysqldump的情况下复制/复制数据库

时间:2020-03-05 18:42:45  来源:igfitidea点击:

如果没有本地访问服务器,是否有任何方法可以将MySQL数据库(包含内容和不包含内容)复制/克隆到另一个数据库中而无需使用" mysqldump"?

我目前正在使用MySQL 4.0。

解决方案

回答

我们可以通过运行以下命令来复制没有数据的表:

CREATE TABLE x LIKE y;

(请参阅MySQL CREATE TABLE Docs)

我们可以编写一个脚本,从一个数据库获取" 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也有一些脚本,这些脚本可能对同步数据很有帮助。它可能不会更快,但是我们可以在实时数据上运行它们的同步脚本而无需太多锁定。

回答

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