15. MySQL主从复制

基本原理

  • slave会从master读取binlog来进行数据同步
  • master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events
  • slave将master的binary log events拷贝到它的中继日志(relay log)
  • slave重做中继日志中的事件,将改变应用到自己的数据库中。 MySQL复制是异步的且串行化的

基本原则

  • 每个slave只有一个master
  • 每个slave只能有一个唯一的服务器ID
  • 每个master可以有多个salve

最大问题

延时

一主一从

1.Windows主机修改my.ini配置文件

# 主服务器唯一ID
server-id=1

# 启用二进制日志
log-bin=D:\Program Files\mysql-5.6.46-winx64\mysqlbin

# 设置不要复制的数据库
binlog-ignore-db=mysql

# 设置需要复制的数据库
binlog-do-db=mydb

# 设置binlog格式
binlog_format=STATEMENT

binlog格式*

binlog_format=STATEMENT默认

image-20201112054420402

  1. STATEMENT默认

    会在logbin日志里面记录所有的写操作SQL,但是有一个问题,如果执行的SQL中带有函数,例如上图的now()这种,如果在主机上执行一遍,再到从机上执行一遍,那就可能造成主从复制不一致。

  2. ROW

    会记录执行完SQL之后每一行的改变,这样可以解决STATEMENT的主从复制不一致问题,但是它也有问题,比如说需要大批量修改数据或者整表修改的时候,假如有10W条数据,做主从复制的话,它就需要在主机记录一遍,到从机再记录一遍,有效率问题。

  3. MIXED

    会判断写操作里面有没有函数,如果有函数就用ROW模式,没函数就用STATEMENT模式,它的问题是,一旦SQL中出现系统变量,例如上图的@@host name,它就会出现主从复制不一致

mysql主从复制起始时,从机不继承主机数据

2.Linux从机修改my.cnf配置文件

vim /etc/my.cnf
 
# 增加以下两行
# 需要与主机区分
server-id=2
 
# 开启终极日志
relay-log=mysql-relay

3.主机从机重启服务

  • Windows:可以直接在任务管理器找到MySQL服务重启
  • Linux:systemctl restart mysqld

4.主机从机都关闭防火墙

  • windows手动关闭
  • linux:systemctl stop firewalld

5.在Windows主机上建立账户并授权slave

# 给repl做主从复制的权限,%代表所有的远程用户
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY '123456';

# 查询master的状态,记录下File和Position的值
show master status;

执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

6.在Linux从机上配置需要复制的主机

# 设置主从关系,此处一定要确定好主机的IP
CHANGE MASTER TO MASTER_HOST='192.168.2.229',MASTER_USER='repl',
MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysqlbin.000001',MASTER_LOG_POS=120;

# 启动从服务器复制功能
start slave;

7.查看连接状态

show slave status\G;

必须保证IO与SQL的Running状态为yes,否则建立失败

假如出现Slave_IO_Running:Connecting,一定要仔细检查配置,我这边就出现过这个错误,但是我的是主机IP一直没写对,我是跟着视频来的,视频中说网段最后是.1,我就下意识的以为应该是一样的,其实不是一样的,本机的IP还是要去查一下,Windows:ipconfig,Linux:ifconfig,要以查出来的为准,所以这是一个非常低级的错误,不知道以后会不会有人看到,如果正好看到了,那也算是我帮你们踩坑了。

8.如何重新配置主从

如果真要重新设置主机、从机,可以看一下这篇博客

9.测试

# 在主服务器操作建库、建表、插入数据
create database mydb_indi
use mydb_indi;
create table mytbl(id int, name varchar(20));
insert into mytbl values(1,'zhang3');

查看从服务器数据库

主从复制,搭建成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQL 8.0.34版本中,主从复制的配置步骤如下: 1. 确保主数据库和从数据库的版本相同,并且都是MySQL 8.0.34版本。 2. 在主数据库中,编辑主配置文件(my.cnf或my.ini),设置以下参数: - server-id=1: 设置主数据库的唯一标识符为1。 - log_bin=mysql-bin: 启用二进制日志,用于记录主数据库的所有变更操作。 3. 重启主数据库,使配置生效。 4. 在主数据库中,创建用于从数据库复制的用户,并为该用户授予适当的权限。 5. 在从数据库中,编辑从配置文件(my.cnf或my.ini),设置以下参数: - server-id=2: 设置从数据库的唯一标识符为2。 - relay-log=mysql-relay-bin: 启用中继日志,用于从数据库接收主数据库的二进制日志事件。 - log_slave_updates: 允许从数据库将收到的二进制日志事件传播给其他从数据库。 6. 重启从数据库,使配置生效。 7. 在主数据库中,执行CHANGE MASTER TO语句,将从数据库的连接信息添加到主数据库中。 8. 在从数据库中,执行START SLAVE语句,启动从数据库的复制进程。 9. 检查主数据库和从数据库的状态,确保主从复制已成功建立。 需要注意的是,在MySQL 8.0.34版本中,主数据库的root密码需要使用如下语句进行修改: ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '12345678'。<span class="em">1</span> #### 引用[.reference_title] - *1* [Docker Mysql 8.0.19 搭建主从复制](https://blog.csdn.net/qq_34474636/article/details/129903309)[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^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值