有时候服务器意外关机,会导致UrBackup的sqlite数据库出现无法自动恢复的错误,我这边就出现了这样的提示:
在访问或检查UrBackup内部数据库时发生错误。这表示内部数据库错误或者没有足够的可用空间。如果这个错误发生,请从备份中恢复数据库文件(backup_server.db, backup_server_files.db, backup_server_links.db, backup_server_link_journal.db and backup_server_settings.db)。详细数据请参阅日志文件。
出现这种情况,当然最好的处理方式是从备份恢复这个数据库,但是如果没有数据库备份的话,只能尝试修复现有的数据库。
进行任何修复之前首先关闭urbackup的进程,如果是docker运行的就关闭docker容器。
然后需要确保操作的电脑上有sqlite3命令,没有的话就进行对应的安装。
准备好之后,开始检查所有数据库文件,看看到底哪些坏了,终端命令进入到urbackup数据库文件所在的目录(一条一条执行,以免分不清哪个结果属于哪个检查):
sqlite3 backup_server.db "PRAGMA integrity_check;" sqlite3 backup_server_files.db "PRAGMA integrity_check;" sqlite3 backup_server_link_journal.db "PRAGMA integrity_check;" sqlite3 backup_server_links.db "PRAGMA integrity_check;" sqlite3 backup_server_settings.db "PRAGMA integrity_check;"
如果返回的是”ok”,那么这个数据库文件就没问题,否则就说明这个文件需要处理。
先备份需要处理的文件,可以创建一个bak目录然后把损坏的数据库文件复制进去,当然想要保险一点也可以把所有数据库文件都备份一遍。
然后把有损坏的数据库文件名后面都加上”.corrupt”,防止一会儿分不清,接着尝试以下方法:
方法一:使用sqlite自带的”.recover”指令尝试导出数据
sqlite3 损坏db.corrupt ".recover" > recovered.sql 2>/dev/null sqlite3 损坏db < recovered.sql #把"损坏db"替换成原始的数据库文件名
然后检查生成的数据库文件内部结构和原来的是否一样,可以用一些可视化工具比对起来会方便一点,比如DB Browser for SQLite 。
有一些表即使无法恢复也不影响urbackup正常运行,比如”backup_server.db”中的”log_data”和”user_tokens”这种表,无法恢复就不用管了。
如果recover命令无法恢复主要内容的话,就尝试方法二。
方法二:我用AI生成了一个从原来数据库文件导出数据的bash脚本
下载这个脚本放在数据库目录: https://gist.github.com/JiaJiaJiang/8baa74abbc320da41259d49c44f293d8。
给它执行权限:chmod +x sqlite_rebuild_db.sh
然后执行 ./sqlite_rebuild_db.sh 损坏db.corrupt 损坏db ,看到有报错也没事,直接检查生成的数据库内容是否包含了必要的核心表。我自己用这个方法恢复出来的数据比方法一要多,生成的数据库文件也可以直接正常启动urbackup,报错没有了。
