mysql基础5——mysql主从

news2024/11/16 23:47:56

文章目录

  • 一、基本了解
  • 二、主从原理
  • 三、主从复制
    • 3.1 从无到有
      • 3.1.1 服务器初始化
      • 3.1.2 配置主库
      • 3.1.3 配置从库
      • 3.1.4 效果验证
    • 3.2 从有到无
      • 3.2.1 主库全备,并同步到从库
      • 3.2.2 配置主库
      • 3.2.3 配置从库
      • 3.2.4 效果验证
  • 四、数据库运维
    • 4.1 几个参数
    • 4.2 查看进程列表

一、基本了解

什么是主从数据库?

  • 从数据库是主数据库的备份,当主库数据变化时从数据库要更新,这些数据库软件可以设计更新周期。这是提高信息安全的手段。
  • 主从数据库服务器不在一个地理位置上,当发生意外时数据库可以保存。

主从分工:

  • Master负责写操作的负载,读操作则分摊到Slave上进行。
  • 读/写的比例大概在 10:1左右 ,这样可以大大提高读取的效率。

为什么要读写分离?

  • 写操作涉及到锁的问题,行锁、表锁、块锁,都是比较降低系统执行效率的事情。
  • 读写分离可以把写操作集中在一个节点上,而读操作在其他的N个节点上进行,可以有效的提高了读的效率,保证系统的高可用性。

主从复制用途:

  • 实时灾备,用于故障切换。
  • 读写分离,提供查询服务。
  • 备份,避免影响业务

主从部署必要条件:

  • 主库开启binlog日志(设置log-bin参数)
  • 主从server-id不同。
  • 从库服务器能连通主库。

主从形式:

  1. 一主一从。
  2. 主主复制。
  3. 一主多从,可以扩展系统读取的性能,因为读是在从库读取的。
  4. 多主一从,5.7开始支持。
  5. 联级复制,不常用。
    在这里插入图片描述

二、主从原理

在这里插入图片描述

  • master操作:

    1. 当master数据发生变化时,该事件变化会按照顺序写入bin-log中。当slave链接到master时,master会为slave开启binlog dump线程。
    2. 当master的bin-log发生变化时,bin-log dump线程会通知slave,并将相应的binlog内容发送给slave。
  • slave操作:

    1. 从库生成两个线程,一个I/O线程,一个SQL线程 。
    2. I/O线程请求主库的bin-log,并将得到的bin-log日志写到relay log(中继日志) 文件中。
    3. SQL线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,达到最终数据一致的目的

主从复制过程:

  • MySQL之间数据复制的基础是二进制日志文件(binlog)。
  • MySQL数据库一旦启用二进制日志后,库中所有写操作都会以“事件”的方式记录在二进制日志中,其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化。
  • 若发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中,然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中,以此实现从数据库和主数据库的一致性,也就实现了主从复制。

主从同步主要有三种形式:

  1. statement: 将对数据库操作的sql语句写入bin-log中。
  2. row: 将每一条数据的变化写入bin-log中。
  3. mixed: statement与row的混合。Mysql决定何时写statement格式的bin-log,何时写row格式的bin-log。

三、主从复制

配置思路:

  1. 确保从数据库与主数据库里的数据一样。
  2. 在主数据库里创建一个同步账号授权给从数据库使用。
  3. 配置主数据库(修改配置文件)。
  4. 配置从数据库(修改配置文件)。

1.脚本安装mysql,服务端和客户端都需要安装。

//准备安装包。
[root@localhost opt]# ll bck/
-rw-r--r--. 1 7161 31415 678018165 Dec  8 02:53 mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz


//安装脚本。
[root@localhost opt]# cat install.sh 
#!/bin/bash
installdir=/usr/local
packname=mysql-5.7.41-linux-glibc2.12-x86_64.tar.gz    ##需要修改。
unpck=$installdir/$(echo $packname| awk -F'.tar' '{print $1}')
port=3306
datadir=/data
PATH=$installdir/mysql/bin:$PATH

