概述
Seafile 的数据备份通常包括两部分:
-
Seafile 资料库数据
-
数据库
有如下三个数据库:
-
ccnet_db :包含用户和群组信息
-
seafile_db :包含库的元数据
-
seahub_db :包含 Web 前端(Seahub)使用的表
备份步骤
备份需要如下两步:
-
备份数据库;
-
备份 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 服务器故障,需要恢复到另一台机器:
-
假设在新机器中,Seafile 也被部署在了 /opt/seafile 目录中,拷贝 /backup/data/seafile 到新机器中即可。
-
恢复数据库。
恢复数据库
你可以按如下步骤来进行恢复。
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 mysqldump -u[username] -p[password] --opt ccnet_db > ccnet_db.sql
docker exec -it seafile-mysql mysqldump -u[username] -p[password] --opt seafile_db > seafile_db.sql
docker exec -it seafile-mysql mysqldump -u[username] -p[password] --opt seahub_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/
恢复数据
恢复数据库
docker cp /opt/seafile-backup/databases/ccnet_db.sql seafile-mysql:/tmp/ccnet_db.sql
docker cp /opt/seafile-backup/databases/seafile_db.sql seafile-mysql:/tmp/seafile_db.sql
docker cp /opt/seafile-backup/databases/seahub_db.sql seafile-mysql:/tmp/seahub_db.sql
docker exec -it seafile-mysql /bin/sh -c "mysql -u[username] -p[password] ccnet_db < /tmp/ccnet_db.sql"
docker exec -it seafile-mysql /bin/sh -c "mysql -u[username] -p[password] seafile_db < /tmp/seafile_db.sql"
docker exec -it seafile-mysql /bin/sh -c "mysql -u[username] -p[password] seahub_db < /tmp/seahub_db.sql"
恢复 seafile 数据
cp -R /backup/data/* /opt/seafile-data/seafile/