mysql主从配置及搭建(gtid方式)

news2024/12/27 15:05:46

一、搭建主从-gtid方式

搭建步骤查看第一篇。bin-log方式。可以进行搭建

1.1 gtid和二进制的优缺点

使用 GTID 的主从复制优点:
1、简化配置:使用 GTID 可以简化主从配置,不需要手动配置每个服务器的二进制日志文件和位置。
2、自动故障转移:GTID 可以在主从切换时自动识别和处理已复制和未复制的事务,使主从切换更加可靠和快速。
3、避免重复复制:GTID 可以避免主从复制中的重复复制问题,确保每个事务只被复制一次。

使用 GTID 的主从复制缺点:
1、兼容性:GTID 是从 MySQL 5.6 版本开始引入的特性,如果使用旧版本的 MySQL,无法使用 GTID 进行主从复制。
2、系统资源占用:启用 GTID 可能会增加一些系统资源的占用,包括存储和计算资源。

使用二进制日志的主从复制优点:
1、兼容性:二进制日志是 MySQL 自带的特性,从较早的版本开始就支持,可以在各个版本之间进行主从复制。
2、灵活性:使用二进制日志可以根据需要进行更精细的配置,如指定复制的数据库、表,过滤不需要复制的操作等。

使用二进制日志的主从复制缺点:
1、配置复杂:相对于 GTID,使用二进制日志需要手动配置主库和从库的二进制日志文件和位置,配置过程相对复杂。
2、容易出错:配置不当或操作失误可能导致主从复制出现问题,如数据不一致、延迟等。
3、复制延迟:在高写入负载的情况下,从库可能会有一定的复制延迟,导致从库数据相对于主库稍有滞后

1.2 配置master

1.#配置基础数据
mysql> create database master1db;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE `master1db`.`master1tab`( `id` INT(2) ZEROFILL NOT NULL AUTO_INCREMENT COMMENT '编号', `name` VARCHAR(255) NOT NULL COMMENT '公司名称', `location` VARCHAR(255) NOT NULL COMMENT '所在地区', PRIMARY KEY (`id`) ) CHARSET=utf8; 

mysql> INSERT INTO `master1db`.`master1tab` (`name`, `location`) VALUES ('强强科技集团', '中国-北京'); 
mysql> INSERT INTO `master1db`.`master1tab` (`name`, `location`) VALUES ('随梦科技集团', '中国-上海'); 
mysql> INSERT INTO `master1db`.`master1tab` (`name`, `location`) VALUES ('阿里巴巴', '中国-杭州');

2.#配置my.cnf文件
[root@mysql-master ~]# cat /etc/my.cnf | tail -n 4			#可以去掉log-bin和serverid只通过gtid的方式进行主从
log_bin=mysql-bin				#开启二进制日志
server-id=1						#用于表示mysql实例在集群中的标识符。必须唯一
gtid_mode=ON					#GTID 是一个全局唯一的事务标识符,用于标识数据库集群中的事务。启用 GTID 后,每个事务都会被分配一个唯一的 GTID。
enforce_gtid_consistency=1		#当启用 GTID 后,该选项用于强制要求从库只能复制具有与主库一致的 GTID 链的事务,以确保数据一致性。

[root@mysql-master ~]# systemctl restart mysqld				#重启mysql配置文件生效

1.3 创建复制用户

#master操作
mysql> grant replication slave, replication
    -> client on *.* to 'slave'@'192.168.17.%'   identified by 'SqlBack@123456';
Query OK, 0 rows affected, 1 warning (0.00 sec)

1.4 备份主库

[root@mysql-master ~]# mysqldump -uroot -p123456  master1db --single-transaction --master-data=2 --flush-logs  > `date +%F`-mysql-all.sql
#针对数据库进行备份
#因为是开启了gtid方式进行备份所有sql中没有Master_Log_File和pos位置
[root@mysql-master ~]# scp 2023-06-27-mysql-all.sql root@192.168.17.130:/root

1.5 配置slave