yum -y -q install perl  ncurses-compat-libs &>/dev/null
read -p "请输入,你要创建几个实例就输入数字几:"  num
read -p "请输入,你要为数据库设置什么密码:"   num1
id mysql &>/dev/null || /usr/sbin/useradd -r -M -s /sbin/nologin mysql

[ ! -d $installdir ] && mkdir -p $installdir
if [ !  -d  $unpck ];then
     echo "正在解压$packname至$installdir下"
     tar xf /opt/bck/$packname  -C $installdir            ##根据实际情况修改。
fi

ln -s $unpck  $installdir/mysql &>/dev/null
chown -R mysql.mysql $installdir/mysql*
echo "export PATH=$installdir/mysql/bin:\$PATH" > /etc/profile.d/mysql.sh
source /etc/profile.d/mysql.sh


if [ $num -gt 1 ];then
cat > /etc/my.cnf <<EOF
[mysqld_multi]
mysqld = $installdir/mysql/bin/mysqld_safe
mysqladmin = $installdir/mysql/bin/mysqladmin
EOF
fi

for i in $(seq $num);do
    if [ $i -ne 1 ]; then
         let port++
    fi
         mkdir -p $datadir/$port &>/dev/null
         chown -R mysql.mysql $datadir
        wcinit=$(ls $datadir/$port|wc -l)
        if [ $wcinit -eq 0 ];then
            echo "正在初始化$port实例"
            $installdir/mysql/bin/mysqld --initialize-insecure --datadir=$datadir/$port --user=mysql --explicit_defaults_for_timestamp &> /dev/null
        fi
    if [ $num -eq 1 ];then
cat > /etc/my.cnf <<EOF
[mysqld]
basedir = $installdir/mysql
datadir = $datadir/$port
socket = /tmp/mysql.sock
port = 3306
pid-file = $datadir/$port/mysql.pid
user = mysql
skip-name-resolve
EOF

       \cp -a  $installdir/mysql/support-files/mysql.server /etc/init.d/mysqld
        sed -ri "s#^(basedir=).*#\1$installdir/mysql#g"      /etc/init.d/mysqld
        sed -ri "s#^(datadir=).*#\1$datadir#g"                   /etc/init.d/mysqld
        service mysqld start
        $installdir/mysql/bin/mysql -uroot -e "set password = password('$num1');"
    else
cat >> /etc/my.cnf <<EOF
[mysqld$port]
datadir = $datadir/$port
port = $port
socket = /tmp/mysql$port.sock
pid-file = $datadir/$port/mysql_$port.pid
log-error=/var/log/$port.log
EOF

        $installdir/mysql/bin/mysqld_multi start $port
        sleep 3
        $installdir/mysql/bin/mysql -uroot -S /tmp/mysql$port.sock -e "set password = password('$num1');"
    fi
done

2.保证2台数据库都能登录。
在这里插入图片描述

3.1 从无到有

  • 主库、从库都是从无到有,都是从部署开始。
  • 两台服务器都需要安装mysql-5.7版本,且从库的配置不能低于主库,至少也是跟主库配置一样。
环境说明释义
主库192.168.130.160无数据
从库192.168.130.161无数据

3.1.1 服务器初始化

1.关闭防火墙和selinux。

//主库、从库服务器都要操作。

systemctl  stop firewalld
systemctl  disable firewalld

//关闭selinux。
setenforce 0

2.主库创建同步账号授权给从库使用。

grant replication slave on *.* to root@192.168.130.161 identified by 'citms';
flush privileges;

在这里插入图片描述

3.1.2 配置主库

1.配置文件/etc/my.cnf 添加2个参数,重启服务。

[root@master ~]# vim /etc/my.cnf 
[mysqld]
server-id = 10         //添加这两行
log-bin = mysql_bin

