高级MySQL数据库备份脚本

news2024/11/15 13:50:18

高级MySQL数据库备份脚本

  • 主要功能
  • 项目构成
    • credentials.txt
    • settings.conf
    • mysql-dump.sh
  • SFTP备份配置:
    • 生成 SSH 密钥对
    • 将公钥复制到 SFTP 服务器
    • 测试无密码登录
  • 邮件发送配置
    • 安装插件sendmail、mailx
    • 修改mail配置
    • 获取邮箱授权码
  • 如何执行备份
    • 执行备份脚本
    • 计划每日的定时任务
  • 执行效果

主要功能

  • 指定数据库连接中的数据库进行备份
  • 可以将备份文件通过FTP或者SFTP传输到其他服务器进行异地备份
  • 指定备份文件保留天数
  • 邮件发送备份信息

项目构成

在这里插入图片描述

  • 凭证文件:credentials.txt,用于存储mysql连接的账号密码

  • 执行脚本:mysql-dump.sh,使用mysql的dump备份数据库

  • 配置文件:settings.conf,配置mysql备份的ip,端口,目录,策略等

credentials.txt

# 使用凭证文件是为了避免执行时的警告信息,mysqldump: [Warning] Using a password on the command line interface can be insecure.
[client]
user=root
password=密码

settings.conf

# 该脚本为备份配置文件,根据需求更新配置
# 本脚本需要运行在mysql数据库运行所在的linux服务器上

#################### MySQL 数据库服务器配置 #####################

# MySQL 数据库服务器地址和端口
MYSQL_HOST="192.168.125.36" 
MYSQL_PORT="3306" 

# 保存MySQL账号密码的文件路径
CREDENTIAL_FILE="/mnt/sdb/credentials.txt" 

# 要备份的数据库名称使用空格分隔,输入"ALL"备份全部
DB_NAMES="test111" 

# 仅备份指定的数据库
# DB_NAMES="mydb testdb dbname2" 

# MySQL 数据库备份保留策略,选择本地备份副本保留的天数
BACKUP_RETAIN_DAYS=30

# 本地数据库备份文件存储路径
LOCAL_BACKUP_DIR="/mnt/sdb/dbbackup" 

# 日志文件存储路径
LOG_PATH="/mnt/sdb/logs"

# 临时文件路径
TMP_PATH="/tmp" 

###################### 启用 SFTP 备份 ############################

# 0=禁用, 1=启用
SFTP_ENABLE=1 
# SFTP 服务器地址host
SFTP_HOST="192.168.154.26" 
# SFTP/SSH 用户名
SFTP_USERNAME="root" 
# SFTP 服务器端口
SFTP_PORT="22" 
# SFTP 上传目录
SFTP_UPLOAD_DIR="/mnt/sdb1/test" 
# SCP 执行路径
SCP="/usr/bin/scp" 

###################### 启用邮件提醒 ##############################

# 0=不发送邮件, 1=发送邮件
SENDEMAIL=1  
# 接收邮件提醒的邮箱地址
EMAILTO='1254125@qq.com' 

###################### 启用 FTP 备份 ##############################

# 0=禁用, 1=启用
FTP_ENABLE=0 
# FTP 服务器地址
FTP_SERVER="ftp.tecadmin.net" 
# FTP 用户名
FTP_USERNAME="ftp 用户名" 
# FTP 密码
FTP_PASSWORD="密码" 
# FTP 上传目录
FTP_UPLOAD_DIR="/backup/dbbackup/" 

###################### 本地可执行文件路径 ##########################

GZIP="/bin/gzip" 
MYSQL="/usr/bin/mysql" 
MYSQLDUMP="/usr/bin/mysqldump"  
MKDIR="/bin/mkdir" 
MYSQLADMIN="/usr/bin/mysqladmin" 
GREP="/bin/grep" 

mysql-dump.sh

#!/usr/bin/env bash

# 获取当前脚本的目录
SCRIPT_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIGFILE=$SCRIPT_PATH/settings.conf

source $CONFIGFILE
DATE_FORMAT='%Y%m%d'
CURRENT_DATE=$(date +"${DATE_FORMAT}")
CURRENT_TIME=$(date +"%H%M")
LOGFILENAME=$LOG_PATH/mydumpadmin-${CURRENT_DATE}-${CURRENT_TIME}.log
CREDENTIALS="--defaults-file=$CREDENTIAL_FILE"

