首页 > 数据库 >【高级】MySQL主从复制

【高级】MySQL主从复制

时间:2023-09-10 14:22:06浏览次数:46  
标签:主库 binlog 主从复制 MySQL 高级 master mysql home 从库

【一】引入

  • 之前做过redis的主从,很简单
  • mysql 稍微复杂一些, 搭建mysql主从的目的是?
    • 读写分离
    • 单个实例并发量低,提高并发量
    • 只在主库写,读数据都去从库----》读多写少
  • 读写分离
    • 通过将读操作分发到从库,可以分摊主库的读负载,提高整体的并发处理能力。
    • 主库只需处理写操作,从库处理读操作。
  • 提高并发能力
    • 通过增加从库的数量,可以增加并行处理读请求的能力,从而提高整个系统的并发能力。
  • 故障容错
    • 当主库发生故障时,可以将其中一个从库晋升为新的主库,确保系统的可用性和数据一致性。

【二】MySQL主从原理

image-20230822114502006

  • 步骤一:主库db的更新事件(update、insert、delete)被写到binlog(二进制日志)
  • 步骤二:从库发起连接,连接到主库
  • 步骤三:此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
  • 步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log(中继日志).
  • 步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db.

步骤一

  • 主库的更新事件被写入binlog 当主库中发生更新操作(如update、insert、delete)时,这些更新操作会被记录在binlog中,以二进制的形式保存。
  • binlog包含了主库上的所有读写操作。

步骤二

  • 从库连接到主库 从库通过与主库建立连接,获取主库上的数据更新。
  • 从库会向主库发送一个连接请求,使用主库的地址、端口号、用户名和密码进行认证完成连接。

步骤三

  • 主库创建binlog dump thread线程传输binlog内容 一旦从库与主库建立连接,主库会创建一个binlog dump thread线程,将binlog的内容发送到从库。
  • 这个线程负责把binlog中的更新事件发送给从库,以便从库能够获取到主库最新的更新信息。

步骤四

  • 从库创建I/O线程读取binlog并写入relay log 从库启动后,会创建一个I/O线程,该线程从主库读取binlog的内容,并将其写入到中继日志(relay log)。
  • 中继日志是从库自己的二进制日志,它记录了从主库加载的binlog内容。

步骤五

  • 从库创建SQL线程执行更新事件并写入slave的db 在从库上还会创建一个SQL线程
  • 它从中继日志(relay log)中读取内容,并从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入从库的数据库中。

【三】搭建步骤

【1】搭建环境

  • 准备两台机器 (可以使用mysql的docker镜像模拟两台机器)
    • 主库:IP地址为8.130.125.9,端口为33307
    • 从库:IP地址为8.130.125.9,端口为33306

【2】拉取mysql5.7的镜像

  • 您需要拉取MySQL 5.7的镜像,使用以下命令来进行拉取:
docker pull mysql:5.7

【3】创建文件夹,文件(目录映射)

  • 创建必要的文件夹和文件,并进行目录映射,以下命令:
mkdir /home/mysql
mkdir /home/mysql/conf.d
mkdir /home/mysql/data/
touch /home/mysql/my.cnf

mkdir /home/mysql1
mkdir /home/mysql1/conf.d
mkdir /home/mysql1/data/
touch /home/mysql1/my.cnf

【4】编写MySQL配置文件(主,从)

(1)主库

  • 在主库上创建/home/mysql/my.cnf文件
  • 并将以下内容保存到该文件中
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000

server-id=100
log-bin=mysql-bin

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

(2)从库

  • 在从库上创建/home/mysql1/my.cnf文件
  • 并将以下内容保存到该文件中
[mysqld]
user=mysql
character-set-server=utf8
default_authentication_plugin=mysql_native_password
secure_file_priv=/var/lib/mysql
expire_logs_days=7
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connections=1000


server-id=101  
log-bin=mysql-slave-bin   
relay_log=edu-mysql-relay-bin 

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

【5】启动MySQL容器并进行端口和目录映射

  • 使用以下命令来启动主库容器并进行端口和目录映射
docker run  -di -v /home/mysql/data/:/var/lib/mysql -v /home/mysql/conf.d:/etc/mysql/conf.d -v /home/mysql/my.cnf:/etc/mysql/my.cnf -p 33307:3306 --name mysql-master -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
  • 使用以下命令来启动从库容器并进行端口和目录映射
docker run  -di -v /home/mysql1/data/:/var/lib/mysql -v /home/mysql1/conf.d:/etc/mysql/conf.d -v /home/mysql1/my.cnf:/etc/mysql/my.cnf -p 33306:3306 --name mysql-slave -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

【6】连接主库

  • 使用以下命令连接到主库
mysql -uroot -P33307 -h 10.0.0.102 -p

【7】在主库创建用户并授权

(1)创建用户

