使用shell脚本安装mysql8,进行主从备份配置

思路

  1. 在3台主机上安装mysql
  2. 进行主从备份配置

使用rpm包yum安装mysql

首先,我们要准备好安装文件,首先下载rpm包

wget -P "/opt/" https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm 

然后执行安装(默认已配置阿里云的yum仓库

yum -y install mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql-community-server

可能会有一个关于License的报错,需要运行以下命令导入公钥

rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023

启动mysql服务,获取初始密码

[root@node21 opt]# systemctl start mysqld
[root@node21 opt]# sudo grep 'temporary password' /var/log/mysqld.log
2024-09-03T09:41:37.074486Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: eSklsjq8Lp;8

配置,我们默认只修改密码,开启远程登录,其他配置先不改

mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abc@1234';
update user set user.Host='%' where user.User='root';
flush privileges;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc@1234';
flush privileges;

脚本安装mysql

通过以上手动安装的例子,我们简单写一个安装脚本

#!/bin/bash
# 安装mysql8# 下载rpm文件
wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm -P /opt/# 导入License
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023# 安装mysql
yum -y install /opt/mysql80-community-release-el7-3.noarch.rpm
yum -y install mysql-community-server# 启动mysql
systemctl start mysqldinit_pw=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}')
new_pw="Abc@1234"# 设置root密码,会有一个warning,但是修改成功了
mysqladmin -uroot -p"$init_pw" password $new_pw# 配置允许远程登录
sed -i 's/bind-address/#bind-address/g' /etc/my.cnf# 更新用户主机
mysql -uroot -p"$new_pw" -e "use mysql;update user set user.Host='%' where user.User='root';flush privileges;"
sleep 2
mysql -uroot -p"$new_pw" -e "ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc@1234';flush privileges;"# 重启mysql
systemctl restart mysqld# 开启3306端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重启一下防火墙服务
firewall-cmd --reload

在从服务器上安装mysql

服务器ip如下

数据库角色IP系统版本
master192.168.32.21centos 7.9
salve1192.168.32.22centos 7.9
salve2192.168.32.23centos 7.9

我们先写一个简单脚本,用来安装mysql,其实就是把上面这个一键安装mysql的shell脚本,发送到22和23两台机器上安装

#!/bin/bash
#将mysql安装脚本发送到指定机器然后安装# 目标主机 IP 范围
network="192.168.32"
start_ip=22
end_ip=23# 获取当前日期和时间
current_date=$(date +%Y%m%d)
current_time=$(date +%H%M%S)# 日志文件名
log_file="${current_date}_${current_time}.log"# 发送文件并记录结果到日志文件
function send_file() {local target_ip=$1local file_path=$2scp "$file_path" root@"$target_ip":/opt/ &>> "$log_file"# 检查发送结果并记录到日志文件if [ $? -eq 0 ]; thenecho "${file_path}文件发送成功到${target_ip}"echo "${file_path}文件发送成功到${target_ip}" >> "$log_file"elseecho "${file_path}文件发送失败到${target_ip}"echo "${file_path}文件发送失败到${target_ip}" >> "$log_file"fi
}for ip in $(seq ${start_ip} ${end_ip})
dotarget_ip=${network}.${ip}echo "正在复制文件到 ${target_ip}..."send_file "$target_ip" "/opt/mysql.sh"if [ $? -eq 0 ]; thenecho "文件复制成功到 ${target_ip}"# 执行远程脚本ssh root@"$target_ip" "source /opt/mysql.sh" >> "$log_file"elseecho "文件复制失败到 ${target_ip}"fi
done
echo "运行完成。请查看日志文件 ${log_file} 获取详细结果。"

创建一个示例数据库

接下来回到master数据库进行操作,我们用以下语句建一个数据库,方便后面测试

DROP DATABASE IF EXISTS db_k_shop;
-- -------------------------
--               建库
-- -------------------------
CREATE DATABASE db_k_shop default character set utf8mb4;
-- ----------------------
-- 建立用户表
-- ----------------------
DROP TABLE IF EXISTS `tb_user`;
CREATE TABLE `tb_user` (
`user_id`  int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id' ,
`user_name`  varchar(255) UNIQUE NOT NULL COMMENT '用户名' ,
`user_pwd`  varchar(255) NOT NULL COMMENT '密码' ,
`user_nickname`  varchar(255) NOT NULL COMMENT '显示名' ,
`user_mail`  varchar(255) NULL COMMENT '邮箱' ,
`user_type`  tinyint(1) NOT NULL COMMENT '用户类型' ,
`user_date`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
PRIMARY KEY (`user_id`)
)
ENGINE=InnoDB
COMMENT='用户信息表'
AUTO_INCREMENT=100000;
-- ----------------------
-- 插入一个用户
-- ----------------------
INSERT INTO `tb_user` (`user_name`, `user_pwd`, `user_nickname`, `user_mail`, `user_type`)
VALUES ('hanayo', 'abc@1234', '花阳亲', 'hanayo@kayotin.cn', '1');

