MySQL恢复到不同的数据库

29

我使用以下命令备份生产数据库:

mysqldump -u root --opt --skip-extended-insert --databases my_production_db

导出的转储文件顶部附近有以下几行:

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `my_production_db` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `my_production_db `;
为了将数据库恢复到不同的目标位置,即 my_debvelopment_db,我需要打开转储文件并编辑其中命名数据库的部分。然后我运行:
mysql -u root  -p <password> < mydumpfile

我还没有想到其他的方法。

随着数据库变得越来越大,这种方法变得不切实际。

我是否漏掉了什么?我能否指定恢复数据库的位置?我需要使用不同的备份命令吗?

5个回答

57

@minaz的答案很好,但我想再补充一点。

问题是由于--databases关键字引起的。如果你省略这个关键字,它将不包含任何数据库创建内容。

因此,请不要使用--databases关键字进行转储。

mysqldump -u username -p database_name > dump.sql

并将其恢复为目标数据库名称。

mysql -u username -p target_database_name < dump.sql

另外,有几种方法可以做到这一点。请参见此处(dba.stackexchange)的类似问题。


我相信-p database_name这个命令存在错误,因为-p--password的简写,而不是数据库名称。 - Hibou57
14
谢谢您的留言,@Hibou57。是的,-p代表--password,正如您所提到的那样。但是,-p实际上意味着“我将通过提示输入密码”。如果您想通过命令选项输入密码,那么就不应该有空格,例如-p<your_password>而不是-p <your_password> - lqez
http://dev.mysql.com/doc/refman/5.5/en/mysql-command-options.html#option_mysql_password - lqez

18

如果您在指定数据库名称的情况下删除选项--databases,则不会获得创建数据库语句。也就是说:

mysqldump -u root --opt --skip-extended-insert  my_production_db

在您的开发机上,只需创建您希望还原到的任何数据库。


4
即使在没有使用--databases选项的情况下,似乎mysqldump仍然会在转储中生成对数据库名称的引用。至少我在一个数据库转储中遇到了一些ALTER DATABASE \dbname` CHARACTER SET utf8 COLLATE utf8_bin的问题,而没有使用--databases`选项。而且这里有两个这样的引用,第二个覆盖了第一个。 - Hibou57

4
在Windows XAMPP中,我使用以下命令来实现此目的。
导出:
mysqldump -u root -p mydb > mydb.sql

导入

mysql -u root -p mynewdb < mydb.sql

谢谢,这正是我想要的简单克隆数据库到另一个的方法。首先创建数据库模式,然后运行这些命令。 - Bobby Bridgeman

3
如果您已经有了转储文件,可以删除用于创建和使用数据库的命令。只需删除第四行和新的第五行即可。
sed '4d' dump.sql | sed '5d' > dump-striped.sql

1
最好只显示要删除的行。只有两行。您提供的方法是随意的 - 特别是如果格式更改或存在其他手动编辑。 - B. Shea

0
假设它是用--databases创建的。
您可以使用以下的sed脚本。
sed -n '/-- Current Database:/,/-- Table structure for table /!p' dump.sql

这假设数据库的创建和切换是按照以下方式编写的。
--
-- Current Database: `mydatabase`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mydatabase` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;

USE `mydatabase`;

--
-- Table structure for table `myfirsttable`
--

所以这将从转储文件的文本块中剥离出所有内容。

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