shell脚本:使用mysqldump实现分库分表备份

一.什么是分库分表备份

分库分表备份是一种数据库备份策略,用于处理大型数据库系统中的数据分布和备份需求。当数据库的数据量非常大时,单个数据库可能无法满足性能和可扩展性的要求。为了解决这个问题,使用分库分表技术将数据库拆分成多个库和表,每个库和表分别存储一部分数据。

在分库分表备份中,备份操作也需要按照分库分表的方式进行。具体而言,备份程序会遍历每个库和表,并对其进行备份操作。这样可以确保所有数据被备份,同时使备份过程更高效。

分库分表备份的主要优势有:

  • 提高系统的可扩展性和性能:通过分库分表,可以将数据分布在多个节点上,从而提高系统的负载能力和处理性能。
  • 精确备份和恢复:分库分表备份可以确保每个数据库和表的数据都得到备份,同时也可以针对需要恢复的具体数据进行恢复操作,提高了备份和恢复的精确性。
  • 部分故障隔离:当某个库或表发生故障时,只需恢复受影响的库或表,而不需要恢复整个数据库系统。

二.基本思路

使用`mysqldump`实现分库分表备份的基本思路如下:

  1. 确定要备份的数据库列表:首先确定要备份的数据库列表,这些数据库可能是分布在不同的库中。
  2.  遍历数据库:对于每个数据库,遍历其中的表。
  3. 备份表:对于每个表,使用`mysqldump`命令备份表结构和数据到指定的备份文件中。
  4. 重复以上步骤:对其他数据库中的表重复执行步骤3,直到所有的数据库和表都备份完成。

三.脚本编写

#!/bin/bash
#########################
#File name:mysqldump_db.sh
#Version:v1.0
#Email:admin@test.com
#Created time:2023-07-17 04:50:04
#Description:
########################## MySQL连接信息
db_user="root"
db_password="RedHat@123"
db_cmd="-u${db_user} -p${db_password}"
exclude_db="information_schema|mysql|performance_schema|sys|Database"
bak_dir=/backup/db/mysqldump_test/
# 判断备份路径是否存在
[ -d ${bak_dir} ] || mkdir ${bak_dir}# 查找出需要备份的数据库mysql ${db_cmd} -e"show databases" -N 2>/dev/null | egrep -v "$exclude_db" > dbtmp
# 循环遍历数据库列表
while read db
do#对数据库进行备份mysqldump ${db_cmd} --set-gtid-purged=off $db 2>/dev/null | gzip > ${bak_dir}/`date +%F`-$db.sql.gz#判断是否备份成功if [ $? -eq 0 ]thenecho "database $db is being backed up ... success!"elseecho "database $db is being backed up ... failure!"fi#根据数据库进行分表备份 [ -d ${bak_dir}/$db ] || mkdir -p ${bak_dir}/$db# 获取数据库中的表名列表mysql ${db_cmd}  $db -e "SHOW TABLES;" | grep -v "Tables_in" > tbtmp# 循环遍历表名列表while read tbdo# 对表进行备份mysqldump ${db_cmd} --set-gtid-purged=off $db $tb 2>/dev/null | gzip > ${bak_dir}/$db/`date +%F`-$db-$tb.sql.gz# 判断是否备份成功if [ "$?" -eq 0 ]; thenecho "Backup of $db.$tb successful!"elseecho "Backup of $db.$tb failed!"fidone < tbtmp
done < dbtmp
#删除临时文件
rm -rf tbtmp
rm -rf dbtmp                                                                    

运行结果如下:

四.脚本描述 

这个脚本是用于对MySQL数据库进行备份的。以下是脚本的解释:

1. 定义MySQL连接信息:

db_user="root"
db_password="RedHat@123"
db_cmd="-u${db_user} -p${db_password}"

   这里指定了 MySQL 的用户名和密码并在 `db_cmd` 变量中构建了传递给 MySQL 命令的连接信息。

2. 定义排除数据库和备份路径:

exclude_db="information_schema|mysql|performance_schema|sys|Database"
bak_dir=/backup/db/mysqldump_test/

   这里指定了需要从备份中排除的数据库列表,并设置了备份文件存储的目录。

3. 检查备份路径是否存在:

[ -d ${bak_dir} ] || mkdir ${bak_dir}

   这里通过判断备份目录是否存在,如果不存在则创建该目录。

4. 查找需要备份的数据库:

mysql ${db_cmd} -e"show databases" -N 2>/dev/null | egrep -v "$exclude_db" > dbtmp

   这里执行 MySQL 命令来获取数据库列表,将结果保存到 `dbtmp` 文件中,并对其中的数据库进行排除。

