MySQL数据库复制

news2025/3/14 19:23:45

文章目录

  • 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的复制其运作流程大致如下:

  1. 从库执行完START SLAVE命令后,会创建两个线程:I/O线程SQL线程
  2. I/O线程会建立一个到主库的连接,相应地,主库会创建一个binlog dump线程来响应这个连
  3. 接的请求。此时,对于主库来说,从库的1/O线程就是一个普通的客户端。
  4. I/O线程首先告诉主库应该从何处开始发送二进制日志事件。
  5. 主库的binlog dump线程开始从指定位置点读取二进制日志事件,并发送给I/O线程。
  6. I/O线程接收到二进制日志事件后,会将其写入relay log
  7. 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-binbinlog文件的前缀(8.0之后的版本可以不用配置该数,但会习惯性的进行设置)
  • server-id 是服务端ID, 在一个复制组内必需全局唯一,有效值为 1~2^32^-1

注意事项:

  • server-id 支持在线调整,但开启binlog 需要重启实例
  • MySQL8.0之前,binlog默认是关闭的,不显示设置log-bin参数,则不开启binlog。而在MySQL8.0中,binlog默认是开启的,如果要关才binlog,需要显示设置skip_log_bindisable_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.sql

scp  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_posI/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.infomysql.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_RunningSlave_SQL_Running 的结果均为YES代表主从复制搭建成功

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for source to send event
                  Master_Host: 192.168.50.121
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bing.000001
          Read_Master_Log_Pos: 717
               Relay_Log_File: mysql02-relay-bin.000003
                Relay_Log_Pos: 327
        Relay_Master_Log_File: mysql-bing.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 717
              Relay_Log_Space: 696
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_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: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: cdc9afd5-fcd8-11ef-9d33-000c29ea0d0a
             Master_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
         Replicate_Rewrite_DB:
                 Channel_Name:
           Master_TLS_Version:
       Master_public_key_path:
        Get_master_public_key: 0
            Network_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 slavestop slaveshow slave stausshow slave hostsreset slave 命令都补弃用了,取而代之的是 start replicastop rplicashow replica statusshow replicasreset replica
  • MySQL8.O.23开始,CHANGE MASTER TO命令被弃用,取而代之的是CHANGE REPLICATION SOURCE TO
  • MySQL8.0.26开始,标识符(如系统参数、状态变量)中的MASTER、SLAVEMTS(multithreadedslave的缩写)将分别被SOURCE、REPLICAMTA(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: 23
   User: repl
   Host: 192.168.50.122:52016
     db: NULL
Command: Binlog Dump
   Time: 152
  State: Source has sent all binlog to replica; waiting for more updates
   Info: NULL

在从库是执行 show processlist 命令, 5和6 的连接分别为 I/O线程和SQL线程

mysql>  show processlist\G;
*************************** 1. row ***************************
     Id: 5
   User: system user
   Host: connecting host
     db: NULL
Command: Connect
   Time: 226
  State: Waiting for source to send event
   Info: NULL
*************************** 2. row ***************************
     Id: 6
   User: system user
   Host:
     db: NULL
Command: Query
   Time: 226
  State: Replica has read all relay log; waiting for more updates
   Info: NULL

至此一个简单的异步复制环境搭建完毕。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2315036.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

101.在 Vue 3 + OpenLayers 使用 declutter 避免文字标签重叠

1. 前言 在使用 OpenLayers 进行地图开发时&#xff0c;我们经常需要在地图上添加点、线、区域等图形&#xff0c;并给它们附加文字标签。但当地图上的标注较多时&#xff0c;文字标签可能会发生重叠&#xff0c;导致用户无法清晰地查看地图信息。 幸运的是&#xff0c;OpenL…

uniapp移动端图片比较器组件,仿英伟达官网rtx光追图片比较器功能

组件下载地址&#xff1a;https://ext.dcloud.net.cn/plugin?id22609 已测试h5和微信小程序&#xff0c;理论支持全平台 亮点&#xff1a; 简单易用 使用js计算而不是resize属性&#xff0c;定制化程度更高 组件挂在后可播放指示线动画&#xff0c;提示用户可以拖拽比较图片…

深度学习与大模型-矩阵

矩阵其实在我们的生活中也有很多应用&#xff0c;只是我们没注意罢了。 1. 矩阵是什么&#xff1f; 简单来说&#xff0c;矩阵就是一个长方形的数字表格。比如你有一个2行3列的矩阵&#xff0c;可以写成这样&#xff1a; 这个矩阵有2行3列&#xff0c;每个数字都有一个位置&a…

搭建基于chatgpt的问答系统

一、语言模型&#xff0c;提问范式与 Token 1.语言模型 大语言模型&#xff08;LLM&#xff09;是通过预测下一个词的监督学习方式进行训练的&#xff0c;通过预测下一个词为训练目标的方法使得语言模型获得强大的语言生成能力。 a.基础语言模型 &#xff08;Base LLM&…

LuaJIT 学习(2)—— 使用 FFI 库的几个例子

文章目录 介绍Motivating Example: Calling External C Functions例子&#xff1a;Lua 中调用 C 函数 Motivating Example: Using C Data StructuresAccessing Standard System FunctionsAccessing the zlib Compression LibraryDefining Metamethods for a C Type例子&#xf…

解锁 AI 开发的无限可能:邀请您加入 coze-sharp 开源项目

大家好&#xff01;今天我要向大家介绍一个充满潜力的开源项目——coze-sharp&#xff01;这是一个基于 C# 开发的 Coze 客户端&#xff0c;旨在帮助开发者轻松接入 Coze AI 平台&#xff0c;打造智能应用。项目地址在这里&#xff1a;https://github.com/zhulige/coze-sharp&a…

全面解析与实用指南:如何有效解决ffmpeg.dll丢失问题并恢复软件正常运行

在使用多媒体处理软件或进行视频编辑时&#xff0c;你可能会遇到一个常见的问题——ffmpeg.dll文件丢失。这个错误不仅会中断你的工作流程&#xff0c;还可能导致软件无法正常运行。ffmpeg.dll是FFmpeg库中的一个关键动态链接库文件&#xff0c;负责处理视频和音频的编码、解码…

Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)

