克隆 MySQL 数据库

63

我在服务器上有一个包含120张表的数据库。

我想要克隆整个数据库到一个新的数据库名称,并复制所有数据。

有没有一种高效的方法来完成这个任务?


1
这对我非常有帮助:https://dev59.com/V3RB5IYBdhLWcg3wQVWV#lH0foYgBc1ULPQZFC8Cc - Ryan
8个回答

117
$ mysqldump yourFirstDatabase -u user -ppassword > yourDatabase.sql
$ mysql yourSecondDatabase -u user -ppassword < yourDatabase.sql

1
这真的很好而且容易。谢谢! - MartyIX
11
可能对大多数人来说很明显,但我在第一次尝试时错过了。这应该从常规命令行中完成,而不是从mysql提示符中完成。此外,您可能需要在“mysqldump”(第一行)之后和“mysql”(第二行)之后添加“-uroot”或您的用户名。 - charliepark
如果这个答案还包括用户/密码命令行选项,我会投赞成票的。 - superjos
3
我猜 -ppassword--password=<password> 是一样的(我不知道那个命令选项)...所以这是我的投票 ;) - superjos
29
需要注意的是,这并不会创建新的数据库。您首先需要创建新的数据库(在此示例中为“yourSecondDatabase”),然后运行上述命令。 - Kevin Bradshaw
显示剩余3条评论

30
mysqldump -u <user> --password=<password> <DATABASE_NAME> | mysql -u <user> --password=<password> -h <hostname> <DATABASE_NAME_NEW>

1
这个方法的速度是否和使用mysqldump和mysqlimport一样快,就像这些说明里面所说的那样?http://dev.mysql.com/doc/refman/5.5/en/copying-databases.html - Adam Nelson
现在针对5.6版本,请访问:https://dev.mysql.com/doc/refman/5.6/en/mysqldump-copying-database.html。 - Felix

24

与已接受的答案相似,但不包括 .sql 文件:

mysqldump sourcedb -u <USERNAME> -p<PASS> | mysql destdb -u <USERNAME> -p<PASS>

2
请注意,您需要首先创建“destdb”。 - GetoX
这个解决方案更好,因为避免了磁盘I/O操作 --> 对于大型数据库更好 - Xavier
而且它非常快速。 - sglessard
我尝试过这个,但对我没有用。仍然不知道为什么。 - Walter

7

如果您使用phpMyAdmin

  1. 从phpMyAdmin主屏幕中点击数据库选择要复制的数据库。
  2. 进入数据库后,选择操作选项卡。
  3. 向下滚动到“将数据库复制到:”部分。
  4. 键入新数据库的名称。
  5. 选择“结构和数据”以复制所有内容。或者,如果您只想要列而不是数据,则可以选择“仅结构”。
  6. 选中“在复制之前创建数据库”的复选框以创建新数据库。
  7. 选中“添加AUTO_INCREMENT值”的复选框。
  8. 点击“Go”按钮继续。

正是我所寻找的。 - mmv-ru

4

1
我尝试使用mysqldbcopy工具,但遇到了各种问题:需要很多特权(例如在某些时候需要SUPER特权!),无法复制外键等。最终我退回到mysqldump解决方案 - 这更简单、更好。 - mortensi
1
这绝对是(至少对我来说)克隆近4GB数据库的最快方法。我印象深刻!!! - John Anderton
链接和工具有一天被移除了。 - Moshe L

0

如果您想确保它是一个完全克隆,接收数据库需要完全清除/删除。这样,新的数据库只有您导入文件中的表,没有其他任何内容。否则,您的接收数据库可能会保留未在导入文件中指定的表。
以前答案的示例:

DB1 == tableA, tableB
DB2 == tableB, tableC
DB1 imported to -> DB2
DB2 == tableA, tableB, tableC //true clone should not contain tableC

使用--databases--add-drop-database请参阅mysql文档)可以轻松进行更改。这将在sqldump中添加drop语句,使您的新数据库成为精确的副本:

$ mysqldump -h $ip -u $user -p$pass --databases $dbname --add-drop-database > $file.sql
$ mysql -h $ip $dbname -u $user -p$pass < $file.sql

当然要替换$变量,而且像往常一样,在密码和-p之间不要留空格。为了增强安全性,请从您的命令中删除-p$pass。


-2

$ mysqldump yourFirstDatabase -u 用户 -ppassword --routines > yourDatabase.sql

$ mysql yourSecondDatabase -u 用户 -ppassword < yourDatabase.sql

-这种方法将获取包括存储过程在内的转储数据。


根据目前的写法,你的回答不够清晰。请编辑以添加更多细节,帮助其他人理解这如何回答所提出的问题。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

-2
$newdb = (date('Y')-1);
$mysqli->query("DROP DATABASE `".$newdb."`;");
$mysqli->query("CREATE DATABASE `".$newdb."`;");

$query = "
SELECT
TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA LIKE 'rds'
";
$result = $mysqli->query($query)->fetch_all(MYSQLI_ASSOC);
foreach($result as $val) {
    echo $val['TABLE_NAME'].PHP_EOL;
    $mysqli->query("CREATE TABLE `".$newdb."`.`".$val['TABLE_NAME']."` LIKE rds.`".$val['TABLE_NAME']."`");
    $mysqli->query("INSERT `".$newdb."`.`".$val['TABLE_NAME']."` SELECT * FROM rds.`".$val['TABLE_NAME']."`");
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接