amtoaer/bili-sync

数据库迁移失败

Opened this issue · 5 comments

有点奇怪,我都是自己本地运行通过之后才发版的。你是从哪个版本升级的呢?

有点奇怪,我都是自己本地运行通过之后才发版的。你是从哪个版本升级的呢?

2.1.0

那就更奇怪了,2.1.0 版本能正常运行说明 idx_video_cid_fid_bvid 这个索引肯定是存在的,2.1.1 把索引删掉没理由找不到才对。
你在更新过程中有做其他的操作吗,比如多个 bili-sync 实例读写同一份数据库,或者当时正在对数据库做编辑之类的?
如果你有原始数据库文件的备份的话,可以对照一下迁移文件看看哪里会出问题。或者方便的话把数据库文件发给我,我尝试排查一下是哪里的问题。

那就更奇怪了,2.1.0 版本能正常运行说明 idx_video_cid_fid_bvid 这个索引肯定是存在的,2.1.1 把索引删掉没理由找不到才对。 你在更新过程中有做其他的操作吗,比如多个 bili-sync 实例读写同一份数据库,或者当时正在对数据库做编辑之类的? 如果你有原始数据库文件的备份的话,可以对照一下迁移文件看看哪里会出问题。或者方便的话把数据库文件发给我,我尝试排查一下是哪里的问题。

data (3).zip

你确定自己没有手动对数据库进行编辑吗?我刚刚打开你的数据库文件,发现:

  1. page 表中存在一些关联到的 video_id 不存在的记录,而程序运行正常来说不会删除 video;
  2. 存在 favorite_id、collection_id、bvid 三者重合的记录,写入日期是 7 月 10 日中午(2.1.1 未发版),但 2.1.0 版的迁移文件中明确执行了创建三者唯一索引的 sql,且数据库中显示该迁移文件成功执行。

如果这是未经你手动修改的数据库文件,那么说明程序分发存在着很大的问题, workflow 构建出来的结果与我代码和本地执行的逻辑完全不同。

而如果你之前有手动修改过数据库文件,那么迁移失败不是程序的问题。可以依次执行:

  1. 删除 watch_later 表
  2. 删除 video 中的 watch_later_id 列
  3. 删除 favorite_id、collection_id、bvid 三者重合的记录
  4. 恢复唯一索引: CREATE UNIQUE INDEX `idx_video_cid_fid_bvid` ON `video` (ifnull(`collection_id`, -1), ifnull(`favorite_id`, -1), `bvid`)

后尝试重新迁移解决。