一般数据库损坏都是由于容器中断或者升级导致的,我也是经历过一次 jellyfin 数据库损坏,打开之后发现以前的什么东西都没有,找遍全网才找到了这一份官网发布的解决办法,仅供大家参考,记得收藏万一哪天你的崩了就派上用场了。
如果您的服务器日志文件显示 SQLite 错误(如以下示例),则需要注意 library.db 文件。
SQLitePCL.pretty.SQLiteException
什么原因会导致这种情况发生
造成这种情况的典型原因是 Emby 服务器进程的突然和突然终止,例如断电、操作系统崩溃、强制终止服务器进程等。
查找数据库文件的位置
如果你不知道数据库的位置,就去服务器信息框正上方的顶部菜单里面找 View Server Info。
点击查看服务器信息,Jellyfin 同理。
找到数据库文件的位置。它们位于所示第一个路径下的“data”目录中。
/var/lib/emby/data
是用于以下每个解决方案的位置。
按此顺序尝试的解决方案
删除数据库锁
- 关闭 Emby
- 找到包含数据库文件的文件夹
- 删除 library.db-shm & library.db-wal
- 重新启动 Emby
检查服务器日志中是否存在 SQLite 错误,并仅在需要时继续执行下一步
检查数据库完整性并恢复数据库
此步骤将需要使用可以从 sqlite.org 下载的 SQLite 编辑器。如果您更喜欢基于图形的编辑器,您可以下载适用于大多数平台的 DB Browser for SQLite。
运行完整性检查
打开 library.db 数据库并运行以下 SQL 命令:
PRAGMA integrity_check
如果使用命令行工具,请尝试以下操作
sqlite3 library.db "PRAGMA integrity_check"
这应该返回“OK”的 integrity_check,并且没有报告任何错误。如果报告错误,我们需要恢复数据库。
恢复 library.db
我们需要做的是将数据库中的所有数据转储到文本文件中,然后将其重新加载回另一个新创建的数据库。这可以通过使用 SQLite 命令行编辑器的单个命令来完成。
- 运行以下命令行(这可能需要一段时间才能运行,因此请等待它完成)
sqlite3 library.db ".recover" | sqlite3 library-recovered.db
- 我们现在将检查恢复的数据库(如上所述)的完整性
sqlite3 library-recovered.db "PRAGMA integrity_check"
这应该返回“OK”的 integrity_check,并且没有报告任何错误。如果报告错误,请在论坛中报告,然后再继续重置库数据库。如果正常且未报告错误,请继续执行步骤 3。
- 复制 library.db 和 library-recovered.db
- 将 library.db 重命名为 library.old
- 将 library-recovered.db 重命名为 library.db
- 重新启动 Emby 服务器
检查服务器日志中是否存在 SQLite 错误,并仅在需要时继续执行下一步
重置库数据库并重新加载的步骤
- 关闭 Emby
- 更改为上面找到的包含数据库文件的数据库位置
- 将 library.db 重命名为 library.corrupt
- 重新启动 Emby
- 运行完整库扫描