linux 环境下mysql 数据库自动备份和清库 通过crontab 创建定时任务实现mysql数据库备份

文章目录

  • [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 创建定时任务

  1. crontab -l 查询定时任务列表

  2. crontab -e 编辑定时任务

    配置crontab每日执行(如凌晨2点)脚本如下:
    0 2 * * * /usr/local/mysql_bak/mysql_backup_all.sh >>/var/log/mysql_backup.log 2>&1

  1. 通过vim 保存退出。

  2. 给脚本赋权限

    chmod 700 mysql_backup_all.sh

  3. 再执行crontab -l 查询是否生效。

相关推荐
做运维的阿瑞2 小时前
Python 标准库汇总:分类速览与常用模块清单
linux·运维·python
fd32002 小时前
达梦数据库更新统计信息后仍走旧执行计划解决方案
数据库
百万蹄蹄向前冲2 小时前
密码都对Node.js却连不上Linux数据库
linux·mysql
彧azz2 小时前
Linux 网络编程学习总结
linux·网络·笔记·学习·面试
华章酱2 小时前
MySQL幻读是怎么出现的
数据库·mysql·幻读
浅念-3 小时前
Redis基础详解:单线程模型、String与Hash数据结构
服务器·数据库·redis·sql·mysql·nosql数据库·nosql
updayday8543 小时前
离职域账号状态变更与Ping64操作记录核对
大数据·网络·数据库·安全·智能路由器
aramae3 小时前
MySQL内置函数(7)
开发语言·笔记·后端·mysql·其他
susplus3 小时前
【ARM 裸机开发 (IMX6ULL-mini)】GNU工具、Makefile 工程构建、链接脚本详解|C 语言点灯 + 蜂鸣器驱动
linux·arm·makefile·imx6ull
Shadow(⊙o⊙)3 小时前
Linux进阶知识1.0
linux·运维·服务器