3.2 备份与恢复失败
先给一个判断
备份失败一般不可怕,恢复失败才可怕。 备份失败你还有原始数据;恢复失败可能把好好的数据覆盖成半残状态。所以这一节的总体原则是:备份失败 → 看日志修备份;恢复失败 → 立刻停手,先保护现状。任何恢复操作之前,都先做一个当前状态的备份当底牌。
现象与原因对照表
| 现象 | 可能原因 | 第一步 |
|---|---|---|
| 备份任务状态失败 | 磁盘空间不足 | df -h |
| 备份了但文件很小/为空 | 数据库实际是空的 / 权限不够 | 看备份文件大小和内容 |
| 上传备份恢复失败 | 上传的压缩包里没有要求的 SQL 文件 | 看任务日志报错 |
| 恢复后网站数据还是旧的 | 恢复了别的库 / 网站关联的是另一个库 | 核对“关联资源” |
| 手动导出的 SQL 导不进去 | 导出工具的格式不兼容 | 换导入方式 |
| 备份文件越来越大 | 备份目录被包含进了源目录 / 没设保留份数 | 检查任务参数 |
规律:凡是“备份失败”,先做两件事——看任务日志、看磁盘空间;凡是“恢复失败”,先做一件事——停手,备现状。
备份:官方怎么做的
1Panel 的数据库备份用 mysqldump 方式,默认备份目录是 /opt/1panel/apps 之外的 /opt/1panel/backup/database/mysql(不同版本路径以面板实际显示为准)。备份是异步任务,进度和错误在 日志审计 → 任务日志 里看。
备份失败的两个高频原因:
# 原因一:磁盘满了(最常见)
df -h /
# 原因二:备份目录权限或空间问题,看一下目录
ls -ld /opt/1panel/backup/database/mysql
数据库本身的当前状态也能辅助判断:如果数据库正在被大查询占满资源,备份任务可能超时。这种情况把备份安排在凌晨低峰期(用计划任务),比白天手动备份稳得多。
用计划任务做常态化备份
生产环境不应该靠人记得点备份。计划任务支持备份应用、网站和数据库,关键参数:
| 参数 | 建议设置 | 为什么 |
|---|---|---|
| 执行周期 | 每天凌晨 | 避开业务高峰,对性能无感 |
| 备份账号 | 至少配一个远程目标 | 本机备份本机,出事一起没 |
| 保留份数 | 7~30 份 | 太少回不去,太多吃磁盘 |
| 排除规则 | 排除缓存目录 | 备份体积小一半 |
| 压缩密码 | 记牢并存好 | 丢了密码备份无法恢复 |
一个隐形大坑(官方原话):备份目录类的任务,“避免把备份输出目录再次包含进源目录,否则可能造成递归归档或空间快速增长”。翻译一下:备份存哪,备份就别把哪一起打包,否则每次备份都把之前的备份全打进去,磁盘几天就爆。
日志类备份的注意事项
计划任务里还有“备份日志”和“切割网站日志”。注意两点:
- 日志被系统轮转或删除后,任务只能备份当时还在的内容;
- 网站日志切割要配合保留份数,否则历史日志慢慢吃满磁盘(详见 4.4 节)。
恢复:三个硬约束
官方文档把恢复的坑说得非常直白:
- 上传文件恢复时,压缩包里必须存在要求的 SQL 文件(如 test.sql),否则无法正确导入;
- 导入的 SQL 文件格式必须符合标准——用 phpMyAdmin 导出的文件可能缺版本、编码等信息,导致 mysqldump 方式导入失败;
- 实在导不进去,可以尝试用 phpMyAdmin 导入(数据库列表上方的【管理】可以跳转 phpMyAdmin / Adminer)。
翻译成人话:不是所有 .sql 文件都能互相喂。跨工具移动数据时,优先用同一种工具导出导入;碰壁了换 phpMyAdmin 的导入功能试一次。
一个完整的复现与修复
场景一:备份失败。
现象:创建数据库备份,任务状态显示失败。
排查:
- 打开任务日志,报错写着写入失败 / 空间不足;
df -h /一看,根分区用了 98%;- 先清理:用 工具箱 → 缓存清理 清掉系统垃圾、未用镜像、构建缓存(详见 4.4 节),腾出空间;
- 重新备份,成功。
场景二:恢复失败。
现象:从本地下载的老备份恢复到新装的数据库,导入失败。
排查:
- 任务日志报“找不到要求的 SQL 文件”;
- 解压备份包看内容——当年是用 phpMyAdmin 导出的单文件,压缩包结构和 1Panel 要求的不一样;
- 用 phpMyAdmin 的导入功能直接导这个文件,成功。
复盘要点:备份文件要定期验证能不能恢复。官方文档原话提醒:“任务执行成功只表示备份流程完成”,生产环境应该定期做恢复验证,确认应用版本、数据库版本、压缩密码和远端文件都可用。一直没试过的备份,约等于没有备份。
再补一句:场景二的“下载老备份来恢复”,其实是迁移场景的预演——跨版本(比如 MySQL 5.7 的备份恢复到 8.0)经常还要处理字符集和语法的差异,低版本备份往高版本恢复成功率较高,反过来要特别小心(升级和数据迁移的坑见 3.4 节)。
网站和应用备份的两点提醒
| 备份对象 | 入口 | 注意事项 |
|---|---|---|
| 网站 | 网站列表 → 更多 → 备份列表 | 关联了数据库的会一起备份 |
| 应用 | 已安装应用 → 备份 | 可下载、可导入恢复 |
| 数据库 | 数据库列表 → 备份 | mysqldump 方式 |
| 全量 | 面板设置 → 快照 | 整个 1Panel 的状态 |
网站配置 → 资源 里可以把网站和一个数据库关联,备份网站时会同时备份关联的数据库。注意官方的警告:切换关联的数据库会导致以前的备份无法恢复——关联关系别随手换。
恢复前的标准动作
养成这个习惯,能避免 90% 的悲剧:
- 先备份当前状态(哪怕现状是坏的,也留个底)。怎么操作:数据库列表 → 备份,把当前这个半残的库先备一份,名字里注明“恢复前快照”;
- 确认目标库的总行数/表数,恢复后用来对比验证:
# 恢复前数一下(在数据库管理工具里执行)
SHOW TABLES;
SELECT COUNT(*) FROM 你的核心表;
- 恢复后重新数一遍,对得上才算成功;
- 重启/刷新使用该库的应用,让它重新读取数据。
为什么要数行数? 因为恢复“成功”有时候只是导入流程没报错,数据其实没进去或者只进去一半。任务状态是绿色,不代表数据是真的。多花 30 秒验证,能省掉后面一整天的“数据怎么不对”。
网站备份恢复的特殊情况
网站恢复走 网站列表 → 备份列表 → 恢复,恢复的是网站目录的文件。特别注意:
- 恢复不会恢复 OpenResty 的网站配置(伪静态、CORS 那些),要单独留底(见 2.4 节);
- 关联的数据库恢复,要在数据库那边单独操作,网站和数据库的备份点要对齐——网站恢复到周一、数据库恢复到周三,出来的组合谁也不知道对不对。
快照:系统级的后悔药
除了逐个备份,1Panel 还支持系统快照(面板设置 / 计划任务 → 系统快照),把整个 1Panel 的状态打成一个包。做大规模调整(升级、迁移、换配置)之前拍一个快照,出问题能整体回滚。快照的相关注意事项见 1.4 节,这里只强调一件事:快照占空间不小,要配合保留份数和镜像包含选项使用,别让快照自己把磁盘吃满。
下载异地:备份的最后一公里
备份文件留在服务器本机上,和服务器一起没了。 1Panel 支持在备份账号里配置远程目标(面板设置 → 备份账号),计划任务里可以把备份同时推到远端。哪怕只是一周下一次备份到本地电脑,也比全在服务器上强。
判断你的备份策略及不及格,问自己三个问题:
- 备份在另一台机器/另一个地理位置上吗?
- 最近三个月恢复验证过一次吗?
- 如果现在服务器没了,多长时间能恢复?
三个都能答“是”才算合格。大部分人的备份是“有在备份”,而不是“能恢复”——这两件事差得很远。
本节要点
- 备份失败先看任务日志,第一位嫌疑是磁盘空间;
- 恢复失败立刻停手,先给现状做备份再继续;
- 上传恢复要求压缩包结构符合规范,跨工具导出的 SQL 换 phpMyAdmin 导入;
- 备份要定期做恢复验证,没验证过的备份等于没有;
- 备份文件务必异地保存,别和业务放一台机器;
- 网站配置不在网站备份里,要单独留底。
备份与恢复的官方说明见 1Panel 官方文档:MySQL,以官方文档为准。
下一节:数据库告一段落,来说应用商店——应用安装失败和容器起不来,怎么从日志里揪出原因。
