在Yii2.0.52中安全执行数据库迁移需严格遵循流程:创建迁移文件时命名规范、核对UTC时区;up()与down()必须成对编写且逻辑逆向;执行yii migrate后用history验证状态;回滚支持单次、多次或精确到指定版本。

你需要在Yii2.0.52项目中安全执行数据库结构变更,并确保能精确回滚到任意历史版本,避免因迁移失败导致生产环境数据异常或表结构错乱。
创建新迁移文件
打开终端,进入项目根目录(即包含 yii 命令脚本的目录),执行以下命令:
yii migrate/create create_user_profile_table
注意:name 参数只能含小写字母、数字和下划线,不能有空格或中文;否则生成的类名非法,后续执行会报 ParseError。
命令成功后,会在 @app/migrations/ 目录下生成类似 m260806_142317_create_user_profile_table.php 的文件——其中时间戳基于 UTC,不是本地时间,【务必核对系统时区是否为UTC,否则迁移版本序号可能错乱】。
编写 up() 与 down() 方法
用编辑器打开刚生成的迁移文件,在 up() 方法中写入建表语句:
$this->createTable('{{%user_profile}}', [ 'id' => $this->primaryKey(), 'user_id' => $this->integer()->notNull(), 'avatar' => $this->string(255), 'bio' => $this->text(), 'created_at' => $this->integer(), ], 'CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci');
down() 方法必须严格逆向操作,且不能留空。若删除了表,down() 中必须重建该表(含字段、索引、字符集);若仅添加字段,down() 中需 dropColumn。不写 down() 或返回 false 会导致 migrate/down 失败。
特别注意:如果 up() 中执行了 DROP TABLE 或 DELETE FROM 等不可逆操作,【必须在 down() 中 return false 并加注释说明,否则强行回滚将引发数据丢失】。
执行迁移并验证状态
第一步:运行迁移命令
yii migrate
第二步:查看当前已应用的迁移列表
yii migrate/history
第三步:确认最新一条记录的 status 是 applied,version 字段与刚生成的文件名前缀一致(如 m260806_142317),且 no of migrations 已增加 1。
若中途中断(如 Ctrl+C),迁移状态可能卡在 "starting...",此时直接再次执行 yii migrate 会跳过已开始但未完成的迁移——Yii 不会自动重试,【需手动检查数据库实际结构是否完整,必要时删掉该迁移记录再重跑】。
回滚单次迁移
方法一:回滚最新一次迁移
yii migrate/down
方法二:回滚指定次数(例如退回最近 3 次)
yii migrate/down 3
方法三:回滚到某具体版本(精确控制)
yii migrate/to m260805_101244_add_index_to_order_table
执行后,Yii 会逐个调用对应 down() 方法,从最新版本向前执行,直到目标版本的下一个版本为止。目标版本本身不会被撤销,而是成为当前最新已应用版本。


















