当前位置:首页 >  站长 >  数据库 >  正文

数据库备份脚本只会 dump 一把梭?这份定时备份方案能救命

 2026-08-28 14:48  来源: 互联网   我来投稿 撤稿纠错

  一键部署OpenClaw

问过不少站长:有备份吗?答有,拷过一份。再问什么时候拷的?去年。这种备份等于没有。数据库备份要做到三条:自动化、异地存、定期演练恢复。三条都不难,一个脚本加一条 cron 全搞定。

先说 dump 命令怎么写才对。默认参数导出的文件恢复时容易出问题,这几个参数建议照抄:

mysqldump -uroot -p'密码' \
--single-transaction \ # InnoDB一致性快照,不锁表
--routines --triggers \ # 存储过程和触发器别落下
--default-character-set=utf8mb4 \
--hex-blob \ # 二进制字段安全导出
dbname | gzip > /backup/dbname_$(date +%F).sql.gz

--single-transaction 是 InnoDB 表的关键参数,用一致性快照代替锁表,备份期间网站照常跑。没加这个参数的话,dump 期间整库锁写,用户会体验一次全站卡死。

打包成完整脚本,带过期清理:

#!/bin/bash
# /var/www/tasks/db_backup.sh
BACKUP_DIR=/backup/mysql
KEEP_DAYS=14
mkdir -p $BACKUP_DIR

for db in site_db forum_db; do
mysqldump -uroot -p'密码' --single-transaction --routines --triggers \
--default-character-set=utf8mb4 "$db" | gzip > \
"$BACKUP_DIR/${db}_$(date +%F_%H%M).sql.gz"
done

# 删过期备份
find $BACKUP_DIR -name '*.sql.gz' -mtime +$KEEP_DAYS -delete

# 异地:推到另一台机器
rsync -az $BACKUP_DIR/ backup@备机IP:/backup/mysql/

crontab 每天凌晨 3 点跑一次,日志照旧落盘。至此自动化和异地都有了,但第三条演练才是灵魂——没恢复过的备份只是心理安慰:

# 找个测试库练恢复
gunzip < site_db_2026-08-25_0300.sql.gz | mysql -uroot -p'密码' site_db_test
# 抽查关键表的行数和最新数据

建议每季度做一次演练,顺便记录恢复耗时。真出事那天,你会感谢当时多花了这十分钟。库大的站点 dump 会越来越慢,后面可以上 XtraBackup 物理备份,但中小站点这套方案够用好几年。(数据来源:MySQL官方手册)

申请创业报道,分享创业好点子。点击此处,共同探讨创业新机遇!

相关标签
mysql
数据库

相关文章

  • 一台数据库扛不住了?MySQL 主从复制搭建实录,附跳坑指南

    站点流量上来后,读写全压在一台MySQL上,页面越来越慢,更闹心的是没备份没冗余,机器一挂全站完蛋。主从复制是数据库水平扩展的第一步:主库写、从库读,顺便从库就是一台热备。原理不难,就是主库把变更写进binlog,从库拉回来重放。第一步,主库开binlog并建复制账号:#主库my.cnf[mysql

    标签:
    mysql
  • 表越删越慢?OPTIMIZE TABLE回收空间实录

    日志表每天删几十万行,文件却一点没变小,查询还越来越慢。这不是玄学,是InnoDB的机制:删除的数据只是打标记,空间留在文件里复用,但反复增删后数据页变得稀碎,扫描效率下降。碎到一定程度就得整理。先看碎片率再动手,information_schema里直接查。SELECTtable_name,ROU

    标签:
    mysql
  • 网站突然连不上数据库?SHOW PROCESSLIST排查实录

    页面集体报数据库连接失败,重启MySQL能救急,但过几小时又犯。这种病根基本是连接堆积:请求速度超过消化速度,连接数堆到max_connections上限,新连接全被拒。排查工具就是一条SQL。SHOWPROCESSLIST;--输出关键列:Id、User、Host、db、Command、Time、

    标签:
    mysql
  • MySQL索引为什么不生效:六个写法让EXPLAIN当场现形

    明明建了索引,查询还是全表扫描,几百万行的表一查十几秒。索引失效多数不是索引的问题,是SQL写法的问题。别猜,EXPLAIN一下,type列是不是ALL、key列是不是NULL,一目了然。EXPLAINSELECT*FROMordersWHEREDATE(create_time)='2026-08-

    标签:
    mysql
  • 网站数据自动备份:一个脚本+一个计划任务搞定

    网站备份是出事之后最后悔没做的东西。很多人服务器被黑后才发现数据库没备份,几年的内容一夜归零。其实一个shell脚本加一个定时任务就能解决。下面这个脚本同时备份MySQL数据库和网站源码,按日期命名,保留最近7天。Linux服务器直接放到/root/backup.sh,Windows可以改成Powe

    标签:
    数据备份
    mysql

热门排行

信息推荐