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

2024-09-08 02:12

本文主要是介绍使用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

这篇关于使用shell脚本安装mysql8,进行主从备份配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

windos server2022的配置故障转移服务的图文教程

《windosserver2022的配置故障转移服务的图文教程》本文主要介绍了windosserver2022的配置故障转移服务的图文教程,以确保服务和应用程序的连续性和可用性,文中通过图文介绍的非... 目录准备环境:步骤故障转移群集是 Windows Server 2022 中提供的一种功能,用于在多个

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Linux使用dd命令来复制和转换数据的操作方法

《Linux使用dd命令来复制和转换数据的操作方法》Linux中的dd命令是一个功能强大的数据复制和转换实用程序,它以较低级别运行,通常用于创建可启动的USB驱动器、克隆磁盘和生成随机数据等任务,本文... 目录简介功能和能力语法常用选项示例用法基础用法创建可启动www.chinasem.cn的 USB 驱动

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3