我很高兴地在一个 ddev 项目上工作,今天我提出了它,它说“db 服务已停止”,它似乎无法修复。ddev 还说“数据库服务健康检查超时”
2 回答
在 Docker For Mac 上(我认为是在 Docker for Windows 上),docker 不会让容器在关闭时有机会优雅地退出。所以数据库容器中的 MariaDB 服务器没有机会清理,重要的数据库在下次启动时会被破坏(它似乎不会损害小型数据库)。因此,如果您要升级 docker、关闭主机或只是退出 docker,您最好先执行 addev stop
或 a ddev remove
. (请注意,一个简单ddev remove
的数据库不会丢弃您的数据库,当您重新开始时,它会为您服务。)
另请注意,在 ddev v0.17.0 之前的版本中,ddev remove
命令本身存在这个问题:它可能会因为在销毁 db 容器之前没有足够的时间进行清理而损坏 db。
我认为这不会影响 Linux 用户,并且不确定 Windows。
TLDR;
- 确保您至少使用 v1.0.0 的 ddev(并且您的容器反映了这一点)。此行为在 v1.0.0 中得到了很大改进。
- 删除现有损坏的数据库
ddev remove --remove-data
(然后ddev start
重新导入数据库或重新安装) - 使用当前版本的 ddev,并按照升级说明进行操作,目前需要删除 docker-compose.yaml 并在每个项目上编辑 config.yaml 文件。
- 避免让 docker 升级或退出,避免在不停止或
ddev remove
-ing 项目的情况下重新启动主机。未解决的问题是https://github.com/drud/ddev/issues/748但它确实必须在 docker-for-mac、docker-for-windows 中修复。
发生这种情况的第二种方法:项目中的自定义 mysql 配置。在调试之前,请删除 .ddev/mysql 中的任何配置,以防这是您问题的原因,然后ddev restart
.
如果您的数据库已损坏,您可以通过将名为 .ddev/mysql/recovery.cnf 的文件添加到项目中来恢复ddev start
:
[mysqld]
innodb_force_recovery = 1
恢复后,删除文件 .ddev/mysql/recovery.cnf 你的数据库不能保证完好无损,即使它恢复正常。
[编辑 2018-05-16]:第三个原因是 docker 资源不足。如果您正在运行一些项目或使用 docker 进行其他操作,您需要将可用内存从默认的 2GB 提高。
[编辑 2018-06-27]:添加了有关恢复可能性的说明。
[编辑 2018-08-02]:提到 ddev 的 v1.0.0 改进了很多。
ddev stop
在切换项目时,我经常需要关闭和打开 Docker,而且在退出 Docker 应用程序之前,我不太可能导航到我管理的 60 多个站点中的每一个。
是否有可能有一个ddev stop all
或类似的命令适合在退出 Docker 之前停止所有 ddev 实例?