备份和恢复

概述
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] --opt ccnet_db > /backup/databases/ccnet_db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h [mysqlhost] -u[username] -p[password] --opt seafile_db > /backup/databases/seafile_db.sql.`date +"%Y-%m-%d-%H-%M-%S"`
mysqldump -h [mysqlhost] -u[username] -p[password] --opt seahub_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
docker exec -it seafile-mysql mariadb-dump -u[username] -p[password] --opt ccnet_db > ccnet_db.sql
docker exec -it seafile-mysql mariadb-dump -u[username] -p[password] --opt seafile_db > seafile_db.sql
docker exec -it seafile-mysql mariadb-dump -u[username] -p[password] --opt seahub_db > seahub_db.sql
提示:默认数据库镜像使用 MariaDB 10.11。在容器中可能找不到某些 mysql* 系列命令(例如 mysqldump: command not found),因为这类命令已逐步被弃用。因此建议使用 mariadb* 系列命令。 但是,如果你仍然使用 MySQL Docker 镜像,则应该继续使用 mysqldump
备份 Seafile 资料库数据
直接复制整个数据目录
cp -R /opt/seafile-data/seafile /backup/data/
或者使用 rsync 执行增量备份
rsync -az /opt/seafile-data/seafile /backup/data/
恢复数据
恢复数据库
docker cp /backup/databases/ccnet_db.sql seafile-mysql:/tmp/ccnet_db.sql
docker cp /backup/databases/seafile_db.sql seafile-mysql:/tmp/seafile_db.sql
docker cp /backup/databases/seahub_db.sql seafile-mysql:/tmp/seahub_db.sql
docker exec -it seafile-mysql /bin/sh -c "mariadb -u[username] -p[password] ccnet_db < /tmp/ccnet_db.sql"
docker exec -it seafile-mysql /bin/sh -c "mariadb -u[username] -p[password] seafile_db < /tmp/seafile_db.sql"
docker exec -it seafile-mysql /bin/sh -c "mariadb -u[username] -p[password] seahub_db < /tmp/seahub_db.sql"
如果使用 MySQL Docker 镜像,请将上述命令中的 mariadb 改为 mysql。
恢复 seafile 数据
# 先预览恢复操作
sudo rsync -aHAX --dry-run --itemize-changes /backup/data/seafile/ /opt/seafile-data/seafile/
# 确认无误后执行恢复
sudo rsync -aHAX /backup/data/seafile/ /opt/seafile-data/seafile/