前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL复制以及调优

MySQL复制以及调优

作者头像
闻说社
发布于 2025-03-13 07:23:26
发布于 2025-03-13 07:23:26
16200
代码可运行
举报
运行总次数:0
代码可运行

一. 简介

MySQL自带复制方案,带来好处有:

数据备份负载均衡。 分布式数据。

概念介绍:

主机(master):被复制的数据库。 从机(slave):复制主机数据的数据库。

复制步骤: (1). master记录更改的明细,存入到二进制日志(binary log)。 (2). master发送同步消息给slave。 (3). slave收到消息后,将master的二进制日志复制到本地的中继日志(relay log)。 (4). slave重现中继日志中的消息,从而改变数据库的数据。

下面放一张经典的图片来说明这一过程:

复制原理图
复制原理图

二. 实现复制

实现复制有以下步骤:

1.设置MySQL主库的二进制日志以及server-id

MySQL配置文件一般存放在/etc/my.cnf

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码# 在[mysqld]下面添加配置选项
[mysqld]
server-id=1
log-bin=mysql-bin.log

server-id是数据库在整个数据库集群中的唯一标示,必须保持唯一。 重启MySQL。 注:如果MySQL配置文件中已经配置过此文件,则可以跳过此步。

2.新建复制账号

在主库里面新建用于从库复制主库数据的账号,并授予复制权限。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pgsql 代码解读复制代码mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO user_name@'host' IDENTIFIED BY 'password';
3.设置MySQL主库server-id

和第二步配置一样,要注意的地方有两点:

  1. 如果不需要从库作为别的从库的主库的话,则不需要配置二进制日志。
  2. 很多时候复制并不需要复制主库的全部数据库(特别是mysql的信息配置库)。因此可以配置replicate_do_db来指定复制的数据库
4.从库初始化主库的数据

如果数据量不算大的情况下,可以使用mysqldump工具导出主库数据,然后导入到从库里面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
brainfuck 代码解读复制代码mysqldump --single-transaction --triggers --master-data databasename > data.sql

如果数据量大的情况下应该使用Xtrabackup去进行数据库的导出,此处不做介绍。 可能会有同学问,为什么不直接使用二进制日志进行初始化呢?

  1. 如果我们主库运行了比较长的一段时间,并不太适合使用从库根据二进制日志进行复制数据,直接使用二进制日志去初始化从库会比较耗费时间和性能。
  2. 更多的情况下,主库的二进制日志的配置项没有打开,因此也就不存在以前操作的二进制日志。
5.开启复制

从库执行下面命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
routeros 代码解读复制代码mysql> CHANGE MASTER TO MASTER_HOST='host',
-> MASTER_USER='user',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000001',
-> MASTER_LOG_POS=0;

注意最后的两个命令:MASTER_LOG_FILE和MASTER_LOG_POS,表示从库的从哪个二进制文件开始读取,偏移量从那里开始,这两个参数可以从我们导入的SQL里面找到。

导入注意
导入注意

开启复制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
crmsh 代码解读复制代码start slave;

这时候就完成了复制,在主库更新一个数据或者新增数据在从库都可以查询到结果。

查看复制
查看复制

在主库上也可以查询的到复制线程的状态。

线程状态
线程状态

三. 复制的日志格式

MySQL复制的日志格式有三种,根据主库存放数据的方式不同有以下三种:

复制方式

特点

优点

缺点

row

基于行的格式复制,记录需要修改的每行的数据信息。 如果一个SQL修改了2w行的数据,那么就会记录2w行的日志格式

保证了数据的强一致性,且由于记录的是执行后的结果,在从库上执行还原也会比较快

日志记录数量很多,主从之间的传输需要更多的时间。

statement

基于段的日志格式复制,也就是记录下更改的SQL记录,而不是更改的行的记录。

日志记录量最小。

对于一些输出结果不确定的函数,在从库上执行一遍很可能会出现问题,如uuid,从库根据日志还原主库数据的时候需要执行一遍SQL,时间相对较慢。

mixed

混合上面两种日志格式记录记录日志,至于什么时候使用哪种日志方式由MySQL本身决定。

可以平衡上面两种日志格式的优缺点。

mysql5.7以前默认使用statement格式。 设置方式,可以在配置文件设置(首选):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码binlog_format=ROW

或临时设置全局变量(当前mysql连接有效):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
routeros 代码解读复制代码查看日志格式
mysql > show variables like 'binlog_format';

