Calibre-web的数据库

date
Dec 26, 2021
💡
继19号把书库的管理员密码弄残(具体记录在这里)了之后,本周我又把记录书籍信息的数据库弄残了……
notion image
目录

怎么出的问题

我要拆书

在收集整理电子书的过程中,总有一些书找不到,而其中的一部分也不是没有,只是包括在了合集中(亚马逊最喜欢出这样的合集)。
如果把这些合集直接放在书库中,总觉得不够完美,在找不到其他单独的版本,又不愿意放弃的情况下,只能考虑把合集的书拆分出来。

拆出来的问题

网上能拆书的工具并不多,google了一个星期,所能找到的工具都是说怎么用Calibre桌面版把epub格式的书籍拆开来。
之前也装过这个软件,没多久就删了。
其一是用Calibre看书实在是不够美观方便,它的主要应用还是在于书籍的管理编辑;
其二是,当时没装Calibre的web版,直接在本地电脑上管理书籍过于痴呆……
安装时图省事,直接选择了局域网上Calibre-web管理的书库所在的文件夹作为书库的位置……安装后看着挺美好的,之前上传备份的书都在了。可事实上,只是看上去美好而已!
刚装好的几天,两者相安无事。因为我根本还没去用。昨天还没拆书,只是试着编辑一本书籍的时候,就出现问题了。
  • 将一本书都在了Calibre-web的自动添加书籍的文件夹中,然后关闭;
  • 马上在桌面Calibre去编辑另外一本书,试试桌面Calibre能否获取豆瓣书籍的元数据;
  • 发现不行,但可能已经点击过保存了;
  • 再进入Calibre-web,编辑刚才自动转存的新书,发现不能保存了……

具体现象

导致出现问题的原因在于,PC的Calibre和Calibre-web的autoaddbooks功能,同时向metadata.db数据库中写入书籍信息,导致了数据库文件出现了问题。具体表现在:
  • 书籍列表为空;
  • 已有的书籍还能看,也能发送到Kindle;
  • 新上传的书籍,不能更改书籍信息(即修改了不能保存),只能看到伴随着epub格式上传时,自动提取的书籍信息;

尝试过的方法

用之前使用过的,解决了admin密码问题的数据库管理软件,打开metadata.db去看,似乎都很正常,但是完整性检查的时候,就出现说Page 1665出错……可我愣是找了半天也不知道哪里看这个page。网上搜了半天,也不得其法。难不成我还得从头开始学习SQL数据库?
尝试用桌面版的Calibre修复数据库,第一次成功了,但是只有几百本书(后来才知道,能重建的书籍,都是通过autoadd功能存入的,手动上传的书,在新数据库中彻底消失了。)更不用说重建的数据库中,所带出的书籍资料,都是epub自有的,简直是一塌糊涂!
试着在PC的Calibre上重新换了一个目录,想着万一还要折腾的时候,不会影响已经残废的数据库。但是等我要回到就有数据库时,马上就说数据库有问题,修复了好多次,都是修复失败……出错提示如下:
Traceback (most recent call last):File "calibre\db\restore.py", line 281, in replace_dbPermissionError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。: '\\DS1813\book\library\metadata.db' -> '\\DS1813\book\library\metadata_pre_restore.db'
按照Docker作者的建议,常识在命令行中用calibredb restore_database命令重建,同样失败:
另一个诸如calibre-server实例的 calibre 程序或主 calibre 程序正在运行。有多个程序可以在同一时间对运行的 calibre 库进行更改是一个坏主意。calibredb可以直接连接到运行的 calibre 内容服务器,通过它进行更改。有关详细信息请参阅--with-library选项的文档。
我也不知道究竟是什么鬼玩意在阻止我更改这个库……怎么我弄坏时的那个步骤,不知道阻止我的呢?现在跟我说不行……
我知道是最后一本书的问题,用之前的工具“DBBrowserforSQLitePortable”在数据库中删除那本书的时候,提示了一条出错信息,组织我删除该书。正是这条出错提示救了我。

解决

