备份和恢复

概述
Seafile 的数据备份通常包括两部分:
  • Seafile 资料库数据
  • 数据库
有如下三个数据库:
  • ccnet_db:包含用户和群组信息
  • seafile_db:包含库的元数据
  • seahub_db:包含 Web 前端(Seahub)使用的表
备份步骤
备份需要如下两步:
  1. 备份数据库;
  2. 备份 Seafile 数据目录
备份顺序:先备份数据库还是先备份数据目录?
1.先备份数据目录,再备份数据库:
如果备份数据目录时有新的对象写入,但未被备份,这些新对象可能在数据库中被引用。恢复时,数据库中的某些记录找不到对象,库会损坏。
2.先备份数据库,再备份数据目录:
数据库先备份,确保所有数据库记录引用有效对象,库不会损坏。但在备份数据目录时新增的数据未被数据库记录引用,恢复时可能丢失部分最新数据。
第二种顺序更安全,可以避免库损坏。使用第一种顺序可以保留更多数据,但要求存储备份机制足够快。
假设 Seafile 数据目录为 /opt/seafile(二进制部署)或 /opt/seafile-data(Docker 部署),备份目录为 /backup。目录结构可以如下:
/backup
----databases/# 数据库备份文件
----data/# 数据目录备份
二进制部署的备份与恢复
备份数据库
建议每次备份生成单独文件,至少保留一周不要覆盖旧备份。
假设数据库名为 ccnet_db、seafile_db 和 seahub_db。使用 mysqldump(或 MariaDB 的 mariadb-dump)备份:
mysqldump-h[mysqlhost]-u[username]-p[password]--optccnet_db>/backup/databases/ccnet_db.sql.`date+"%Y-%m-%d-%H-%M-%S"`

mysqldump-h[mysqlhost]-u[username]-p[password]--optseafile_db>/backup/databases/seafile_db.sql.`date+"%Y-%m-%d-%H-%M-%S"`

mysqldump-h[mysqlhost]-u[username]-p[password]--optseahub_db>/backup/databases/seahub_db.sql.`date+"%Y-%m-%d-%H-%M-%S"`
如果报错 mysqldump: command not found,请使用 mariadb-dump:
mariadb-dump -h [mysqlhost] -u[username] -p[password] --opt ccnet_db > /backup/databases/ccnet_db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
mariadb-dump -h [mysqlhost] -u[username] -p[password] --opt seafile_db > /backup/databases/seafile_db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
mariadb-dump -h [mysqlhost] -u[username] -p[password] --opt seahub_db > /backup/databases/seahub_db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
备份 Seafile 资料库数据
数据文件存储在 /opt/seafile,可直接复制整个目录或使用 rsync 增量备份:
直接复制:
cp-R/opt/seafile/backup/data/seafile-`date+"%Y-%m-%d-%H-%M-%S"`
这样每次都会产生一个新的备份文件夹。完成后可以删掉旧的备份。
如果你有很多数据,拷贝整个数据目录会花很多时间,这时你可以用 rsync 做增量备份。
rsync-az/opt/seafile/backup/data
这个命令将数据备份到目录 /backup/data/seafile 。
恢复备份
恢复 Seafile 资料库数据
如果你当前的 Seafile 服务器故障,需要恢复到另一台机器:
  1. 假设在新机器中,Seafile 也被部署在了 /opt/seafile 目录中,拷贝 /backup/data/seafile 到新机器中即可。
  2. 恢复数据库。
  3. 由于数据库和数据是分别备份的,它们之间可能会出现一些不一致。为了纠正潜在的不一致性,在新机器上运行 seaf-fsck 工具来检查数据完整性。请参阅seaf-fsck 文档 。
恢复数据库
你可以按如下步骤来进行恢复。
mysql-u[username]-p[password]ccnet_db<ccnet_db.sql.2013-10-19-16-00-05
mysql-u[username]-p[password]seafile_db<seafile_db.sql.2013-10-19-16-00-20
mysql-u[username]-p[password]seahub_db<seahub_db.sql.2013-10-19-16-01-05
Seafile Docker 安装方式下的备份和恢复
目录结构
假设 Seafile 卷路径为 /opt/seafile-data,备份目录为 /backup。需要备份的数据:
/opt/seafile-data/seafile/conf # configuration files
/opt/seafile-data/seafile/seafile-data # data of seafile
/opt/seafile-data/seafile/seahub-data # data of seahub
备份数据库
建议每次将数据库备份到一个单独的文件中。至少在一周内不要覆盖旧的数据库备份。
cd/backup/databases
dockerexec-itseafile-mysqlmysqldump-u[username]-p[password]--optccnet_db>ccnet_db.sql
dockerexec-itseafile-mysqlmysqldump-u[username]-p[password]--optseafile_db>seafile_db.sql
dockerexec-itseafile-mysqlmysqldump-u[username]-p[password]--optseahub_db>seahub_db.sql
提示:默认的数据库镜像是 Seafile 12 版本中的 MariaDB 10.11,在容器中你可能找不到一些命令(例如 mysqldump: command not found),因为 mysql* 系列命令已逐步被弃用。因此我们建议使用 mariadb* 系列命令。
但是,如果你仍然使用 MySQL Docker 镜像,则应该继续使用 mysqldump
备份 Seafile 资料库数据
直接复制整个数据目录
cp-R/opt/seafile-data/seafile/backup/data/
或者使用 rsync 执行增量备份
rsync-az/opt/seafile-data/seafile/backup/data/
恢复数据
恢复数据库
dockercp/opt/seafile-backup/databases/ccnet_db.sqlseafile-mysql:/tmp/ccnet_db.sql
dockercp/opt/seafile-backup/databases/seafile_db.sqlseafile-mysql:/tmp/seafile_db.sql
dockercp/opt/seafile-backup/databases/seahub_db.sqlseafile-mysql:/tmp/seahub_db.sql
dockerexec-itseafile-mysql/bin/sh-c"mysql -u[username] -p[password] ccnet_db < /tmp/ccnet_db.sql"
dockerexec-itseafile-mysql/bin/sh-c"mysql -u[username] -p[password] seafile_db < /tmp/seafile_db.sql"
dockerexec-itseafile-mysql/bin/sh-c"mysql -u[username] -p[password] seahub_db < /tmp/seahub_db.sql"
恢复 seafile 数据
cp-R/backup/data/*/opt/seafile-data/seafile/