Shell脚本实现MySQL线上数据备份

2024-06-16 16:04

本文主要是介绍Shell脚本实现MySQL线上数据备份,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言

1.1 说明

文章是对使用Shell脚本实现MySQL线上数据备份的方式进行探究和学习。

Shell脚本用于线上或本地MySQL数据库中对数据进行备份处理的shell脚本。

相关脚本可以通过如下方式获取:

  • github地址

1.2 参考文章

MySQL——使用mysqldump备份与恢复数据

1.3 前置知识点

1. mysqldump

mysqldump命令可以将数据库中指定或所有的库、表导出为SQL脚本。表的结构和表中的数据将存储在生成的SQL脚本中。

mysqldump备份恢复原理:通过先查出需要备份的库及表的结构,在SQL脚本中生成CREATE语句。然后将表中的所有记录转换成INSERT语句并写入SQL脚本中。这些CREATE语句和INSERT语句都是还原时使用的:还原数据时可使用其中的CREATE语句来创建表,使用INSERT语句还原数据。

基本的备份用法:

  • 备份整个数据库
mysqldump -u username -p database_name > backup_file.sql

这将备份名为 database_name 的整个数据库,并将结果输出到名为 backup_file.sql 的文件中。-u 选项用于指定用户名,-p 选项提示用户输入密码

  • 备份特定表
mysqldump -u username -p database_name table_name > backup_file.sql

这将备份名为 database_name 的数据库中名为 table_name 的表,并将结果输出到 backup_file.sql 文件中。

  • 仅备份数据,不包括表结构
mysqldump -u username -p --no-create-info database_name > backup_file.sql

这将仅备份数据库中的数据,不包括表的结构信息

  • 仅备份表结构,不包括数据
mysqldump -u username -p --no-data database_name > backup_file.sql

这将仅备份数据库中的表结构,不包括数据

恢复的基本用法:

  • 恢复数据库

语法:mysql -u[用户名] -p[密码] < /备份文件路径/备份文件名.sql

示例:

#还原数据库
mysql -uroot -p123456 < backup_file.sql
  • 恢复数据表

语法:mysqldump -u[用户名] -p[密码] [database] < /备份文件路径/备份文件名.sql

注意:恢复表的前提是表所在的库必须存在,且可任意指定库进行恢复操作

示例:

mysql -u root -p123456 database_name < backup_file.sql
2. 关于#!/usr/bin/env bash#!/usr/bin/bash说明

#!/usr/bin/env bash

  • 这行告诉系统在哪里找到bash解释器,并使用它来执行脚本。
  • /usr/bin/env是一个用来在PATH环境变量指定的目录中查找并执行程序的工具。
  • bash是Bourne Again Shell的缩写,是Unix和Linux系统中一个常见的命令行解释器和脚本语言。

优点:

  • 可以确保在不同系统上能够找到正确的bash解释器路径,因为env命令会在PATH中查找,而不是依赖于固定的路径。
  • 更加灵活,不需要依赖于固定的安装路径。

缺点:

  • 可能稍微慢一点,因为每次执行脚本时都要运行env来查找bash
  • 有些较老或者特殊的系统可能没有/usr/bin/env命令。

#!/usr/bin/bash

  • 这行直接指定了bash解释器的路径,通常是在Unix和Linux系统中的典型安装位置之一。
  • 如果确保系统中bash的路径不会改变,这种方式也是有效的。

优点:

  • 明确指定了bash的路径,可以直接调用。

缺点:

  • 可能会因为路径不一致而在某些系统上出现问题,尤其是在不同的发行版或操作系统版本中。
  • 不够灵活,如果bash的安装路径变化,脚本可能会失效。

二、备份数据库shell脚本

2.1 支持

  • 该脚本用于linux环境下的MySQL数据备份

  • 数据库全量数据的备份

  • 支持常用方式部署的MySQL数据库

  • 支持Docker方式部署的MySQL数据库

  • 通过配置文件进行动态配置

  • 可自行选择是否动态配置