设置日志格式
mysql > set binlog_format='row';

由于两个主从服务器一般都会放在同一个机房里面,两者之间同步的速度会会比较快,为保证强一致性,应该首选行的日志格式记录(row),保证传输素速度可以选择混合方式(mixed)。 而行的日志格式有下面三种记录方式:

记录方式

特点

minimal

只记录被修改列的数据

full

记录被修改的行的全部列的数据

noblob

特点同上,只是如果没有修改blob和text类型的列的情况下,不会记录这些列的数据(也就是大数据列)

mysql默认是full,最好修改成minimal。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ini 代码解读复制代码binlog_row_image=minimal

四. 主从复制延迟

由于主库和从库之间不在同一个主机上,数据同步之间不可以避免地具有延迟,解决的方法有添加缓存,业务层的跳转等待,如果非得从数据库层面去减缓延迟问题,可以从复制时候的三大步骤(主库产生日志,主从传输日志,从库还原日志内容)入手: 1.主库写入到日志的速度 控制主库的事务大小,分割大事务为多个小事务。 如插入20w的数据,改成插入多次5000行(可以利用分页的思路)

2.二进制日志在主从之间传输时间 主从之间尽量在同一个机房或地域。 日志格式改用MIXED,且设置行的日志格式未minimal,原理详见上面的日志格式介绍。

3.减少从库还原日志的时间 在MySQL5.7版本后可以利用逻辑时钟方式分配SQL多线程。 设置逻辑时钟:slave_parallel_type=‘logical_clock’; 设置复制线程个数:slave_parallel_workers=4;

五. 需要注意的地方

  1. 重启MySQL最好切换未MySQL用户再进行操作,不然文件启动后会有权限问题。
  2. 搭建好MySQL的环境后就设置好配置里的log-bin选项,这样以后如果数据库需要从库的复制,就不需要重启数据库,打断业务的进行。
  3. 需要打开主库的防火墙的对应的mysql端口。
  4. 由于从库同步主库的方式,监听主库发送的信息,而不是轮询,因此如果出现通信出现了故障,重新连接后如果主库没有进行数据更改的操作,从库不会同步数据,因此可以通过插入空事务的方式同步数据。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL复制功能介绍
