是否可以从--all-databases mysqldump导入单个数据库?我想我可以手动修改文件,但想知道是否有任何命令行选项来执行此操作。
我正在移动服务器并拥有大量数据库,其中大部分目前我不需要或不想要,但如果需要,可以选择恢复单个数据库。
答案 0 :(得分:71)
mysqldump
输出只是一组SQL
语句。
您可以在命令行中提供所需的数据库,并使用以下命令跳过针对其他数据库的命令:
mysql -D mydatabase -o mydatabase < dump.sql
这只会在mydatabase
正在使用时执行命令
答案 1 :(得分:63)
您可以使用以下命令:
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 - 见his page)
答案 2 :(得分:0)
在使用Hetzbh建议的sed
方法时,请确保手动复制原始转储中的开头和结尾行,例如
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
和
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
分别到sed生成的剥离文件的开头和结尾。否则,导入可能会由于转储表中的字母顺序(即errno: 150 "Foreign key constraint is incorrectly formed"
)不受外部约束而失败。