2.2 使用说明

本脚本只支持在linux环境上使用

获取init.sh和config.txt文件后,将其放到对应的linux虚拟机中

为两个文件添加权限

sudo chmod +x init.sh
sudo chmod +x config.txt

按照自己的需求修改config.txt中的参数

在init.sh目录下,执行脚本命令

bash init.sh

执行完脚本后会生成对应的脚本文件

使用如下命令执行生成的脚本文,备份mysql数据库

bash {生成的备份脚本的名称}.sh

如果想要添加定时执行,可以按照如下方法执行

//加入计划任务
crontab -e00 5 * * * 【脚本位置】 > 【日志打印】 2>&1// 示例
crontab -e00 5 * * * /app/mysqlbak/scripts/backup.sh > /app/mysqlbak/logs/backup.log 2>&1

2.2 脚本详情

1. 初始化
  • 配置文件config.txt (默认名称为config.txt,可在init.sh初始化脚本中选择修改配置文件名称)

用于对一些配置参数进行声明,各个参数的信息如下所示

# MYSQL用户名
MYSQL_USERNAME=yjy
# MYSQL密码
MYSQL_PASSWORD=123456
# MYSQL备份脚本名称
MYSQL_BACKUP_SCRIPT_NAME=MySQL_BASE_BACKUP
# MYSQLDUMP目标位置
MYSQLDUMP_DIRECTORY=/nfadata/engine/mysql/bin/mysqldump
# MYSQL容器名称
MYSQL_CONTAINER_NAME=mysql
# 是否基于docker部署Mysql
IF_DOCKER=1
# 数据库名称
DATABASES_NAME=(hsx hsx2)
# 备份目标地址
BACKUP_ROOT=/app/mysqlbak
  • 初始化init.sh脚本内容,用于根据配置文件config.txt中声明的配置,生成对应的MYSQL备份脚本
