使用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…

go 开发小技巧

一、简介 本篇文章会介绍go 开发小技巧。 二、go 开发技巧 2.1 Semaphore type Semaphore chan struct{}func NewSemaphore(maxCount int) Semaphore {return make(chan struct{}, maxCount) }func (s Semaphore) Acquire() {s <- struct{}{} }func (s Semaphore) tryAcq…

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

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

linux高级学习9

24.9.6学习目录 一.共享内存1.共享内存的API 一.共享内存 特点&#xff1a; 其在进程间共享数据的方法中是最快的要注意对给定存储区访问时进行互斥 1.共享内存的API &#xff08;1&#xff09;获取共享内存标识符 在shell中使用 ipcs -m进行查看共享内存 ipcrm -m shmid删…

P1546 [USACO3.1] 最短网络 Agri-Net

[题目通道]([USACO3.1] 最短网络 Agri-Net - 洛谷) #include<bits/stdc.h> #define int long long using namespace std; const int N1e6100; struct edge{int u,v,w; }e[N*30]; bool cmp(edge a,edge b){return a.w<b.w; } int a,b,c,n,m,fa[N],cnt0,ans0; int fin…

目标检测-YOLOv10

YOLOv10 是 YOLO 系列的最新版本&#xff0c;进一步推动了目标检测技术的发展。它在前代&#xff08;YOLOv9&#xff09;的基础上进行了更多优化和改进&#xff0c;使得模型在复杂场景、实时性以及精度方面取得了更高的突破。YOLOv10 将高效的架构设计与新颖的技术结合&#xf…

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…

PHP与Nginx配置优化:深入探讨Socket通信

在现代Web开发中&#xff0c;PHP和Nginx的组合是一种常见且高效的服务器配置。本文将深入探讨PHP-FPM&#xff08;FastCGI进程管理器&#xff09;与Nginx的配置&#xff0c;特别是关于它们之间的通信方式——Unix Domain Socket和TCP Socket的选择与优化。 PHP-FPM配置解析 首…

计网名词解释

DNS的主要功能和特点 域名解析&#xff1a;DNS的核心功能是将用户输入的域名解析为IP地址。因为计算机之间只能通过IP地址进行通信&#xff0c;而域名更易于人类记忆和使用&#xff0c;所以DNS起到了桥梁的作用。 分布式数据库&#xff1a;DNS是一个分布式的数据库系统&#x…

Vue3 父子传参 简单易懂

在Vue 3中&#xff0c;父组件向子组件传递数据&#xff08;也称为“props”&#xff09;是一个非常常见的模式。这是通过props选项在子组件中定义的&#xff0c;然后在父组件的模板中使用该子组件时通过属性&#xff08;attributes&#xff09;传递数据。 步骤 1: 定义子组件的…

面向对象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中的消…

【2024高教社杯全国大学生数学建模竞赛】B题 生产过程中的决策问题——解题思路 代码 论文

目录 问题 1&#xff1a;抽样检测方案的设计问题 2&#xff1a;生产过程中的决策问题 3&#xff1a;多工序、多零配件的生产决策问题 4&#xff1a;重新分析次品率题目难度分析1. 统计检测方案设计的复杂性&#xff08;问题 1&#xff09;2. 多阶段生产决策的复杂性&#xff08…

常用排序算法(上)

目录 前言&#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…