# 如果日志路径不存在,创建该路径
[ ! -d $LOG_PATH ] && ${MKDIR} -p ${LOG_PATH}
echo "数据库备份报告——$(date +"%Y-%m-%d %H:%M:%S")" >> ${LOGFILENAME}
echo "" >> ${LOGFILENAME}


### 创建备份 ###
check_config() {
    ### 检查配置文件是否存在
    [ ! -f $CONFIGFILE ] && close_on_error "找不到配置文件,请确保配置文件正确"
}

db_backup() {
    ### 开始数据库备份
    if [ "$DB_NAMES" == "ALL" ]; then
        DATABASES=`$MYSQL $CREDENTIALS -h $MYSQL_HOST -P $MYSQL_PORT -Bse 'show databases' | grep -Ev "^(Database|mysql|performance_schema|information_schema)$"`
    else
        DATABASES=$DB_NAMES
    fi

    db=""
    # 如果备份路径不存在,创建该路径
    [ ! -d $BACKUPDIR ] && ${MKDIR} -p $BACKUPDIR
    echo "*** 正在导出 MySQL 数据库 ***"
    mkdir -p ${LOCAL_BACKUP_DIR}/${CURRENT_DATE}
    for db in $DATABASES; do
        FILE_NAME="${db}.${CURRENT_DATE}-${CURRENT_TIME}.sql.gz"
        FILE_PATH="${LOCAL_BACKUP_DIR}/${CURRENT_DATE}/"
        FILENAMEPATH="$FILE_PATH$FILE_NAME"
        echo -en "*** 数据库 > $db... ***\n"
        ${MYSQLDUMP} ${CREDENTIALS} --single-transaction -h ${MYSQL_HOST} -P $MYSQL_PORT $db | ${GZIP} -9 > $FILENAMEPATH
		
		 # 获取数据库备份文件大小
        DB_SIZE=$(du -sh ${FILENAMEPATH} | awk '{print $1}')
		
		echo "数据库名称:$db" >> ${LOGFILENAME}
        echo "数据库大小:$DB_SIZE" >> ${LOGFILENAME}
        echo "备份文件名:$FILE_NAME" >> ${LOGFILENAME}
		
        [ $FTP_ENABLE -eq 1 ] && ftp_backup
        [ $SFTP_ENABLE -eq 1 ] && sftp_backup
    done
    echo "*** 备份完成 ***"
    echo "*** 请检查 ${FILE_PATH} 中的备份文件 ***"
}

### 根据需求输出错误信息并退出 ###
close_on_error() {
    echo "$@"
    exit 99
}

### 确保可执行文件存在,否则退出 ###
check_cmds() {
    [ ! -x $GZIP ] && close_on_error "文件 $GZIP 不存在,请确保 $CONFIGFILE 中的路径正确。"
    [ ! -x $MYSQL ] && close_on_error "文件 $MYSQL 不存在,请确保 $CONFIGFILE 中的路径正确。"
    [ ! -x $MYSQLDUMP ] && close_on_error "文件 $MYSQLDUMP 不存在,请确保 $CONFIGFILE 中的路径正确。"
    [ ! -x $RM ] && close_on_error "文件 $RM 不存在,请确保 $CONFIGFILE 中的路径正确。"
    [ ! -x $MKDIR ] && close_on_error "文件 $MKDIR 不存在,请确保 $CONFIGFILE 中的路径正确。"
    [ ! -x $MYSQLADMIN ] && close_on_error "文件 $MYSQLADMIN 不存在,请确保 $CONFIGFILE 中的路径正确。"
    [ ! -x $GREP ] && close_on_error "文件 $GREP 不存在,请确保 $CONFIGFILE 中的路径正确。"
    if [ $SFTP_ENABLE -eq 1 ]; then
        [ ! -x $SCP ] && close_on_error "文件 $SCP 不存在,请确保 $CONFIGFILE 中的路径正确。"
    fi
}

