Shell脚本-MySQL数据库自动备份
#### 前提 确认已安装 `mysqldump`(MySQL 自带,一般都有) 提前准备:MySQL 账号、密码、数据库名 备份目录统一存放,示例路径:`/data/mysql_backup` #### 创建备份目录 ```bash mkdir -p /data/mysql_backup ``` #### 新建文件 `backup_mysql.sh` ```bash vim /data/backup_mysql.sh ``` #### 修改代码 ```bash #!/bin/bash # ==================== 手动修改以下配置 ==================== # MySQL 账号 DB_USER="账号" # MySQL 密码 DB_PWD="数据库密码" # 要备份的数据库名,多个库空格分隔 DB_NAME="test_db blog_db" # 备份文件存放目录 BACKUP_DIR="/data/mysql_backup" # 保留最近 7 天备份,自动删除旧文件 RETENTION_DAYS=7 # =========================================================== # 获取当前日期时间作为文件名 DATE=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="${BACKUP_DIR}/db_backup_${DATE}.sql.gz" # 执行备份 + 压缩 # --single-transaction:InnoDB 引擎热备份,不用停库、不锁表 mysqldump -u${DB_USER} -p${DB_PWD} --databases ${DB_NAME} \ --default-character-set=utf8mb4 --single-transaction --quick | gzip > ${BACKUP_FILE} # 判断备份是否成功 if [ $? -eq 0 ]; then echo "[$DATE] 数据库备份成功: ${BACKUP_FILE}" else echo "[$DATE] 数据库备份失败!" fi # 删除 N 天前的旧备份 # find -mtime +7:自动清理 7 天前备份,避免磁盘爆满 find ${BACKUP_DIR} -name "db_backup_*.sql.gz" -type f -mtime +${RETENTION_DAYS} -delete ``` > 遇到的坑:手动执行脚本文件可以生效,但是定时执行没有效果 `cron` 执行时的 `PATH` 通常很精简(只有 `/usr/bin:/bin`),一些命令可能无法执行,比如 `date`,`mysqldump`,`find`这些系统命令 解决办法:先在脚本文件中加 `source /.bashrc` 先加载一下环境,最好把 `find`,`date` 等一些系统命令换成绝对路径,执行 `which find data`,大概输出`/usr/bin/find` `/usr/bin/date`,然后把代码中用到的系统命令,例如 `find`,`date` 替换成 `/usr/bin/find` `/usr/bin/date` 这种绝对路径 ```bash #!/bin/bash source ~/.bashrc # 其他代码 ``` #### 添加执行权限 ```bash chmod +x /data/backup_mysql.sh ``` #### 手动测试执行(先跑一遍看是否报错) ```bash /data/backup_mysql.sh # 正常会在 /data/mysql_backup 生成 .sql.gz 压缩备份文件 ``` #### 设置定时任务(Crontab 自动执行)**每周一凌晨 2 点自动备份** ```bash # 编辑定时任务 crontab -e # 追加一行 0 2 * * 1 /data/backup_mysql.sh >> /data/mysql_backup/backup_log.txt 2>&1 # >> 日志文件:把运行日志记录下来,方便排查错误 # 查看当前定时任务 crontab -l # 常用时间格式参考(按需改) # 每 6 小时备份一次:0 */6 * * * # 每天中午 12 点:0 12 * * * # 每周一凌晨 2 点:0 2 * * 1 ``` #### 如何恢复备份(关键时刻用) ```bash # 解压备份文件 cd /data/mysql_backup gzip -d db_backup_20260612_020000.sql.gz # 导入恢复数据库 mysql -u账号 -p你的密码 < db_backup_20260612_020000.sql ``` #### 安全优化建议(云服务器必做) 不要把密码明文写脚本里(进阶安全) 编辑 MySQL 客户端配置,避免密码暴露: ```bash vim ~/.my.cnf ``` 写入 ```bash [mysqldump] user=账号 password=密码 ``` 权限收紧: ```bash chmod 600 ~/.my.cnf ``` 之后脚本里可以删掉 `-u${DB_USER} -p${DB_PASS}`,直接简写: ```bash mysqldump --databases ${DB_NAME} --single-transaction --quick | gzip > ${BACKUP_FILE} ```