我在服务器上有一个包含120张表的数据库。
我想要克隆整个数据库到一个新的数据库名称,并复制所有数据。
有没有一种高效的方法来完成这个任务?
$ mysqldump yourFirstDatabase -u user -ppassword > yourDatabase.sql
$ mysql yourSecondDatabase -u user -ppassword < yourDatabase.sql
-ppassword
和 --password=<password>
是一样的(我不知道那个命令选项)...所以这是我的投票 ;) - superjosmysqldump -u <user> --password=<password> <DATABASE_NAME> | mysql -u <user> --password=<password> -h <hostname> <DATABASE_NAME_NEW>
与已接受的答案相似,但不包括 .sql 文件:
mysqldump sourcedb -u <USERNAME> -p<PASS> | mysql destdb -u <USERNAME> -p<PASS>
如果您使用phpMyAdmin
MySQL Utilities包中有一个名为mysqldbcopy的工具。 http://dev.mysql.com/doc/mysql-utilities/1.3/en/mysqldbcopy.html
如果您想确保它是一个完全克隆,接收数据库需要完全清除/删除。这样,新的数据库只有您导入文件中的表,没有其他任何内容。否则,您的接收数据库可能会保留未在导入文件中指定的表。
以前答案的示例:
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。
$ mysqldump yourFirstDatabase -u 用户 -ppassword --routines > yourDatabase.sql
$ mysql yourSecondDatabase -u 用户 -ppassword < yourDatabase.sql
-这种方法将获取包括存储过程在内的转储数据。
$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']."`");
}