shell脚本实战案例---数据库的备份

目录

1.环境准备

2.数据库的分库分表备份

2.1 分库备份

2.2 分表备份

2.3 分库分表备份


通过此次shell脚本实战案例,我们将学习和了解到如何利用shell脚本实现数据库的分库分表备份。

1.环境准备

要实现数据库的备份,首先我们应该要有数据库的环境,以及需要备份的数据

在这里我们就使用rpm包的方式安装数据库

【1】先从官网下载rpm安装包,上传至服务器

https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.14-1.el7.x86_64.rpm-bundle.tar

【2】解压

 [root@localhost ~]# tar -xf mysql-5.7.14-1.el7.x86_64.rpm-bundle.tar

【3】安装

[root@localhost ~]# yum install -y mysql-community-server-5.7.14-1.el7.x86_64.rpm 
# 由信息得知,下面几个都得安装  
[root@localhost ~]# yum install -y mysql-community-server-5.7.14-1.el7.x86_64.rpm mysql-community-libs-5.7.14-1.el7.x86_64.rpm mysql-community-client-5.7.14-1.el7.x86_64.rpm mysql-community-common-5.7.14-1.el7.x86_64.rpm  
# 由于之前安装了别的数据库,所以冲突了,需要卸载下面这个  
[root@localhost ~]# yum remove mariadb-libs  
# 重新安装上面的

【4】启动

[root@node11 ~]# systemctl enable --now mysqld

【5】查看

[root@node11 ~]# ps -ef | grep mysqld
[root@node11 ~]# netstat -lnupt | grep 3306

【6】进入数据库,修改密码

[root@node11 ~]# grep password /var/log/mysqld.log    # 查看密码
[root@node11 ~]# mysql -uroot -p    # 登录数据库
Enter password: 
mysql> alter user root@localhost identified by 'MySQL@123';    # 修改密码
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like '%char%';    # 查看字符集
# 永久修改如下:
mysql> \q
Bye
[root@node11 ~]# vim /etc/my.cnf
[mysqld]
character-set-server = utf8
[root@node11 ~]# systemctl restart mysqld    # 重启数据库服务

 【7】创建数据库,创建表,导入数据

