Zavier's Blog

关于Seafile的数据迁移以及出错的解决办法

images.png


seafile默认是采用分块存储的,所以在迁移数据(资料库)的时候,只需迁移块,并修改mysql数据库即可。

Seafile的数据一般由三个目录组成,分别是seafile安装目录下的:

${SeafileDir}/seafile-data/storage/blocks
${SeafileDir}/seafile-data/storage/commits
${SeafileDir}/seafile-data/storage/fs

通俗地说,blocks目录下是被分块存储的文件,它们以repo_id为二级目录,commits则是记录了其对应的文件名、用户权限信息等,三者缺一不可。

因此,若要对整个seafile服务器进行迁移,则将它们一并拷贝到新服务器上;若只对单个资料库进行迁移,则从三个目录中分别找出相应的repo_id对应的文件夹,选择性拷贝。

如何查看资料库的repo_id?

通过管理员帐号登录seafile,进入管理员界面,找到左边菜单的“资料库”选项,点进去即可看到资料库对应的ID。

image.png

底层文件拷贝完成后,开始进行数据库的迁移。

注意:整个迁移过程中务必关闭seafile主程序,或者封堵端口、避免写入,否则容易导致迁移失败。

  • 整体迁移很简单,只需要原封不动地备份和导入数据即可

#备份
mysqldump -uroot -p seafile >seafile.sql
mysqldump -uroot -p seahub >seahub.sql
mysqldump -uroot -p ccnet >ccnet.sql
#sql文件拷贝后导入新服务器
mysql -uroot -p seafile <seafile.sql
mysql -uroot -p seahub <seahub.sql
mysql -uroot -p ccnet <ccnet.sql
  • 单一资料库迁移较为复杂,具体步骤:

记住资料库的repo_id值,通过phpmyadmin或者mysql命令行进入原服务器数据库,查找该repo_id对应的行

例如:该资料库的repo_id是“522f5320-14e4-4b9c-a96e-1d16f9b0769e”,现在迁移表Branch;

use seafile;
SELECT * FROM Branch where repo_id = '522f5320-14e4-4b9c-a96e-1d16f9b0769e';

可以同时得到字段id、name、repo_id、commit_id,将所有字段值插入新服务器即可。

其中id值可以自定义,其余字段的值必须原封不动地迁移。

涉及到的、需要插入的表有Branch、Repo、RepoFileCount、RepoHead、RepoInfo、RepoOwner、RepoSize

待数据库迁移完毕后,则完成数据迁移,通过web进入seafile的管理员界面即可对数据库进行操作。


迁移后可能出现的问题及解决办法:

在迁移时若忘记封堵端口、关闭程序,同时被待迁移数据库还有读写操作,则会导致迁移后数据无法读取,出现错误。

其原因是迁移中的数据读写导致seafile数据库中的表RepoSize中的head_id与原有数据不一致,从而出现错误。

显著的特征是读取日志文件${SeafileDir}/logs/seafile.log中会出现如下日志:

../common/block-backend-fs.c(70): failed to open block xxxx for read: No such file or directory.

解决的办法是通过运行修复脚本来修复。

sudo -u seafile ${SeafileDir}/seafile-server-latest/seaf-fsck.sh -r xxx

其中xxx代表的是资料库的repo_id。


  • 评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 2017-2023 Zavier的博客.网站地图