一、计算机眼中的图像 像素 像素是图像的基本单元&#xff0c;每个像素存储着图像的颜色、亮度和其他特征。一系列像素组合到一起就形成 了完整的图像&#xff0c;在计算机中&#xff0c;图像以像素的形式存在并采用二进制格式进行存储。根据图像的颜色不 同&#xff0c;每个像…

小米路由器SSH下安装DDNS-GO

文章目录 前言一、下载&#xff06;安装DDNS-GO二、配置ddns-go设置开机启动 前言 什么是DDNS&#xff1f; DDNS&#xff08;Dynamic Domain Name Server&#xff09;是动态域名服务的缩写。 目前路由器拨号上网获得的多半都是动态IP&#xff0c;DDNS可以将路由器变化的外网I…

go语言zero框架拉取内部平台开发的sdk报错的修复与实践

在开发过程中&#xff0c;我们可能会遇到由于认证问题无法拉取私有 SDK 的情况。这种情况常发生在使用 Go 语言以及 Zero 框架时&#xff0c;尤其是在连接到私有平台&#xff0c;如阿里云 Codeup 上托管的 Go SDK。如果你遇到这种错误&#xff0c;通常是因为 Go 没有适当的认证…

手机屏幕摔不显示了,如何用其他屏幕临时显示,用来导出资料或者清理手机

首先准备一个拓展坞 然后 插入一个外接的U盘 插入鼠标 插入有数字小键盘区的键盘 然后准备一根高清线&#xff0c;一端链接电脑显示器,一端插入拓展坞 把拓展坞的连接线&#xff0c;插入手机充电口&#xff08;可能会需要转接头&#xff09; 然后确保手机开机 按下键盘…

工业三防平板AORO-P300 Ultra,开创铁路检修与调度数字化新范式

在现代化铁路系统的庞大网络中&#xff0c;其设备维护与运营调度的精准性直接影响着运输效率和公共安全。在昼夜温差大、电磁环境复杂、震动粉尘交织的铁路作业场景中&#xff0c;AORO-P300 Ultra工业三防平板以高防护标准与智能化功能体系&#xff0c;开创了铁路行业移动端数字…

LInux基础--apache部署网站

httpd的安装 yum -y install httpdhttpd的使用 启动httpd systemctl enable --now httpd使用enable --now 进行系统设置时&#xff0c;会将该服务设置为开机自启并且同时开启服务 访问httpd 创建虚拟主机 基于域名 在一台主机上配置两个服务server1和server2&#xff0c;其…

Linux内核套接字以及分层模型

一、套接字通信 内核开发工程师将网络部分的头文件存储到一个专门的目录include/net中&#xff0c;而不是存储到标准位置include/linux。 计算机之间通信是一个非常复杂的问题&#xff1a; 如何建立物理连接&#xff1f;使用什么样的线缆&#xff1f;通信介质有那些限制和特殊…

Linux《基础开发工具(中)》

在之前的Linux《基础开发工具&#xff08;上&#xff09;》当中已经了解了Linux当中到的两大基础的开发工具yum与vim&#xff1b;了解了在Linux当中如何进行软件的下载以及实现的基本原理、知道了编辑器vim的基本使用方式&#xff0c;那么接下来在本篇当中将接下去继续来了解另…

使用1Panel一键搭建WordPress网站的详细教程(全)

嘿&#xff0c;各位想搭建自己网站的朋友们&#xff01;今天我要跟大家分享我用1Panel搭建WordPress网站的全过程。说实话&#xff0c;我之前对服务器运维一窍不通&#xff0c;但通过这次尝试&#xff0c;我发现原来建站可以这么简单&#xff01;下面是我的亲身经历和一些小技巧…

uni-app学习笔记——自定义模板

一、流程 1.这是一个硬性的流程&#xff0c;只要按照如此程序化就可以实现 二、步骤 1.第一步 2.第二步 3.第三步 4.每一次新建页面&#xff0c;都如第二步一样&#xff1b;可以选择自定义的模版&#xff08;vue3Setup——这是我自己的模版&#xff09;&#xff0c;第二步的…

数据结构——顺序表seqlist

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序表部分的内容 目录 一、线性表的定义 二、线性表的基本操作 三.顺序表 1.定义 2. 存储结构 3. 特点 四 顺序表操作 4.1初始化 4.2 插入 4.2.1头插 4.2.2 尾插 4.2.3 按位置插 4.3 …

使用位运算如何找到数组中只出现一次的数?

题目链接&#xff1a;137. 只出现一次的数字 II - 力扣&#xff08;LeetCode&#xff09; 算法解析 位运算是用于二进制的运算符号。而对于多次出现的数字&#xff0c;其二进制都是一模一样的&#xff0c;这里是3次重复的出现是数字。由此我们可以想到&#xff0c;如果我们由低…

Linux笔记之通配符和正则表达式的区别

Linux笔记之通配符和正则表达式的区别 code review! 参考笔记 1.Linux笔记之通配符和正则表达式的区别 2.C++笔记之C语言中的换行符和转义符 文章目录 Linux笔记之通配符和正则表达式的区别1.通配符概念2.通配符和正则表达式的区别3.C++或C语言中有没有通配符?4.Linux Bash脚…