Mysql5.7主从复制

主从原理

在高并发情况下数据库会存在一定的性能瓶颈,多数情况下一个系统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 ,复制一份,重命名:Mysql-slav

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

第二步:

然后找到Mysql的数据目录,默认在 C:\ProgramData\MySQL ,复制一份,重命名:MySQL-slave

  • 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=baidu-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 :是从的配置文件地址

安装成功提示:Service successfully installed
如果提示没有权限,就在任务管理器里面启动从MysqlSlave

实现Mysql主从自动同步

第一步

使用navicat工具连上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没有权限导致;可以给账号重新分配权限
  • 如果都不行,就要详细检查你的操作步骤了,可能是某个步骤不对导致

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 5.7主从复制配置步骤如下: 1. 在主库上重启MySQL服务并进入MySQL控制台。创建一个用于从库复制的用户,并为其授权。 ``` CREATE USER 'slave'@'%' IDENTIFIED BY '123456'; GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%'; ``` 2. 在主库上查看主库参数,记住File和Position对应的参数值,从库需要配置这些参数。 ``` show master status; ``` 3. 在从库上重启MySQL服务并进入MySQL控制台。配置主库参数,将master_log_file设置为主库的File值,将master_log_pos设置为主库的Position值。 ``` change master to master_host='192.168.1.15', master_user='slave', master_password='123456', master_port=3306, master_log_file='mysql-bin.000003', master_log_pos=2336, master_connect_retry=30; ``` 4. 在从库上启动主从复制。 ``` start slave; ``` 5. 查看主从复制状态,确保Slave_IO_Running和Slave_SQL_Running都为Yes。 ``` show slave status \G; ``` 6. 若要修改MySQL配置文件,进入配置文件中的部分,插入或修改以下关键配置: ``` [mysqld] log-bin=mysql-bin server-id=1 ``` 请确保在配置主从复制之前,主库和从库之间可以正常通信,且主库的binlog模式已经开启。当主从复制配置成功后,从库会自动从主库同步数据。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [MySQL 5.7 主从复制](https://blog.csdn.net/MrYang_Wei/article/details/129587645)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *3* [MySQL5.7主从复制](https://blog.csdn.net/qq_43681755/article/details/108365639)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值