#!/usr/bin/env bash# 变量声明
# 1.配置文件
CONFIG_FILE="config.txt"# 函数声明
# 1.解析配置文件函数
parse_config_file() {local file="$1"echo "开始解析配置文件【$CONFIG_FILE】……"# 检查配置文件是否存在if [[ ! -f $CONFIG_FILE ]]; thenecho "需要的配置文件【$CONFIG_FILE】不存在, 请先完成配置文件的配置!"exit 1fi# 解析配置文件while IFS='=' read -r line;do# 跳过注释和空行if [[ ! $line =~ ^#.*$ ]] && [[ -n $line ]]; then# 使用 eval 解析数组eval "$line"fidone < "$CONFIG_FILE"echo "解析配置文件【$CONFIG_FILE】成功!"
}# 2.检查必要参数配置函数
check_required_params() {# 检查必要的参数变量是否进行配置if [ -z "$MYSQL_USERNAME" ]; thenecho "配置文件中缺少MYSQL_USERNAME配置项!"exit 1fiif [ -z "$MYSQL_PASSWORD" ]; thenecho "配置文件中缺少MYSQL_PASSWORD配置项!"exit 1fiif [ -z "$MYSQL_BACKUP_SCRIPT_NAME" ]; thenecho "配置文件中缺少MYSQL_BACKUP_SCRIPT_NAME配置项!"exit 1fiif [ -z "$MYSQLDUMP_DIRECTORY" ]; thenecho "配置文件中缺少MYSQLDUMP_DIRECTORY配置项!"exit 1fiif [ -z "$IF_DOCKER" ]; thenecho "配置文件中缺少IF_DOCKER配置项!"exit 1fiif [ -z "$IF_DOCKER" ]; thenecho "配置文件中缺少IF_DOCKER配置项!"exit 1fiif [ -z "$DATABASES_NAME" ]; thenecho "配置文件中缺少DATABASES_NAME配置项!"exit 1fi# 如果启用docker就查看是否配置了docker容器名称if [ "$IF_DOCKER" = 1 ];thenif [ -z "$MYSQL_CONTAINER_NAME" ]; thenecho "配置文件中缺少MYSQL_CONTAINER_NAME配置项!"exit 1fifi
}# 3.MySQL备份脚本创建(基本)
create_MySQL_backup_script() {touch "$MYSQL_BACKUP_SCRIPT_NAME.sh"#向文件中写入内容cat << EOF > "$MYSQL_BACKUP_SCRIPT_NAME.sh"
#!/bin/usr/env bashDATABASES=(${DATABASES_NAME[@]})
MYSQL_USERNAME=$MYSQL_USERNAME
MYSQL_PASSWORD=$MYSQL_PASSWORD
MYSQL_CONTAINER_NAME=$MYSQL_CONTAINER_NAME
BACKUP_ROOT=$BACKUP_ROOT
BACKUP_FILEDIR=$BACKUP_ROOT/data
MYSQLDUMP_DIRECTORY=$MYSQLDUMP_DIRECTORYEOFcat << 'EOF' >> "$MYSQL_BACKUP_SCRIPT_NAME.sh"#获取当前日期
DATE=$(date +%Y%m%d)#备份命令
mkdir -p /app/mysqlbak/data/$DATE#需要备份的数据表配置
#DATABASES=(${DATABASES_NAME[@]})#备份数据表
for DB in "${DATABASES[@]}"
do# 执行备份命令$MYSQLDUMP_DIRECTORY -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" --default-character-set=utf8 --hex-blob "$DB" > "$BACKUP_FILEDIR/$DATE/${DB}_${DATE}.sql"# 检查是否成功if [ $? -eq 0 ]; thenecho "备份数据库 【$DB】 成功"elseecho "备份数据库【$DB】 失败"fidone#打印任务结束
echo $DATE" done"
EOF#授予文件执行权限chmod +x "$MYSQL_BACKUP_SCRIPT_NAME.sh"}# 4.MySQL备份脚本创建(Docker)
create_MySQL_backup_docker_script() {touch "$MYSQL_BACKUP_SCRIPT_NAME.sh"#向文件中写入内容cat << EOF > "$MYSQL_BACKUP_SCRIPT_NAME.sh"
#!/bin/usr/env bashDATABASES=(${DATABASES_NAME[@]})
MYSQL_USERNAME=$MYSQL_USERNAME
MYSQL_PASSWORD=$MYSQL_PASSWORD
MYSQL_CONTAINER_NAME=$MYSQL_CONTAINER_NAME
BACKUP_ROOT=$BACKUP_ROOT
BACKUP_FILEDIR=$BACKUP_ROOT/data
MYSQLDUMP_DIRECTORY=$MYSQLDUMP_DIRECTORYEOFcat << 'EOF' >> "$MYSQL_BACKUP_SCRIPT_NAME.sh"#获取当前日期
DATE=$(date +%Y%m%d)#备份命令
mkdir -p /app/mysqlbak/data/$DATE#需要备份的数据表配置
#DATABASES=(${DATABASES_NAME[@]})#备份数据表
for DB in "${DATABASES[@]}"
do# 执行备份命令docker exec "$MYSQL_CONTAINER_NAME" $MYSQLDUMP_DIRECTORY -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" --default-character-set=utf8 --hex-blob "$DB" > "$BACKUP_FILEDIR/$DATE/${DB}_${DATE}.sql"# 检查是否成功if [ $? -eq 0 ]; thenecho "备份数据库 【$DB】 成功"elseecho "备份数据库【$DB】 失败"fidone#打印任务结束
echo $DATE" done"
EOF#授予文件执行权限chmod +x "$MYSQL_BACKUP_SCRIPT_NAME.sh"}# 具体调用
# 调用解析配置文件函数
parse_config_file "$CONFIG_FILE"# 调用检查必要参数配置函数
check_required_params# 决策生成对应的数据备份脚本
if [ "$IF_DOCKER" = 1 ] 
thenecho "此时创建的mysql数据备份脚本【docker版本】"# 创建MYSQL备份脚本【docker】create_MySQL_backup_docker_script
elseecho "此时创建的mysql数据备份脚本【基础版本】"# 创建MYSQL备份脚本【基础版本】create_MySQL_backup_script
fifor v in "${DATABASES_NAME[@]}";
doecho "当前备份的数据库详情:$v"
done# 执行MySQL备份脚本文件
# bash $MYSQL_BACKUP_SCRIPT_NAME.sh# 打印成功消息
echo "初始化完成"
2. 正常部署的MySQL实现数据库的备份脚本详情示例
#!/bin/bash#备份目录路径
BACKUP_ROOT=/app/mysqlbak
BACKUP_FILEDIR=$BACKUP_ROOT/data#容器名称
CONTAINER_NAME="mysql"#MYSQL配置
MYSQL_USER="root"
MYSQL_PASSWORD="Cc123@leo"#获取当前日期
DATE=$(date +%Y%m%d)#备份命令
mkdir -p /app/mysqlbak/data/$DATE#需要备份的数据表配置
DATABASES=("hsx_config" "hsx")#备份数据表
for DB in "${DATABASES[@]}"
do# 执行备份命令/nfdata/engine/mysql/bin/mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" --default-character-set=utf8 --hex-blob "$DB" > "$BACKUP_FILEDIR/$DATE/${DB}_${DATE}.sql"# 检查是否成功if [ $? -eq 0 ]; thenecho "备份数据库 【$DB】 成功"elseecho "备份数据库【$DB】 失败"fidone#打印任务结束
echo $DATE" done"
3. Docker部署的MySQL实现数据库的备份脚本详情示例
#!/usr/bin/bash#备份目录路径
BACKUP_ROOT=/app/mysqlbak
BACKUP_FILEDIR=$BACKUP_ROOT/data#容器名称
CONTAINER_NAME="mysql"#MYSQL配置
MYSQL_USER="root"
MYSQL_PASSWORD="Cc123@leo"#获取当前日期
DATE=$(date +%Y%m%d)#备份命令
mkdir -p /app/mysqlbak/data/$DATE#需要备份的数据表配置
DATABASES=("hsx_config" "hsx")#备份数据表
for DB in "${DATABASES[@]}"
do# 执行备份命令docker exec "$CONTAINER_NAME" /usr/bin/mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" --default-character-set=utf8 --hex-blob "$DB" > "$BACKUP_FILEDIR/$DATE/${DB}_${DATE}.sql"# 检查是否成功if [ $? -eq 0 ]; thenecho "备份数据库 【$DB】 成功"elseecho "备份数据库【$DB】 失败"fidone#打印任务结束
echo $DATE" done"

这篇关于Shell脚本实现MySQL线上数据备份的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1066895

相关文章

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

从入门到精通MySQL联合查询

《从入门到精通MySQL联合查询》:本文主要介绍从入门到精通MySQL联合查询,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下... 目录摘要1. 多表联合查询时mysql内部原理2. 内连接3. 外连接4. 自连接5. 子查询6. 合并查询7. 插入查询结果摘要前面我们学习了数据库设计时要满

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

MySQL中的锁机制详解之全局锁,表级锁,行级锁

《MySQL中的锁机制详解之全局锁,表级锁,行级锁》MySQL锁机制通过全局、表级、行级锁控制并发,保障数据一致性与隔离性,全局锁适用于全库备份,表级锁适合读多写少场景,行级锁(InnoDB)实现高并... 目录一、锁机制基础:从并发问题到锁分类1.1 并发访问的三大问题1.2 锁的核心作用1.3 锁粒度分