内容提要
PlanetScale 提供零停机的 Laravel 数据库迁移解决方案,避免在生产环境中直接运行迁移命令。通过创建开发分支和影子表,进行非阻塞的架构更改,确保数据库在迁移期间可用。迁移应在应用代码发布前或后进行,具体取决于更改类型。此外,PlanetScale 允许快速撤销架构更改,确保数据安全。
延伸解读
直接在生产环境运行迁移的风险
许多 Laravel 部署流程会执行 php artisan migrate,直接在生产数据库上运行迁移。这种直接 DDL 操作可能导致表锁定,使表在迁移期间完全无法访问,甚至读取也会被阻塞。此外,直接 DDL 没有速率限制、隔离机制或安全的回滚策略,可能引发数据丢失。因此,避免在生产环境直接运行迁移是保障数据库可用性的关键。
PlanetScale 如何实现非阻塞架构更改
PlanetScale 通过影子表技术实现非阻塞架构更改:先创建表的副本(影子表),应用架构更改,同步数据,然后原子性地交换表,最后删除旧表。整个过程由 PlanetScale 的分支工作流自动处理,无需手动干预。这样,原始表在迁移期间不会被锁定,数据库始终可用,从而避免停机。
迁移时机取决于更改类型
迁移应在应用代码发布前还是后执行,取决于具体的架构更改类型。例如,添加新列或新表时,需先在生产环境更新架构,再部署写入新列的代码;而删除列或表时,则应先部署代码停止使用该列或表,再执行架构更改。对于重命名列或表,需要更复杂的多步流程,包括克隆、双写和逐步切换,以确保零停机。
快速撤销架构更改的机制与限制
PlanetScale 的在线架构更改方法允许在 30 分钟内通过仪表板按钮快速撤销错误的架构更改。这是因为在交换表后,原始表会保留 30 分钟并持续同步数据,从而可以安全地交换回来。但撤销并非总是可行,例如增加 varchar 列长度后,如果已写入超出原长度的数据,撤销将导致数据不完整,此时 PlanetScale 会阻止撤销以保护数据完整性。
Q&A
PlanetScale 如何实现零停机的数据库迁移?
PlanetScale 通过创建开发分支和影子表,进行非阻塞的架构更改,确保数据库在迁移期间可用。
在使用 PlanetScale 进行迁移时,何时应该运行迁移命令?
迁移命令的运行时间取决于更改类型,添加字段时应在应用代码上线前进行,而删除字段时应在停止写入后进行。
直接在生产数据库上运行迁移命令有什么风险?
直接运行迁移命令可能导致数据库锁定,影响读写操作,甚至造成数据丢失。
如何快速撤销在 PlanetScale 上的架构更改?
PlanetScale 允许在 30 分钟内通过点击撤销按钮快速撤销架构更改,确保数据安全。
使用 PlanetScale 进行架构更改时,如何确保数据安全?
通过使用影子表和同步数据的方式,PlanetScale 确保在架构更改期间数据的安全性。
在 Laravel 中如何安全地进行数据库迁移?
应在开发环境中运行 Laravel 迁移,并通过 PlanetScale 的开发分支将更改合并到生产环境,而不是直接在生产服务器上运行迁移。