导入单个数据库从--all-databases dump
问题的原因是在导入从--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"的错误)。
问题的原因是使用mysqldump --all-databases
导出的SQL文件中包含了对所有数据库的操作命令,包括删除和创建数据库的命令。当我们使用mysql -D mydatabase -o mydatabase < dump.sql
导入SQL文件时,只有指定的数据库mydatabase
会执行相应的命令。
解决方法是在导入SQL文件之前,先创建一个只有指定数据库权限的用户,并使用该用户的凭据执行导入命令。这样虽然会遇到切换数据库时的错误,但是指定数据库的数据会被保留,而其他数据库不会被覆盖。
需要注意的是,使用-D
选项在读取由mysqldump --all-databases
生成的SQL文件时没有效果。而且该方法还会在mysql模式中DROP和CREATE表,包括用户表。
经过测试,使用-o
选项确保了其他数据库不会被覆盖,因此可以重新考虑之前的评论。