- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
MySQL 基于 Binlog 的主从复制(Master-Slave Replication)是 MySQL 数据库中实现数据复制的一种机制。在这种复制模式下,主库(Master)记录所有对数据库的修改操作(如 INSERT、UPDATE、DELETE 等)到 二进制日志(Binlog),从库(Slave)则读取这些日志并执行相同的操作,从而保持与主库的数据一致性.
Binlog 是 MySQL 用来记录所有修改数据库的事件的日志文件,包括:
Binlog 存储的是操作日志而非数据本身,因此从库需要根据这些操作来更新自己的数据.
基于 Binlog 的复制模式大致可以分为以下几个步骤:
基于 Binlog 的主从复制可以分为不同的复制模式,主要有以下几种:
异步复制:
半同步复制(Semi-Synchronous Replication):
全同步复制(Synchronous Replication):
复制延迟:由于主库和从库是异步同步的,因此在高并发的场景中,从库可能会出现延迟,导致主库和从库的数据不一致。这种延迟通常是由于从库处理速度较慢,或者网络问题等原因导致.
容错性:基于 Binlog 的主从复制,主库发生故障时,需要手动或自动切换到从库。虽然从库可以保持主库的副本,但在主库故障时可能会丢失一定的事务,因此对高可用性的需求需要结合其他技术(如 MHA、ProxySQL、Group Replication 等)来提高容错性.
基于 Binlog 的主从复制是 MySQL 中实现数据复制的常见方式,它通过记录主库的二进制日志,并将日志同步到从库,从而保持数据一致性。这种方式在大多数应用中运行稳定、性能良好,但需要注意故障恢复、复制延迟等问题,适用于高可用架构中进行读写分离、负载均衡等场景.
binlog二进制日志文件记录了主服务器上所有数据库的更改操作 。
参考:https://blog.csdn.net/2401_85648342/article/details/139765433 。
.
├── docker-compose.yml
├── master1
│ ├── conf
│ ├── data
│ └── logs
├── slave1
│ ├── conf
│ ├── data
│ └── logs
└── slave2
├── conf
├── data
└── logs
创建相关文件夹 。
# 创建持久化目录
mkdir -p /opt/mysql-compose/{master1/{data,logs,conf},slave1/{data,logs,conf},slave2/{data,logs,conf}}
# 修改权限
chmod -R 777 /opt/mysql-compose/{master1/{data,logs},slave1/{data,logs},slave2/{data,logs}}
# 临时测试-删除持久化的数据
rm -rf /opt/mysql-compose/{master1/{data/*,logs/*},slave1/{data/*,logs/*},slave2/{data/*,logs/*}}
#rm -rf /opt/mysql-compose/{master1/data/*,slave1/data/*,slave2/data/*}
分别上传配置文件(my.cnf)至 conf 目录下 。
[mysqld]
# 服务器唯一id,默认值1
server-id=11
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
# log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
binlog-do-db=testdb
# 设置不需要复制的数据库
#binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema
#binlog-ignore-db=sys
#binlog-ignore-db=performance_schema
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=12
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=13
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
#version: "3.5"
services:
#mysql:
# image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29
# container_name: mysql8
# ports:
# - "13306:3306"
# restart: always
# environment:
# - MYSQL_ROOT_PASSWORD=123456
# - TZ=Asia/Shanghai
# volumes:
# - /opt/mysql-compose/master1/conf:/etc/mysql/conf.d
# - /opt/mysql-compose/master1/logs:/var/log/mysql
# - /opt/mysql-compose/master1/data:/var/lib/mysql
mysql_master1:
image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29
container_name: mysql_master1
ports:
- "13306:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- TZ=Asia/Shanghai
volumes:
- ./master1/mysql:/etc/mysql
- ./master1/logs:/var/log/mysql
- ./master1/data:/var/lib/mysql
mysql_slave1:
image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29
container_name: mysql_slave1
ports:
- "13307:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- TZ=Asia/Shanghai
volumes:
- ./slave1/mysql:/etc/mysql
- ./slave1/logs:/var/log/mysql
- ./slave1/data:/var/lib/mysql
mysql_slave2:
image: registry.cn-shenzhen.aliyuncs.com/multiway/mysql:8.0.29
container_name: mysql_slave2
ports:
- "13308:3306"
restart: always
environment:
- MYSQL_ROOT_PASSWORD=123456
- TZ=Asia/Shanghai
volumes:
- ./slave2/mysql:/etc/mysql
- ./slave2/logs:/var/log/mysql
- ./slave2/data:/var/lib/mysql
注意:/var/lib/mysql/auto.cnf文件中的server-uuid是 MySQL 数据库服务器的唯一标识符(UUID)。这个标识符用于标识 MySQL 实例,尤其在复制(Replication)设置中,它可以帮助区分不同的数据库实例。在 MySQL 中,/var/lib/mysql/auto.cnf 是一个自动生成的配置文件,通常包含 MySQL 实例的 UUID 信息。你可以通过这个文件来查看 MySQL 服务器的 UUID。它是在 MySQL 启动时自动生成的,并且通常不需要手动修改。如果docker-compose挂载本地目录已有挂载数据请检查,如果有重复的修改server-uuid或者删除这个auto.cnf文件之后重启mysql服务 。
[auto]
server-uuid=bc8c658e-ce63-11ef-89ae-0242ac130004
# 进入docker-compose.yml的所在层级文件夹
cd /opt/mysql-compose
# 运行docker compose 容器服务
docker compose up -d
#停止docker compose 容器服务
docker compose down
#查看docker compose 容器服务状态
docker compose ps
查看主库状态,连接master1数据库执行下面sql语句 。
SHOW MASTER STATUS;
查看结果 。
File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
---|---|---|---|---|
binlog.000005 | 157 | testdb |
注意:如果是指定的数据库比如testdb的话,先在主数据库master1创建数据库,并创建表添加数据后,导出脚本,然后从库slave1和slave2也要创建数据库testdb导入执行sql脚本,使主从库数据一致,执行主从复制操作之前停止其他服务对主库的读写操作,不然会造成数据丢失等问题;简单来说在主从复制操作开始之前保证主从数据库数据一致 。
分别连接slave1和slave2数据库执行下面sql语句,设置或修复 MySQL 的主从复制关系 。
#1.重置从服务器的复制设置。
#功能: 清除当前从服务器的所有复制设置
#作用: 重置从服务器的复制状态,包括清除 MASTER_* 配置、复制相关的文件、状态标记等。如果之前从服务器已经在运行复制任务,执行这个命令会停止复制进程并清除复制的所有状态信息。
#使用场景: 这通常在配置新的复制关系,或者需要重新设置复制时使用。
RESET SLAVE;
#2.配置从服务器连接到指定的主服务器(192.168.137.2),并设置复制的起始点。
#功能: 设置从服务器的主服务器连接信息及复制位置。
#作用: 配置从服务器如何连接到主服务器,以及从哪个二进制日志文件和位置开始复制。
CHANGE MASTER TO
MASTER_HOST='192.168.137.2', # 指定主服务器的 IP 地址或主机名,表示从服务器将连接到这个主机
MASTER_PORT=13306, # 指定主服务器的端口号,通常 MySQL 的默认端口是 3306,根据实际情况修改
MASTER_USER='root', # 指定主服务器上用于连接的用户名,通常是具备复制权限的用户
MASTER_PASSWORD='123456', # 指定上述用户的密码,用于认证连接
MASTER_LOG_FILE='binlog.000005',# 指定主服务器的二进制日志文件名,从该文件的指定位置开始复制数据。
MASTER_LOG_POS=157; #指定从主服务器的二进制日志文件中从哪个位置开始复制。位置是一个数字,表示从该位置开始的日志条目
#3.启动从服务器的复制进程。
#功能: 启动从服务器的复制进程
#作用: 在执行完 CHANGE MASTER TO 后,启动从服务器的复制任务,使得从服务器开始连接主服务器,并从指定的二进制日志文件位置开始复制数据。
START SLAVE;
#4.查看从服务器的复制状态。
#功能: 显示从服务器的复制状态
#作用: 查看从服务器的当前复制状态,包括是否成功连接到主服务器,复制是否正常进行,以及任何可能出现的错误。
该命令会返回一个包含多个字段的结果,常用的字段有 Slave_IO_Running 和 Slave_SQL_Running,这两者的值为yes,分别表示 I/O 线程和 SQL 线程是否正在运行,Last_Error 显示最后一个错误信息等。
SHOW SLAVE STATUS;
最后此篇关于使用Docker部署的基于binlog实现Mysql8的文章就讲到这里了,如果你想了解更多关于使用Docker部署的基于binlog实现Mysql8的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
1、binlog简介 binlog即binary log,二进制日志文件。它记录了数据库所有执行的DDL和DML语句(除了数据查询语句select、show等),以事件形式记录并保存在二进制
如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点的数据。“mysqlbinlog:用于处理二
我想编写一个服务来跟踪 mysql bin 日志以获取有关数据库更改的通知。 有没有开源的库可以读取和解析ROW格式的mysql bin log? 最佳答案 使用mysqlbinlog。 The se
canal 定位:基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql。 原理: canal模拟mysql slave的交互协议,伪装自己为mysql sla
以前备份binlog时,都是先在本地进行备份压缩,然后发送到远程服务器中。但是这其中还是有一定风险的,因为日志的备份都是周期性的,如果在某个周期中,服务器宕机了,硬盘损坏了,就可能导致这段时间的bi
mysql binlog3种格式,row,mixed,statement. 解析工作 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.00
要禁用给定表的 bin 日志记录,我知道我可以使用以下命令: replicate-ignore-table=db_name.tbl_name 但是我不确定需要在哪里执行它? 谢谢 最佳答案 您必须将其
我正在设置复制,但我面临的问题是,当我执行插入更新的任何查询甚至创建表时,二进制日志文件没有被更新。这里是我的主人 my.cnf server-id = 1 log_bin
如果我正在读取 MySql binlog,我可以获得同一事务中发生哪些语句的指示吗? 最佳答案 有nothing built-in yet ,但也许this page会提供一些帮助。他们提供了一个 a
我不同意这个问题得到了有效的回答:decode mysqlbinlog in C# . 我有,我认为是同一个问题:我想从 C# 应用程序中读取 MySql 二进制日志,但不知道文件的格式。如何正确解析
我有许多运行 5.1.63 版的 mysql 服务器,本周早些时候在对从属服务器运行一些查询时,我注意到从属服务器上的一些数据本应使用主服务器上的更新语句删除。 我最初的想法是: 团队中的某个人正在更
在mysql中,我通过做来调试记录是如何改变的 mysqlbinlog bin-88.log | grep "record-id"--before=2 --after=2 我如何用 mongo 做类似
例如,在创建新表或更新现有表上的数据时,这些事件将存储在mysql binlog中,也就是MySQL数据库的二进制日志。 二进制日志在MySQL复制中非常有用,主服务器将数据从二进制日志发送到远
我读到过,MariaDB 的 Maxscale(BinLog Server) 可用于将 bin 日志从 MySQL 集群中继到单个 BinLog Server,但是我想知道是否可以从不同的 MySQL
抱歉,这个问题可能非常基本,但我找不到任何东西来解决这个问题。 我有一个 aws rds,当我尝试获取我的 binlog 列表时,它只向我显示 2 个最新的列表。 SHOW BINARY LOGS;
我正在尝试查看 MySQL binlog 文件以追踪特定查询的来源。我使用 SHOW BINARY LOGS 查询来获取现有日志文件的名称,但是当尝试使用 mysqlbinlog 命令访问时,我不断收
我们希望打开查询日志记录,以便我们可以找到更改数据的查询。 是否可以将事务日志写入数据库?binlog和普通查询日志有什么区别? 最佳答案 如果启用,二进制日志将包含所有修改数据的查询。但您应该注意格
我有几个实时数据库需要迁移到新服务器。这些是经常使用的大型数据库。 我想在新服务器上使用从服务器设置复制并开始跨服务器移植数据。但是,我想尝试避免对当前主数据执行 mysqldump 以获得初始 bi
我在一对服务器上设置了复制。一个是主人,第二个是奴隶。 最近在 master 上,binlog 文件被过早清除(通过文件名,所以 mysql 没有阻止过早删除文件)。 现在 SLAVE 有状态: Go
如果全过程使用的是Mysql用户,应该可以正常启动。 如果用的ROOT用户,可能不能正常启动,原因是新建的目录权限不对。 可能会这样的错误提示: /usr/loc
我是一名优秀的程序员,十分优秀!