💡
事实上我现在依然对数据库一窍不通,白纸一张,所以解决的办法真的很是侥幸……
后来我放弃了在全网搜索怎么解决Calibre-web数据款出错问题,转而用上文提到的出错信息,直接找找有没有什么办法解决一般数据库的问题。终于被我找到这两个解决的案例:
修复sqlite3数据库,database disk image is malformed
利用Python将sqlite修复相关的命令封装了一下,并且针对sqlite导出的临时文件最后一行默认是 Rollback 进行了处理,最后打包成exe程序。 sqlite是一个文本型数据库,其内部虽然做了异常处理,且官网上也说一般的 异常不会引起数据库文件损坏,但是官方还是给出了有可能导致数据库文件损坏的 情况 。 网上随便一搜 database disk image is malformed,发现这问题出现的频率还挺高的,看来sqlite的异常出错几率还是挺高的啊。不过一般来说,sqlite这种类型的数据库也是用在嵌入式设备上较多,用来记录一些读写频率不是很高的场景,例如记录软件的用户 配置信息等。但是很不巧,我们之前的项目中采用Sqlite来作为 记录型数据 的数据库,读写频率还是比较高的,因此碰到了两次客户现场出现数据库损坏的情况。 通过打印日志分析,当时正在执行 写事务的时候,我们的服务进程异常停止了。服务被拉起之后,再次写同一个数据库文件的时候,就报 database disk image is malformed 这个错误了,显然此时数据库文件的结构已经出现了异常。因此,推测是写数据库文件时,进程异常停止导致的。 网上搜索之后发现,解决方案还是比较简单的,虽然Sqlite本身没有提供修复工具,但是sqlite3.exe提供了 dump数据库文件,以及从 sql文件中 read 并写到数据库文件中的操作。 这里的 dump命令就是从一个数据库文件 CorruptDB中,将其所有执行过的 sql语句全部 dump下来,并放到一个临时文件 tmp.sql 中。 可以用sqlite3.exe进行修复,基本操作如下。 以下操作都在命令行中运行 D:\Tools\RepairTool>sqlite3.exe CorruptDB 此时进入了sqlite命令行环境 sqlite>.output tmp.sql sqlite>.dump sqlite>.quit 由于数据库文件损坏,所以sqlite自动将tmp.sql最后一行加上了一句 Rollback,因此我们需要手动修改 tmp.sql文件,将最后一行的 Rollback改为 Commit;
修复sqlite3数据库,database disk image is malformed
SQLite数据库错误:The database disk image is malformed 解决(修复)方法
摘要: SQLite数据库错误:The database disk image is malformed 解决方法: 今天一客户网站使用的是 SQLite数据库,留言板被批量挂马导致 SQLite数据库报 The database disk image is malformed 错误。 百度了很多办法都不行,导出结构出错,删除记录出错,删除表出错,但这个方法对于较大的数据库根本无法解决,我遇到的数据文件有280M,执行任何SQL命令都会报错卡死,证明是不可行的,可能 SQLite 数据库错误:The database disk image is malformed 解决方法: 今天一客户网站使用的是 sql ite数据库,留言板被批量挂马导致 SQLite数据库报 The database disk image is malformed 错误。 百度了很多办法都不行,导出结构出错,删除记录出错,删除表出错,但这个方法对于较大的数据库根本无法解决,我遇到的数据文件有280M,执行任何SQL命令都会报错卡死,证明是不可行的,可能对于小的数据文件有用,没有测试过。 最后这个问题还是解决了,我的解决方法是: 下载SQLite Expert Professional,一定要Professional版(收费)的,Personal版(免费)的没有修复功能。 这里提供下我之前下载的: https://pan.baidu.com/s/1hrUgv3Y 密码:oc5w 双击SQLiteExpertPro.exe,启动SQLite Expert Professional 打开要修复的sqlite数据文件,如果出现下图的提示: 说明数据库文件存在密码,点击"OK",关闭提示,在"db"上点击右键: 选择"Enter Encryption Key": 输入数据库密码后,点击"OK",这样数据库已经打开了,小红"x"变成了绿色的小箭头,再"db"上点击右键,选择"Repair",如下图: 点击"Repair"后弹出对话框如下图: 在 New file 那里输入修复后数据库文件的名字,点击"Start",就开始修复了,这里输入的是db_repaired,用db_repaired改名后替换原来的db,程序已经可以正常运行了。
SQLite数据库错误:The database disk image is malformed 解决(修复)方法
命令行的我不会,第二个说是能用到图形工具,自然考虑先试试。一试之下,居然可以了……

最后

  • PC版的Calibre的数据款依然放在NAS上,但是单独建了一个目录,再也不敢用Calibre-web的了。
  • 鉴于metadata.db如此重要,我在NAS上用了两种方式做版本和文件备份,方便自己回溯还能正常运行的版本……
  • 还是存在问题:不能自动添加书籍了,每次往那个目录中放了书,自动添加功能会重新建一个metadata.db文件,覆盖原文件……我现在只能手工添加书籍。


💡
已经两次出现问题了,我只想好好收集点电子书而已,怎么就这么曲折的呢……

© 等闲 2021 - 2024