从--all-databases转储导入单个数据库


77

是否可以从--all-databases mysqldump导入单个数据库?我想我可以手动修改文件,但想知道是否有任何命令行选项可以执行此操作。

我正在移动服务器,并拥有许多数据库,目前我目前不需要或不希望使用其中的大多数数据库,但是如果需要,可以选择还原单个数据库。

Answers:


83

mysqldump输出只是一组SQL语句。

您可以在命令行中提供所需的数据库,并使用以下命令针对其他数据库跳过命令:

mysql -D mydatabase -o mydatabase < dump.sql

这只会mydatabase在使用时执行命令


感谢您的快速回答!太棒了
savageguy

2
对我非常有用,谢谢!您可以添加--disable-keys以避免外键错误;)mysql -u用户-D --disable-keys数据库-o <dump.sql
davidselo 2012年

25
这是非常鲁ck的答案,而且非常危险。如果启动mysqldump --all-databases,则mysqldump输出将包含DROP DATABASE IF EXISTS dbname; CREATE DATABASE dbname; USE dbname;MySQL实例中每个数据库的内容,包括mysql模式。请查看mysqldump文档:dev.mysql.com/doc/refman/5.5/en/…。这意味着每个数据库都会被无情地覆盖。您能否提供证明,它将跳过所有数据库,只有一个?注意:您可以使用mysqlbinlog对二进制日志执行此操作。
RolandoMySQLDBA 2014年

4
对于偏执狂,我首先创建了一个仅对特定数据库拥有权限的用户,然后使用该用户的凭据运行此命令。尝试切换数据库时出现错误,但保留了特定数据库的数据。
topher

11
这个答案是不正确的。从mysqldump --all-databases生成的文件中读取MySQL语句时,-D选项无效。此外,它将在mysql模式中包括用户表的DROP和CREATE表。
2015年

96

您可以使用以下命令:

mysql -u root -p --one-database destdbname < alldatabases.sql

destdbname您要还原的所需数据库在哪里。

恕我直言,另一种更为安全的选择是从--all-databases转储中提取数据库。例:

sed -n '/^-- Current Database: `dbname`/,/^-- Current Database: `/p' alldatabases.sql > output.sql

替换dbname为所需的数据库名称。alldatabases.sql是sql-dump文件的名称。这样,您将拥有单独的数据库文件,然后可以使用简单的mysql命令进行还原。

(版权归:Darren Mothersele-参见他的页面


4
很好的解决方案!这表示我必须添加原始转储标头,以避免出现一些错误...
Neuro

1
这应该是正确的答案
Bysander

请注意,这在Powershell中不起作用,但在cmd中起作用
Somnium

sed真的很有帮助!
寿果牧岛

2
How do you say另一种选择是恕我直言更安全?使用中有任何风险--one-database吗?
阿卜杜勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.