//重启。
service mysqld restart

2.查看主库状态。

mysql -uroot -pcitms -S /tmp/mysql.sock
show master status;

在这里插入图片描述

3.1.3 配置从库

1.配置文件/etc/my.cnf 添加2个参数,重启服务。

[root@master ~]# vim /etc/my.cnf 
[mysqld]
server-id = 20         //从库数值必须大于主库。
log-bin = myrelay        //启用中继日志relay-log

//重启。
service mysqld restart

2.进入本地数据库,配置并启动主从复制。

mysql -uroot -pcitms -S /tmp/mysql.sock

mysql> change master to master_host='192.168.130.160',master_user='root',master_password='citms',master_log_file='mysql_bin.000001',master_log_pos=154;
mysql> start slave;

在这里插入图片描述

3.1.4 效果验证

1.主库创建数据库qingjun,从库查看结果。
在这里插入图片描述

3.2 从有到无

  • 主库以提前存在,并有数据;从库不存在,需要部署后再同步主库数据。
  • 两台服务器都需要安装mysql-5.7版本,且从库的配置不能低于主库,至少也是跟主库配置一样。
环境说明释义
主库192.168.130.160有数据
从库192.168.130.161无数据

1.主库创建一个库和表,插入数据;从库没有数据。

//主库插入数据。
mysql>  create database school;
mysql> use school;
mysql> create table student(id int not null primary key auto_increment,name varchar(50),age tinyint);
mysql> insert student(name,age) values('tom',29),('jerry',24),(',zhangsan',18),('lisi',56);

在这里插入图片描述

3.2.1 主库全备,并同步到从库

  • 为确保从库与主库里数据一样,先全备主库并还原到从库。

1.主库锁表。

flush tables with read lock;

2.主库全备,把数据文件传给从库恢复数据。

//主库全备。
mysqldump -uroot -pcitms --all-databases > all.sql
scp  all.sql root@192.168.130.161:/opt/

//从库恢复数据。
mysql -uroot -pcitms < /opt/all.sql

在这里插入图片描述
3.主从数据一致后,主库退出解锁,创建授权账户给从库使用。

//主库退出解锁。
mysql> quit
Bye

//主库创建用户使其能在192.168.130.161上登陆。
create user qingjun@192.168.130.161 identified by '123456';
grant replication slave on *.* to 'qingjun'@'192.168.130.161';
flush privileges;

在这里插入图片描述

3.2.2 配置主库

1.配置文件/etc/my.cnf 添加2个参数,重启服务。

[root@master ~]# vim /etc/my.cnf 
[mysqld]
server-id = 10         //添加这两行
log-bin = mysql_bin

//重启。
service mysqld restart

2.查看主库状态。

mysql -uroot -pcitms -S /tmp/mysql.sock
show master status;

在这里插入图片描述

3.2.3 配置从库

1.配置文件/etc/my.cnf 添加2个参数,重启服务。

[root@master ~]# vim /etc/my.cnf 
[mysqld]
server-id = 20         //从库数值必须大于主库。
log-bin = myrelay        //启用中继日志relay-log

//重启。
service mysqld restart

2.进入本地数据库,配置并启动主从复制。

mysql -uroot -pcitms -S /tmp/mysql.sock

mysql> change master to master_host='192.168.130.160',master_user='root',master_password='citms',master_log_file='mysql_bin.000001',master_log_pos=154;
mysql> start slave;

在这里插入图片描述

3.2.4 效果验证

1.主库插入数据,从库查看。

//主库插入数据。
use school;
insert student(name,age) values('qianliu',30);

在这里插入图片描述

四、数据库运维

