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。
底层文件拷贝完成后,开始进行数据库的迁移。
注意:整个迁移过程中务必关闭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。