chore: 存量头像迁移脚本——旧命名 <uid>.jpg 迁入统一 files 表(type=avatars) #9

Merged
kevin merged 1 commits from dsh/go_blog:chore/legacy-avatar-migration-script into main 2026-08-28 20:23:59 +08:00
Contributor

背景

头像上传已走统一上传引擎(files 表 + SHA-256 内容寻址,PR #8)。其他部署在升级前创建的历史头像仍以 <uid>.jpg 命名、且未在 files 表登记——只有所有者下次换头像时才会被新代码清理。

内容

新增 scripts/migrate_legacy_avatars.sh(一次性、幂等):

  1. 逐用户处理非哈希命名的头像(^[0-9a-f]{64}$ 自动跳过);
  2. 取文件内容 SHA-256 作为新存储名(内容字节不变,不重新编码);
  3. 复制为 avatars/<哈希>(内容寻址磁盘去重)并登记 files 行(type='avatars',WHERE NOT EXISTS 幂等);
  4. 更新 users.avatar 为哈希;
  5. 删除旧 <uid>.jpg

已在本机生产库实测(kevin/dsh 均为哈希命名,2 个用户全部跳过,exit 0),迁移不会重复执行。

## 背景 头像上传已走统一上传引擎(files 表 + SHA-256 内容寻址,PR #8)。其他部署在升级前创建的历史头像仍以 `<uid>.jpg` 命名、且未在 files 表登记——只有所有者下次换头像时才会被新代码清理。 ## 内容 新增 `scripts/migrate_legacy_avatars.sh`(一次性、幂等): 1. 逐用户处理非哈希命名的头像(`^[0-9a-f]{64}$` 自动跳过); 2. 取文件内容 SHA-256 作为新存储名(**内容字节不变**,不重新编码); 3. 复制为 `avatars/<哈希>`(内容寻址磁盘去重)并登记 files 行(`type='avatars'`,WHERE NOT EXISTS 幂等); 4. 更新 `users.avatar` 为哈希; 5. 删除旧 `<uid>.jpg`。 已在本机生产库实测(kevin/dsh 均为哈希命名,2 个用户全部跳过,exit 0),迁移不会重复执行。
dsh added 1 commit 2026-08-28 20:22:36 +08:00
其他部署升级到统一上传引擎后,历史头像仍以 <uid>.jpg 命名且未在 files 表
登记,直到所有者下次换头像才被清理。本脚本提供一次性迁移:
内容字节不变,以 SHA-256 哈希命名复制到 avatars/,登记 files 行
(type=avatars),更新 users.avatar,删除旧文件。
幂等:已为 64 位哈希名的用户自动跳过;无遗留文件时无操作。
已在线上库实测(2 个用户全部跳过)。
kevin merged commit f03199de6b into main 2026-08-28 20:23:59 +08:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: kevin/go_blog#9