Typecho数据库备份脚本,定时自动导出
Typecho站点最怕的就是数据库损坏或误删,手动导出既容易忘又麻烦。
本文给出一套可落地的Shell备份脚本,配合crontab定时自动导出,并自动清理过期文件,零基础也能照着做完。
先理清备份前要确认的三件事
动手写脚本之前,先把下面几个信息记下来,后面命令里都要用到:
- 数据库连接信息:Typecho的数据库名、用户名、密码、主机地址。这些在网站根目录的
config.inc.php文件里能找到,打开后看$db->database、$db->user、$db->password、$db->host这几个变量。 - 备份文件存放目录:建议放在网站根目录之外,例如
/www/backup/typecho,避免被Web访问到。 - 服务器是否已安装mysqldump:在SSH里执行
which mysqldump,有路径返回说明可用。宝塔面板用户一般已自带。
编写自动导出脚本
在服务器上创建脚本文件,路径可以自己定,这里用 /root/backup_typecho.sh:
nano /root/backup_typecho.sh
把下面内容粘贴进去,记得把开头四个变量改成你自己的:
#!/bin/bash
DB_NAME="typecho_db"
DB_USER="typecho_user"
DB_PASS="你的数据库密码"
DB_HOST="localhost"
BACKUP_DIR="/www/backup/typecho"
DATE=$(date +%Y%m%d_%H%M%S)
FILE_NAME="typecho_${DATE}.sql"
mkdir -p "$BACKUP_DIR"
mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/$FILE_NAME"
gzip "$BACKUP_DIR/$FILE_NAME"
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
保存后给脚本加执行权限:
chmod +x /root/backup_typecho.sh
脚本逻辑不复杂:
先进入备份目录,
用 mysqldump 导出纯SQL文件,
再 gzip 压缩成 .sql.gz,
最后用 find 删掉7天前的旧备份。保留天数可以按需调整,
把 -mtime +7 里的7改成14就是保留两周。
配置crontab实现定时自动导出
先手动跑一次脚本,确认能正常生成文件:
/root/backup_typecho.sh
ls -lh /www/backup/typecho
看到有 .sql.gz 文件就说明脚本没问题。
随后加入定时任务,执行:
crontab -e
在打开的编辑器中添加一行,比如每天凌晨3点执行一次:
0 3 * * * /bin/bash /root/backup_typecho.sh > /dev/null 2>&1
这行的意思是:
每天3点0分,
用bash执行备份脚本。> /dev/null 2>&1 表示不保留输出日志,
如果你需要排查问题,
可以改成 >> /var/log/typecho_backup.log 2>&1,
把每次执行结果写进日志文件。
保存退出后,用 crontab -l 能看到刚添加的任务就说明配置成功。
宝塔面板用户的替代操作路径
如果你用的是宝塔面板,不想敲crontab命令,可以走面板界面:
- 进入面板左侧菜单的 计划任务。
- 点击 添加任务,任务类型选 Shell脚本。
- 任务名称填“Typecho数据库备份”,执行周期选“每天”,时间设为凌晨3点。
- 脚本内容直接粘贴上面脚本文件的全部内容。
- 保存后点击 执行 测试一次,再到备份目录查看是否生成文件。
两种方式效果一样,选自己顺手的即可。
容易踩坑的几个地方
密码里带特殊字符:如果数据库密码包含 $、! 等符号,直接写在脚本里可能被Shell解析出错。
稳妥做法是把密码用单引号包起来,或者改用MySQL配置文件方式,但最简单的办法是给Typecho单独建一个只含字母数字的数据库用户。
备份目录权限:脚本由cron执行时的用户身份可能和手动执行不同,如果备份目录权限不够会静默失败。
建议先手动执行一次,确认目录可写;
cron默认以当前登录用户身份运行,用 whoami 确认。
没验证就放任不管:定时任务配好后,第二天务必到备份目录看一眼文件时间戳是不是新的。备份脚本最怕的就是“以为在跑,其实早就失败了”。
只备份数据库不够:Typecho的附件和主题文件在 usr/uploads 和 usr/themes 目录里,数据库备份只含文章和配置。
重要站点建议数据库和 usr 目录一起备份,或者定期手动打包整站。
怎么确认备份真的可用
光有文件还不够,要验证备份能恢复。
最直接的方法:新建一个空数据库,用 mysql 命令导入备份文件试试:
gunzip -c /www/backup/typecho/typecho_20250101_030000.sql.gz | mysql -u test_user -p test_db
导入不报错、表结构完整,就说明备份是有效的。建议每隔一两个月做一次恢复演练,别等到真出事才发现备份是坏的。
如果服务器磁盘空间紧张,可以把备份目录挂载到对象存储或另一台机器上,脚本里加一行 rsync 或 scp 同步过去,这样即使本机磁盘损坏也有异地副本。
常见疑问
脚本里mysqldump提示command not found怎么办?
说明服务器没装MySQL客户端工具。宝塔用户可以在软件商店安装MySQL后自带;其他环境用包管理器安装,如 apt install mysql-client 或 yum install mysql。
备份文件越来越大怎么处理?
可以把保留天数改短,比如 -mtime +3 只留3天;或者把备份同步到对象存储后本地只留最近1份。
cron任务没执行,怎么排查?
先检查 crontab -l 里任务在不在,再看系统日志 /var/log/cron 或 /var/log/syslog 里有没有执行记录。把脚本输出重定向到日志文件是最快的排查方式。
能不能用宝塔自带的数据库备份功能?
可以,宝塔计划任务里也有“备份数据库”类型,操作更简单。但自写脚本更灵活,方便自定义保留策略和异地同步,两者不冲突,按需选择。
数据库备份是Typecho站点运维里性价比最高的一个动作,花十分钟配好脚本,之后就不用再操心。
先把本文的脚本跑通,再根据自己服务器的实际情况调整目录、保留天数和同步策略,基本就稳了。