苹果CMS如何做数据库定时备份?数据备份与恢复已存在,避开。
照着做一遍,你就能给苹果CMS 配上一套不依赖后台按钮、由系统定时执行的 MySQL 自动备份,并知道备份文件该放哪、怎么确认它真的可用。
第一步:从配置文件里读出数据库连接信息
这一步要拿到数据库名、账号、密码和主机地址,后面写脚本全靠它。用 SSH 或宝塔的「终端」登录服务器,进入网站根目录,打开苹果CMS 的数据库配置文件:
- 苹果CMS V10 默认路径:
application/database.php - 部分老版本或改过结构的:
config/database.php
命令示例(把 /www/wwwroot/maccms 换成你的实际站点目录):
cd /www/wwwroot/maccms
grep -E "hostname|database|username|password|prefix" application/database.php
记下 hostname(一般是 127.0.0.1)、database、username、password、prefix(默认是 mac_)。
注意:不要用 root 账号去跑备份脚本。如果配置里用的就是 root,建议在宝塔「数据库」页面或命令行新建一个只读账号,只授予
SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER权限,万一脚本泄露损失也小。
第二步:写备份脚本,产出按日期命名的压缩文件
这一步要得到一个能重复执行的 shell 脚本,每跑一次就在指定目录生成一个 .sql.gz 文件,并自动清掉过期文件。
在服务器上新建 /data/backup/backup_maccms.sh(目录不存在就先 mkdir -p /data/backup),内容如下:
#!/bin/bash
DB_HOST="127.0.0.1"
DB_NAME="maccms"
DB_USER="maccms_user"
DB_PASS="这里填密码"
BACKUP_DIR="/data/backup/maccms"
KEEP_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p "$BACKUP_DIR"
/usr/bin/mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASS" \
--single-transaction --quick --default-character-set=utf8mb4 \
--routines --events --triggers --hex-blob \
"$DB_NAME" | gzip > "$BACKUP_DIR/maccms_$DATE.sql.gz"
find "$BACKUP_DIR" -name "maccms_*.sql.gz" -mtime +$KEEP_DAYS -delete
echo "$(date '+%F %T') backup ok: maccms_$DATE.sql.gz" >> "$BACKUP_DIR/backup.log"
--single-transaction 保证 InnoDB 表在备份过程中不锁表,前台访问不受影响;--default-character-set=utf8mb4 防止中文标题、弹幕类内容变乱码。
保存后赋权并手动跑一次:
chmod 700 /data/backup/backup_maccms.sh
/data/backup/backup_maccms.sh
ls -lh /data/backup/maccms/
看到当天的 .sql.gz 文件就算成功。
注意:备份目录绝对不能放在网站根目录下(比如
public/backup),否则别人用浏览器直接访问 URL 就能把你的整库数据下载走。放在/data/backup这类 web 目录之外最稳妥。
第三步:用 crontab 设置每天定时执行
这一步让脚本无人值守自动跑,得到的是「每天固定时间自动新增一份备份」。
执行 crontab -e,在末尾加一行:
0 3 * * * /bin/bash /data/backup/backup_maccms.sh >/dev/null 2>&1
意思是每天凌晨 3:00 执行一次(低峰期,对站点影响最小)。保存退出后确认:
crontab -l
第二天来看 cat /data/backup/maccms/backup.log,有新的 backup ok 记录就说明定时生效了。
注意:crontab 的环境变量比登录 shell 少,
mysqldump可能找不到,所以脚本里写的是绝对路径/usr/bin/mysqldump。先用which mysqldump确认真实路径,不是这个就改成你的。另外 MySQL 8 若报Unknown authentication plugin 'caching_sha2_password',把该账号改为mysql_native_password,或升级客户端版本。
第四步:验证备份可用,并做一份异地留存
这一步确认备份不是「看起来有、恢复时废」,并避免服务器整机故障时数据一起丢。
先做完整性检查:
gzip -t /data/backup/maccms/maccms_*.sql.gz && echo "压缩包完整"
再挑最新一份恢复到测试库验证(不要直接动生产库):
mysql -uroot -p -e "CREATE DATABASE maccms_test DEFAULT CHARSET utf8mb4;"
gunzip < /data/backup/maccms/maccms_20250101_030001.sql.gz | mysql -uroot -p maccms_test
mysql -uroot -p -e "SELECT COUNT(*) FROM maccms_test.mac_vod;"
能查出影片条数,说明备份真能用。随后把备份同步到另一台机器或对象存储,例如:
rsync -avz /data/backup/maccms/ user@另一台IP:/data/backup/maccms/
注意:本地保留 7 天、异地保留 30 天是比较常见组合。如果站点数据量大,
mysqldump会占用磁盘 IO,建议仍放在凌晨执行,并用df -h确认备份分区剩余空间足够放下「份数 × 单份大小」。
小结
- 数据库连接信息从
application/database.php读取,别用 root 账号执行备份。 - 核心命令是
mysqldump --single-transaction --default-character-set=utf8mb4加gzip,脚本负责命名、压缩、清理过期文件。 - 定时靠
crontab -e,脚本内命令一律写绝对路径,避免环境变量缺失。 - 备份目录必须放在 web 根目录之外,否则等于把数据库挂到公网。
- 定期做一次恢复演练,并把备份 rsync 到异地,才算真正可靠。
原文链接:https://www.gj0.com/thread-138.html
转载请注明出处并保留本声明;内容仅代表作者观点,与本站立场无关。若本文涉嫌侵权,请联系本站处理。