1.配置my.cnf配置文件
[root@mysql-slave ~]# cat /etc/my.cnf | tail -n 4
#log_bin=mysql-bin					#从库可以不开启二进制日志
server-id=2
gtid_mode=ON
enforce_gtid_consistency=1
2.重启mysqld
[root@mysql-slave ~]# systemctl restart mysqld
3.导入备份数据
mysql> set sql_log_bin=0;
mysql> create database master1db;			#因为是恢复单个库。所以需要提前创建好恢复的库
Query OK, 1 row affected (0.00 sec)
mysql> use master1db
mysql> source /root/2023-06-27-mysql-all.sql;		#恢复数据库

4.配置主从
mysql> change master to
    -> master_host='192.168.17.129',
    -> master_user='slave',
    -> master_password='SqlBack@123456',
    -> master_auto_position=1;							#自动获取二进制的位置
Query OK, 0 rows affected, 2 warnings (0.53 sec)
mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.17.129
                  Master_User: slave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 457
               Relay_Log_File: mysql-slave-relay-bin.000002
                Relay_Log_Pos: 670
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
5.验证主从{主库操作}
mysql> INSERT INTO `master1db`.`master1tab` (`name`, `location`) VALUES ('字节跳动集团', '中国-北京'); 
mysql> select * from master1tab;
+----+--------------------+---------------+
| id | name               | location      |
+----+--------------------+---------------+
| 01 | 强强科技集团       | 中国-北京     |
| 02 | 随梦科技集团       | 中国-上海     |
| 03 | 阿里巴巴           | 中国-杭州     |
| 04 | 京东集团           | 中国-北京     |
| 05 | 字节跳动集团       | 中国-北京     |
+----+--------------------+---------------+
5 rows in set (0.00 sec)

二、模拟主从不同步(gtid)

1.1 故障描述

#开始模拟:这里我们模拟一个主从复制架构中,从服务器中途异常宕机,不再同步主服务器的场景,假设该情况
#宕机时间较长,数据量较大,GTID无法短时间恢复,并要求不停业务进行数据同步修复,恢复一致

1.2 配置测试库

1#master操作
mysql> create database demon;
Query OK, 1 row affected (0.00 sec)

mysql> CREATE TABLE `demon`.`t1`( `id` INT(2) NOT NULL AUTO_INCREMENT, `name` VARCHAR(255) NOT NULL, `age` INT(255) NOT NULL, PRIMARY KEY (`id`) ); 

2、编写脚本实现重复插入数据
#!/usr/bin/bash
values=`find /usr/ -type d | awk -F '/' '{print $NF}' | sort -u`

while true
do
	age=$(($RANDOM % 100))		# random随机数
	name=$(echo "$values" | shuf -n 1)			#随机获取find查到的值
	mysql -uroot -p123456 -e "insert into demon.t1(name,age) values ('$name',$age)"		#插入到mysql中
	sleep $(($RANDOM%5))			#睡眠小于5s之内的数字
done

3、后台运行脚本模拟客户数据
[root@mysql-master ~]# nohup /bin/bash 1.sh &

1.3 模拟从库宕机

#从库操作
mysql> stop slave;						#手动停止mysql主从复制
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM demon.`t1`;
160 rows in set (0.00 sec)				#此时从库有160条数据。主库由于还在执行脚本,数据还在不断插入

1.4 恢复数据

#主库操作
思路:
先通过mysqldump全量备份当前的数据,由于不能影响业务,所以在mysqldump数据时不能造成锁表。要保持数据写入,由于mysqldump时数据还在写入,所以有一部分数据还是会同步不全,所以导入mysqldump的数据后,跳过dump中包含的GTID事务,再重新建立一次主从配置,开启slave线程,恢复数据并同步。

