Lando中同一项目两个本地实例共用数据库且不丢失原有数据的解决问题
问题根因
两个Lando实例共享数据库的核心原因是Lando默认使用项目目录名作为所有容器、存储卷的资源前缀,如果两个项目的目录名完全一致,就会共用同一个数据库存储卷,导致数据互通。
你可以分别进入两个项目目录执行lando info,查看database服务对应的卷名称,如果二者完全相同即可确认是该问题。
解决步骤
务必先完成第一个项目的数据库备份,再操作第二个项目的Lando资源,避免意外数据丢失
- 进入第一个故障项目的根目录,执行
lando db-export ~/first-project-db-backup.sql.gz,备份文件存在本地用户目录,不会被Lando后续操作影响。 - 打开第二个调试项目的
.lando.yml配置文件,在顶级配置项中新增字段:name: drupal-project-debug(名称自定义,只要和第一个项目的Lando实例名完全不同即可,Lando会优先使用该值作为资源前缀,替代默认的目录名)。 - 如果第二个项目已经启动过,先进入其根目录执行
lando destroy -y销毁旧的冲突容器和存储卷,该操作只会删除第二个项目的关联Lando资源,不会影响第一个项目的已有数据。 - 在第二个项目根目录执行
lando start,Lando会为其创建完全独立的数据库卷、容器资源,和第一个项目彻底隔离。
lando pull 安全性说明 完成上述隔离配置后,你可以完全安全地在第二个项目中执行lando pull从platform.sh拉取全新数据,该操作只会修改第二个项目的独立数据库,完全不会触碰第一个项目的存储资源,不会导致原有故障项目的数据库数据丢失。
隔离验证
完成配置后可以通过以下操作确认隔离生效:
- 分别在两个项目根目录执行
lando drush sql-query "SELECT database();",二者输出的数据库名称应完全不同。 - 在第二个项目站点中任意创建测试内容,刷新第一个项目的站点,看不到该测试内容即代表隔离成功。
如果修改实例名后仍存在数据互通问题,检查第二个项目的
web/sites/default/settings.local.php中数据库连接配置,确认是否使用Lando提供的环境变量(如$_ENV['DB_HOST']、$_ENV['DB_NAME']),不要手动写死第一个项目的数据库连接参数。
内容的提问来源于stack exchange,提问作者laurent
相关产品推荐
相关产品推荐

