
背景服务器上的 MariaDB 存着监控数据虽然不多但没了就没了。做了个备份脚本dockerexecmy-mariadb mariadb-dump-uroot-p密码 --all-databasesbackup.sql但从来没验证过——备份文件真的能恢复吗原因备份不算备份能恢复的才叫备份。很多人做了备份但从没验证过。真出事时才发现备份文件是空的dump 命令写错了备份文件中途中断数据库太大命令超时被杀备份文件格式不对编码问题、换行问题根本没配定时任务备份文件是半年前的没演练过的备份等于没有备份。解决第一步写备份脚本#!/bin/bashset-euopipefailBACKUP_DIR/home/YOUR_USER/db-backupsKEEP_DAYS7mkdir-p$BACKUP_DIRTS$(date%F-%H%M)BACKUP_FILE$BACKUP_DIR/all-databases-$TS.sql# 备份dockerexecmy-mariadb mariadb-dump\-uroot-pYOUR_DB_PASSWORD\--all-databases\--single-transaction\--routines--triggers--events\$BACKUP_FILE# 验证结尾必须有 Dump completedif!tail-5$BACKUP_FILE|grep-qDump completed;thenecho❌ 备份不完整rm-f$BACKUP_FILEexit1fi# 清理 7 天前的备份find$BACKUP_DIR-name*.sql-mtime$KEEP_DAYS-deleteecho✅ 备份完成:$BACKUP_FILE关键参数参数作用--all-databases备份所有库--single-transaction不锁表InnoDB--routines包含存储过程--triggers包含触发器--events包含定时事件第二步加到定时任务crontab -e加一行每天凌晨 3 点备份0 3 * * * /home/YOUR_USER/backup.sh /home/YOUR_USER/backup.log 21第三步灾难恢复演练关键这一步才是重点。假设服务器挂了要在新服务器上恢复。步骤拉一个干净的 MariaDB 容器docker run -d --name test-mariadb \ -e MYSQL_ROOT_PASSWORD临时密码 \ mariadb:latest等它健康sleep 30 docker exec test-mariadb mariadb -uroot -p临时密码 -e SELECT 1;恢复备份dockerexec-itest-mariadb mariadb-uroot-p临时密码~/db-backups/all-databases-2026-10-06.sql验证数据真的恢复了dockerexectest-mariadb mariadb-uroot-p临时密码-eSHOW DATABASES;dockerexectest-mariadb mariadb-uroot-p临时密码 test_db-eSELECT COUNT(*) FROM server_metrics;看到数据条数正常才算恢复成功。5. 清理测试容器dockerstop test-mariadbdockerrmtest-mariadb第四步把演练写进 SOP每次改过备份脚本或升级数据库版本后必做一次演练。三个坑坑 1备份文件没验证完整性mariadb-dump 中途超时被杀会生成一个半截的 sql 文件看着有几十 M其实恢复不了。验证方法文件结尾必须有 – Dump completed on …。没有就不算成功。坑 2只备份不演练备份脚本写得再漂亮没演练过就不知道能不能用。等到真出事才发现备份坏了——那就晚了。建议每季度演练一次把恢复流程跑一遍。坑 3备份文件没异地、没保留策略备份全在同一台服务器上——服务器硬盘坏了备份也没了。建议保留 7 天本地每周拉一份到对象存储腾讯云 COS、阿里云 OSS3 个月内不删除阅读分享强烈推荐一本小说《黎明之剑》。它既有宏大的世界观也融入了对信息、网络与文明安全的思考。喜欢宏大叙事和网络安全题材的朋友相信会读得很过瘾。