一般来说,Seafile 备份分为两部分内容:
Seafile 资料库数据
数据库
如果你根据我们的手册来安装 Seafile 服务器,你应该有如下目录结构:
/opt/seafile
--seafile-server-9.x.x # Seafile 安装包解压缩后目录
--seafile-data # Seafile 配置文件和数据(如果你选择默认方式)
--seahub-data # Seahub 数据
--conf # 包含配置文件
你所有的资料库数据都存储在 /opt/seafile 目录。
对于 MySQL, 数据库由管理员来创建,所以不同的人部署,可能会有不同的文件名。大体而言,有如下三个数据库会被创建:
ccnet_db: 包含用户和群组信息
seafile_db: 包含资料库元数据信息
seahub_db: 包含网站前端(seahub)所用到的数据库表信息
备份需要如下两步:
备份数据库;
备份存放 Seafile 数据的目录;
先备份数据目录,后备份 SQL:备份数据目录时,会写入一些新对象,但不会备份它们。这些新对象可以在 SQL 数据库中引用。因此,当您还原时,数据库中的某些记录找不到其对象,会导致资料库损坏。
先备份 SQL,后备份数据目录:由于先备份数据库,因此数据库中的所有记录都引用的有效对象。因此资料库不会损坏。但是,数据库记录不会引用在备份时写入存储的新对象。所以有些资料库已经过时了。还原时,一些新数据会丢失。
从某种意义上说,第二个方法更好,因为它避免了资料库损坏。与其他备份解决方案一样,一些新数据可能会在恢复过程中丢失。始终有一个备份窗口。
我们假设你的 Seafile 数据位于 /opt/seafile 目录下,并且你想将其备份到 /backup
目录(/backup
目录可以是 NFS(网络文件系统),可以是另一台机器的 Windows 共享,或者是外部磁盘)。请在 /backup
目录下创建如下目录结构:
/backup
---- databases/ 包含数据库备份
---- data/ 包含 Seafile 数据备份
我们建议你每次将数据库备份到另一个单独文件,并且不要覆盖最近一周来备份过的旧数据库文件。
MySQL
假设你的数据库名分别为 ccnet_db
, seafile_db
和 seahub_db
。mysqldump
会自动锁住表,所以在你备份 MySql 数据库的时候,不需要停掉 Seafile 服务器。通常因为数据库表非常小,所以执行以下命令备份不会花太长时间。
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"`
由于所有的数据文件都存储在 /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 也被部署在了 /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 数据卷路径是 /opt/seafile-data
,并且您想将备份数据存放到 /backup
目录下。
您可以创建一个类似以下 /opt/seafile-backup
的目录结构:
/backup
---- databases/ 用来存放 MySQL 容器的备份数据
---- data/ 用来存放 Seafile 容器的备份数据
要备份的数据文件:
/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
步骤:
备份 MySQL 数据库数据;
备份 Seafile 数据目录;
建议每次将数据库备份到一个单独的文件中。至少在一周内不要覆盖旧的数据库备份。
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
注释:-p 后面是 mysql 的 root 用户登录密码,不要有空格
直接复制整个数据目录
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"
cp -R /backup/data/* /opt/seafile-data/seafile/
Last modified by Daniel Pan, 2024-03-30