Laravel Homestead 11.1.0升级后数据库丢失及Homestead.yaml配置创建数据库异常问题求助
咱先把核心原因捋明白:你升级到的Homestead 11.x版本已经默认用MariaDB替代MySQL作为默认数据库服务了,但你参考的还是Laravel v8.x的老文档,版本不匹配导致了一系列矛盾问题。
问题1:为什么不加mysql feature时,databases列表的库创建失败?
Homestead 11.x的provision脚本会优先检测MariaDB的运行状态(因为它是默认服务)。当你没在features里指定数据库类型时,脚本会尝试连接MariaDB,但可能你的升级过程中MariaDB服务没有正常启动,或者原来的MySQL服务被停用了,脚本找不到MariaDB的PID,就直接跳过了数据库创建步骤——这就是为什么show databases;只显示默认库的原因。
问题2:加features: - mysql: true能创建库但报错?
Homestead 11.x的底层脚本其实支持通过这个配置强制启用MySQL,但官方文档(尤其是v8.x的文档)还没同步更新这个配置项,所以provision时会抛出Invalid feature: mysql的警告。不过脚本并没有完全忽略这个配置,还是会执行MySQL的数据库创建逻辑,所以你能看到db00、db01被成功创建,只是伴随一个无影响的警告。
问题3:只加- mysql配置时出现MariaDB错误?
当你只写- mysql而不指定true/false,脚本会默认按MariaDB的逻辑去执行创建,但此时你要启用的是MySQL,MariaDB服务没运行,脚本找不到它的PID,就会输出We didn't find a PID for mariadb, skipping $DB creation的提示,自然创建失败。
最优解决方案
根据你的需求,分两种推荐方案:
方案1:改用MariaDB(推荐,符合Homestead 11.x默认配置)
既然新版本默认用MariaDB,直接适配这个变化即可:
- 修改
Homestead.yaml的配置:databases: - db00 - db01 features: - mariadb: true - 执行
vagrant provision,脚本会正常检测MariaDB服务并创建指定数据库,不会有任何报错。
方案2:强制启用MySQL(如果必须用MySQL)
如果你依赖MySQL的特定特性,需要强制开启:
- 修改
Homestead.yaml,用services配置替代features(这是更规范的方式,避免无效feature警告):databases: - db00 - db01 services: - mysql: true - 执行
vagrant provision,脚本会启动MySQL服务并创建指定数据库,无警告报错。
补充:升级后数据库消失的原因
Homestead 11.x切换默认数据库服务后,原来MySQL的数据目录和MariaDB的目录是分开的,导致你看不到原来的数据库。如果需要恢复旧数据,可以进入虚拟机(vagrant ssh),找到旧MySQL的数据目录(通常在/var/lib/mysql),将数据迁移到MariaDB的目录(/var/lib/mysql,如果是默认安装的话),或者直接导出旧数据库再导入到新服务中。
内容的提问来源于stack exchange,提问作者Aaron

