没有本地访问服务器,有没有办法将MySQL数据库(包含内容和没有内容)复制/克隆到另一个不使用mysqldump
?
我目前正在使用MySQL 4.0.
我可以看到你说你不想使用mysqldump
,但我在寻找类似的解决方案时到达了这个页面,而其他人也可能会找到它.考虑到这一点,这是从Windows服务器的命令行复制数据库的简单方法:
使用MySQLAdmin或您首选的方法创建目标数据库.在此示例中,db2
是目标数据库,其中db1
将复制源数据库.
在命令行上执行以下语句:
mysqldump -h [server] -u [user] -p[password] db1 | mysql -h [server] -u [user] -p[password] db2
注意:-p
和之间没有空格[password]
您可以通过运行来复制没有数据的表:
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
!
编辑 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
在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