1、主库备份现在的数据。并且不锁表进行备份
mysql> SELECT * FROM demon.`t1`;
322 rows in set (0.00 sec)				#备份前有322条数据
[root@mysql-master ~]# mysqldump -uroot -p123456  demon --single-transaction --master-data=2 > `date +%F`-mysql-demon.sql
#备份测试库demon
#--master-data=2:生成的备份文件中包含用于主从复制的二进制日志文件名和位置的注释。值为 2 表示将 CHANGE MASTER TO 语句和位置信息添加到导出文件的注释中。
mysql> SELECT * FROM demon.`t1`;
428 rows in set (0.00 sec)					#备份后数据没有影响写入。存在428条记录。


2、从库恢复数据主库依然在写入数据
[root@mysql-master ~]# scp 2023-06-28-mysql-demon.sql root@192.168.17.130:/root				#把数据传给从库

#从库操作
mysql> use demon			#因为是备份的单个库需要先use到库
mysql> source /root/2023-06-28-mysql-demon.sql		#恢复数据	
#但是查看主从的结果还是不一致的。需要重新设定主从


source过程中会出现ERROR 1840 (HY000): @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
这种报错不用管,不会影响数据的写入。接着往下走。数据正常写入了就OK!!!!!
#这个问题是因为备份的时候可能加入了--flush-logs。不影响主从重做和数据写入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fUTeVPtB-1687945620666)(C:\Users\LENOVO\Desktop\复习\assets\image-20230628112451344.png)]

1.5 恢复主从

#从库操作
mysql> start slave;			#先直接开启主从看看
mysql> show slave status\G
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
               Last_SQL_Error: Could not execute Write_rows event on table demon.t1; Duplicate entry '161' for key 'PRIMARY', Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-bin.000002, end_log_pos 27863
#存在报错。需要重新配置主从


1、当前gtid_purged不为空,所以我们要先设置它为空
mysql> show global variables like '%gtid%';
+----------------------------------+--------------------------------------------+
| Variable_name                    | Value                                      |
+----------------------------------+--------------------------------------------+
| binlog_gtid_simple_recovery      | ON                                         |
| enforce_gtid_consistency         | ON                                         |
| gtid_executed                    | ee194423-1405-11ee-a122-000c29b3572a:1-163 |
| gtid_executed_compression_period | 1000                                       |
| gtid_mode                        | ON                                         |
| gtid_owned                       |                                            |
| gtid_purged                      | ee194423-1405-11ee-a122-000c29b3572a:1-163 |
| session_track_gtids              | OFF                                        |
+----------------------------------+--------------------------------------------+
mysql> reset master;					
#将gtid_purged参数设为空字符
#将gtid_executed设为空字符
#清空mysql.gtid_executed表
Query OK, 0 rows affected (0.00 sec)

mysql> show global variables like '%gtid%';
+----------------------------------+-------+
| Variable_name                    | Value |
+----------------------------------+-------+
| binlog_gtid_simple_recovery      | ON    |
| enforce_gtid_consistency         | ON    |
| gtid_executed                    |       |
| gtid_executed_compression_period | 1000  |
| gtid_mode                        | ON    |
| gtid_owned                       |       |
| gtid_purged                      |       |
| session_track_gtids              | OFF   |
+----------------------------------+-------+
8 rows in set (0.00 sec)

2、重置salve
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> reset slave all;
Query OK, 0 rows affected (0.01 sec)

3、查看主库当前mysqldump导出数据的GTID号
[root@mysql-slave ~]# grep GLOBAL.GTID 2023-06-28-mysql-demon.sql 
SET @@GLOBAL.GTID_PURGED='ee194423-1405-11ee-a122-000c29b3572a:1-401';


4、重置后,设置跳过的GTID,并重新同步MASTER
mysql> SET @@GLOBAL.GTID_PURGED='ee194423-1405-11ee-a122-000c29b3572a:1-401';
#从库将跳过指定范围内的 GTID,确保不会重复执行已经在主库上执行过的事务,从而避免数据的重复修改。这样,主从复制可以从当前的 GTID 位置继续进行
Query OK, 0 rows affected (0.00 sec)
mysql> change master to
    -> master_host='192.168.17.129',
    -> master_user='slave',
    -> master_password='SqlBack@123456',
    -> master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