5. 循环遍历数据库列表:

while read db
do
...
done < dbtmp

   这里使用 `while read` 循环读取 `dbtmp` 文件中的每一行,即数据库列表。

6. 对数据库进行备份:

mysqldump ${db_cmd} --set-gtid-purged=off $db 2>/dev/null | gzip > ${bak_dir}/`date +%F`-$db.sql.gz

   这里使用 `mysqldump` 命令对每个数据库进行备份,备份的内容会经过 `gzip` 压缩,并将结果保存到以日期和数据库名称命名的压缩文件中。

7. 根据数据库分表进行备份:

[ -d ${bak_dir}/$db ] || mkdir -p ${bak_dir}/$db
mysql ${db_cmd}  $db -e "SHOW TABLES;" | grep -v "Tables_in" > tbtmp
while read tb
do...
done < tbtmp

   这里首先检查存放分表备份的目录是否存在,若不存在则创建。然后获取指定数据库中的表名列表,并保存到 `tbtmp` 文件中。接着循环读取 `tbtmp` 文件中的每个表名,对每个表进行备份。

8. 删除临时文件:

rm -rf tbtmp
rm -rf dbtmp

   最后删除脚本运行过程中创建的临时文件 `tbtmp` 和 `dbtmp`。

 

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

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

相关文章

fortran语言语法

FORTRAN是世界上最早出现的高级编程语言&#xff0c;是工程界最常用的编程语言&#xff0c;它在科学计算中&#xff08;如航空航天、地质勘探、天气预报和建筑工程等领域&#xff09;发挥着极其重要的作用。经过40多年的发展&#xff0c;伴随着FORTRAN语言多次版本的更新及相应…

北漂Java程序员入职五个月的收获总结

&#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1f468;‍&#x1f4bb;本文专栏&#xff1a;Java程序员的成长 &#x1f468;‍&#x1f4bb;上一篇文章&#xff1a;告别过去&#xff0c;拥抱未来&#xff1a;一个Java开发者的成长之路 &#x1f468;‍&a…

LRU缓存淘汰算法详解与实现

目录 1.什么是LRU算法 2.LRU算法原题描述 3.LRU算法设计 4.LRU算法细节分析 5.代码实现 1.什么是LRU算法 就是一种缓存淘汰策略。 计算机的缓存容量有限&#xff0c;如果缓存满了就要删除一些内容&#xff0c;给新内容腾位置。但问题是&#xff0c;删除哪些内容呢&#…

tinkerCAD案例:31. 3D 基元形状简介

tinkerCAD案例&#xff1a;31. 3D 基元形状简介 1 将一个想法从头脑带到现实世界是一次令人兴奋的冒险。在 Tinkercad 中&#xff0c;这将从一个新的设计开始。 在新设计中&#xff0c;简单的原始形状可以通过不同的方式组合成更复杂的形状。 在这个项目中&#xff0c;你将探索…

Openstack等私有云

1 OpenStack 计算&#xff1a;部署管理虚拟机存储&#xff1a;块存储 Cinder 和 对象存储 Swift网路&#xff1a;管理网络身份&#xff1a;管理用户和权限镜像&#xff1a;管理镜像用于快速部署新的虚拟机仪表盘&#xff1a;Web界面 2 RAID 如果使用的软件已经在多个硬件设备…

【Lua语法】字符串操作、字符串中的方法

1.对字符串的操作 --声明一个字符串 str "我是一个字符串"--1.获取字符串的长度 -- 前面加个#即可(注意&#xff1a;Lua中字母占1个长度&#xff0c;汉字占3个长度) print(#str)--2.字符串多行打印 -- 方法1.Lua中是支持转义字符的 print("哈哈\n嘻嘻&q…

【个人笔记】Linux 服务管理两种方式service和systemctl

service命令与systemctl 命令 service 命令与传统的 SysVinit 和 Upstart 初始化系统相关。较早期的 Linux 发行版&#xff08;如早期的 Ubuntu、Red Hat 等&#xff09;使用了这些初始化系统。service 命令用于启动、停止、重启和查询系统服务的状态。虽然许多现代 Linux 发行…

IDEA中配置pom文件时对annotationProcessorPaths作修改后Lombok不起作用

IDEA中配置pom文件时对annotationProcessorPaths作修改后Lombok不起作用 问题&#xff1a;在学习MyBatis-Flex框架时&#xff0c;要求在pom文件中配置 annotationProcessor&#xff0c;官方说这样的好处是&#xff1a;mybatis-flex-processor提供APT服务&#xff0c;可以配置到…

