php artisan migrate:refresh 会彻底清空数据,无内置回滚机制,本质是先重置再迁移;Laravel 迁移只管理结构不保存数据,恢复依赖数据库日志或备份,本地开发通常无法恢复。
php artisan migrate:refresh 会清空所有数据,没有内置回滚机制
它本质是先
(删表),再
(重建),中间不保留任何旧数据快照。laravel 的迁移系统只管结构,不管数据——哪怕你写了
方法,也仅用于逆向建表或改字段,不是“还原数据”。
恢复的唯一可行路径:从备份或数据库日志里捞数据
没备份?那要看你的数据库是否启用了二进制日志(MySQL)或 WAL 归档(PostgreSQL),以及日志是否还在线、未被轮转。本地开发环境通常默认关闭这些,生产环境则大概率开着——但得确认。
MySQL:检查
是否为
,再用
解析最近的 binlog 文件,定位到
执行前的 INSERT/UPDATE 语句
PostgreSQL:确认
且
,然后用
或时间点恢复(PITR)回退到刷新前的 checkpoint
SQLite:基本无解——文件被删就没了,除非你有文件系统快照(如 Time Machine、ZFS snapshot)或 IDE 自动保存的历史版本
为什么不能靠 Laravel 的 migration rollback 恢复
只会按
方法执行逆向操作,比如删字段、删表,但它不会把之前被删掉的用户记录“吐”回来。很多开发者误以为写个
在
里就能救数据——不行,因为:
运行时,表可能已被
流程删掉,插不进去
迁移文件是静态的,
数据无法动态捕获上次运行时的状态
就算硬塞进去了,主键自增、外键约束、软删除字段(
)等状态全乱
下次怎么避免这种问题
不是靠“恢复”,而是让误操作成本变高、可感知、可拦截:
在
里加保护逻辑:检测当前命令是否为
或
,且环境为
,直接
并打印警告
把敏感命令 alias 成带确认的脚本,比如
开发阶段强制用
配合工厂数据,而不是依赖真实测试数据;生产环境严禁直接跑
,只允许
+ 手动补数据脚本
真正麻烦的不是技术上能不能捞回来,而是你得先确定哪条 binlog 里有你要的那几条用户记录——查日志比写代码花的时间多十倍。
立即学习
“
PHP免费学习笔记(深入)
”;
php artisan migrate:resetphp artisan migratedown()SHOW VARIABLES LIKE 'log_bin';ONmysqlbinlogmigrate:refresharchive_mode = onwal_level >= replicapg_waldumpphp artisan migrate:rollbackdown()DB::table('users')->insert($backup)down()down()refresh$backupdeleted_atAppServiceProvider::boot()migrate:refreshmigrate:freshproductionexit(1)alias art-refresh='read -p "Really refresh? " -n 1 -r; echo; if [[ $REPLY =~ ^[Yy]$ ]]; then php artisan migrate:refresh; fi'--seed:refreshmigrate