备份和还原数据库

我们需要保证master和slave的数据库是完全一致的,所以首先来备份master的数据,然后还原到slave上。

注意,进行备份和还原操作期间,确保数据库没有写入操作。可以参考如下加上锁。

#全备主库时需要另开一个终端,给数据库加上读锁,避免在备份期间有其他人在写入导致数据不一致
mysql> flush tables with read lock;		#此锁表的终端必须在备份完成以后才能退出
Query OK, 0 rows affected (0.00 sec)
#解除主库的锁表状态,直接退出交互式界面即可
mysql> quit
Bye

以下是备份和还原的参考代码:

# 备份数据
backup_name="backup_${current_date}_${current_time}.sql"
mysqldump -uroot -p$pwd --all-databases > "/opt/$backup_name"
# 还原数据
echo "正在复制sql文件到 ${target_ip}..."
scp "/opt/$backup_name" root@"$target_ip":/opt/
echo "正在还原数据库到 ${target_ip}..."
ssh root@"$target_ip" "mysql -uroot -p$pwd < /opt/$backup_name"

在master需要做如下配置

  1. 首先需要创建salve@目标IP的用户,该用户用来同步数据

        # 创建slave用户,授权给从数据库使用create user 'slave'@'$target_ip' identified by '$pwd';grant replication slave on *.* to 'slave'@'$target_ip';flush privileges;"
    
  2. 开启bin_log

    #主库配置
    echo "log_bin=mysql-bin" >> /etc/my.cnf
    echo "server_id=1" >> /etc/my.cnf
    # 重启mysql服务
    systemctl restart mysqld
    
  3. 获取主库状态备用

    # 查看主库状态
    mysql -uroot -p"$pwd" -e 'show master status;'
    master_file=$(mysql -uroot -p"$pwd" -e 'show master status;' | awk 'NR==2{print $1}')
    master_pos=$(mysql -uroot -p"$pwd" -e 'show master status;' | awk 'NR==2{print $2}')
    

在两个slave需要做如下配置

  1. 编辑/etc/my.cnf

    server-id=2     //设置从库的唯一标识符,从库的server-id值必须小于主库的该值
    relay-log=mysql-relay-bin       //启用中继日志relay-log
    
  2. 运行命令,设置master,启动salve

    change master to master_host='192.168.32.21',
    master_user='slave', master_password='Abc@1234',GET_MASTER_PUBLIC_KEY=1,
    master_log_file='mysql-bin.000001', master_log_pos=3597;
    start slave;
    

注意以上有一个设置GET_MASTER_PUBLIC_KEY=1 这个很重要,否则会报错,导致slave连接不到master。

通过如下语句可以查看slave状态

#查看从服务器状态
mysql> show slave status \G

最终完整脚本如下:

#!/bin/bash
# 备份主数据库数据,还原到备份数据库,配置主从pwd="Abc@1234"
# 备份数据库
current_date=$(date +%Y%m%d)
current_time=$(date +%H%M)
backup_name="backup_${current_date}_${current_time}.sql"
mysqldump -uroot -p$pwd --all-databases > "/opt/$backup_name"# 目标主机 IP 范围
network="192.168.32"
start_ip=22
end_ip=23# 还原数据库
for ip in $(seq ${start_ip} ${end_ip})
dotarget_ip=${network}.${ip}echo "正在复制sql文件到 ${target_ip}..."scp "/opt/$backup_name" root@"$target_ip":/opt/echo "正在还原数据库到 ${target_ip}..."ssh root@"$target_ip" "mysql -uroot -p$pwd < /opt/$backup_name"# 创建slave用户,授权给从数据库使用mysql -uroot -p"$pwd" -e "use mysql;create user 'slave'@'$target_ip' identified by '$pwd';grant replication slave on *.* to 'slave'@'$target_ip';flush privileges;"
done#主库配置
echo "log_bin=mysql-bin" >> /etc/my.cnf
echo "server_id=1" >> /etc/my.cnf
# 重启mysql服务
systemctl restart mysqld# 查看主库状态
mysql -uroot -p"$pwd" -e 'show master status;'
master_file=$(mysql -uroot -p"$pwd" -e 'show master status;' | awk 'NR==2{print $1}')
master_pos=$(mysql -uroot -p"$pwd" -e 'show master status;' | awk 'NR==2{print $2}')
master_ip="192.168.32.21"# 从库配置
salve_id=2
for ip in $(seq ${start_ip} ${end_ip})
dotarget_ip=${network}.${ip}echo "正在配置从库 ${target_ip}..."ssh root@"$target_ip" "echo 'server_id=$salve_id' >> /etc/my.cnf"ssh root@"$target_ip" "echo 'relay-log=mysql-relay-bin' >> /etc/my.cnf;systemctl restart mysqld"sql_txt="change master to master_host='$master_ip',master_user='slave',master_password='$pwd',master_log_file='$master_file',GET_MASTER_PUBLIC_KEY=1,master_log_pos=$master_pos;start slave;"ssh root@"$target_ip" "mysql -uroot -p$pwd -e \"$sql_txt\""((salve_id++))
done

