主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做);从而使得从数据库的数据与主数据库保持一致。当系统访问量大时,单数据库可能无法保证系统的性能,需要配置多台数据库来提高系统性能进行读写分离,把访问量分担,同时主从复制也起到了一个数据备份的功能。

文章目录

  • 主从复制的作用
  • MySQL主从复制解决的问题
  • MySQL主从复制工作原理
  • 基本原理流程,3个线程以及之间的关联
  • 一主一从主从复制实战
    • 环境准备
    • 主机配置
    • 从机配置
    • 查看log-bin文件的生成位置
    • 主机给从机链接授权
    • 使用命令查看master状态
    • 从机连接主机配置
    • 更新主机数据库,在从机看是否同步成功
    • 要把主数据库和从数据库的责任分担明确
  • 本文小结

主从复制的作用

  1. 主数据库出现问题,可以切换到从数据库。
  2. 可以进行数据库层面的读写分离。
  3. 可以在从数据库上进行日常备份。

MySQL主从复制解决的问题

  1. 数据分布:随意开始或停止复制,并在不同地理位置分布数据备份
  2. 负载均衡:降低单个服务器的压力
  3. 高可用和故障切换:帮助应用程序避免单点失败
  4. 升级测试:可以用更高版本的MySQL作为从库

MySQL主从复制工作原理

简单通俗说,主机把改变操作记录保存到一个日志文件中,从机获取到这个日志文件,在自己的机器上运行

  1. 在主库上把数据更新记录到二进制日志
  2. 从库将主库的日志复制到自己的中继日志
  3. 从库读取中继日志的事件,将其重放到从库数据中

基本原理流程,3个线程以及之间的关联

主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进自己的relay log中;
从:sql执行线程——执行relay log中的语句;

复制过程


Binary log:主数据库的二进制日志

Relay log:从服务器的中继日志

第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。

第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。

第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。


一主一从主从复制实战

环境准备

准备两台装有mysql数据库的机器,在此笔者使用了两台虚拟机系统是ubuntu18.04,在一台机器安装好mysql数据库之后克隆就行了(通过这种方法会有一个坑后面再说),保证这两台虚拟机可上网可以相互ping通。


主机配置

修改数据库配置文件 /etc/mysql/mysql.conf.d/mysqld.cnf, 注意:这个文件根据安装mysql方式不同路径不同,需要找到自己mysql的配置文件 在[mysqld]节点中配置如下:


配置说明:

  1. server-id:指定master服务id,必须
  2. log-bin=mysql-bin:需要打开日志文件,必须,这里有些人会指定一个目录,但是笔者指定一个目录之后发现mysql就启动不起来了,这里直接设置为 mysql-bin 就可以,生成的文件过后是可以使用命令查看的
  3. 错误日志文件归集路径,可选
  4. read-only=0 数据库读写模式 因为主机一般都是可读可写的,也可以使用默认值这项可选, 0为可读可写,1为只读
  5. binlog_do_db :这项可选所以没有配置,意思 要复制哪些数据库
  6. binlog_ignore_db 这项可选所以没有配置,意思 忽略复制哪些数据库

这里就完成了主机数据库配置文件的修改,保存之后重启mysql服务。


从机配置

从机数据库配置相对简单点,也是修改数据库配置文件(如上路径),只需要在【mysqld】节点中配置server-id即可:


server-id不能和主机重复了,read-only这里理论上从机只做读操作,所以设置为1,但是这里有坑下文再说

从机的配置配置一个server-id就可以了保存退出,重启服务,这里我们就配置好了一台主机和从机 主机:192.168.192.133 从机:192.168.192.132


查看log-bin文件的生成位置

  1. 首先登录到数据库中 mysql -u root -p 根据提示输入密码
  2. 输入命令:show variables like ‘%log_bin%’;


在图中我们可以看到log_bin 的value是ON说明是打开了二进制文件配置,log_bin_basenaem 的value 就是文件的保存地址,去到目录查看


这里的mysql-bin.000001就是生成的二进制文件了


主机给从机链接授权

1.mysql -u root -p 根据提示输入密码
2. 使用命令:grant REPLICATION SLAVE ON *.* to 'ayou'@'192.168.192.132' identified by '123456';
3. 命令解析

grant: 是数据库的授权命令
ayou:被授权的账号
REPLICATION SLAVE:复制权限
‘192.168.192.132’:被授权登录的从机ip
‘123456’:被授权账号的密码

执行命令后,再执行刷新权限表命令:

FLUSH PRIVILEGES;

查看某个账号被分配权限的命令:如

show grants for ‘ayou’@‘192.168.192.132’


使用命令查看master状态

show master status

  • file:二进制文件,从机要复制主机的哪一个二进制文件
  • position:磁道,就是从机要从哪一个节点开始复制主机的内容
  • binlog_Do_DB:要复制的哪一个数据库(这一项可在上文配置文件配置)
  • Binlog_Igore_DB:要排斥复制的哪个数据库,(这一项可在上文配置文件配置)

从机连接主机配置

在上文中在主机中为从机账号授权了,现在要通过这个账号来连接主机,步骤如下:

1.登录数据库mysql -u root -p

2.登录成功后输入命令:change master to master_host='192.168.192.133',master_user='ayou',master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=10756;

命令详解:

