mysql基础5——mysql主从

文章目录

  • 一、基本了解
  • 二、主从原理
  • 三、主从复制
    • 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;

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB | 如何使用MATLAB获取顶刊《Nature》全部绘图(附带近3年全部图像)

我出了如何使用MATLAB获取期刊《Cell》全部绘图&#xff0c;立马就有粉丝问《Nature》、《Sience》、《PNAS》啥的会不会安排&#xff0c;这期就给大家安排《Nature》全部绘图获取&#xff0c;之后其他期刊也会慢慢安排&#xff0c;但是不会一次性全出完(毕竟不能抓住一个主题就…

【Java基础教程】(五)程序概念篇 · 下:夯实基础!全面解析Java程序的逻辑控制体:顺序、选择与循环结构~

Java基础教程之程序概念 下 本节学习目标1️⃣ 程序逻辑控制1.1 顺序结构1.2 分支结构1.2.1 if 选择结构1.2.2 switch 选择结构 1.3 循环结构1.3.1 while 循环1.3.2 for 循环1.3.3 循环控制 &#x1f33e; 总结 本节学习目标 掌握Java中分支结构、循环结构、循环控制语法的使…

Squid 缓存代理--反向代理

Squid 缓存代理–反向代理 反向代理&#xff1a;如果Squid反向代理服务器中缓存了该请求的资源&#xff0c;则将该请求的资源直接返回给客户端&#xff1a;否则反向代理服务器将向后台的WEB服务器请求资源&#xff0c;然后将请求的应答返回给客户端&#xff0c;同时也将应答缓…

Django框架-11

聚合查询 1.聚合函数 使用aggregate()过滤器调用聚合函数。聚合函数包括&#xff1a;Avg 平均&#xff0c;Count 数量&#xff0c;Max 最大&#xff0c;Min 最 小&#xff0c;Sum 求和&#xff0c;被定义在django.db.models中。 例&#xff1a;查询图书的总阅读量。 from mo…

如何确定活动隔断整体色调

确定活动的整体色调可以通过以下几个步骤&#xff1a; 1. 确定主题或目标&#xff1a;首先要明确活动的主题或目标&#xff0c;这将有助于确定活动需要传达的情感或氛围。 2. 考虑活动类型&#xff1a;根据活动的类型&#xff0c;例如婚礼、生日派对、企业活动等&#xff0c;可…

vue3+pinia用户信息持久缓存(token)的问题

vue3pinia用户信息持久缓存&#xff08;token)的问题 对博主来说&#xff0c;这是个相当复杂的问题。 当初在使用vue2vuex进行用户信息持久登录时&#xff0c;写了不下3篇博客&#xff0c;确实是解决了问题&#xff0c;博客链接如下 vue存储和使用后端传递过来的tokenvue中对…

gma 2 教程(二)数据操作:1. 相关模块组成

考虑到数据读写是地理空间数据分析和应用的基础&#xff0c;因此将本章作为正文第一部分&#xff0c;以便为后续章节应用提供基础支持。本章以gma栅格/矢量数据输入输出模块&#xff08;io&#xff09;栅格/矢量数据的读取、创建、变换等主要操作为基础&#xff0c;配合gma地理…

基于PyQt5的桌面图像调试仿真平台开发(13)图像边缘显示

系列文章目录 基于PyQt5的桌面图像调试仿真平台开发(1)环境搭建 基于PyQt5的桌面图像调试仿真平台开发(2)UI设计和控件绑定 基于PyQt5的桌面图像调试仿真平台开发(3)黑电平处理 基于PyQt5的桌面图像调试仿真平台开发(4)白平衡处理 基于PyQt5的桌面图像调试仿真平台开发(5)…

2023年第一届证券基金行业先进计算峰会在沪成功召开

2023年7月7日&#xff0c;在中国计算机学会集成电路设计专委会、中国通信学会金融科技发展促进中心、中国电子工业标准化技术协会新一代计算标准工作委员会和证券基金信息技术创新联盟WG1工作组的指导下&#xff0c;由中科驭数主办的2023年第一届证券基金行业先进计算峰会在上海…

用矩阵处理3D变换

