在不使用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