运行结果如下:

在这里插入图片描述

并且经过测试,master数据库中的数据更新后,会自动备份到slave1和slave2中。

完整代码请参考:https://github.com/h-kayotin/hanayo_homework/tree/master/shell脚本/02_mysql安装和主从配置
参考了如下链接:https://cloud.tencent.com/developer/article/2241142

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

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

相关文章

HMI设计:嵌入式设备和电脑的差异化,工控领域首选。

嵌入式设备属于专机专用&#xff0c;电脑是通用&#xff0c;从性能、用途、特殊能力、成本、通信上嵌入式设备完全优于电脑&#xff0c;是工控领域的首选。 嵌入式设备和电脑在很多方面有着显著的差异&#xff0c;主要体现在以下几个方面&#xff1a; 1. 设计用途&#xff1a…

在js渲染的dom中的事件中传递对象

在某些情况下&#xff0c;可能需要将整个对象或部分对象嵌入到 HTML 元素的属性中&#xff0c;可以将对象数据序列化为 JSON 字符串&#xff0c;存储在 data-* 自定义属性中。这样可以在事件中取出并解析对象数据&#xff1a; <!DOCTYPE html> <html lang"en&qu…

C++万字解读类和对象(上)

1.类的定义 class为定义类的关键字&#xff0c;Stack为类的名字&#xff0c;{}中为类的主体&#xff0c;注意类定义结束时后面分号不能省略。类体中内容称为类的成员&#xff1a;类中的变量称为类的属性或成员变量; 类中的函数称为类的方法或者成员函数。 为了区分成员变量&…

[QT] QT事件与事件重写

一.事件 事件(event)是由系统或者 Qt本身在不同的场景下发出的。当用户按下鼠标、敲下键盘&#xff0c;或者是窗口关闭等都会发出一个相应的事件。 一些事件在用户操作时发出(如鼠标/键盘事件); 另一些事件则是由系统自动发出(如计时器事件)。 Qt窗口中对于产生的一系列事件都…

MarkdownEditor 配置以及使用

MarkdownEditor 配置以及使用 MarkdownEditor是一款基于浏览器的 Markdown 编辑器&#xff0c;虽然他是独立软件&#xff0c;但该软件内嵌一个浏览器。功能非常简单实用、反应速度很快&#xff0c;号称是Markdown领域的NotePad&#xff08;记事本&#xff09;。 MarkdownEdit…

面向对象23种设计模式通俗理解

终点即是起点,自强不息! 设计模式的理解 设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 模式&#xff1a;在某些场景下&#xff0c;针对某类问题的某种通用的解决方案。 场景&#xff1a;项目所在的环境 问题&#xff1a;约束条件&#xff0c;项目目标…

vue3 项目中使用git

一.vue项目创建 二.创建本地仓库并和远程仓库进行绑定 在vue3-project-git 项目文件夹下 初始化一个新的Git仓库&#xff0c;可以看到初始化成功之后就会出现一个.git文件&#xff0c;该文件包含所有必要的 Git 配置和版本控制信息。 创建远程仓库: 打开gitee ,点击右上角 ‘…

MapSet之二叉搜索树

系列文章&#xff1a; 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 目录 前言 1.二叉搜索树 1.1 定义 1.2 操作-查找 1.3 操作-新增 1.4 操作-删除(难点) 1.5 总体实现代码 1.6 性能分析 前言 TreeMap 和 TreeSet 是 Java 中基于搜索树实现的 M…

DELTA_IA-ASD_ASDA-A2简明教程