5、恢复主从线程
mysql> start salve;
mysql> show slave status\G
            Slave_IO_Running: Yes			#线程正常
            Slave_SQL_Running: Yes
            
6、查看数据是否正常
mysql> SELECT * FROM demon.`t1`;
595 rows in set (0.01 sec)				#数据和此时的主库条目一致。完美恢复

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a0D5MbhS-1687945620668)(C:\Users\LENOVO\Desktop\复习\assets\image-20230628100832707.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SQZDI4b8-1687945620669)(C:\Users\LENOVO\Desktop\复习\assets\image-20230628100522852.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QEZbqn99-1687945620670)(C:\Users\LENOVO\Desktop\复习\assets\image-20230628100538636.png)]

1.6 清空主从配置

mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> reset master;
Query OK, 0 rows affected (0.01 sec)
mysql> reset slave all;
Query OK, 0 rows affected (0.00 sec)
mysql> show slave status;
Empty set (0.00 sec)

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

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

相关文章

【Docker】Docker中安装MySQL数据库

文章目录 1. 前言2. Docker中安装MySQL服务2.1. 查看可用的MySQL版本2.2. 拉取MySQL镜像2.3. 查看本地镜像2.4. 运行容器2.5. 查看正在运行的容器2.6. 查看容器内部2.7. 授权root远程登录2.8. 在宿主机连接到容器的MySQL2.9. 用Navicat连接容器的MySQL 3. 如果是MySQL8.0可能需…

vue项目开发常用工具类

