shanxia2.0 生产环境 MySQL 备份脚本
每天 00:00 / 12:00 自动备份库 shanxia2.0;备份时 不导出 sys_api_request_log 表数据(仅保留表结构)。
每次备份前检查该表占用,若 data + index ≥ 2G 则执行 TRUNCATE 清理。
生产机建议目录
/iflytek/shanxia2.0/db-backup/ ← 将本目录整包上传到此处
├── backup.conf.example
├── backup.conf ← 需自行创建并填密码
├── backup-mysql.sh
├── start.sh
├── stop.sh
├── status.sh
├── data/ ← 备份文件 *.sql.gz
└── logs/ ← cron / 运行日志
上线步骤(上传后执行)
# 1. 上传本文件夹到生产机,例如:
# scp -r 生产环境部署/生产环境数据库备份的shell脚本 root@121.43.228.102:/iflytek/shanxia2.0/db-backup
ssh root@121.43.228.102
cd /iflytek/shanxia2.0/db-backup
# 2. 配置数据库账号(与 backend/.env.production 的 DATABASE_URL 一致)
cp backup.conf.example backup.conf
vi backup.conf # 必改 MYSQL_PASSWORD;按需改 HOST/USER/BACKUP_DIR
# 3. 赋权
chmod +x backup-mysql.sh start.sh stop.sh status.sh
# 4. 确认本机有 mysql / mysqldump(无则安装客户端)
# CentOS/RHEL: yum install -y mysql
# Debian/Ubuntu: apt-get install -y mysql-client
# 5. 安装定时任务(每天 0 点、12 点)
./start.sh
# 6. 建议立刻跑一次验证
./backup-mysql.sh
./status.sh
日常命令
| 命令 |
作用 |
./start.sh |
安装/更新 crontab(0 0,12 * * *) |
./stop.sh |
移除定时任务(不删已有备份) |
./status.sh |
查看 crontab、最近备份、日志 |
./backup-mysql.sh |
立即执行一次备份 + 超限清理 |
行为说明
- 备份内容:
mysqldump 全库(含 routines/triggers/events),对 sys_api_request_log 使用 --ignore-table,再单独追加该表的 仅结构 dump,最后 gzip。
- 日志表清理:查询
information_schema 中该表 data_length + index_length,超过 LOG_TABLE_MAX_BYTES(默认 2147483648,即 2GiB)则 TRUNCATE TABLE。
- 保留策略:删除
BACKUP_DIR 下超过 KEEP_DAYS(默认 14)天的 ${库名}_*.sql.gz。
- 凭据:密码写在
backup.conf,运行时写入临时 defaults-extra-file(chmod 600),用完删除,避免出现在 ps 参数里。
恢复示例
gunzip -c /iflytek/shanxia2.0/db-backup/data/shanxia2.0_YYYYMMDD_HHMMSS.sql.gz \
| mysql -h 47.99.164.66 -P 3306 -u USER -p shanxia2.0
恢复后 sys_api_request_log 为空表(仅有结构),属预期行为。
配置项(backup.conf)
| 变量 |
含义 |
默认 |
MYSQL_HOST |
库主机 |
47.99.164.66 |
MYSQL_PORT |
端口 |
3306 |
MYSQL_USER / MYSQL_PASSWORD |
账号密码 |
必填 |
MYSQL_DATABASE |
库名 |
shanxia2.0 |
BACKUP_DIR |
备份目录 |
/iflytek/shanxia2.0/db-backup/data |
LOG_DIR |
日志目录 |
/iflytek/shanxia2.0/db-backup/logs |
KEEP_DAYS |
保留天数 |
14 |
LOG_TABLE_MAX_BYTES |
日志表清理阈值(字节) |
2147483648(2G) |
IGNORE_DATA_TABLE |
不备份数据的表名 |
sys_api_request_log |