create user 'test'@'%' identified by '123';

(2)用户授权

grant all privileges on *.* to 'test'@'%' ;

(3)刷新权限

flush privileges;

(4)查看主服务器状态(显示如下图)

show master status; 

image-20230822120311338

【8】连接到从库并设置复制参数

  • 连接到从库
mysql -uroot -P33306 -h 10.0.0.102 -p
  • 设置复制参数
change master to master_host='8.130.125.9',master_port=33307,master_user='test',master_password='123',master_log_file='mysql-bin.000003',master_log_pos=0;
  • change master to
  • master_host='MySQL主服务器IP地址',
  • master_user='之前在MySQL主服务器上面创建的用户名',
  • master_password='之前创建的密码',
  • master_log_file='MySQL主服务器状态中的二进制文件名',
  • master_log_pos='MySQL主服务器状态中的position值';

【9】启动从库

start slave;

【10】检查从库状态(如下图)

show slave status\G;

image-20230822120633285

标签:主库,binlog,主从复制,MySQL,高级,master,mysql,home,从库
From: https://www.cnblogs.com/dream-ze/p/17691174.html

相关文章

  • 学习笔记-计算机病毒对抗技术-高级反病毒
    虚拟机技术1、虚拟CPU2、虚拟进程环境3、虚拟执行进程代码虚拟机在反病毒领域中的应用1、处理变形病毒2、基于虚拟机技术的行为判定病毒与虚拟机的对抗云查杀技术启发式扫描技术1、动态启发式2.静态启发式主动防御技术1、获得SSDT表2、在SSDT表中定位要替换的函数地址的位置3、使用......
  • MySQL面试问题集锦
    1、请简要说明一条SQL语句的执行过程。参照:深度好文:MySQL架构(baidu.com)一文读懂MySQL查询语句的执行过程(taodudu.cc)MySQLServer架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层。2、mysql有关权限的表都有哪几个MySQL服务器通过权限表来控制用户对......
  • 高级Java面试:如何在事务中使用锁?
    亲爱的小伙伴们,大家好!我是小米,很高兴再次和大家见面。今天,我将和大家分享一个关于编程中的面试题:一个有@Transaction注解的方法中有锁,需要注意什么?这个问题可能在Java后端开发的面试中常常被问到,不仅考察了对事务和锁的理解,还涉及到了多线程编程的复杂性。所以,赶快跟我一起深入探讨......
  • Flink 1.17教程:输出算子之输出到MySQL(JDBC)
    输出到MySQL(JDBC)写入数据的MySQL的测试步骤如下。(1)添加依赖添加MySQL驱动:mysqlmysql-connector-java8.0.27官方还未提供flink-connector-jdbc的1.17.0的正式依赖,暂时从apachesnapshot仓库下载,pom文件中指定仓库路径:apache-snapshotsapachesnapshotshttps://repository.a......
  • nacos配置mysql链接
    因为是Linux安装,所以下载的是tar.gz的 下载完之后直接用的MobXtrem上传到任意文件夹中,然后用下面的命令解压到当前文件夹:tar-zxvfnacos-server-1.4.2.tar.gz然后进入到bin文件夹下面,执行单机命令启动:./startup.sh-mstandalone这个时候就已经可以访问页面域名/ip:8848/......
  • 欧拉22使用rpm包安装mysql8
    欧拉系统下载链接http://mirrors.163.com/openeuler/openEuler-22.03-LTS/everything/x86_64/Packages/https://zhuanlan.zhihu.com/p/649407349安装tar命令dnf-yinstalltar解压tar包tar-xfmysql-community-8.0.33-1.x86_64.tarsetenforce0开始安装rm-rf*test*rm-rf*d......
  • navicate 连接mysql8.1
    1问题描述安装好mysql8.1,使用navicate连接,报错Clientdoesnotsupportauthenticationprotocolrequestedbyserver; 2解决1)命令行登录mysqlmysql-hlocalhost-P3306-u用户-p密码 2)执行命令修改加密规则ALTERUSER'root'@'localhost'IDENTI......
  • es高级查询
    ......
  • MySQL查询语句及练习题
    查询记录查询数据库表中列的数据SELECT*,列名FROM表名WHERE条件GROUPBY分组HAVING过滤ORDERBY排序LIMIT分页查询分组查询GROUPBY子句用于根据一个或多个列对结果进行分组--统计员工表中职位的分类信息SELECTJ职位FROM员工表GROUPBY职位;--统计员工表......
  • MySQL配置中文编码GBK的重要性
    一、背景   在mysql数据库中,默认使用的是latin字符集,所以无法正常的支持中文字符。在my.ini文件中将配置支持GBK编码,方便于后续数据库操作而不会报错误。二、问题如下图所示通过上述图,存在以下几个问题:默认创建的数据库和表是latin1编码。my.ini配置文件中设置为:character-s......