[root@node11 ~]# mysql -uroot -p    进入数据库
Enter password: 
# 创建数据库db1和其中的两张表:
mysql> create database db1;
mysql> use db1;
create table dept (dept1 int ,dept_name varchar(11));
insert into dept values
(101,'财务'),
(102,'销售'),
(103,'IT技术'),
(104,'行政');create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int);
insert into emp values
(1789,'张三',35,'1980/1/1',4000,101),
(1674,'李四',32,'1983/4/1',3500,101),
(1776,'王五',24,'1990/7/1',2000,101),
(1568,'赵六',57,'1970/10/11',7500,102),
(1564,'荣七',64,'1963/10/11',8500,102),
(1879,'牛八',55,'1971/10/20',7300,103);# 创建数据库db2和其中的两张表
mysql> create database db2;
mysql> use db2;
CREATE TABLE `t_dept` (`id` INT(11) NOT NULL AUTO_INCREMENT,`deptName` VARCHAR(30) DEFAULT NULL,`address` VARCHAR(40) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;INSERT INTO t_dept(deptName,address) VALUES('华山','华山');
INSERT INTO t_dept(deptName,address) VALUES('丐帮','洛阳');
INSERT INTO t_dept(deptName,address) VALUES('峨眉','峨眉山');
INSERT INTO t_dept(deptName,address) VALUES('武当','武当山');
INSERT INTO t_dept(deptName,address) VALUES('明教','光明顶');
INSERT INTO t_dept(deptName,address) VALUES('少林','少林寺');CREATE TABLE `t_emp` (`id` INT(11) NOT NULL AUTO_INCREMENT,`name` VARCHAR(20) DEFAULT NULL,`age` INT(3) DEFAULT NULL,`deptId` INT(11) DEFAULT NULL,
empno int  not null,PRIMARY KEY (`id`),KEY `idx_dept_id` (`deptId`)#CONSTRAINT `fk_dept_id` FOREIGN KEY (`deptId`) REFERENCES `t_dept` (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('风清扬',90,1,100001);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('岳不群',50,1,100002);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('令狐冲',24,1,100003);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('洪七公',70,2,100004);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('乔峰',35,2,100005);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('灭绝师太',70,3,100006);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('周芷若',20,3,100007);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张三丰',100,4,100008);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('张无忌',25,5,100009);
INSERT INTO t_emp(NAME,age,deptId,empno) VALUES('韦小宝',18,null,100010);

 最后查看一下,确保数据无误。

2.数据库的分库分表备份

此次实验,我们利用自带的mysqldump工具,实现数据库的分库分表备份

[root@node11 ~]# mkdir -p /server/scripts        # 脚本路径
[root@node11 ~]# mkdir -p /backup/mysql        # 数据库备份路径

2.1 分库备份

【1】首先我们获取数据库列表

[root@node11 ~]# mysql --help | grep skip    # -N选项:跳过列名-N, --skip-column-names (Defaults to on; use --skip-reconnect to disable.)(Defaults to on; use --skip-ssl to disable.)[root@node11 ~]# mysql -uroot -p'MySQL@123' -N -e 'show databases' | egrep -v "information_schema|mysql|performance_schema|sys"

【2】然后我们实现循环遍历数据库

[root@node11 scripts]# vim datab_1.sh
#!/bin/bashfor db in $DBS
doecho 备份$db
done:

【3】其次备份数据库语句的实现

[root@node11 scripts]# mysqldump -uroot -p'MySQL@123' -B db1 > /backup/mysql/db1_$(date +%F).sql
# 注意:-B作用:创建数据库和切换数据库,不加-B时,在恢复时必须手动创建数据库
[root@node11 scripts]# ll /backup/mysql/
-rw-r--r-- 1 root root 2940 Oct 29 03:36 db1_2023-10-29.sql

【4】最后分库备份的参考代码

刚才备份的SQL语句全部删掉,进行测试

上面的分步骤中,数据库固定,下面的脚本中要进行修改

[root@node11 scripts]# vim datab_2.sh 
#!/bin/bash# define var
OPT="-uroot -pMySQL@123"
EX_DB="information_schema|mysql|performance_schema|sys"
DBS=$(mysql ${OPT} -N -e 'show databases' | egrep -v ${EX_DB})
BAK_DIR=/backup/mysql[ -d $BAK_DIR ] || mkdir -p $BAK_DIR
# main program
for db in $DBS
domysqldump ${OPT} -B $db > ${BAK_DIR}/${db}_$(date +%F).sql
done
[root@node11 scripts]# sh  datab_2.sh     # 执行脚本
-n:检测语法是否有错误
-x:跟踪脚本,发现错误

2.2 分表备份

【1】首先我们获取数据库中表

[root@node11 scripts]# mysql -uroot -pMySQL@123 -N -e 'show tables from db1'

【2】然后我们实现循环遍历数据库中的表

[root@node11 scripts]# vim tab_1.sh
#!/bin/bashfor tab in $TABS
doecho 备份表$tab
done

【3】其次备份数据库中的表的语句

[root@node11 mysql]# mkdir db1
[root@node11 scripts]# mysqldump -uroot -pMySQL@123 db1 emp > /backup/mysql/db1/db1_emp_$(date +%F).sql

【4】最后分库备份的参考代码

刚才备份的SQL语句全部删掉,进行测试

上面的分步骤中,数据库固定,下面的脚本中要进行修改

[root@node11 scripts]# vim tab_2.sh 
#!/bin/bash# define var
OPT="-uroot -pMySQL@123"
DBS=db1
TABS=$(mysql ${OPT} -N -e "show tables from ${DBS}")
BAK_DIR=/backup/mysql/db1[ -d $BAK_DIR ] || mkdir -p $BAK_DIR
# main program
for tab in $TABS
domysqldump ${OPT} $DBS $tab > ${BAK_DIR}/${DBS}_${tab}_$(date +%F).sql
done
[root@node11 scripts]# sh tab_2.sh

2.3 分库分表备份

[root@node11 scripts]# vim all.sh
#!/bin/bash# define var
OPT="-uroot -pMySQL@123"
EX_DB="information_schema|mysql|performance_schema|sys"
BAK_DIR=/backup/mysqlDBS=$(mysql ${OPT} -N -e 'show databases' | egrep -v ${EX_DB})# main program
for db in $DBS
do[ -d ${BAK_DIR}/$db ] || mkdir -p ${BAK_DIR}/$dbmysqldump ${OPT} -B $db > ${BAK_DIR}/${db}/${db}_$(date +%F).sqlTABS=$(mysql ${OPT} -N -e "show tables from $db")for tab in $TABSdomysqldump ${OPT} $db $tab > ${BAK_DIR}/${db}/${db}_${tab}_$(date +%F).sqldone
done

后续可以结合计划任务进行数据库的备份。

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

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

相关文章

python实验2 π的计算

π的计算 1. 圆周率的介绍2. BBP公式计算圆周率3. 蒙特卡洛方法计算π 1. 圆周率的介绍 圆周率π自古就是人们计算的问题,π到底是什么,圆的周长与直径的比值或者是面积与半径的平方之比,或者是使sinx0的最小正数x。所以每一种定义每一种理解…

Qt5.15:MinGW64位编译Oracle 19c数据库驱动及代码测试 - 安装时没有选Sources处理办法

文章目录 0 代码仓库1 环境以及条件说明2 准备一:下载Oracle 19c驱动,需要下载两个包,注意分x86和x642.1 32位2.2 64位2.3 新建目录并解压缩2.4 记录路径2.4.1 x86需要的路径2.4.2 x64需要的路径 3 准备二:下载Sources源代码的两种…

策略路由和路由策略

目录 策略路由 路由策略 策略路由和路由策略 策略路由 Step1:配置ACL,匹配流量 acl number 2010 rule 10 permit source 192.168.10.0 0.0.0.255 acl number 2020 rule 10 permit source 192.168.20.0 0.0.0.255 Step2:流分类traffic classifier jiaoxue //匹配…

用于静电除尘的高频高压供电电源的设计

摘要 节能减排已成为当今社会发展的主题,高压静电除尘器以其独特的优势广泛应用于业粉尘的回收与处理领域。随着工业的发展,环境问题日益突出,国家制定了一系列的法律、法规来限制工业排放烟气中的粉尘浓度,常见的除尘方法有水膜…

Navicat for MySQL 视图创建使用方法

创建视图步骤: 点击新建;选择视图;点击视图创建工具;可以在左侧拖拽表到工作区;选择表字段进行连线

使用koa搭建服务器(一)

最近有个需求需要使用到koa搭建服务器并编写接口对数据库进行增删改查,因此写一篇博客记录这段时间的收获。 一、新建koa项目 (一)安装koa及其相关依赖 npm i koa npm i koa-router// 中间件,用于匹配路由 npm i koa-bodyparse…

​Vue3响应式原理

目录 手动收集依赖通知更新 effect():更改数据后执行,更新依赖该数据的数据(依赖) track()收集依赖的effect()放进dep(set去重) 更新时触发trigger函数通知dep里所有effect()执行…

uniapp 中添加 vconsole

uniapp 中添加 vconsole 一、安装 vconsole npm i vconsole二、使用 vconsole 在项目的 main.js 文件中添加如下内容 // #ifdef H5 // 提交前需要注释 本地调试使用 import * as vconsole from "vconsole"; new vconsole() // 使用 vconsole // #endif三、成功

Ansible简介

环境 控制节点:Ubuntu 22.04Ansible 2.10.8管理节点:CentOS 8 组成 Ansible环境主要由三部分组成: 控制节点(Control node):安装Ansible的节点,在此节点上运行Ansible命令管理节点&#xff…

Linux命令(107)之basename

linux命令之basename 1.basename介绍 linux命令basename是用来从文件路径中获取文件的基本名称 2.basename用法 basename [参数] NAME basename参数 参数说明-a支持多个参数,并将每个参数视为一个NAME-s移除后缀-z使用NUL而不是换行符分隔输出--help显示帮助信…

TypeScript - 枚举 - 常量枚举

常量枚举的定义 使用 const enum 进行常量枚举的定义, 格式如下 : const enum 枚举类型名称{ 元素1, 元素2, 。。。。。。 } 常量枚举的特殊的地方 常量枚举 : 在编译后是不存在的。 在使用常量枚举的元素的时候,编译之…

Android 系统架构

目录 Android 系统架构 1. Android 应用层 2. Android应用框架层 2.1 Activity Manager (活动管理器) 2.2 Window Manager (窗口管理器) 2.3 Content Provider (内容提供器) 2.4 View System(视图系统&a…

Leetcode刷题详解——搜索插入位置

1. 题目链接:35. 搜索插入位置 2. 题目描述: 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。…

JVM调优(10)JVM的运行时数据区

一、概述 对于 C C 来说,在内存管理领域,JVM既拥有最高的权利,但是同时他们又是从事最基础工作的劳动人员,因为他们担负着每一个对象从开始到结束的维护责任。而对于Java来说,再虚拟机自动内存管理的帮助下&#xff0…

x210项目重新回顾之十七升级到linux4.19.114 +buildroot2018再讨论

代码参考https://github.com/colourfate/x210_bsp/ 他的是linux_4.10(dtb为 s5pv210-x210..dtb)我打算用linux4.19.114(dtb为 s5pv210-smdkv210.dtb) ,所以修改build.sh ------------------------------------------------------------------------------ 5 M…

STM32 CAN使用

STM32 CAN使用 简介各种通讯接口对比报文总线上的报文信息表示为几种固定的赖类型数据帧列表模式掩码模式配置CAN配置参数位时序 简介 控制器局域网CAN(Controller Area Network)是由德国博世公司为汽车应用而开发的多主机局部网络,用于汽车的监测和控制…

Openssl数据安全传输平台015:OCCI的使用方法+在项目中的设计与实现

文章目录 1 OCCI使用1.1 初始化 - Environment 类1.2 连接数据库 - Connection 类1.3 执行SQL 2 OCCI在项目中的使用2.1 OCCI单独封装为一个类文件OCCIOP2.2 在ServerOP中作为私有成员2.3 ServerOP::ServerOP(string json)中实例化进行使用2.4 秘钥协商过程中进行读写操作 1 OC…

关于错误javax.net.ssl.SSLException: Received close_notify during handshake

今天开发的小伙伴遇到一问题,报错内容是: javax.net.ssl.SSLException: Received close_notify during handshake at sun.security.ssl.Alerts.getSSLException(Unknown Source) at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source) at sun.securi…

智能水厂运行与调控3D模拟仿真在线展示提高整个系统的协同效应

水厂在生活中的重要性不可忽视。它们提供清洁、安全的水源,满足人们饮用、洗浴、烹饪等基本需求,保障公共卫生,预防疾病传播;同时,水厂也促进经济发展,为工业生产和农业灌溉提供保障,吸引和支持企业的投资和…

chrome谷歌浏览器取消网页所有剪切板的授权方法步骤

地址栏输入 chrome://settings/content/clipboard选择 不允许网站查看您剪贴板中的文字或图片 ———————————————— 版权声明:本文为CSDN博主「一切V随缘」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明…