### 检查数据库连接是否正常 ###
check_mysql_connection() {
    ${MYSQLADMIN} ${CREDENTIALS} -h ${MYSQL_HOST} -P ${MYSQL_PORT} ping | ${GREP} 'alive' > /dev/null
    [ $? -eq 0 ] || close_on_error "错误:无法连接到 MySQL 服务器。请确保 $CONFIGFILE 中的用户名和密码设置正确。"
}

### 将备份文件上传到 FTP 服务器 ###
ftp_backup() {
    echo "*** 正在将备份文件上传到 FTP ***"
    ftp -n $FTP_SERVER <<- EndFTP
        user "$FTP_USERNAME" "$FTP_PASSWORD"
        binary
        hash
        cd $FTP_UPLOAD_DIR
        lcd $FILE_PATH
        put "$FILE_NAME"
        bye
EndFTP
}


### 将备份文件上传到 SFTP 服务器 ###
sftp_backup() {
    echo "*** 正在将备份文件上传到 SFTP... ***"
    cd ${FILE_PATH}
    ${SCP} -P ${SFTP_PORT} "$FILE_NAME" ${SFTP_USERNAME}@${SFTP_HOST}:${SFTP_UPLOAD_DIR}/
	echo "异地备份传输服务器:${SFTP_HOST}" >> ${LOGFILENAME}
}

### 删除旧备份 ###
clean_old_backups() {
    echo "*** 检查是否存在需要删除旧备份... ***"
    DBDELDATE=`date +"${DATE_FORMAT}" --date="${BACKUP_RETAIN_DAYS} days ago"`
    
    if [ ! -z ${LOCAL_BACKUP_DIR} ]; then
        cd ${LOCAL_BACKUP_DIR}
        if [ ! -z ${DBDELDATE} ] && [ -d ${DBDELDATE} ]; then
            echo "***正在删除旧备份:${DBDELDATE}***"
			echo "删除旧备份:${DBDELDATE}" >> ${LOGFILENAME}
            rm -rf ${DBDELDATE}
        fi
    fi
	echo "*** 检查完毕 ***"
}

### 发送备份报告邮件 ###
send_report() {
    if [ $SENDEMAIL -eq 1 ]; then
        cat ${LOGFILENAME} | mail -vs "数据库备份报告 $(date +"%Y-%m-%d")" ${EMAILTO}
    fi
}

### 主流程 ###
check_config
check_cmds
check_mysql_connection
db_backup
clean_old_backups
send_report

SFTP备份配置:

设置 SFTP 无密码登录(SSH 密钥认证)

生成 SSH 密钥对

首先,需要在备份服务器上生成 SSH 密钥对:

在这里插入图片描述

ssh-keygen -t rsa

执行此命令后,密钥对将默认存储在 ~/.ssh/ 目录下。生成的文件包括:

  • id_rsa(私钥)
  • id_rsa.pub(公钥)

默认情况下,系统会提示选择是否设置密码短语。为了实现无密码登录,直接按下回车跳过此步骤

将公钥复制到 SFTP 服务器

在这里插入图片描述

生成密钥对后,需要将公钥复制到目标 SFTP 服务器,以便启用无密码登录。可以通过以下命令将公钥复制到远程服务器:

ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.1

这条命令会将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中。之后,备份服务器将可以无密码登录至远程 SFTP 服务器

测试无密码登录

完成上述步骤后,使用以下命令测试是否成功实现无密码登录:

ssh root@192.168.0.1

如果能够直接登录而不需要输入密码,则说明配置成功


通过此方式,备份脚本将能够全自动化执行 SFTP 文件传输,不再需要手动输入密码

邮件发送配置

安装插件sendmail、mailx

heyum install sendmail maix -y

修改mail配置

vim /etc/mail.rc,文件最后添加:

set from=邮箱@qq.com
set smtp=smtps://smtp.qq.com:465
set smtp-auth-user=邮箱@qq.com
set smtp-auth-password=授权码
set smtp-auth=login
set ssl-verify=ignore
set nss-config-dir=/etc/pki/nssdb

获取邮箱授权码

如何获取邮箱授权码,其他邮箱获取授权码方式大同小异

在这里插入图片描述

image-20240826163327650

image-20240828084127582

重启邮件服务

systemctl restart sendmail

如何执行备份

执行备份脚本

cd /script_path
# 赋予执行权限
chmod a+x mysql-dump.sh
# 手动执行一次备份脚本
./mysql-dump.sh

