MySQL主从复制

MySQL主从复制

MySQL内建的复制功能是构建大型,高性能应用程序的基础
通过将MySQL的某一台主机(master)的数据复制到其他主机(slaves)上,并重新执行一遍来执行 复制过程中一台服务器充当主服务器,而其他一个或多个其他服务器充当从服务器

1、MySQL支持的复制类型

基于语句(statement)的复制
在主服务器上执行SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比 较高。
基于行(row)的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍。从MySQL 5.0开始支持。混合型(mixed)的复制
默认采用基于语句的复制,一旦发现基于语句的无法精确复制时,就会采用基于行的复制。

2、为什么要做主从复制灾备

数据分布
负载平衡读写分离
提高并发能力

3、主从复制基本架构

在这里插入图片描述

4、主从复制原理

主要基于MySQL二进制日志
主要包括三个线程(2个I/O线程,1个SQL线程)

1、MySQL将数据变化记录到二进制日志中;
2、Slave将MySQL的二进制日志拷贝到Slave的中继日志中;
3、Slave将中继日志中的事件在做一次,将数据变化,反应到自身(Slave)的数据库

详细步骤:

1、从库通过手工执行change master to 语句连接主库,提供了连接的用户一切条件(user 、password、port、ip),并且让从库知道,二进制日志的起点位置(file名 position 号); start slave
2、从库的IO线程和主库的dump线程建立连接。
3、从库根据change master to 语句提供的file名和position号,IO线程向主库发起binlog的请求。
4、主库dump线程根据从库的请求,将本地binlog以events的方式发给从库IO线程。
5、从库IO线程接收binlog events,并存放到本地relay-log中,传送过来的信息,会记录到master.info中
6、从库SQL线程应用relay-log,并且把应用过的记录到relay-log.info中,默认情况下,已经应用过的relay 会自动被清理purge

5、MySQL复制常用的拓扑结构

主从类型(Master-Slave)
主主类型(Master-Master)
级联类型(Master-Slave-Slave)

6、如何实现主从复制

在主服务器(master)上
启用二进制日志
选择一个唯一的server-id 创建具有复制权限的用户
在从服务器(slave)上
启用中继日志
(二进制日志可开启,也可不开启)
选择一个唯一的server-id
连接至主服务器,并开始复制

7、MySQL主从复制实战

环境准备

两台机器一主一从。
主库(MySQL Master):[ip为172.25.10.130 port为3306]
从库(MySQL Slave ):[ip为172.25.10.132 port为3306]

主库配置
1) 设置server-id值并开启binlog参数
[mysqld]
log_bin = mysql-bin
server_id = 130

[root@localhost ~]# vim /etc/my.cnf.d/mysql-server.cnf 

在这里插入图片描述
重启数据库

[root@localhost ~]# systemctl restart mysqld.service

2) 建立同步账号

mysql> create user 'rep1'@'172.25.10.%' identified with mysql_native_password by 'redhat123';
mysql> grant replication slave on *.* to 'rep1'@'172.25.10.%';
mysql> show grants for'rep1'@'172.25.10.%';

在这里插入图片描述

3)锁表设置只读
为后面备份准备,注意生产环境要提前申请停机时间;

mysql> flush tables with read lock;

提示:如果超过设置时间不操作会自动解锁。
mysql> show variables like '%timeout%'; 测试锁表后是否可以创建数据库:

4) 查看主库状态
查看主库状态,即当前日志文件名和二进制日志偏移量
mysql> show master status;
在这里插入图片描述

5) 备份数据库数据
退出数据库后操作

[root@localhost ~]# mysqldump -uroot -p -A -B |gzip > mysql_bak.$(date +%F).sql.gz

密码为数据库的密码
在这里插入图片描述

6) 解锁
进入到MySQL进行解锁
mysql> unlock tables;

7) 主库备份数据上传到从库

scp mysql_bak.2022-09-11.sql.gz 172.25.10.132:/root

将本地路径下的压缩包拷贝到从库的root目录下
其中密码是root@172.25.10.132(从库)root的密码
在这里插入图片描述

可以查看从库主机上面的root目录下有该文件
在这里插入图片描述
到此,主库设置完成操作

从库上设置

1) 设置server-id值并关闭binlog参数
#log_bin = /data/mysql/data/mysql-bin
server_id = 132

在这里插入图片描述
重启数据库
[root@localhost ~]# systemctl restart mysqld.service

2) 还原从主库备份数据

[root@localhost ~]# cd /root
[root@localhost ~]# gzip -d mysql_bak.2022-09-11.sql.gz 
[root@localhost ~]# mysql -uroot -p < mysql_bak.2022-09-11.sql

检查还原:
mysql -uroot -p -e 'show databases;'

3) 设定从主库同步
根据主库的信息进行同步
在这里插入图片描述

mysql> change master to 
MASTER_HOST='172.25.10.130', 
MASTER_PORT=3306,
MASTER_USER='rep1', 
MASTER_PASSWORD='redhat123', 
MASTER_LOG_FILE='mysql-bin.000001', 
MASTER_LOG_POS=868;

4) 启动从库同步开关
start slave;

检查状态:
show slave status\G
在这里插入图片描述

在这里插入图片描述

8、MySQL主从复制的状况监测

主从状况监测主要参数
Slave_IO_Running: IO 线 程 是 否 打 开 YES/No/NULL Slave_SQL_Running: SQL线程是否打开 YES/No/NULL Seconds_Behind_Master: NULL #和主库比同步的延迟的秒数
可能导致主从延时的因素主从时钟是否一致
网络通信是否存在延迟
是否和日志类型,数据过大有关从库性能,有没开启binlog 从库查询是否优化

常见状态错误排除

发现IO进程错误,检查日志,排除故障:

在这里插入图片描述
找到原因:从5.6开始复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样
解决方法:(从库是克隆机器) 修改从库的uuid
vim auto.cnf server-uuid=
或者
在这里插入图片描述

常见状态错误排除
show slave status;
报错:Error xxx doesn’t exist
解决方法:
stop slave;
set global sql_slave_skip_counter = 1;
start slave;

测试主从同步:
主库创建一个数据库:
mysql -uroot -p -e 'create database test_m';
在这里插入图片描述

从库检查:
mysql -uroot -p -e 'show databases;' |grep "test_m"

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值