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

news2024/9/21 20:02:49

思路

  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 mysqld

init_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=$1
    local file_path=$2

    scp "$file_path" root@"$target_ip":/opt/ &>> "$log_file"
    # 检查发送结果并记录到日志文件
    if [ $? -eq 0 ]; then
        echo "${file_path}文件发送成功到${target_ip}"
        echo "${file_path}文件发送成功到${target_ip}" >> "$log_file"
    else
        echo "${file_path}文件发送失败到${target_ip}"
        echo "${file_path}文件发送失败到${target_ip}" >> "$log_file"
    fi
}

for ip in $(seq ${start_ip} ${end_ip})
do
    target_ip=${network}.${ip}
    echo "正在复制文件到 ${target_ip}..."
    send_file "$target_ip" "/opt/mysql.sh"
    if [ $? -eq 0 ]; then
        echo "文件复制成功到 ${target_ip}"
            # 执行远程脚本
        ssh root@"$target_ip" "source /opt/mysql.sh" >> "$log_file"
    else
        echo "文件复制失败到 ${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})
do
    target_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})
do
    target_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.coloradmin.cn/o/2113664.html

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

相关文章

1111111111111113

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…

openwrt的旁路模式无法访问国内网站

防火墙: 常规设置-> 区域&#xff1a; lan-> wan :编辑 IP 动态伪装:勾选

【Qt线程】—— Qt线程详解

目录 &#xff08;一&#xff09;多线程的概述 &#xff08;二&#xff09;Qt线程的使用条件 &#xff08;三&#xff09;创建线程的方法 3.1 继承QTread&#xff0c;重写run()函数 3.1.1 为什么要重写 3.2 继承QObject 3.3 核心API介绍 3.4 关闭线程的使用方法 &…

高压挑战:新能源汽车换电连接器的技术革新

摘要 随着汽车行业的电动化、网联化和智能化发展&#xff0c;新能源汽车连接器的使用量从传统汽车的600个左右增加到800至1000个。新能源汽车连接器在电连接和信号连接方面更为复杂&#xff0c;包括低压连接器和高压连接器。高压连接器面临严苛性能要求&#xff0c;如耐热性、…