小红书2020校招测试开发后端笔试题卷三

//完全背包求组合数 #include <iostream> #include<vector> #include<set> #include<map> #include<algorithm> using namespace std; int value[300]; // vector<int>vis; // vector<int>vis1; map<vector<int>,int>m…

web前端开发工程师工作的岗位职责(合集)

web前端开发工程师工作的岗位职责1 职责&#xff1a; 1、根据设计图进行前端页面开发并设计编写业务交互脚本 2、优化前端页面&#xff0c;保证良好的用户体验以及不同浏览器的兼容性 3、web前沿技术研究和新技术调研&#xff0c;将主流的特效应用到业务场景中 4、配合后台…

cocoscreator中tween详细用法

基本方法&#xff1a; to&#xff1a;对属性进行绝对值计算&#xff0c;最终的运行结果即是设置的属性值&#xff0c;即改变到某个值 by&#xff1a;对属性进行相对值计算&#xff0c;最终的运行结果是设置的属性值加上开始运行时节点的属性值&#xff0c;即变化值 cc.tween(t…

SQL面试题

下列语句部分是Mssql语句&#xff0c;不可以在access中使用。 SQL分类&#xff1a; DDL—数据定义语言(CREATE&#xff0c;ALTER&#xff0c;DROP&#xff0c;DECLARE) DML—数据操纵语言(SELECT&#xff0c;DELETE&#xff0c;UPDATE&#xff0c;INSERT) DCL—数据控制语言…

关于单体架构缓存刷新实现方案

背景 如果各位看官是分布式项目应该都采用分布式缓存了&#xff0c;例如redis等&#xff0c;分布式缓存不在本次讨论范围哈&#xff1b;我个人建议是&#xff0c;如果是用户量比较大&#xff0c;建议采用分布式缓存机制&#xff0c;后期可以很容易前后到分布式服务或微服务。 …

安装Apache遇到的问题

安装Apache服务 httpd -k install -n Apache2.4 #-n后面表示自定义访问名称 问题1&#xff1a; 此时去 windows 的开始摁扭里找到控制器右键管理员运行 问题2&#xff1a; 命令行没用对 应该用&#xff1a; .\httpd -k install -n Apache2.4 #-n后面表示自定义访问名称

kafka常用命令

目录 Kafka通用命令 进入Kafka 1.进入kafka容器 2.进入kafka目录 查看Topic信息 1.查看所有Topic的列表 2.查看单个Topic的信息 查看ConsumerGroup信息 1.查看所有ConsumerGroup的列表 2.查看单个ConsumerGroup的信息 读取Topic中的数据 向Topic写入数据 Kafka通用…

快速响应,上门维修小程序让您享受无忧生活

随着科技的不断发展和智能手机的普及&#xff0c;上门维修小程序成为了现代人生活中越来越重要的一部分。上门维修小程序通过将维修服务与互联网相结合&#xff0c;为用户提供了更加便捷、高效的维修服务体验。下面将介绍上门维修小程序开发的优势。   提供便捷的预约方式&am…

驱动开发相关内容复盘

并发与竞争 并发 ​ 多个“用户”同时访问同一个共享资源。 竞争 并发和竞争的处理方法 处理并发和竞争的机制&#xff1a;原子操作、自旋锁、信号量和互斥体。 1、原子操作 ​ 原子操作就是指不能再进一步分割的操作&#xff0c;一般原子操作用于变量或者位操作。 ​ …

神经网络原理概述

文章目录 1.神经元和感知器1.1.什么是感知器1.2.什么是单层感知器1.3.多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;MLP&#xff09; 2.激活函数2.1.单位阶跃函数2.2.sigmoid函数2.3.ReLU函数2.4.输出层激活函数 3.损失函数4.梯度下降和学习率5.过拟合和Dropout6.…

Vue3使用vxetable进行表格的编辑、删除与新增

效果图如下: vxetable4传送门 一、引入插件 package.json中加入"vxe-table": "4.0.23",终端中执行npm i导入import {VXETable, VxeTableInstance

docker容器的基本操作

一、查看Docker的版本信息 [roothuyang1 ~]# docker version 二、查看docker的详细信息 [roothuyang1 ~]# docker info 三、Docker镜像操作 Docker创建容器前需要本地存在对应的镜像&#xff0c;如果本地加载不到相关镜像&#xff0c;Docker默认就会尝试从镜像仓库https://hu…