应使用 schema:dump 生成数据库结构快照以跳过冗长迁移;需先确保所有迁移已执行(migrate:status 全为 ran),再运行 php artisan schema:dump 生成 schema 文件,或加 --prune 参数同时删除已执行的迁移文件。

当你维护一个上线多年的 Laravel 8 项目,database/migrations 目录里堆了 200+ 个迁移文件,每次测试都要跑完全部迁移、CI 构建耗时飙升,本地重装环境要等半分钟——这时你需要用 schema:dump 把当前数据库结构“快照”下来,跳过冗长的逐条迁移执行过程。
确认前提条件
运行 schema:dump 前,必须确保当前数据库连接已生效且结构完整:先执行 php artisan migrate:status,所有迁移状态必须显示为 Ran;若存在未执行项,先运行 php artisan migrate 补齐。这一步漏掉会导致生成的 schema 文件缺失表或字段,后续 fresh 迁移会直接报错。
检查 database/schema/ 目录是否为空或不存在——如果已有旧 schema 文件,【它会被新生成的覆盖,且不可恢复】。
生成基础 schema 快照
在项目根目录下执行命令:
php artisan schema:dump
命令会自动调用 mysqldump(MySQL)或 pg_dump(PostgreSQL),将当前数据库结构导出为 SQL,并保存到 database/schema/{connection}-schema.mysql(或 .pgsql)。默认使用 .env 中 DB_CONNECTION 指定的连接名。
该操作不删除任何现有迁移文件,仅生成快照。生成后,database/schema/ 下会出现类似 mysql-schema.mysql 的文件。
生成并自动清理旧迁移(推荐生产前使用)
执行带 --prune 参数的命令:
php artisan schema:dump --prune
这条命令会做两件事:① 生成 schema 文件;② 【永久删除所有已成功执行过的迁移文件】。注意:被删的迁移文件不会进回收站,也无法通过 git restore 恢复——务必确保你已将这些文件提交到 Git 并确认无误后再执行。
删除范围严格限定于 migrations 表中 status 为 1 的记录所对应的迁移文件。若某次迁移失败导致其未被标记为已执行,该文件将被保留,不会误删。
验证 schema 文件是否生效
方法一:清空测试库并触发 schema 加载
先执行 php artisan migrate:fresh(确保数据库为空且 migrations 表也为空),Laravel 会自动检测到 database/schema/ 下存在对应连接的 schema 文件,并优先执行其中的 SQL,再运行尚未包含在 schema 中的新迁移。
方法二:手动检查生成内容
打开 database/schema/{connection}-schema.mysql,确认开头有 CREATE TABLE 语句,末尾无 INSERT 或 UPDATE 数据操作——schema:dump 默认只导出结构,不导数据。
注意:schema 文件仅在 migrations 表为空时被加载。若你已在该库中执行过迁移,哪怕只有一条,Laravel 就会忽略 schema 文件,继续走常规 migrate 流程。
指定连接与自定义路径(高级场景)
如果你的项目配置了多个数据库连接(如 tenant、logging),需显式指定:
php artisan schema:dump --database=tenant
该命令将在 database/schema/ 下生成 tenant-schema.mysql。
无法自定义输出路径——schema:dump 固定写入 database/schema/,且文件名格式不可更改。试图用 --path 或重定向 > 会失败。