master_host:主机ip地址
master_user:master授权账号
master_password:master授权的密码
master_log_file:对应的二进制文件,如上图所示的FIle
master_log_pos=:对应的是master上的磁道(通俗将就是你要从二进制文件的哪个地方开始做复制)

3.输入成功后执行如下命令启动slave,:

start slave;

4.执行如下命令查看slave状态:

show slave status\G;

slave_Io_State:状态必须显示为 Waiting for master to send event

Slave_IO_Running:YES 状态必须显示为 YES

Slave_SQL_Running:YES 状态必须显示为 YES

以上三项条件必须满足才证明主从之间的通道打开。


更新主机数据库,在从机看是否同步成功


如上所示我们在主机数据库创建了test数据库,在test数据库中创建了test数据表,在表中插入了一条记录,按理说主从连接通道已经建立好此时去从机查看就会和主机数据一致,我们查看从机数据库。


再试一次,在主机上插入数据

insert into test values(1,‘234789’);

返回从机查看,


发现数据同步是成功的,说明我们的主从复制是生效的.

这里补充一下,如果在生产过程中,你的从库是后面再搭建的而主库已经有一些数据库表和数据了, 从库数据的复制是从主从架构搭建之后的,所以搭建之前的主库的数据需要手动导入到从库后建立主从复制机制。


要把主数据库和从数据库的责任分担明确

上文操作中我们已经把主从复制搭建好了,但是“主从复制”这四个字常常伴随着“读写分离”四个字,在开发中我们为了避免主从数据库数据冲突,需要给主数据库可读可写的权限,从数据库拥有读的权限就可。写数据的时候都往主数据库写,而读数据时则可以通过java或其他程序来规定读取哪个数据库。


本文小结

本文详细分析了mysql数据库的主从复制,但是在实际的操作过程中可能会遇到不少问题。

MySQL的主从复制详解相关推荐

  1. MySQL主从同步详解与配置

    https://zhuanlan.zhihu.com/p/335142300 MySQL主从同步详解与配置 第一部分[原理解析] * 应用背景* MySQL数据库自身提供的主从复制功能可以方便的实现数 ...

  2. Mysql加锁过程详解(3)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  3. mysql status改变_mysql 配置详解mysql SHOW STATUS 详解

    1. back_log 指定MySQL可能的连接数量.当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程. back_log ...

  4. MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) 一.什么是表分区 通俗地讲表分区是将一大表,根据条件分割成若干个小表.mysql5.1开始支持数据表分区了. 如:某用户表的记录超过 ...

  5. Mysql存储引擎详解(MyISAM与InnoDB的区别)

    Mysql存储引擎详解(MyISAM与InnoDB的区别) 存储引擎     MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平 ...

  6. MySQL的Limit详解(转载)

    MySQL的Limit详解 问题:数据库查询语句,如何只返回一部分数据? Top子句 TOP 子句用于规定要返回的记录的数目.对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 在SQL Se ...

  7. Mysql加锁过程详解(2)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  8. 数据库mysql_row_MYSQL数据库mysql found_row()使用详解

    <MYSQL数据库mysql found_row()使用详解>要点: 本文介绍了MYSQL数据库mysql found_row()使用详解,希望对您有用.如果有疑问,可以联系我们. mys ...

  9. mysql 联合索引详解

    mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...

最新文章

  1. falcon存储引擎入门(一)
  2. P5459-[BJOI2016]回转寿司【树状数组】
  3. matlab简单程序实例视频,matlab编程实例100例.docx
  4. 该文件可能是只读的 或者您要访问的位置_Linux应用编程之文件操作 系统调用篇(下)...
  5. netcore docker_深入浅出 ASP.NET Core 与 Docker 入门课程目标说明
  6. 用户层关闭杀毒软件安全保护
  7. mysql 多个字段拼接 concat
  8. VS2017环境下动态链接库编写及调用
  9. Java高并发编程详解-代码在本地
  10. 获取指定月份最后一天_Excel如何计算某个月的第1天和最后1天?
  11. 二分图匹配问题之km算法代码
  12. 【有利可图网】PS实战教程28:巧用调整边缘滤镜抠毛发
  13. FreeRTOS消息队列详解第一讲(全网最全)——消息队列概述
  14. MultiTracker 多目标跟踪算法
  15. java投票小程序_一个实现不记名投票的小程序
  16. DEBIAN_FRONTEND noninteractive参数
  17. 日拱一卒,热爱可抵岁月漫长
  18. 上海大学计算机科学与技术专业选修课怎么选,大一“选修课”怎么选?这3种选课攻略很关键,第3种才是最重要的!...
  19. iDownsV1.8.4资源素材教程下载类WordPress
  20. python双色球选号_python实现双色球随机选号

热门文章

  1. android中button点击两次才响应onclick方法
  2. ASP.NET登录控件login。
  3. 第七章——DMVs和DMFs(4)——用DMV和DMF监控磁盘IO
  4. windows2003管理组创建
  5. 试图登录,但是网络登陆服务没有启动成功
  6. 路由器链路聚合技术(Eth-Trunk、Ip-Trunk)
  7. 洛谷——P1109 学生分组
  8. 15个最佳的 JavaScript 表单验证库
  9. 实例解读:如何减少Docker中的Java内存消耗
  10. 手把手教你用express搭建个人博客(二)