分担数据库的读负载 对服务器进行水平扩展 异步复制(无法保证主库和从库的延迟) 复制解决了什么问题? 不同服务器上的数据分布 利用二进制日志进行增量备份 不需要太多带宽 但是基于行复制 需要大量的带宽 跨IDC环境下可能有问题 应该进行分批复制 实现数据读取的负载均衡 采用非共享架构 增加数据安全性 减少主库服务器的负载 数据库之间的故障切换 binlog日志 记录了所有MySQL数据库的修改事件 包括增删改查时间和对表结构的修改事件 二进制日志格式 基于段的格式 binlog_format=STA
Yuou
2022/09/26
3950
面试被问MySQL 主从复制,怎么破?
随着应用业务数据不断的增大,应用的响应速度不断下降,在检测过程中我们不难发现大多数的请求都是查询操作。
程序员白楠楠
2021/01/28
5880
MySQL主从复制详解
在MySQL中,主从架构应该是最基础、最常用的一种架构了。后续的读写分离、多活高可用架构等大多都依赖于主从复制。主从复制也是我们学习MySQL过程中必不可少的一部分,关于主从复制的文章有很多,笔者也来凑凑热闹,写写这方面的内容吧,同时分享下自己的经验和方法。
MySQL技术
2020/07/28
4120
MySQL主从复制详解
MySQL 复制全解析 Part 4 使用备库搭建MySQL复制
MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制
bsbforever
2020/08/18
4280
MySQL 复制全解析 Part 4 使用备库搭建MySQL复制
Mysql-13mysql的复制
1.mysql复制概念   指将主数据库的DDL和DML操作通过二进制日志传到复制服务器上,然后在复制服务器上将这些日志文件重新执行,从而使复制服务器和主服务器的数据保持同步。复制过程中一个服务器充当主服务器(master),而一个或多个其它服务器充当从服务器(slaves)。主服务器将更新重新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器、从服务器在日志中读取的最后一次成功更新的位置。从服务器接受从那时起发生的任何
用户1173509
2018/01/17
8770
高性能Mysql主从架构的复制原理及配置详解
Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
用户7353950
2022/05/11
5160
高性能Mysql主从架构的复制原理及配置详解
Mysql主从复制
Mysql主从复制也可以称为Mysql主从同步,它是构建数据库高可用集群架构的基础。它通过将一台主机的数据复制到其他一台或者多台主机上,并重新应用日志(realy log)中的SQL语句来实现复制功能。Mysql支持单向,双向,链式级联,异步复制,复制过程中一台服务器充当主库(master),而一个或者多个服务器充当从库(slave)
mikelLam
2022/10/31
1.3K0
Mysql主从复制
(1)主从服务器操作系统版本和位数必须一致; (2)主节点(Master)和从节点(Slave)数据库版本必须一致; (3)主节点(Master)和从节点(Slave)数据库中的数据必须一致; (4)主节点(Master)需要开启二进制日志; (5)主节点(Master)和从节点(Slave)的 server-id 在局域网内必须唯一。
码客说
2022/12/05
1.2K0
Mysql主从复制
MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制
https://dev.mysql.com/doc/refman/5.7/en/replication.htm
bsbforever
2020/08/18
3380
MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制
谈谈MYSQL主从复制原理
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
一个风轻云淡
2023/12/12
3270
MySQL主从复制搭建
CREATE USER 'repl'@'172.18.0.11' IDENTIFIED BY '123456';
code-x
2022/06/21
5920
MySQL 结合 MyCAT 实现主从复制读写分离
MySQL 结合 MyCAT 实现主从复制读写分离是一个用于提高数据库性能和可用性的常见方案。
用户7353950
2024/04/03
1440
MySQL 结合 MyCAT 实现主从复制读写分离
一步步搭建基于GTID的MySQL复制
虽然从库可以不需要开启二进制日志功能,这里我们推荐主从库同时开启二进制日志功能,方便主从切换
bsbforever
2020/08/19
7850
一步步搭建基于GTID的MySQL复制
使用Xtrabackup对MySQL做主从复制
mysqldump对于导出10G以下的数据库或几个表,还是适用的,而且更快捷。一旦数据量达到100-500G,无论是对原库的压力还是导出的性能,mysqldump就力不从心了。Percona-Xtrabackup备份工具,是实现MySQL在线热备工作的不二选择,可进行全量、增量、单表备份和还原。(但当数据量更大时,可能需要考虑分库分表,或使用 LVM 快照来加快备份速度了)。 2.2版本xtrabackup能对InnoDB和XtraDB存储引擎的数据库非阻塞地备份,innobackupex通过perl封装了一层xtrabackup,对MyISAM的备份通过加表读锁的方式实现。2.3版本xtrabackup命令直接支持MyISAM引擎。
阿dai学长
2019/04/03
2.3K0
mysql高可用架构设计,处理高并发,大流量!
主要介绍:复制功能介绍、mysql二进制日志、mysql复制拓扑、高可用框架、单点故障、读写分离和负载均衡介绍等 mysql复制功能介绍 mysql复制功能提供分担读负载 复制解决的问题 实现在不同服务器上的数据分布 利用二进制日志增量进行 不需要太多的带宽 但是使用基于行的复制在进行大批量的更改时会对带宽带来一定得压力,特别是跨IDC环境下进行复制 实现在不同服务器上的数据分布 实现数据读取的负载均衡 需要其他组件配合完成 利用DNS轮询的方式把程序的读连接到不同的备份数据库, 使用LVS,haproxy
思梦php
2018/03/09
2.4K0
mysql高可用架构设计,处理高并发,大流量!
第18章_主从复制
🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉
程序员Leo
2023/08/07
2190
第18章_主从复制
MySQL高可用之主从复制
最近公司业务量有点大,服务器I/O访问频率过高,之前单节点MySQL有点扛不住压力了,于是我找老板又搞了一台服务器,准备上MySQL的主从复制和读写分离,做多库的存储,提高单个机器的性能,老板欣然同意!
行百里er
2020/12/02
9790
MySQL高可用之主从复制
MySQL 8 复制(三)——延迟复制与部分复制
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wzy0623/article/details/90642712
用户1148526
2019/07/02
3.9K0
MySQL 8 复制(三)——延迟复制与部分复制
MySql主从复制,从原理到实践!
主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从数据库上,然后在从数据库上对这些日志进行重新执行,从而使从数据库和主数据库的数据保持一致。
macrozheng
2020/01/16
5360
MySql主从复制,从原理到实践!
【MySQL】主从复制介绍及配置
MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点。
Xiongan-桃子
2023/06/15
3840
相关推荐
MySQL复制功能介绍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验