4.1 几个参数

  • Slave_IO_Running: Yes,参数表示主从数据库连接状态,防火墙和网络问题会影响该参数。
  • Slave_SQL_Running: Yes,参数表示主从传输的数据过程出现问题,为NO时可以查看时哪条命令出现了问题。
  • Seconds_Behind_Master: 0,参数表示主从数据同步的延迟时间。
  • Last_IO_Errno: 0,若第一个yes出现问题问题,该参数会显示其错误日志。
  • Last_SQL_Errno: 0,若第二个yes出现问题问题,该参数会显示其错误日志。
//从库检查。
mysql> show slave status\G

在这里插入图片描述

4.2 查看进程列表

1.查看进程。

//从库查看。
show processlist\G

在这里插入图片描述
2.根据id杀进程。
在这里插入图片描述
3.此时再查看从库状态,第二个yes变成no。
在这里插入图片描述
4.此时可以手动把进程启动起来。

//启动。
start slave;

//停止。
stop slave;

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【案例实战】高并发业务的多级缓存架构一致性解决方案

我们在高并发的项目中基本上都离不开缓存&#xff0c;那么既然引入缓存&#xff0c;那就会有一个缓存与数据库数据一致性的问题。 首先&#xff0c;我们先来看看高并发项目里面Redis常见的三种缓存读写模式。 Cache Aside 读写分离模式&#xff0c;是最常见的Redis缓存模式&a…

树莓派教程2023

摘要&#xff1a;本教程只适用于最新版树莓派64位系统&#xff08;debian11&#xff09; 树莓派官网&#xff08;之前是org&#xff09;&#xff1a; https://www.raspberrypi.com/ 一.烧录系统 1.官网下载官方烧写器 https://downloads.raspberrypi.org/imager/imager_late…

部署Redis到云服务器

购买某服务商的云服务器 在云服务器中设置TCP端口号 配置云服务器的开放端口 通过telneat测试端口是否可用 配置redis服务器 需要配置一下自己云服务器的ip 保护模式关闭、允许其他远端连接 设置和云服务器开放一致的端口号 打开此项设置redis的连接密码&#xff0c;更加…

一、计算复杂度

补充说明&#xff1a; 1、决定性问题&#xff1a; 一个决定性问题(decision problem)是指其输出&#xff0c;只有“是”或“否”的问题。 一、P问题&#xff08;polynomial time class&#xff09; 1、问题描述&#xff1a; 可于确定型图灵机以多项式时间求解的决定性问题…

STM32学习之keil5环境搭建

1.keil5是开发ARM内核芯片最常用的集成开发环境IDE。STM32开发环境的搭建主要分为两步&#xff1a; 第一步&#xff0c;安装Kile5.到keil官网下载&#xff1a;Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. 第二步…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI指数的生态质量评价及拓展应用

第一章 生态环境脆弱性评价内涵及基于文献可视化方法研究热点分析 一、基本原理 生态环境脆弱性内涵 生态环境脆弱性评价研究 生态环境脆弱性驱动力研究 生态环境脆弱性研究热点 二、文献可视化软件介绍及常用功能介绍 VOS Viewer文献可视化及研究热点分析&#xff…

工业物联网时代需要什么样的数据采集设备

引言&#xff1a; 随着物联网技术的飞速发展&#xff0c;数据成为推动企业决策和创新的核心资源。然而&#xff0c;要实现高效的数据收集和分析&#xff0c;需要可靠的数据采集设备。本文将探讨物联网时代对数据采集设备的需求&#xff0c;并介绍一款优秀的工业边缘网关产品——…

软考A计划-系统集成项目管理工程师-项目范围管理(三)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

DevOps系列文章之 DevOps 运维服务体系

DevOps 体系是从原始运维一步步走过来的&#xff0c;原始运维好比是本&#xff0c;有了本进而想继续提升效率、减少出错、优化流程&#xff0c;就发展到了 DevOps&#xff0c;AIOps……各种Ops 首先&#xff0c;运维的业务职能规范后形成章程、纲领&#xff0c;在互联网快速发…

flutter手写一个底部导航栏

