Skip to content

备份和恢复

为数据库和外部的附件存储规划备份

你的备份方案的制订,取决于数据库后端和存储后端。

默认的数据目录层级

~/.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 ~/.memos

PostgreSQL 备份

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 和代理怎么配置的

操作建议

  • 当决定了备份计划后,至少测试一次恢复
  • 备份时记录下存储服务的信息
  • 对附件的恢复应该是恢复过程中的首要环节,而非事后补救

最后更新于:

评论区
评论区空空如也
发送评论
名字
0 / 20
邮箱
0 / 100
评论内容
0 / 140
由于是非实名评论,所以不提供删除功能。如果你需要删除你发送的评论,或者是其他人的评论对你造成了困扰,请 发邮件给我 。同时评论区会使用 AI + 人工的方式进行审核,以达到合规要求。