Linux 环境下 Mysql 5.7 数据定期备份

目录

备份策略:

系统环境 openEuler 22.03 (LTS-SP4)

单机备份

每天凌晨2点,指定数据库表全量备份,只保留近7次备份数据

每次的脚本执行,将会记录执行结果到日志,方便后续查看

一、创建数据备份脚本

1.1 创建脚本文件

bash 复制代码
# 路径根据实际情况修改
[root@openeuler ~]# sudo vi /mnt/mysql/backup_script.sh

1.2 写入脚本内容

bash 复制代码
#!/bin/bash

# MySQL配置
MYSQL_USER="root"
MYSQL_PWD="root"
MYSQL_HOST="localhost"
MYSQL_PORT="3366"
MYSQL_BIN="/usr/local/mysql/bin/mysql"
MYSQLDUMP_BIN="/usr/local/mysql/bin/mysqldump"

# 备份配置
BACKUP_DIR="/mnt/mysql/backup_data"
BACKUP_LOG_FILE="$BACKUP_DIR/backup.log"
DATABASES=("rmcbs" "gdzj")
MAX_BACKUPS=7

# 创建备份目录(如果不存在)
if [ ! -d "$BACKUP_DIR" ]; then
    mkdir -p "$BACKUP_DIR"
fi

# 记录日志函数
log() {
    local timestamp=$(date +"%Y%m%d %H:%M:%S")
    echo "$timestamp $1 $2" >> "$BACKUP_LOG_FILE"
}

log "INFO" ""
log "INFO" "================== start 备份 =================="

# 检查数据库是否存在
check_db_exists() {
    local db_name=$1
    local query="SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$db_name'"
    local result=$($MYSQL_BIN -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PWD" -e "$query" 2>/dev/null | grep -c "$db_name")
    [ "$result" -eq 1 ]
}

# 备份每个数据库
for db in "${DATABASES[@]}"; do
    if check_db_exists "$db"; then
        backup_file="$BACKUP_DIR/${db}_backup_$(date +"%Y%m%d_%H%M%S").sql"
        if $MYSQLDUMP_BIN -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p"$MYSQL_PWD" "$db" > "$backup_file"; then
            log "SUCCESS" "成功备份数据库 $db 到 $backup_file"
            # 压缩备份文件
            if gzip "$backup_file"; then
                log "SUCCESS" "成功压缩数据库 $db 的备份文件"
            else
                log "FAILURE" "压缩数据库 $db 的备份文件失败"
            fi
        else
            log "FAILURE" "备份数据库 $db 失败"
        fi

        # 清理旧备份
        backup_count=$(ls -1 "$BACKUP_DIR/${db}_backup_"*.sql.gz 2>/dev/null | wc -l)
        if [ $backup_count -gt $MAX_BACKUPS ]; then
            files_to_delete=$((backup_count - MAX_BACKUPS))
            ls -1t "$BACKUP_DIR/${db}_backup_"*.sql.gz | tail -n $files_to_delete | xargs rm -f
            log "SUCCESS" "删除 $db 的 $files_to_delete 个旧备份文件"
        fi
    else
        log "WARNING" "数据库 $db 不存在,跳过备份"
    fi
done 

log "INFO" "================== end 备份 =================="
log "INFO" ""

1.3 添加执行权限

bash 复制代码
[root@openeuler ~]# chmod +x /mnt/mysql/backup_script.sh

1.4 配置定时任务

bash 复制代码
# 编辑 crontab
[root@openeuler ~]# crontab -e

# 按【i】键进行编辑,设置环境变量,【ESC】退出编辑,【:wq】保存内容
# 写入下列内容:
# 每天凌晨2点执行备份脚本
0 2 * * * /mnt/mysql/backup_script.sh
# 每1分钟执行一次备份
# */1 * * * * /mnt/mysql/backup_script.sh

# 验证 crontab
[root@openeuler ~]# crontab -l

二、查看备份日志

bash 复制代码
[root@openeuler ~]# tail -1000f /mnt/mysql/backup_data/backup.log

三、数据库数据恢复

注意:
此处命令是上一版本的数据库全量恢复,在生产环境中一定要注意,最好是手动执行按表恢复,防止数据丢失!!!以防万一!!!

bash 复制代码
# 若数据库不存在则创建
[root@openeuler ~]# mysql -h localhost -P 3366 -u root -proot -e "CREATE DATABASE IF NOT EXISTS [数据库名];" 2>/dev/null

# 恢复数据库,先解压备份文件再导入
[root@openeuler ~]# zcat /mnt/mysql/backup_data/[备份名称].sql.gz | mysql -h localhost -P 3366 -u root -proot [数据库名] 2>/dev/null
相关推荐
tan180°7 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
DuelCode8 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
幽络源小助理8 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
爬山算法10 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
KellenKellenHao19 小时前
MySQL数据库主从复制
数据库·mysql
一只fish20 小时前
MySQL 8.0 OCP 1Z0-908 题目解析(16)
数据库·mysql
叁沐1 天前
MySQL 07 行锁功过:怎么减少行锁对性能的影响?
mysql
Java烘焙师1 天前
架构师必备:业务扩展模式选型
mysql·elasticsearch·架构·hbase·多维度查询
飞翔的佩奇1 天前
Java项目:基于SSM框架实现的忘忧小区物业管理系统【ssm+B/S架构+源码+数据库+毕业论文+开题报告】
java·数据库·mysql·vue·毕业设计·ssm框架·小区物业管理系统
@Ryan Ding1 天前
MySQL主从复制与读写分离概述
android·mysql·adb