Rotation 也可以把三个旋转矩阵合并为一个综合旋转矩阵: 平移和旋转结合 有时我们想要将平移和旋转结合起来&#xff0c;这样我们就可以在一次操作中同时进行两者&#xff0c;但是我们不能用3x3矩阵来做3D平移&#xff0c;只能用4x4矩阵来做&#xff0c;如下所定义&#xff1a…

iOS打包IPA教程

转载&#xff1a;xcode打包导出ipa 众所周知&#xff0c;在开发苹果应用时需要使用签名&#xff08;证书&#xff09;才能进行打包安装苹果 IPA&#xff0c;作为刚接触ios开发的同学&#xff0c;只是学习ios app开发内测&#xff0c;并没有上架appstore需求&#xff0c;对于苹…

UE4/5用贴图和GeneratedDynamicMeshActor曲面细分与贴图位移制作模型

目录 制作逻辑&#xff1a; ​编辑 曲面细分函数&#xff1a; 添加贴图逻辑&#xff1a; 代码&#xff1a; 制作逻辑&#xff1a; 在之前的文章中&#xff0c;我们使用了网格细分&#xff0c;而这一次我们将使用曲面细分函数&#xff0c;使用方法和之前是一样的&#xff1a…

2023年Web安全学习路线总结!430页Web安全学习笔记(附PDF)

关键词&#xff1a;网络安全入门、渗透测试学习、零基础学安全、网络安全学习路线、web安全攻防笔记、渗透测试路线图 网络安全的范畴很大&#xff0c;相较于二进制安全等方向的高门槛、高要求&#xff0c;Web安全体系比较成熟&#xff0c;在现阶段来看&#xff0c;但凡有自己…

浅析便捷生活的新选择——抖音本地服务

抖音是一款风靡全球的短视频分享平台&#xff0c;其本地服务功能的发展也逐渐引起了广泛关注。本地服务是指抖音平台上的用户可以通过平台直接查找并使用周边的各种服务&#xff0c;比如美食外卖、快递配送、家政服务等。本地服务的发展对用户和商家都带来了很多便利和机遇。 首…

Mockplus Cloud - June 2023crack

Mockplus Cloud - June 2023crack 添加便签以澄清情节提要上的任何设计概念。 新的流程图工具直接在情节提要上可视化任何设计流程和过程。 添加了在发布到Mockplus Cloud时删除RP页面的功能。 添加设计注释时包括图像和链接。 添加了一个新的提示&#xff0c;用于在断开互联网…

四、Docker镜像详情

学习参考&#xff1a;尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、Docker镜像1.1 概念1.2 UnionFS&#xff08;联合文件系统&#xff09;1.3 Docker镜像加载原理1.4 重点理解 二、docker commit 命令2.1 是什么&#xff1f;2.2 命令…

element之el-table合并列功能

目标效果如下&#xff1a; 实现代码如下&#xff1a; html部分&#xff1a; <!--定义表格组件,用组件自带的span-method属性定义合并列的方法--> <el-table :data"tableData" :span-method"spanRow"><el-table-column prop"RegionNa…

独立站如何实现全球开店,获得更多流量?

对于独立站卖家来说&#xff0c;针对一个国家搭建一个站点、运营&#xff0c;就已经要花上不少力气了。更别说想要在多个市场售卖了&#xff0c;每个国家不同的货币、语言、定价、付款方式等等就已经够让人头大。 研究显示&#xff0c;40%的人不会从其他语言的网站上购买产品。…

Python基础综合案例-数据可视化(地图)

今天给大家带来的是Python综合实战开发的数据可视化操作 通过python实现对数据的分析、可视化 数据来源:线上公布数据&#xff0c;需要可私信 前期准备工作&#xff1a;Python可视化准备工作 前期模块安装等前期基础的准备工作大家可以看我之前的文章讲解&#xff0c;有问题可…

交易所行情基础相关知识

目录 一、行情基本概念 二、简单交易模型 三、行情系统结构 四、各种行情协议 1.FIX 2.STEP 3.FAST 4.Binary 五、集合竞价和连续竞价 1.集合竞价 2.连续竞价 六、上交所LDDS和深交所Binary行情对比 一、行情基本概念 行情是描述市场繁荣状态的数据&#xff0c;…