Tomcat控制台乱码问题已解决(2024/9/7

步骤很详细&#xff0c;直接上教程 问题复现&#xff1a; 情景一 情景二 原因简述 这是由于编码不一致引起的&#xff0c;Tomcat启动后默认编码UTF-8&#xff0c;而Windows的默认编码是GBK。因此你想让其不乱码&#xff0c;只需配置conf\logging.properties的编码格式即可 解决…

探索Pyro4:Python中的远程对象通信艺术

文章目录 探索Pyro4&#xff1a;Python中的远程对象通信艺术背景&#xff1a;为何选择Pyro4&#xff1f;Pyro4是什么&#xff1f;如何安装Pyro4&#xff1f;简单的库函数使用方法场景应用示例常见Bug及解决方案总结 探索Pyro4&#xff1a;Python中的远程对象通信艺术 背景&…

git中,隐藏application.properties文件,修改不用提交了

git中&#xff0c;隐藏application.properties文件&#xff0c;修改不用提交了 A、将文件名放入 .gitignore 文件中 B、执行git命令隐藏文件 执行在ide上执行命令 a、执行隐藏命令 git rm --cached src/main/resources/application.properties b、执行提交命令 git commit -m…

【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程豪车劳斯莱斯库里南中控改名软件AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 怎么如何做的【生日视频制作】劳斯莱斯库里南中控改名软件AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件 把A…

120张网络安全等保拓扑大全

120张网络安全等保拓扑大全已更新至星球&#x1f517;哦&#xff0c;有兴趣的领取吧。

处理List采用并行流处理时,通过ForkJoinPool来控制并行度失控的问题

在使用parallelStream进行处理list时&#xff0c;如不指定线程池&#xff0c;默认的并行度采用cpu核数进行并行&#xff0c;这里采用ForJoinPool来控制&#xff0c;但循环中使用了redis获取key时&#xff0c;出现失控。具体上代码。 RunWith(SpringRunner.class) SpringBootTe…

OpenFeign的使用(一)

OpenFeign的定义 OpenFeign是一个声明式的Web服务客户端&#xff0c;它简化了编写Web服务客户端的过程&#xff0c;使得微服务间的通信更加简单和灵活。它主要作用于帮助开发者方便地调用远程服务&#xff0c;让远程调用像本地方法调用一样简单。 事实上&#xff0c;远程调用的…

共享单车轨迹数据分析:以厦门市共享单车数据为例(一)

共享单车数据作为交通大数据的一个重要组成部分&#xff0c;在现代城市交通管理和规划中发挥着越来越重要的作用。通过对共享单车的数据进行深入分析&#xff0c;城市管理者和规划者能够获得大量有价值的洞察&#xff0c;这些洞察不仅有助于了解城市居民的日常出行模式&#xf…

入职国企3个月,还没碰过代码,很焦虑。。

国企 日常逛脉脉&#xff0c;看到名为「入职后发现提升很慢怎么办」的话题。 本以为是正儿八经的讨论帖&#xff0c;结果点开&#xff0c;还是有凡尔赛&#xff0c;不愧是人均 P8 交流地 &#x1f923;&#x1f923; 一位网友表示&#xff1a;自己入职了国企三个月&#xff0c;…

spring cloud gateway配置

1:Intellij 新建项目 spring-cloud-gateway 2:pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLoca…

正规式与有限自动机例题

答案&#xff1a;D 知识点&#xff1a; 正规式 正规集 举例 ab 字符串ab构成的集合 {ab} a|b 字符串a,b构成的集合 {a,b} a^* 由0或者多个a构成的字符串集合 {空,a,aa,aaa,aaaa} (a|b)^* 所有字符a和b构成的串的集合 {空,a,b,ab,aab,aba,aaab} a(a|b)^* 以a为…

145-Linux权限维持Rootkit后门Strace监控Alias别名Cron定时任务

参考 【权限维持】Linux&Rootkit后门&Strace监控&Alias别名&Cron定时任务_alias lsalerts(){ ls $* --colorauto;python -c "-CSDN博客 参考 FlowUs 息流 - 新一代生产力工具 权限维持-Linux-定时任务-Cron后门 利用系统的定时任务功能进行反弹Shell 1…

电脑WLan无线网连上没网络的问题解决方法

在公司的酒店&#xff0c;网络很差&#xff0c;每到周末网就很差&#xff0c;昨天网上还能上头条写文章&#xff0c;终于&#xff0c;今天浏览器都上不去了&#xff0c;咋回事呢&#xff1f; 明明手机能上网呀&#xff0c;明明电脑显示无线网已连接&#xff0c;没一点问题呀&a…

【语音告警】博灵智能语音报警灯JavaScript循环播报场景实例-语音报警灯|声光报警器|网络信号灯

功能说明 本文将以JavaScript代码为实例&#xff0c;讲解如何通过JavaScript代码调用博灵语音通知终端 A4实现声光语音告警。主要博灵语音通知终端如何实现无线循环播报或者周期播报的功能。 本代码实现HTTP接口的声光语音播报&#xff0c;并指定循环次数、播报内容。由于通知…

『功能项目』战士的A键连击【33】

我们打开上一篇32更换URP场景的项目&#xff0c; 本章要做的事情是切换为战士的连击动画&#xff0c;主要实现的是做了一个战士的动画行为&#xff0c;当按键盘A的时候播放一次右手攻击动画&#xff0c;在1秒内再次按A键播放左手攻击动画&#xff0c;再在1秒内按A键播放右手攻击…

Mysql 数据库免费使用

目录 前言 详细步骤 总结 前言 由于工作需要现在打算学习WPF开发&#xff0c;因为需要访问mysql数据&#xff0c;但是又不想在自己电脑上安装。于是就上网试着查了下&#xff0c;发现果然有提供免费数据库服务的网站。nice&#xff01;所以就打算写一篇文章详细记录一下&…