计划每日的定时任务

直接执行下面命令,将设置添加到 crontab,以便在每天凌晨 2:00 运行

(crontab -l ; echo "0 9 * * * cd /script_path && ./mysql-dump.sh") | crontab -

script_path替换为脚本路径

使用crontab -l可以查看定时任务列表

执行效果

生成备份文件路径和备份日志路径

在这里插入图片描述

邮件发送提醒

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2081170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据结构-前缀异或和】力扣1371. 每个元音包含偶数次的最长子字符串

给你一个字符串 s &#xff0c;请你返回满足以下条件的最长子字符串的长度&#xff1a;每个元音字母&#xff0c;即 ‘a’&#xff0c;‘e’&#xff0c;‘i’&#xff0c;‘o’&#xff0c;‘u’ &#xff0c;在子字符串中都恰好出现了偶数次。 示例 1&#xff1a; 输入&…

PyCharm 自定义字体大小

常用编程软件自定义字体大全首页 文章目录 前言具体操作1. 打开设置对话框2. 设置编辑器字体3. 选择外观字体 前言 PyCharm 自定义字体大小&#xff0c;统一设置为 JetBrains Mono 具体操作 【File】>【Settings...】>【Editor】>【Font】 统一设置为字体样式 JetB…

JVM上篇:内存与垃圾回收篇-13-垃圾回收器

笔记来源&#xff1a;尚硅谷 JVM 全套教程&#xff0c;百万播放&#xff0c;全网巅峰&#xff08;宋红康详解 java 虚拟机&#xff09; 文章目录 13. 垃圾回收器13.1. GC 分类与性能指标13.1.1. 垃圾回收器概述13.1.2. 垃圾收集器分类13.1.3. 评估 GC 的性能指标吞吐量暂停时间…

X86架构(五)——栈操作与寻址操作

我们先采用 X86架构(四) 所学知识&#xff0c;在显示器上显示 123...100 ;代码清单7-1;文件名&#xff1a;c07_mbr.asm;文件说明&#xff1a;硬盘主引导扇区代码;创建日期&#xff1a;2011-4-13 18:02jmp near __startmessage db 123...100 __start:mov ax, 0x7c0 ;数据段基…

APP封装安装配置参考说明

APP封装安装配置参考说明 一, 环境准备 宝塔环境 nginx php5.6 mysql5.6 java-openjdk1.8 apktool 1,安装 nginx,php,mysql自行安装 java-openjdk1.8 安装 推荐使用命令行安装 1.1 yum install java-1.8.0-openjdk1.2 yum install -y java-1.8.0-openjdk-devel1.3 设置…

Intellij Idea + Git 完美实战!

环境准备 使用前需要安装一个远程的 Git 仓库和本地的 Git 客户端。由于IDEA中的Git插件需要依赖本地Git客户端&#xff0c;所以需要进行如下配置&#xff1a; 如果本地已有项目&#xff0c;直接通过如下操作&#xff0c;即可在远程自动创建仓库并关联 1. 克隆远程仓库代码&am…

halcon4

图像采集助手-Image Aequisition 1.配置相机IP 和巨型帧等 2.通过海康MVS软件 找到 对应halcon 版本 3. 找到对应halcon版本的 海康相机文件 4.找到Halocn文件目录 粘贴上图文件 通过halcon 助手 -Image Aequisition -自动检测 -找到MVision接口 连接相机 采集图像 实时…

一句话概括TMMi的每个PA

TMMi&#xff08;Test Maturity Model Integration&#xff0c;测试成熟度模型集成&#xff09;是一个由TMMi基金会开发的非商业化的测试成熟度模型&#xff0c;是对CMMI模型的一个补充。它可以帮助组织使测试过程从未管理的状态进化为已管理、已定义、已测量和优化的状态。 T…

网站建设完成后,视频类网站如何做seo

视频类网站的SEO优化是一个综合性的工作&#xff0c;涉及从内容优化、技术优化到外部链接建设等多个方面。由于视频类网站主要提供的是视频内容&#xff0c;其SEO优化不仅需要关注常规的网页优化技巧&#xff0c;还需要考虑视频特有的元素和用户行为模式。以下是针对视频类网站…

Xilinx高速接口之GTP

