Appearance
备份和恢复
为数据库和外部的附件存储规划备份
你的备份方案的制订,取决于数据库后端和存储后端。
默认的数据目录层级
~/.memos/
├── memos_prod.db # SQLite 数据库(默认)
└── assets/ # 上传的文件和附件目录位置由 MEMOS_DATA 控制。你可以在运行时对其进行覆写,或者就用默认配置。
备份什么
- 数据库
- 当附件没有存放在数据库里时,还需要备份附件存储
- 部署配置,例如环境变量、Compose 文件、代理配置
SQLite 备份
安全性最高的离线备份方式,就是先停止 Memos 服务,再复制数据库文件:
bash
sudo systemctl stop memos
tar -czf memos-backup-$(date +%Y%m%d).tar.gz -C ~/.memos .
sudo systemctl start memos当 Memos 正在运行,而要进行在线备份时,可以使用 SQLite 内置的 .backup 命令,该命令可以正确处理 WAL 模式:
bash
sqlite3 ~/.memos/memos_prod.db ".backup ~/.memos/memos_backup.db"7 日滚动备份:
bash
#!/bin/bash
BACKUP_DIR="/var/backups/memos"
DATE=$(date +%Y%m%d-%H%M%S)
MEMOS_DATA="${MEMOS_DATA:-$HOME/.memos}"
mkdir -p "$BACKUP_DIR"
sqlite3 "$MEMOS_DATA/memos_prod.db" ".backup $BACKUP_DIR/memos-$DATE.db"
tar -czf "$BACKUP_DIR/assets-$DATE.tar.gz" -C "$MEMOS_DATA" assets
find "$BACKUP_DIR" -name "memos-*.db" -mtime +7 -delete
find "$BACKUP_DIR" -name "assets-*.tar.gz" -mtime +7 -delete添加到定时任务中:0 2 * * * /usr/local/bin/backup-memos.sh。
MySQL 备份
bash
# 备份
mysqldump -u memos_user -p memos_db | gzip > memos-backup-$(date +%Y%m%d).sql.gz
tar -czf assets-backup-$(date +%Y%m%d).tar.gz -C ~/.memos assets
# 恢复
gunzip < memos-backup.sql.gz | mysql -u memos_user -p memos_db
tar -xzf assets-backup.tar.gz -C ~/.memosPostgreSQL 备份
bash
# 备份
pg_dump -U memos_user -d memos_db -F c -f memos-backup-$(date +%Y%m%d).dump
tar -czf assets-backup-$(date +%Y%m%d).tar.gz -C ~/.memos assets
# 恢复
pg_restore -U memos_user -d memos_db memos-backup.dump
tar -xzf assets-backup.tar.gz -C ~/.memos恢复思路
备份只有当可以用于恢复时才有意义,确保你对如下信息了如指掌:
- 数据存放在哪
- 正在使用哪个数据库引擎
- 附件是存放在数据库中、磁盘上,还是对象存储中
- 实例 URl 和代理怎么配置的
操作建议
- 当决定了备份计划后,至少测试一次恢复
- 备份时记录下存储服务的信息
- 对附件的恢复应该是恢复过程中的首要环节,而非事后补救