文章目录
- [1. 需求](#1. 需求)
- [2.shell 脚本编写](#2.shell 脚本编写)
- [3. 通过crontab 创建定时任务](#3. 通过crontab 创建定时任务)
1. 需求
linux 环境下 通过crontab 创建定时任务实现mysql数据库每日凌晨2点备份
2.shell 脚本编写
#!/bin/bash
#备份保存路径与保留天数
backup_dir=/usr/local/mysql_bak/mysqlbackup
days=3
dd=$(date +%Y%m%d%H%M%S)
#获取所有非系统数据库
# 安全读取密码(无回显)
read -s -p "Enter MySQL password: " MYSQL_PWD
echo # 换行
# 执行查询并检查错误
if ! DATABASES=$(mysql -uroot -p"$MYSQL_PWD" -sNe "SHOW DATABASES" 2>/dev/null); then
echo "Error: Failed to connect to MySQL or execute query." >&2
exit 1
fi
# 使用示例
echo "Databases:"
echo "$DATABASES"
#DATABASES=$(mysql --defaults-file=/etc/my.cnf -s -e "SHOW DATABASES")
for db in $DATABASES; do
if [[ $db != "information_schema" ]] && [[ $db != "performance_schema" ]] &&[[ $db != "mysql" ]]&&[[ $db != "sys" ]]; then
#执行备份并压缩
mysqldump --skip-lock-tables $db |gzip >$backup_dir/${db}_$dd.sql.gz
#清理旧备份
ls -lt $backup_dir/${db}_* | awk 'NR>'$days | xargs rm -f
fi
done
==========================优化后1======================
#!/bin/bash
#备份保存路径与保留天数
backup_dir=/usr/local/mysql_bak/mysqlbackup
#日期路径
day_dir=$(date +%Y-%m-%d)
days=3
dd=$(date +%Y%m%d%H%M%S)
#获取所有非系统数据库
# 安全读取密码(无回显)
read -s -p "Enter MySQL password: " MYSQL_PWD
echo # 换行
# 执行查询并检查错误
if ! DATABASES=$(mysql -uroot -p"$MYSQL_PWD" -sNe "SHOW DATABASES" 2>/dev/null); then
echo "Error: Failed to connect to MySQL or execute query." >&2
exit 1
fi
# 使用示例
echo "Databases:"
echo "$DATABASES"
cd $backup_dir
#DATABASES=$(mysql --defaults-file=/etc/my.cnf -s -e "SHOW DATABASES")
for db in $DATABASES; do
if [[ $db != "information_schema" ]] && [[ $db != "performance_schema" ]] &&[[ $db != "mysql" ]]&&[[ $db != "sys" ]] ; then
if [[ ! -e $day_dir ]]; then
mkdir $day_dir
fi
#执行备份并压缩
mysqldump --skip-lock-tables $db |gzip >$backup_dir/$day_dir/${db}_$dd.sql.gz
#清理旧备份
ls -lt $backup_dir/${db}_* | awk 'NR>'$days | xargs rm -f
fi
done
==============================优化后2============================
#!/bin/bash
#备份保存路径与保留天数
backup_dir=/usr/local/mysql_bak/mysqlbackup
#日期路径
day_dir=$(date +%Y-%m-%d)
days=7
dd=$(date +%Y%m%d%H%M%S)
MYSQL_PWD=root123
echo # 换行
# 执行查询并检查错误
if ! DATABASES=$(mysql -uroot -p"$MYSQL_PWD" -sNe "SHOW DATABASES" 2>/dev/null); then
echo "Error: Failed to connect to MySQL or execute query." >&2
exit 1
fi
# 使用示例
echo "Databases:"
echo "$DATABASES"
cd $backup_dir
#DATABASES=$(mysql --defaults-file=/etc/my.cnf -s -e "SHOW DATABASES")
for db in $DATABASES; do
if [[ $db != "information_schema" ]] && [[ $db != "performance_schema" ]] &&[[ $db != "mysql" ]]&&[[ $db != "sys" ]] ; then
if [[ ! -e $day_dir ]]; then
mkdir $day_dir
fi
#执行备份并压缩
mysqldump --skip-lock-tables $db |gzip >$backup_dir/$day_dir/${db}_$dd.sql.gz
#清理旧备份
ls -lt $backup_dir/${db}_* | awk 'NR>'$days | xargs rm -f
fi
done
3. 通过crontab 创建定时任务
-
crontab -l 查询定时任务列表
-
crontab -e 编辑定时任务
配置crontab每日执行(如凌晨2点)脚本如下:
0 2 * * * /usr/local/mysql_bak/mysql_backup_all.sh >>/var/log/mysql_backup.log 2>&1

-
通过vim 保存退出。
-
给脚本赋权限
chmod 700 mysql_backup_all.sh
-
再执行crontab -l 查询是否生效。