简介 开坑计划中&#xff0c;主要参考ug482 主要讲解结构以及原语 以及时钟路由和一些其他的 GTP_COMMON还好&#xff0c;需要设置的不多&#xff0c;原语也短&#xff0c; GTP_CHANNEL需要设置的东西真多&#xff0c;原语也长 还好有官方参考例程以及自动生成的原语例化 不然…

0基础学习Python路径(31)logging模块

Python logging 模块定义了为应用程序和库实现灵活的事件日志记录的函数和类。 程序开发过程中&#xff0c;很多程序都有记录日志的需求&#xff0c;并且日志包含的信息有正常的程序访问日志还可能有错误、警告等信息输出&#xff0c;Python 的 logging 模块提供了标准的日志接…

OpenCV绘图函数(4)绘制轮廓线的函数drawContours()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 函数会在图像中绘制轮廓线&#xff0c;如果 thickness ≥ 0&#xff0c;则绘制轮廓线&#xff1b;如果 thickness < 0&#xff0c;则填充由轮…

【JLINK】RTT Viewer 的使用

​​​​​​ 一、使用说明 1.1 查找 RTT 缓冲区的开始位置 echo off if exist .\Debug\%PRJ_NAME%.map (findstr /C:" _SEGGER_RTT" .\Debug\%PRJ_NAME%.map rem findstr /C:" __StackTop " .\Debug\%PRJ_NAME%.map rem findstr /C:" Reset_Handle…

从欧拉公式的美到旋转位置编码RoPE

也许你在某些场合听说过欧拉公式&#xff0c;也许你干脆对数学不感冒。机缘巧合下&#xff0c;你点开了这篇文章&#xff0c;大致浏览了下然后关闭&#xff0c;继续为自己的工作学习忙碌。这不妨碍你暂停忙碌的脚步&#xff0c;欣赏她的美。 若干年后&#xff0c;你应该不曾记得…

Java基础(2)- Java环境

目录 一、jvm和跨平台 二、JDK 和 JRE 三、JDK的下载和安装 四、配置环境变量 一、jvm和跨平台 1.jvm&#xff08;Java虚拟机&#xff09;类似于翻译官&#xff1a;java运行程序的假想计算机&#xff0c;主要运行java程序。 2.跨平台&#xff1a;指不同操作系统。 3.关系…

网上买大流量卡要问哪些问题?几个常见的问与答!

大家都比较关注的几个常见的流量卡问题&#xff0c;答案来喽&#xff01; 这几个问题特别适合刚刚接触流量卡的朋友&#xff0c;如果你在购买流量卡时不知道该了解什么&#xff0c;该向商家问什么的时候&#xff0c;不妨问问这几个问题吧&#xff0c;接下来&#xff0c;这篇文…

python 实现square root平方根算法

square root平方根算法介绍 计算平方根&#xff08;Square Root&#xff09;的算法有多种&#xff0c;这里介绍几种常见的方法&#xff1a; 牛顿迭代法&#xff08;Newton’s Method&#xff09; 牛顿迭代法是一种在实数域和复数域上近似求解方程的方法。对于平方根问题&…

home kit认证

在当今快节奏的生活中&#xff0c;智能家居技术正不断改变我们的居住体验。home kit 将这一领域提升到了全新的高度。它不仅让智能家居设备的管理变得更为简单直观&#xff0c;还通过高水平的安全性和互操作性&#xff0c;为用户提供了无缝的体验。 一、什么是home kit home k…

CentOS7将yum源更换为国内源保姆级教程

在 CentOS 7 系统中更改 YUM 源到国内源可以显著提高软件包的下载速度&#xff0c;因为国内源服务器通常距离中国大陆用户更近。以下是一个详细的步骤来完成这一操作&#xff1a; 步骤 1: 备份原有配置 首先&#xff0c;备份原系统中的 yum 配置文件以防万一&#xff1a; BA…

红黑树模拟实现STL中的map与set——C++

1.红黑树的迭代器 &#xff08;本篇代码基于我写的红黑树的实现这篇博客&#xff09; 迭代器的好处是可以方便遍历&#xff0c;是数据结构的底层实现与用户透明。如果想要给红黑树增加迭代器&#xff0c;需要考虑以下问题&#xff1a; begin()与end()&#xff1a; STL明确规定&…