nextcloud数据丢失!

做一次标题党哈哈

!!!!!!!!!!!
后续在review的时候 发现其实不是nextcloud的错,而是因为两台主机的区域设置不一样,导致默认字符编码集不一致造成的乱码。
!!!!!!!!!!!

起因

nextcloud最近一段时间大版本更新 于是乎就升级了

因为最近在忙别的事情 文章什么的都没有图片 所以也就没上传

直到昨天。。。。

upload err

并且部分文件无法下载

着手解决

看了一下日志并没有发现有什么报错

在概览页的安全及设置警告倒是有发现丢失了索引

修复索引

先来修复索引

sudo -u www-data php occ db:add-missing-indices


DBALException: Failed to connect to the database: An exception occured in driver: could not find driver in /var/www/nextcloud/lib/private/DB/Connection.php:64

报错???

在一顿搜索之后 发现了一个issue有描述了这个问题

https://github.com/nextcloud/server/issues/14942

跟我的情况是差不多的

我最开始的时候用的是debian官方的php7.0

奈何有个服务需要php7.2 于是升级到了7.2

后来更新升级到了php7.3

但是这次升级7.3并不是带着其他模块一起升级到了7.3

在debian下查看已安装的软件包

apt list --installed

过滤一下只看php的apt list --installed | grep php

果然看到了 php7.2的模块和7.3的核心模块

解决很简单 只需要把7.2的模块更新到7.3就可以了

然后在回去修复索引

即可看到修复完成

但是还是不能上传文件

继续找原因

nextcloud的文件是以原始方式保存的

位置就在 nextcloud/data/${your user}/files

进去一看 瞬间就知道是怎么回事了

后台乱码

存储的文件中文是乱码的!

所以就可以解释了为什么不能上传和下载某些文件了

linux中如何解决文件乱码的问题呢

已经保存的乱码是无法再还原的 我想要把他变回正常的文件名

只能通过重命名来解决mv filename newfilename

但是原始的文件名是无法选中了的

这个时候就要用到inode

本文不对inode做展开讲解

查看乱码的文件inode numls -il

有了inode num ,文件大小,创建日期,我们可以对比nextcloud上的信息分辨哪个是哪个

知道了原始文件名后 我们就可以修复乱码了

find . -inum file_inode -exec mv {} new_file_name \;

example: find . -inum 1712191 -exec mv {} 微信截图_1.jpg \;

当然 如果你想要删除它

find . -inum 1712191 -exec rm -rf {} \;

注意了 你修复的文件名需要和nextcloud上的信息保持一致 否则一定是找不到的

接下来就是一个一个修复就好了

OK 到这里就大功告成了

TIPS

一些想法

为什么会出现该问题?

很难说 因为我有过迁移主机 并且有过大版本升级
无法确定到底是nextcloud问题还是系统环境的问题
系统都是服务提供商的 可能会有点差别 
这个问题难以解答

受损的文件太多怎么办?

需要准确的定位问题 是否跟系统的语言有关,nextcloud有没有做过大版本更新

只有定位了问题才能一次性完美修复 即使是写程序去修复我相信也要耗费不少时间

nextcloud是否可靠?

在这期间 我确实的怀疑过nextcloud的可靠性
再github上你能看到接近2000个 open issue

虽然如此 官方还是保持着活跃的release

nextcloud会变得越来越好

我更希望官方解决更多的稳定性问题

不会像是现在的win10一样 满身的bug 还要强制你更新