Nextcloud 是一款非常优秀的开源网络存储软件,可以让我们方便的创建私有云存储服务器。
我也部署了一套 Nextcloud 作为云服务器来使用,之前使用一直正常,前几天系统提示可以更新至最新版。但是下载过程中出现了问题,没有完全下载,系统提示可以手动删除”data”目录下的以”updater_”开头的目录,于是就按提示照做了。看到这个目录里还有一个”appdata_oc5wykmg581s”目录,感觉也没啥用,就顺手删除了。之后的结果不用想也知道是悲剧了,Nextcloud 报内部错误提示,不能正常显示页面。
本来想着重新安装 Nextcloud,但是想想如果重装的话,之前上传到服务器的文件都会失去关联关系,从而不能在新的 Nextcloud 中显示,需要再重新上传,费时费力。同时又觉得不必那么麻烦,反正数据库和文件都没有变,只是前台显示不正常罢了,文件的关联关系一定保存在数据库中,我们就可以通过特殊方法恢复Nextcloud。
于是通过如下步骤,成功恢复了 Nextcloud 网站。
1] 备份文件和数据库
Nextcloud 的用户文件保存在”/data”目录下对应的用户名目录中,如果 Nextcloud 有多个用户,则会按不同的用户名分别保存。将些用户名目录复制到其他位置进行备份,以便在 Nextcloud 网站恢复后继续使用。
将 Nextcloud 使用的数据库备份出来,由于我使用的是 MariaDB,数据库名为 nextcloud,则可以使用如下命令备份数据库:
# mysqldump -u root -p nextcloud > nextcloud.bak
这样,就会把数据库备份至备份文件中。
2] 重新部署 Nextcloud
去 Nextcloud 的官方网站,下载与故障前一致的 Nextcloud 发行版,这样做的好处是可以尽量避免出现兼容性问题。因为不同版本的 Nextcloud 对于数据库表的访问可能存在一些差异,从而造成恢复失败。
查看 Nextcloud 网站”config”目录的”config.php”文件,里面保存了连接数据库的信息,记录这些信息,以备恢复时使用。
删除之前 Nextcloud 的网站目录,然后将下载的网站文件解压至网站目录,例如之前 Nextcloud 的网站目录是”/www/nextcloud”,则将下载的发行版文件夹解压保存成”/www/nextcloud”,即用全新网站替换了之前的网站。
登录 MariaDB 数据库服务器,使用如下指令删除 Nextcloud 使用的数据库,并重新创建数据库:
MariaDB [(none)]> drop datbase nextcloud; MariaDB [(none)]> CREATE DATABASE IF NOT EXISTS nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
注意这里创建的数据库名同”config.php”文件中保存的数据名一致,当然也可以使用其他数据库名,但是使用一致的数据库名可以减少出错的机率。
至于数据库用户则不需要创建,因为本来就保存在数据库中的,如果使用了与之前一致的数据名,则不需要重新授权,因为该用户已经对 Nextcloud 使用的数据库具有所有权限;如果使用了其他数据库名,则需要重新授权。
之后,使用如下命令保证 web 服务器用户对于 Nextcloud 具有读写权限,我使用的是 nginx 用户,根据实际情况自行修改:
# chown -R nginx:nginx /www/nextcloud
最后,通过浏览器访问 Nextcloud 网站的 URL,就会发现网站会提示选择数据库安装 Nextcloud,根据之前”config.php”中的信息,填入数据库信息和网站数据目录信息后,点击安装按钮,就会重新部署 Nextcloud 网站了。
事实上部署也没有多复杂,就是创建数据目录,生成 Nextcloud 的实例 ID,并生成相应的辅助文件,也就是之前删除的那个目录。新 Nextcloud 网站的实例 ID 可能与之前不一致,这不影响恢复数据,不需要处理。
3] 恢复 Nextcloud 数据
首先将之前备份的用户数据复制到新 Nextcloud 网站的数据目录中,然后登录数据库服务器,重复第二步的操作,将 Nextcloud 使用的数据库删除并重新创建一个名为”nextcloud”的数据库,最后使用如下命令将数据库备份数据恢复:
# mysql -u root -p nextcloud < nextcloud.bak
这样,之前的数据文件了和数据库信息都按原样恢复了,关联关系也恢复了。
再次访问 Nextcloud 网站,就会发现所有文件都可以正常显示了,误删文件造成的故障就处理完成了。