使用了一下flutter提供的导航栏&#xff0c;NavigationBar&#xff0c;不过感觉使用起来不是很方便。 譬如说&#xff1a; 不能直接使用图片资源&#xff0c;需要中间加几层转换把图片转化成icon文本大小及颜色不太好控制状态栏的上边来一个横线也没有相应的样式&#xff0c;等…

对 tcp out-of-window 的安全建议

TCP 收到一个 out of window 报文后会立即回复一个 ack&#xff0c;这是 RFC793 中 SEGMENT ARRIVES 段的要求。但这是为什么&#xff1f;难道不是默默丢弃才对吗&#xff1f; 对 oow 报文回复 ack&#xff0c;岂不是把正确的 ack 号回过去了吗&#xff0c;这样攻击者盲打一番…

设计模式篇---建造者模式

文章目录 概念结构实例总结 概念 建造者模式的定义&#xff1a;将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构造过程可以创建不同的表示。 这么看起来有点难以理解&#xff0c;翻译一下就是 用户无需关注创建复杂对象的过程&#xff0c;只需要指定创建的对象即…

一文带你了解云HIS

一、简介 基于云计算技术的B/S架构的HIS系统&#xff0c;为基层医院机构提供标准化的、信息化的、可共享的医疗信息管理系统&#xff0c;实现医患事务管理和临床诊疗管理等标准管理信息系统的功能。系统利用健康云计算平台的技术优势&#xff0c;建立统一的健康档案存储平台&am…

spark调试中常见的错误集锦

示例一、没有引入jar错误 错误描述&#xff1a; 以spark在pyspark环境解析xml为例 spark核心包不支持解析xml&#xff0c;所以需要引入引用依赖包配置为: config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.16.0") 在spark-submit部署提交…

ctfshow_反序化漏洞

web254 首先进行一个代码审计 <?php error_reporting(0); highlight_file(__FILE__); include(flag.php);class ctfShowUser{public $usernamexxxxxx;public $passwordxxxxxx;public $isVipfalse;public function checkVip(){return $this->isVip;}public function logi…

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程&#xff0c;解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响&#xff0c;每N分频&#xff0c;TIE RJ(1&#x1d70e;)不变(之前已推导)&#xff0c;而Period RJ(1&#x1d70e;)增加√N倍。

RecyclerView 实现WheelView和省市区多级联动

作者&#xff1a;丨小夕 前言 滚轮经常在选择中用到&#xff0c;主要包括类型选择、省市区联动选择、年月日联动选择等。 项目中的WheelView一般都是ScrollViewLinearLayout组合完成的。 但是自定义起来比较复杂&#xff0c;也有一些优秀的第三方库DateSelecter 通过Adapter…

直线导轨的技术应用

直线导轨是机械领域中使用广泛的一种构件&#xff0c;主要用于机器的移动和定位。它具有高精度、高刚性和耐磨损等优点&#xff0c;被广泛应用于工业制造、医疗设备、半导体设备等领域。现在&#xff0c;我们来详细了解一下直线导轨的技术应用。 1、移动装置&#xff0c;直线导…

二、Spring Cloud Eureka 简介、快速入门

注册发现中心 Eureka 来源于古希腊词汇&#xff0c;意为“发现了”。在软件领域&#xff0c; Eureka 是 Netflix 在线影片公司开源的一个服务注册与发现的组件&#xff0c;和其他 Netflix 公司的服务组件&#xff08;例如负载均衡、熔断器、网关等&#xff09; 一起&#xff0…

基于灰狼优化算法的最小二乘支持向量机及其MATLAB实现

常用的预测方法有回归分析法、神经网络法、支持向量机(SVM, Support Vector Machine)等。回归分析法是建立影响因素与目标量之间的回归方程&#xff0c;建模过程简单&#xff0c;但预测精度较低。神经网络法适合分析大量非线性数据样本&#xff0c;挖掘其潜在规律&#xff0c;具…