MySQL数据库复制
文章目录
- MySQL数据库复制
- 一、复制的原理
- 二、复制的搭建
- 1.编辑配置文件
- 2.在主库上创建复制的用户
- 3.获取主库的备份
- 4.基于从库的恢复
- 5.建立主从复制
- 6.开启主从复制
- 7.查看主从复制状态
MySQL数据库复制
MySQL作为非常流行的数据库,支撑它如此出彩的因素主要有两个,InnoDB存储引擎和复制。InnoDB存储引擎支持事务、行级别锁、MVCC。基于此,MySQL能实现高并发。而复制可以将主库的数据同步到另一个实例,基于此我们可以实现读写分离和数据容灾。
一、复制的原理
MySQL主从复制的核心原理是通过二进制日志(binlog)实现的,熟悉Oracle的同学会问:MySQL不是有redo log吗?为什么不直接基于redo log来实现呢?
实际上redo log是InnoDB存储引擎独有的,作为一个支持可插拨存储引擎的数据库,MySQL不仅支持InnoDB存储引擎,还支持MyISAM、CSV、Memory等存储引擎,对于这些存储引擎的操作同样需要持久化到binlog中。

MySQL的复制主要涉及以下3个线程:
- 主库 binlog dump 线程
- 从库 I/O 线程
- 从库 SQL 线程
MySQL的复制其运作流程大致如下:
- 从库执行完
START SLAVE命令后,会创建两个线程:I/O线程和SQL线程。 I/O线程会建立一个到主库的连接,相应地,主库会创建一个binlog dump线程来响应这个连- 接的请求。此时,对于主库来说,从库的
1/O线程就是一个普通的客户端。 I/O线程首先告诉主库应该从何处开始发送二进制日志事件。- 主库的
binlog dump线程开始从指定位置点读取二进制日志事件,并发送给I/O线程。 I/O线程接收到二进制日志事件后,会将其写入relay log。SQL线程读取relay log中的二进制日志事件,然后进行重放。
二、复制的搭建
实验版本为 MySQL 8.0.41,部署MySQL异步复制,机器环境如下, 需要分别提前安装数据库软件以及初始化好数据库实例,可以参考我之前的《MySQL数据库安装》的文章
| 角色 | IP |
|---|---|
| 主库 | 192.168.50.121 |
| 从库 | 192.168.50.122 |
1.编辑配置文件
主库编辑/etc/my.cnf文件
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
socket = /data/mysql/3306/data/mysql.sock
server-id = 1
log-bin = mysql-bing
user = mysql
port = 3306
log-error = /data/mysql/3306/data/mysqld.err
log-timestamps = system
从库/etc/my.cnf文件
[mysqld]
basedir = /usr/local/mysql
datadir = /data/mysql/3306/data
socket = /data/mysql/3306/data/mysql.sock
server-id = 2
log-bin = mysql-bing
user = mysql
port = 3306
log-error = /data/mysql/3306/data/mysqld.err
log-timestamps = system
这里给出的只是搭建复制最简单的参数:
log-bin开启binlog, 这里的mysql-bin是binlog文件的前缀(8.0之后的版本可以不用配置该数,但会习惯性的进行设置)server-id是服务端ID, 在一个复制组内必需全局唯一,有效值为1~2^32^-1
注意事项:
server-id支持在线调整,但开启binlog需要重启实例- 在
MySQL8.0之前,binlog默认是关闭的,不显示设置log-bin参数,则不开启binlog。而在MySQL8.0中,binlog默认是开启的,如果要关才binlog,需要显示设置skip_log_bin或disable_log_bin。
2.在主库上创建复制的用户
在MySQL 8.0 之前可以直接使用第二第命令会隐式创建用户,但官方不推荐这种方式。
create user 'repl'@'192.168.50.122' identified by 'test123';grant replication slave on *.* to 'repl'@'192.168.50.122';
创建用户后在从库环境验证帐号是否能正常登陆
mysql -urepl -ptest123 -h 192.168.50.121
3.获取主库的备份
这里使用mysqldump工具进行备份,备份集通过scp命令拷贝到从库
mysqldump -uroot -ptest123 -S /data/mysql/3306/data/mysql.sock --single-transaction --source-data=2 -E -R --triggers -A > full_backup.sqlscp full_backup.sql 192.168.50.122:/data
从MySQL 8.0.26开始,开始使用 --source-data 代替之前版本的 --master-data 否则备份文件中会写入以下信息,影响到后续的导入。
WARNING:–master-data is deprecated and will be removed in a future version.use --source-data instead.
4.基于从库的恢复
在从库对备份文件进行导入
mysql -uroot -ptest123 -S /data/mysql/3306/data/mysql.sock < /data/full_backup.sql
5.建立主从复制
在从库执行 CHANGE MASTER TO命令创建主从关系
change master to
master_host='192.168.50.121',
master_port=3306,
master_user='repl',
master_password='test123',
master_log_file='mysql-bing.000001',
master_log_pos=717;
参数具体含义:
| 参数 | 作用 |
|---|---|
| master_host | 主库的主机信息,可以为主机名或IP |
| master_port | 主库端口,若不指定则默认为3306 |
| master_use | 复制的用户名 |
| master_password | 复制用户的密码 |
| master_log_file | 从库I/O线程启动时,应该从主库的哪个binlog由这个参数决定 |
| master_log_pos | I/O线程确定binlog后,从哪个位置开始读取二进制日志事件. |
我们在备份的时候通过 mysqldump 指定的 --source-data=2 (旧版本用--master-data=2) 他会将备份时的binlog位置信息记录到备份文件中,内容如下
--
-- Position to start replication or point-in-time recovery from
---- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bing.000001', MASTER_LOG_POS=717;
当从库执行完CHANGE MASTER TO命令后,复制的相关信息会保存在两张表中:mysqL.slave_master.info和mysql.slave_relay_.log_info
mysql.slave_master_.info主要记录了两类信息:
- 主库的连接信息,包括主库的
IP、端口、复制用户和密码; I/O线程读取的主库binlog的位置点信息。
注意,这个位置点不是实时更新的,它的更新频率与
sync_master_.info参数有关。该参数默认为10000,即I/O线程每写入10000个事务会更新mysql.slave_.master_info一次。
mysql.slave_relay_log_info主要记录了以下信息:
SQL线程重放relay log的位置点信息。
事务每次提交时都会更新
mysqL.slave._relay._log_info
这两张表是MySQL5.6引入的。在此之前复制的相关信息保存在
master.info(对应mysql.slave_master.info表)和relay-log.info(对应mysql.slave_.relay_.log_info表)文件中,这两个文件默认位于从库的数据目录下。复制的相关信息是保存在文件还是系统表中由master_info_repository参数决定,其中,FILE代表文件,TABLE代表系统表。从MySQL8.0.2开始,该参数的默认值由FILE调整为TABLE。
6.开启主从复制
在从库上执行如下以下命令
mysql> start slave;
7.查看主从复制状态
重点关注 Slave_IO_Running和 Slave_SQL_Running 的结果均为YES代表主从复制搭建成功
mysql> show slave status\G;
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.50.121Master_User: replMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bing.000001Read_Master_Log_Pos: 717Relay_Log_File: mysql02-relay-bin.000003Relay_Log_Pos: 327Relay_Master_Log_File: mysql-bing.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB:Replicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 717Relay_Log_Space: 696Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 1Master_UUID: cdc9afd5-fcd8-11ef-9d33-000c29ea0d0aMaster_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:Master_public_key_path:Get_master_public_key: 0Network_Namespace:1 row in set, 1 warning (0.00 sec)
在上面使用 SHOW SLAVE STATUS 命令时,提示了warning通过 show warnings 可以看到,SHOW SLAVE STATUS 已被弃用, 代用SHOW REPLICA STATUS替代。
- 实际上在
MySQL 8.0.22开始start slave、stop slave、show slave staus、show slave hosts、reset slave命令都补弃用了,取而代之的是start replica、stop rplica、show replica status、show replicas、reset replica。 - 从
MySQL8.O.23开始,CHANGE MASTER TO命令被弃用,取而代之的是CHANGE REPLICATION SOURCE TO - 从
MySQL8.0.26开始,标识符(如系统参数、状态变量)中的MASTER、SLAVE和MTS(multithreadedslave的缩写)将分别被SOURCE、REPLICA和MTA(multithreaded applier的缩写)替换,这一点需要注意。
mysql> show warnings;
+---------+------+-------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+-------------------------------------------------------------------------------------------------------------------+
| Warning | 1287 | 'SHOW SLAVE STATUS' is deprecated and will be removed in a future release. Please use SHOW REPLICA STATUS instead |
+---------+------+-------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
在主库上执行 show processlist 命令,可以看到 ID为23 连接对应的即是 binlog dump线程。
mysql> show processlist\G;*************************** 3. row ***************************Id: 23User: replHost: 192.168.50.122:52016db: NULL
Command: Binlog DumpTime: 152State: Source has sent all binlog to replica; waiting for more updatesInfo: NULL
在从库是执行 show processlist 命令, 5和6 的连接分别为 I/O线程和SQL线程
mysql> show processlist\G;
*************************** 1. row ***************************Id: 5User: system userHost: connecting hostdb: NULL
Command: ConnectTime: 226State: Waiting for source to send eventInfo: NULL
*************************** 2. row ***************************Id: 6User: system userHost:db: NULL
Command: QueryTime: 226State: Replica has read all relay log; waiting for more updatesInfo: NULL
至此一个简单的异步复制环境搭建完毕。
相关文章:
MySQL数据库复制
文章目录 MySQL数据库复制一、复制的原理二、复制的搭建1.编辑配置文件2.在主库上创建复制的用户3.获取主库的备份4.基于从库的恢复5.建立主从复制6.开启主从复制7.查看主从复制状态 MySQL数据库复制 MySQL作为非常流行的数据库,支撑它如此出彩的因素主要有两个&am…...
安装 ubuntu 2404 LTS 服务器 设置 服务器名称
安装 ubuntu服务器 设置 服务器名称 hostname 打开终端(Terminal),通过快捷键CtrlAltT或在应用程序中搜索"终端"来打开;在终端中输入以下命令:hostname,然后按下回车键即可查看本机服务器名称。…...
101.在 Vue 3 + OpenLayers 使用 declutter 避免文字标签重叠
1. 前言 在使用 OpenLayers 进行地图开发时,我们经常需要在地图上添加点、线、区域等图形,并给它们附加文字标签。但当地图上的标注较多时,文字标签可能会发生重叠,导致用户无法清晰地查看地图信息。 幸运的是,OpenL…...
uniapp移动端图片比较器组件,仿英伟达官网rtx光追图片比较器功能
组件下载地址:https://ext.dcloud.net.cn/plugin?id22609 已测试h5和微信小程序,理论支持全平台 亮点: 简单易用 使用js计算而不是resize属性,定制化程度更高 组件挂在后可播放指示线动画,提示用户可以拖拽比较图片…...
深度学习与大模型-矩阵
矩阵其实在我们的生活中也有很多应用,只是我们没注意罢了。 1. 矩阵是什么? 简单来说,矩阵就是一个长方形的数字表格。比如你有一个2行3列的矩阵,可以写成这样: 这个矩阵有2行3列,每个数字都有一个位置&a…...
搭建基于chatgpt的问答系统
一、语言模型,提问范式与 Token 1.语言模型 大语言模型(LLM)是通过预测下一个词的监督学习方式进行训练的,通过预测下一个词为训练目标的方法使得语言模型获得强大的语言生成能力。 a.基础语言模型 (Base LLM&…...
LuaJIT 学习(2)—— 使用 FFI 库的几个例子
文章目录 介绍Motivating Example: Calling External C Functions例子:Lua 中调用 C 函数 Motivating Example: Using C Data StructuresAccessing Standard System FunctionsAccessing the zlib Compression LibraryDefining Metamethods for a C Type例子…...
解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目
大家好!今天我要向大家介绍一个充满潜力的开源项目——coze-sharp!这是一个基于 C# 开发的 Coze 客户端,旨在帮助开发者轻松接入 Coze AI 平台,打造智能应用。项目地址在这里:https://github.com/zhulige/coze-sharp&a…...
全面解析与实用指南:如何有效解决ffmpeg.dll丢失问题并恢复软件正常运行
在使用多媒体处理软件或进行视频编辑时,你可能会遇到一个常见的问题——ffmpeg.dll文件丢失。这个错误不仅会中断你的工作流程,还可能导致软件无法正常运行。ffmpeg.dll是FFmpeg库中的一个关键动态链接库文件,负责处理视频和音频的编码、解码…...
Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)
一、计算机眼中的图像 像素 像素是图像的基本单元,每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成 了完整的图像,在计算机中,图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不 同,每个像…...
Nginx 限流功能:原理、配置与应用
Nginx 限流功能:原理、配置与应用 在当今互联网应用的高并发场景下,服务器面临着巨大的压力。为了确保系统的稳定运行,保障核心业务的正常开展,限流成为了一项至关重要的技术手段。Nginx 作为一款高性能的 Web 服务器和反向代理服…...
【大模型学习】第十九章 什么是迁移学习
目录 1. 迁移学习的起源背景 1.1 传统机器学习的问题 1.2 迁移学习的提出背景 2. 什么是迁移学习 2.1 迁移学习的定义 2.2 生活实例解释 3. 技术要点与原理 3.1 迁移学习方法分类 3.1.1 基于特征的迁移学习(Feature-based Transfer) 案例说明 代码示例 3.1.2 基于…...
小米路由器SSH下安装DDNS-GO
文章目录 前言一、下载&安装DDNS-GO二、配置ddns-go设置开机启动 前言 什么是DDNS? DDNS(Dynamic Domain Name Server)是动态域名服务的缩写。 目前路由器拨号上网获得的多半都是动态IP,DDNS可以将路由器变化的外网I…...
C++ 布尔类型(bool)深度解析
引言 在 C 编程里,布尔类型(bool)是一种基础且极为关键的数据类型。它专门用于表达逻辑值,在程序的条件判断、循环控制等诸多方面都发挥着重要作用。接下来,我们将对 C 中的布尔类型展开全面且深入的探讨。 一、布尔…...
树莓科技集团董事长:第五代产业园运营模式的深度剖析与展望
第五代产业园运营模式,以创新为核心驱动,强调数字化、网络化和资源整合。树莓科技集团在这一领域具有代表性,其运营模式值得深入剖析。 核心特征 数字化转型:第五代产业园高度重视数字化技术的应用,通过构建数字化平…...
go语言zero框架拉取内部平台开发的sdk报错的修复与实践
在开发过程中,我们可能会遇到由于认证问题无法拉取私有 SDK 的情况。这种情况常发生在使用 Go 语言以及 Zero 框架时,尤其是在连接到私有平台,如阿里云 Codeup 上托管的 Go SDK。如果你遇到这种错误,通常是因为 Go 没有适当的认证…...
手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机
首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线,一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线,插入手机充电口(可能会需要转接头) 然后确保手机开机 按下键盘…...
工业三防平板AORO-P300 Ultra,开创铁路检修与调度数字化新范式
在现代化铁路系统的庞大网络中,其设备维护与运营调度的精准性直接影响着运输效率和公共安全。在昼夜温差大、电磁环境复杂、震动粉尘交织的铁路作业场景中,AORO-P300 Ultra工业三防平板以高防护标准与智能化功能体系,开创了铁路行业移动端数字…...
LInux基础--apache部署网站
httpd的安装 yum -y install httpdhttpd的使用 启动httpd systemctl enable --now httpd使用enable --now 进行系统设置时,会将该服务设置为开机自启并且同时开启服务 访问httpd 创建虚拟主机 基于域名 在一台主机上配置两个服务server1和server2,其…...
Linux内核套接字以及分层模型
一、套接字通信 内核开发工程师将网络部分的头文件存储到一个专门的目录include/net中,而不是存储到标准位置include/linux。 计算机之间通信是一个非常复杂的问题: 如何建立物理连接?使用什么样的线缆?通信介质有那些限制和特殊…...
Linux《基础开发工具(中)》
在之前的Linux《基础开发工具(上)》当中已经了解了Linux当中到的两大基础的开发工具yum与vim;了解了在Linux当中如何进行软件的下载以及实现的基本原理、知道了编辑器vim的基本使用方式,那么接下来在本篇当中将接下去继续来了解另…...
使用1Panel一键搭建WordPress网站的详细教程(全)
嘿,各位想搭建自己网站的朋友们!今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话,我之前对服务器运维一窍不通,但通过这次尝试,我发现原来建站可以这么简单!下面是我的亲身经历和一些小技巧…...
uni-app学习笔记——自定义模板
一、流程 1.这是一个硬性的流程,只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面,都如第二步一样;可以选择自定义的模版(vue3Setup——这是我自己的模版),第二步的…...
kotlin基础知识点汇总
对象类继承变量常量静态常量定义方法重载方法基本数据类型比较类型转换符字符串比较数组循环角标循环高级循环判断器构造函数类创建私有化 set 方法私有化 get 方法枚举接口匿名内部类内部类内部类访问外部类同名变量抽象类静态变量和方法可变参数泛型构造代码块静态代码块方法…...
git备份or打补丁
起因 在工作中使用git pull突然发现仓库出现了找不到代码库问题,但是这个时候有个对策又急着需要,于是乎,就需要备份,拷贝给另一个工程师输出。 git 打补丁操作 工程师A生成补丁文件 touch a.txtgit add a.txtgit commit -m &qu…...
如何使用GuzzleHttp库:详细教程与代码示例
GuzzleHttp 是一个功能强大的 PHP HTTP 客户端库,它可以帮助开发者方便地发送 HTTP 请求。与传统的 cURL 相比,Guzzle 提供了一个更简单且易于使用的 API,并且支持同步和异步请求。以下是 GuzzleHttp 的使用方法和一些高级特性。 一、安装 G…...
数据结构——顺序表seqlist
前言:大家好😍,本文主要介绍了数据结构——顺序表部分的内容 目录 一、线性表的定义 二、线性表的基本操作 三.顺序表 1.定义 2. 存储结构 3. 特点 四 顺序表操作 4.1初始化 4.2 插入 4.2.1头插 4.2.2 尾插 4.2.3 按位置插 4.3 …...
使用位运算如何找到数组中只出现一次的数?
题目链接:137. 只出现一次的数字 II - 力扣(LeetCode) 算法解析 位运算是用于二进制的运算符号。而对于多次出现的数字,其二进制都是一模一样的,这里是3次重复的出现是数字。由此我们可以想到,如果我们由低…...
Linux笔记之通配符和正则表达式的区别
Linux笔记之通配符和正则表达式的区别 code review! 参考笔记 1.Linux笔记之通配符和正则表达式的区别 2.C++笔记之C语言中的换行符和转义符 文章目录 Linux笔记之通配符和正则表达式的区别1.通配符概念2.通配符和正则表达式的区别3.C++或C语言中有没有通配符?4.Linux Bash脚…...
防汛应急包,快速响应,守护安全
根据中国水利部统计,自1949年以来,我国几乎每年都面临洪水威胁,其中20世纪90年代后洪涝灾害频率显著增加,仅1990-2009年间就发生超4000起较大灾害,直接经济损失近3万亿元,受灾人口达20亿人次。在2020年长江…...
