导入单个数据库从--all-databases dump

10 浏览
0 Comments

导入单个数据库从--all-databases dump

是否可能从一个--all-databases的mysqldump中导入单个数据库?我猜我可以手动修改文件,但想知道是否有任何命令行选项可以做到这一点。

我正在迁移服务器,有很多数据库,其中大部分我目前不需要或者暂时不想要,但是如果需要的话,我希望有恢复单个数据库的选项。

0
0 Comments

问题的原因是在导入从--all-databases dump生成的文件时,可能会由于表的字母顺序不符合外键约束而导致导入失败。

解决方法是在使用Hetzbh建议的sed方法时,需要手动将原始dump文件的开头和结尾的几行代码复制到通过sed处理后生成的剥离文件中。这些代码的示例如下:

/*!40101 SET _CHARACTER_SET_CLIENT=@_SET_CLIENT */;

/*!40101 SET _CHARACTER_SET_RESULTS=@_SET_RESULTS */;

/*!40101 SET _COLLATION_CONNECTION=@_CONNECTION */;

/*!40101 SET NAMES utf8mb4 */;

/*!40103 SET _TIME_ZONE=@_ZONE */;

/*!40103 SET TIME_ZONE='+00:00' */;

/*!40014 SET _UNIQUE_CHECKS=@_CHECKS, UNIQUE_CHECKS=0 */;

/*!40014 SET _FOREIGN_KEY_CHECKS=@_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

/*!40101 SET _SQL_MODE=@_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;

/*!40111 SET _SQL_NOTES=@_NOTES, SQL_NOTES=0 */;

/*!40103 SET TIME_ZONE=_TIME_ZONE */;

/*!40101 SET SQL_MODE=_SQL_MODE */;

/*!40014 SET FOREIGN_KEY_CHECKS=_FOREIGN_KEY_CHECKS */;

/*!40014 SET UNIQUE_CHECKS=_UNIQUE_CHECKS */;

/*!40101 SET CHARACTER_SET_CLIENT=_CHARACTER_SET_CLIENT */;

/*!40101 SET CHARACTER_SET_RESULTS=_CHARACTER_SET_RESULTS */;

/*!40101 SET COLLATION_CONNECTION=_COLLATION_CONNECTION */;

/*!40111 SET SQL_NOTES=_SQL_NOTES */;

这样做是为了确保导入过程中外键约束能够得到正确的遵守,以免导入失败(例如出现"errno: 150 Foreign key constraint is incorrectly formed"的错误)。

0
0 Comments

问题的原因是使用mysqldump --all-databases导出的SQL文件中包含了对所有数据库的操作命令,包括删除和创建数据库的命令。当我们使用mysql -D mydatabase -o mydatabase < dump.sql导入SQL文件时,只有指定的数据库mydatabase会执行相应的命令。

解决方法是在导入SQL文件之前,先创建一个只有指定数据库权限的用户,并使用该用户的凭据执行导入命令。这样虽然会遇到切换数据库时的错误,但是指定数据库的数据会被保留,而其他数据库不会被覆盖。

需要注意的是,使用-D选项在读取由mysqldump --all-databases生成的SQL文件时没有效果。而且该方法还会在mysql模式中DROP和CREATE表,包括用户表。

经过测试,使用-o选项确保了其他数据库不会被覆盖,因此可以重新考虑之前的评论。

0