该文章仅供参考&#xff0c;编写人不对任何实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 0 引言 文章主要介绍电机的硬件连接、软件配置、转动调试以及软件控制。文章中提到的内容在产品手册中都有说明&#xff0c;强烈建议在操作前通读产品手册&#…

RocketMQ高级特性三-消费者分类

目录 前言 概述 区别 PullConsumer 定义与概述 原理机制 使用场景 优缺点 Java 代码示例 SimpleConsumer 定义与概述 原理机制 使用场景 优缺点 Java 代码示例 PushConsumer 定义与概述 原理机制 使用场景 优缺点 Java 代码示例 总结 前言 RocketMQ中的消…

常用排序算法(上)

目录 前言&#xff1a; 1.排序的概念及其运用 1.1排序的概念 1.2排序运用 1.3 常见的排序算法 2.常见排序算法的实现 2.1 堆排序 2.1 1 向下调整算法 2.1 2 建堆 2.1 3 排序 2.2 插入排序 2.1.1基本思想&#xff1a; 2.1.2直接插入排序&#xff1a; 2.1.3 插…

SQL进阶技巧:每年在校人数统计 | 区间重叠问题

目录 0 问题分析 1 数据准备 2 问题分析 3 小结 区间重叠问题 0 问题分析 有一个录取学生人数表 in_school_stu,记录的是每年录取学生的人数及录取学生的学制,计算每年在校学生人数。 1 数据准备 create table in_school_stu as ( select stack(5,1,2001,2,1200,2,2000…

Vue 中 watch 和 watchEffect 的区别

watch 和 watcheffect 都是 vue 中用于监视响应式数据的 api&#xff0c;它们的区别在于&#xff1a;watch 用于监视特定响应式属性并执行回调函数。watcheffect 用于更通用的响应式数据监视&#xff0c;但回调函数中不能更新响应式数据。Vue 中 watch 和 watchEffect 的区别 …

linux下的Socket网络编程教程

套接字概念 Socket本身有“插座”的意思&#xff0c;在Linux环境下&#xff0c;用于表示进程间网络通信的特殊文件类型。本质为内核借助缓冲区形成的伪文件。与管道类似的&#xff0c;Linux系统将其封装成文件的目的是为了统一接口&#xff0c;使得读写套接字和读写文件的操作…

从材料到应用:螺杆支撑座材质选择的多样性与精准性!

支撑座是连接丝杆和电机的轴承固定座&#xff0c;其材料的选择直接影响使用效果。那么&#xff0c;大家知道螺杆支撑座常用的材质有哪些吗&#xff1f; 1、高碳钢&#xff1a;高碳钢因其高强度和良好的耐磨性&#xff0c;是螺杆支撑座制作中常用的材料。它能够很好地配合滚珠螺…

ESD防静电监控系统助力电子制造行业转型升级

在电子制造行业中&#xff0c;静电危害不容小觑。ESD 防静电监控系统的出现&#xff0c;为行业转型升级带来强大助力。电子元件对静电极为敏感&#xff0c;微小的静电放电都可能损坏元件&#xff0c;影响产品质量。ESD 防静电监控系统能够实时监测生产环境中的静电状况&#xf…

C++——类和对象(2)

目录 一、类的默认成员函数 二、构造函数 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;特点 三、析构函数 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;特点 四、拷贝构造函数 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;特…

【2024-2025源码+文档+调试讲解】微信小程序的城市公交查询系统

摘 要 当今社会已经步入了科学技术进步和经济社会快速发展的新时期&#xff0c;国际信息和学术交流也不断加强&#xff0c;计算机技术对经济社会发展和人民生活改善的影响也日益突出&#xff0c;人类的生存和思考方式也产生了变化。传统城市公交查询管理采取了人工的管理方法…

【论文阅读】DETRs Beat YOLOs on Real-time Object Detection

文章目录 摘要一、介绍二、相关工作2.1 实时目标检测器2.2 端到端目标检测器 三、检测器的端到端速度3.1 分析 NMS3.2 端到端速度基准 四、实时 DETR4.1 模型概述4.2 高效混合编码器4.3不确定性最小的查询选择4.4 缩放的RT - DETR 五、实验5.1 与SOTA对比5.2 混合编码器的消融研…

【重构获得模式 Refactoring to Patterns】

重构获得模式 Refactoring to Patterns 面向对象设计模式是“好的面向对象设计”&#xff0c;所谓“好的面向对象设计”指的是那些可以满足“应对变化&#xff0c;提高复用”的设计。 现代软件设计的特征是“需求的频繁变化”。设计模式的要点是“寻找变化点&#xff0c;然后…