linux服务器自动备份数据库脚本
脚本代码配置数据库密码执行脚本查看脚本执行结果设置定时任务踩过的坑
脚本代码
#!/bin/bash
#########################################################################
# 数据库备份脚本(MySQL)
# 功能:全量备份、压缩存储、日志记录、自动清理过期备份
#########################################################################
# ========================= 基础配置(可根据需求调整)=========================
DB_HOST="127.0.0.1" # 数据库IP
DB_PORT="3306" # 数据库端口
DB_USER="root" # 数据库用户
BACKUP_DB="all" # 备份的数据库(all=全部数据库,指定单个数据库如test_db)
BACKUP_DIR="/data/mysql_backup" # 备份存储目录
LOG_DIR="/var/log/mysql_backup" # 日志存储目录
RETENTION_DAYS=7 # 备份保留天数(自动删除超过此天数的备份)
COMPRESS_TYPE="gzip" # 压缩方式(gzip/bzip2,bzip2压缩率更高但速度慢)
#########################################################################
# ========================= 脚本初始化 =========================
# 检查必要命令是否存在
check_command() {
if ! command -v $1 &> /dev/null; then
echo "错误:命令 $1 未找到,请先安装!"
exit 1
fi
}
check_command "mysqldump"
check_command "date"
check_command "mkdir"
check_command "rm"
check_command $COMPRESS_TYPE
# 创建备份目录和日志目录(若不存在)
mkdir -p $BACKUP_DIR
mkdir -p $LOG_DIR
# 定义日志文件和备份文件名
DATE=$(date +"%Y%m%d_%H%M%S") # 时间戳(年-月-日_时-分-秒)
LOG_FILE="${LOG_DIR}/backup_${DATE}.log"
BACKUP_FILENAME="${BACKUP_DIR}/mysql_backup_${DATE}"
# ========================= 备份执行 =========================
echo "========================================" >> $LOG_FILE 2>&1
echo "备份开始时间:$(date +"%Y-%m-%d %H:%M:%S")" >> $LOG_FILE 2>&1
echo "备份配置:主机=$DB_HOST 端口=$DB_PORT 用户=$DB_USER 数据库=$BACKUP_DB" >> $LOG_FILE 2>&1
# 执行mysqldump备份
if [ "$BACKUP_DB" = "all" ]; then
# 备份所有数据库(排除系统数据库)
mysqldump -h$DB_HOST -P$DB_PORT -u$DB_USER
--all-databases
--single-transaction
--master-data=2
--flush-logs
--triggers
--routines
--events
--quick
--lock-tables=false > ${BACKUP_FILENAME}.sql 2>> $LOG_FILE
else
# 备份指定单个数据库
mysqldump -h$DB_HOST -P$DB_PORT -u$DB_USER
$BACKUP_DB
--single-transaction
--master-data=2
--flush-logs
--triggers
--routines
--events
--quick
--lock-tables=false > ${BACKUP_FILENAME}.sql 2>> $LOG_FILE
fi
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "数据库导出成功,开始压缩..." >> $LOG_FILE 2>&1
# 压缩备份文件
if [ "$COMPRESS_TYPE" = "gzip" ]; then
gzip ${BACKUP_FILENAME}.sql >> $LOG_FILE 2>&1
BACKUP_FILE="${BACKUP_FILENAME}.sql.gz"
else
bzip2 ${BACKUP_FILENAME}.sql >> $LOG_FILE 2>&1
BACKUP_FILE="${BACKUP_FILENAME}.sql.bz2"
fi
# 检查压缩是否成功
if [ $? -eq 0 ]; then
echo "备份压缩成功,文件路径:$BACKUP_FILE" >> $LOG_FILE 2>&1
else
echo "错误:备份压缩失败!" >> $LOG_FILE 2>&1
exit 1
fi
else
echo "错误:数据库导出失败!" >> $LOG_FILE 2>&1
exit 1
fi
# ========================= 清理过期备份 =========================
echo "开始清理超过 ${RETENTION_DAYS} 天的备份文件..." >> $LOG_FILE 2>&1
if [ "$COMPRESS_TYPE" = "gzip" ]; then
find $BACKUP_DIR -name "mysql_backup_*.sql.gz" -mtime +$RETENTION_DAYS -delete >> $LOG_FILE 2>&1
else
find $BACKUP_DIR -name "mysql_backup_*.sql.bz2" -mtime +$RETENTION_DAYS -delete >> $LOG_FILE 2>&1
fi
if [ $? -eq 0 ]; then
echo "过期备份清理完成" >> $LOG_FILE 2>&1
else
echo "警告:过期备份清理失败,但不影响本次备份结果" >> $LOG_FILE 2>&1
fi
# ========================= 备份完成 =========================
echo "备份结束时间:$(date +"%Y-%m-%d %H:%M:%S")" >> $LOG_FILE 2>&1
echo "========================================
" >> $LOG_FILE 2>&1
exit 0
配置数据库密码
细心的应该发现,上面的脚步是没有配置密码,他执行的时候如何获取密码呢?一开始我是把密码放在脚本里面的,但是考虑到安全问题,就使用另外的方式配置密码了。
创建 MySQL 配置文件
# 创建配置文件(仅当前用户可读写)
vi ~/.my.cnf
写入以下内容(替换为你的数据库信息)
[mysqldump]
host=127.0.0.1
port=3306
user=root
password=密码
限制配置文件权限(关键!避免他人读取密码)
chmod 600 ~/.my.cnf
执行脚本
# 确保脚本有执行权限
chmod +x mysql_backup.sh
# 执行备份
./mysql_backup.sh
查看脚本执行结果
tail -f /var/log/mysql_backup/backup_*.log

这是我执行了四次的日志。这时候/data/mysql_backup 目录下就会有响应的数据库备份文件。如果有表示执行成功。
设置定时任务
# 编辑crontab配置
crontab -e
# 添加以下内容(注意脚本绝对路径)
0 2 * * * /path/to/mysql_backup.sh
踩过的坑
如果执行报错 错误:命令 mysqldump 未找到,请先安装!
即使在mysqldump 目录下执行也报错。
解决:创建软链接
ln -s /usr/local/mysql/bin/mysqldump /usr/bin/
添加到 PATH 环境变量
export PATH=/usr/local/mysql/bin:$PATH
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...


