我在拥有120个表的服务器上有数据库。
我想用新的数据库名称和复制的数据克隆整个数据库。
有一种有效的方法吗?
答案 0 :(得分:94)
$ mysqldump yourFirstDatabase -u user -ppassword > yourDatabase.sql
$ mysql yourSecondDatabase -u user -ppassword < yourDatabase.sql
答案 1 :(得分:28)
mysqldump -u <user> --password=<password> <DATABASE_NAME> | mysql -u <user> --password=<password> -h <hostname> <DATABASE_NAME_NEW>
答案 2 :(得分:11)
喜欢接受的答案,但没有.sql文件:
mysqldump sourcedb -u <USERNAME> -p<PASS> | mysql destdb -u <USERNAME> -p<PASS>
答案 3 :(得分:5)
如果您使用phpMyAdmin
答案 4 :(得分:3)
MySQL Utilities包中有 mysqldbcopy 工具。 http://dev.mysql.com/doc/mysql-utilities/1.3/en/mysqldbcopy.html
答案 5 :(得分: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
(see mysql docs)可以轻松进行更改。这会将drop语句添加到sqldump中,因此您的新数据库将是精确的副本:
$ 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
答案 6 :(得分:-1)
$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']."`");
}