Mysql随笔-Mysql5.7主从复制

前言

本来没打算写这篇文章,只是项目需要搞Mysql主从,心血来潮做一个笔记,也是很久么有写文章了。希望可以对你有所帮助,喜欢的话可以给个好评

主从原理

我不知道你是否了解Mysql主从,在高并发情况下数据库会存在一定的性能瓶颈,多数情况下一个系统80%的性能问题都在读上面,这种情况我们可以使用Mysql主从来分担读的压力。

主从的含义是:所有的写操作在主库上,读操作在一个或者多个从库上,当然主库也可以承担读请求,而从库的数据则通过主库复制而来,Mysql自带主从复制的功能。原理如下图
在这里插入图片描述

主从复制步骤:

  1. 将Master的binary-log日志文件打开,mysql会把所有的DDL,DML,TCL写入BinaryLog日志文件中
  2. Master会生成一个 log dump 线程,用来给从库的 i/o线程传binlog
  3. 从库的i/o线程去请求主库的binlog,并将得到的binlog日志写到中继日志(relaylog)中
  4. 从库的sql线程,会读取relaylog文件中的日志,并解析成具体操作,通过主从的操作一致,而达到最终数据一致

基于这样一个原理,那么我们的项目就可以实现读写分离了。如下:

在这里插入图片描述
Mysql可以自动实现主从复制,那么我们项目发起的写操作就走主库,而读操作就走从库。我们今天讲的内容主要是如何实现Mysql的主从复制功能。

安装mysql主从

第一步

我机器上已经安装好了一个Mysql,版本是 5.7,在此基础上我们来演示Mysql主从的安装和配置(Linux也是一样的)。首先找到Mysql的安装目录,我的安装在 C:\Program Files\MySQL ,复制一份,如下:
在这里插入图片描述

  • C:\Program Files\MySQL\MySQL Server 5.7: 作为我的主msyql,也就就是master,端口是3306
  • C:\Program Files\MySQL\MySQL-slave :是我复制出来的,作为从Mysql

第二步:

然后找到Mysql的数据目录,默认在 C:\ProgramData\MySQL ,复制一份,如下:

在这里插入图片描述

  • C:\ProgramData\MySQL\MySQL Server 5.7 : 是我的master的数据目录
  • C:\ProgramData\MySQL\MySQL-slave : 是我的slave从库的数据目录

第三步

然后进入到 master主mysql的数据目录中修改my.ini ,开启master的bin-log 同步功能,我的是 C:\ProgramData\MySQL\MySQL Server 5.7\my.ini

[mysqld]
#lower_case_table_names=1 #忽略大小写
#服务器id ,不可重复
server-id=1
#打开log-bin日志
log-bin=mysql-bin

#要给从机同步的库,如果是多个库,可以写多个命令
binlog-do-db=itsource-student
#binlog-do-db=xxxx
#不给从机同步的库(多个写多行)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#自动清理 7 天前的log文件,可根据需要修改
expire_logs_days=7
  • 注意一下,默认情况下 my.ini中有一个 server-id=1 ,所以master的配置这个项目可以不用管
  • log-bin=mysql-bin :开启master的log-bin写日志功能
  • binlog-do-db :同步的数据库名

第四步

主Mysql配置修改好了,直接重启即可,接下来修改slave的配置 C:\ProgramData\MySQL\MySQL-slave\my.ini ,内容如下

[mysqld]

#lower_case_table_names = 1
#不可以与主数据库的ID相同
server-id = 2
#跳过出现的错误,继续执行复制
slave_skip_errors = 1146,2003 
#slave_skip_errors = 2003
port=3307

# Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL-slave/"

# Path to the database root
datadir=C:/ProgramData/MySQL/MySQL-slave/Data

从Mysql就配置就改好了,多说一句:从Mysql也可以开启log-bin 。

  • server-id = 2 : 注意一下,一定要把默认的server-id = 1改掉,不然会和master重复了
  • port=3307 : 把mysqld下的服务器端口改一下,不然会端口冲突
  • basedir : 安装目录要修改成slave的安装目录
  • datadir : 数据目录修改成slave的数据目录

第五步

另外,去从库的数据目录\data 目录中把auto.cnf 文件删除,因为该文件中存在一个UUID,我们使用的是复制主库,UUID会重复导致从启动不了。

第六步

现在我们来依次启动两个Mysql。主mysql直接重启即可,从mysql我还需要安装一个服务,CMD进入到从库的安装目录下的bin目录 : C:\Program Files\MySQL\MySQL-slave\bin ,然后执行下面命令安装从的服务:

C:\Program Files\MySQL\MySQL-slave\bin>mysqld.exe --install MysqlSlave --defaults-file="C:\ProgramData\MySQL\MySQL-slave\my.ini"
  • MysqlSlave : 是服务名
  • –defaults-file :是从的配置文件地址

在这里插入图片描述
如果提示没有权限,就用管理运行cmd , 然后在任务管理器里面启动从Mysql,如下:

在这里插入图片描述

实现Mysql主从自动同步

第一步

使用工具连上2个Mysql,从Mysql是复制的主Mysql所以密码也是一样的

在这里插入图片描述
从mysql需要从主mysql同步数据,那么首先需要在主mysql创建一个用作数据复制的账号

GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%' IDENTIFIED BY '密码';

FLUSH PRIVILEGES;

然后可以通过 show master status; 命令查看主Mysql的状态
在这里插入图片描述

  • mysql-bin.000002 : Master的log-bin日志文件
  • Position : 数据同步的位置
  • Binlog-Do_DB : 我们指定的要同步数据的数据库
  • Binlog-Ignore_DB : 这个是忽略不同步的表

第二步

到这说明master就已经准备好了 , 接下来配置Slave 数据库, 一定要在Slave去执行下面命令来建立主从同步关系。

# 先停掉slave
stop slave ; 
# 建立主从关系
change master to master_host='127.0.0.1' , master_user='slaveuser',master_password='密码',master_log_file='master-bin.000002',master_log_pos=1876;
#启动同步,如有报错执行 reset slave;
start slave;			
#显示从的状态			
show slave status
#确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes				#负责与主机的io通信
Slave_SQL_Running: Yes    #负责自己的slave mysql进程
  • master_log_file : log-bin文件名,和master查询状态所显示的一样
  • master_log_pos :日志的位置,和master查询状态所显示的一样
  • master_host : 主数据库的IP
  • master_user :之前在主数据库创建的账号,专门用作数据同步

注意:master_log_file 和 master_log_pos 的值要与Master查询的一致,要填写你自己的值,不要直接拷贝文章中的内容。

如果 Slave_IO_Running = no 可以检查数据这几个点:

  • 主Mysql和从Mysql的server-id重复了
  • 两个数据目录\data\auto.cnf 中的UUID值重复了
  • 在配置slave同步时因为slave访问master没有权限导致;可以给账号重新分配权限
  • 如果都不行,就要详细检查你的操作步骤了,可能是某个步骤不对导致

最后一步就是测试了。因为我同步是itsource-student ,只需要主mysql去修改该库表中的任何一个数据,从mysql中的数据都会跟着变化。

文章结束,希望对你有所帮助,喜欢请三连。。。

猜你喜欢

转载自blog.csdn.net/u014494148/article/details/126881544