我的 ddev 项目显示 "db service stopped",但我无法启动它 "db service health check timed out"

My ddev project says "db service stopped" and I can't get it started "db service health check timed out"

我很高兴在一个 ddev 项目上工作,今天我提出了它,它说 "db service stopped" 并且它似乎无法修复。 ddev 还说 "db service health check timed out"

On Docker For Mac(我认为 Docker for Windows) docker 没有给容器一个优雅退出的机会关闭。所以数据库容器中的 MariaDB 服务器没有机会清理,并且重要的数据库在下次启动时会被破坏(它似乎不会损害小型数据库)。因此,如果您要升级 docker、关闭主机或只是退出 docker,您最好先执行 ddev stopddev remove。 (请注意,一个简单的 ddev remove 不会丢弃您的数据库,当您重新开始时它会在那里。)

另请注意,在 ddev v0.17.0 之前的版本中,ddev remove 命令本身存在此问题:它可能会破坏数据库,因为在销毁数据库之前不允许数据库容器有足够的时间进行清理。

我认为这不会影响 Linux 用户,我不确定 Windows。

TLDR;

  • 确保您至少使用 v1.0.0 的 ddev(并且您的容器反映了这一点)。此行为在 v1.0.0 中得到了很大改进。
  • 使用 ddev remove --remove-data 删除现有损坏的数据库(并在 ddev start、re-import db 之后或重新安装)
  • 使用 ddev 的 current version,并按照升级说明进行操作,目前需要删除 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 改进了很多。

我经常需要在切换项目时关闭和打开 Docker,而且我不太可能能够导航到我管理的 60 多个站点中的每一个 ddev stop在退出 Docker 应用程序之前。

是否可以有一个 ddev stop all 或类似的命令适合在退出之前停止所有 ddev 实例 Docker?