防止重复造轮子,将经常用的函数进行记录,也参考网上的并一起进行记录,后续会持续更新常用到的函数工具类方法😉😉 /** 验证手机号是否合格* true--说明合格*/ export function isPhone(phoneStr) {let myreg /^[1][3,…

VMware vCenter Server Appliance VCSA 备份还原

vCenter是VMware管理员的常备工具,要保护它的安全,我们可以借助vCenter备份还原方式来达成目的。 怎么备份vCenter 7.0? vCenter备份包括vCenter Server核心配置、资源清册和历史数据,如统计信息、事件和任务。接下来&#xff0…

【LeetCode每日一题】——1572.矩阵对角线元素的和

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 矩阵 二【题目难度】 简单 三【题目编号】 1572.矩阵对角线元素的和 四【题目描述】 给你一…

HTTP之Session、Cookie 与 Application

目录 简介cookiecookie生命周期 sessionsession生命周期 HTTP cookies示例application 简介 cookie、seesion、application三个都会缓存我们用户状态的数据,使得我们在浏览器访问网站时可以更快速的获取到信息。 主要原因在于HTTP协议是无状态的,我们每…

IO流(4)- 序列化流与反序列化流

目录 1. 序列化流与反序列化流的基本介绍 2. 序列化流的基本用法? 3. 序列化流的作用? 4. 反序列化流的基本用法? 5. 反序列化流的作用 6. 序列化流与反序列化流使用时需要注意的细节(非常重要) 6.1 被序列化的…

90%的测试工程师是这样使用Postman做接口测试的

一:接口测试前准备 接口测试是基于协议的功能黑盒测试,在进行接口测试之前,我们要了解接口的信息,然后才知道怎么来测试一个接口,如何完整的校验接口的响应值。 那么问题来了,那接口信息从哪里获取呢&…

中国AI大模型峰会“封神之作”!开发者不容错过这场夏季盛会

年度最强大模型顶会来袭!喊话中国数百万AI开发者,速来! 硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过! 前瞻大模型发展趋势,紧跟这场大会! 中国科技超级碗,大模型最新前…

SpringCloud Alibaba分布式集群要点

1、可通过nginxkeepalived实现nginx高可用集群。 2、nacos集群,在nacos/conf/cluster.conf配置IP:8848,nginx中配置nacos负载均衡,yml文件使用其对应域名即可。 注:服务器之间内网不通 举例:腾讯服务器之间就存在内网不通的现象…

关于bigemap在土地行业的一些应用

选择Bigemap的原因: 由于我们是国营企业单位,管理六万多亩的国有土地,必须要有这样的软件套图 客户之前用的谷歌,后来不能访问了,通过百度搜索到这款软件 使用场景: 使用软件一般都用于套坐标以及空间规…

未来将有可能是元宇宙发展的数字化时代

近年来,元宇宙环境的概念近年来引起了广泛关注,并引发了巨大的舆论浪潮。然而,经济形式的放缓和行业向人工智能的转变所带来的挫折引发了人们对这一 " 雄心勃勃 " 的概念的可行性和时机的质疑。 很明显,一些挑战阻碍了…

Python元编程-装饰器介绍、使用

目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒,打印时间 方法一:使用datetime 方法二:使用time 一、Python元编程…

Eureka 学习笔记4:EurekaClient

版本 awsVersion ‘1.11.277’ EurekaClient 接口实现了 LookupService 接口&#xff0c;拥有唯一的实现类 DiscoveryClient 类。 LookupService 接口提供以下功能&#xff1a; 获取注册表根据应用名称获取应用根据实例 id 获取实例信息 public interface LookupService<…

【MySQL】数据库基本使用

文章目录 一、数据库介绍二、数据库使用2.1 登录MySQL2.2 基本使用2.2.1 显示当前 MySQL 实例中所有的数据库列表2.2.2 创建数据库2.2.3 创建数据库表2.2.4 在表中插入数据2.2.5 在表中查询数据 三、服务器、数据库、表之间的关系四、SQL语句分类五、存储引擎 一、数据库介绍 …

多线程案例(2)

文章目录 多线程案例二二、阻塞式队列 大家好&#xff0c;我是晓星航。今天为大家带来的是 多线程案例二 相关的讲解&#xff01;&#x1f600; 多线程案例二 二、阻塞式队列 阻塞队列是什么 阻塞队列是一种特殊的队列. 也遵守 “先进先出” 的原则. 阻塞队列能是一种线程…

设计走查指南:提升设计质量的关键步骤

在产品设计过程中&#xff0c;确保产品设计质量是至关重要的。设计走查作为一种关键的质量控制方法&#xff0c;能够帮助设计团队发现问题并采取相应措施来提升设计质量。通过有效地进行设计走查&#xff0c;团队可以提高设计作品的一致性、可用性和用户满意度&#xff0c;从而…

正则表达式在格式校验中的应用以及包装类的重要性

文章目录 正则表达式&#xff1a;做格式校验包装类&#xff1a;在基本数据类型与引用数据类型间的桥梁总结 在现代IT技术岗位的面试中&#xff0c;掌握正则表达式的应用以及理解包装类的重要性是非常有益的。这篇博客将围绕这两个主题展开&#xff0c;帮助读者更好地面对面试挑…

Elasticsearch Java客户端和Spring data elasticsearch-Elasticsearch文章三

文章目录 官网版本组件版本说明实现代码地址es Spring Data Repositories例子&#xff1a;ElasticsearchRepository分析 es Spring Data Repositories 关键字es Spring Data Repositories client 加载rest风格客户端直接执行dsl例子响应式客户端-ReactiveElasticsearchClientpo…

【SLAM】LoFTR知多少

1. LoFTR: Detector-Free Local Feature Matching with Transformers PAPER 论文 | LoFTR: Detector-Free Local Feature Matching with Transformers 代码 | CODE: 关键词 | detector-free, local feature matching LoFTR知多少 1. LoFTR: Detector-Free Local Feature M…

DirectX SDK下载安装及开发环境设置

1 DirectX DirectX&#xff08;Direct eXtension&#xff0c;简称DX&#xff09;是由微软公司创建的多媒体编程接口&#xff0c;是一种应用程序接口&#xff08;API&#xff09;。DirectX可以让以windows为平台的游戏或多媒体程序获得更高的执行效率&#xff0c;加强3D图形和声…