首页 > 数据库 >MySQL学习笔记:基于GTID的主从复制

MySQL学习笔记:基于GTID的主从复制

时间:2023-05-01 22:01:57浏览次数:45  
标签:主从复制 slave log MySQL master mysql root GTID

GTID的主从复制

背景

GTID出现之前,在一主多从的复制拓扑中,如果主库宕机,需要从多个从库选择之一作为新主库,这个过程比较复杂。没有一种直接了当的方法找到其它从库对应的新主库二进制日志坐标。通常的做法是先要寻找每个从库复制原主库的最后语句,然后找到新主库中包含该语句的二进制日志文件,其中该语句后的第一个事件位置即为连接新主库的二进制坐标。主要难点在于不存在一个唯一标识指出“复制原主库的最后语句”,于是后来的MySQL中就出现了GTID的概念。

什么是GTID的主从复制?

全局事务标识符GTID的全称为Global Transaction Identifier,是在整个复制环境中对一个事务的唯一标识。它是MySQL 5.6加入的一个强大特性,目的在于能够实现主从自动定位和切换,而不像以前需要指定文件和位置使用GTID复制时,主库上提交事务时创建事务对应的GTID,从库在应用中继日志时用GTID识别和跟踪每个事务。在启动新从库或因故障转移到新主库时可以使用GTID来标识复制的位置,极大地简化了这些任务。由于GTID的复制完全基于事务,因此只要在主库上提交的所有事务也在从库上提交,两者之间的一致性就得到保证。GTID支持基于语句或基于行的复制格式,但为了获得最佳效果,MySQL建议使用基于行的格式。GTID始终保留在主库和从库上,这意味着可以通过检查其二进制日志来确定应用于任何从库的任何事务的来源。而且,一旦在给定库上提交了具有给定GTID的事务,则该库将忽略具有相同GTID的任何后续事务。因此,在主库上提交的事务只会在从库上应用一次,这也有助于保证一致性。

新的主从切换时,新的从服务器知道哪些事务已经做了,哪些没有做

每产生一个事务,就给事务编一个号

优点:替代传统的binlog+pos复制;使用master_auto_position=1自动匹配GTID断点进行复制

GTID格式

GTID与主库上提交的每个事务相关联。此标识符不仅对发起事务的库是唯一的,而且在给定复制拓扑中的所有库中都是唯一的。GTID用冒号分隔的一对坐标表示,例如:8eed0f5b-6f9b-11e9-94a9-005056a57a4e:23 前一部分是主库的server_uuid,后面一部分是主库上按提交事务的顺序确定的序列号,提交的事务序号从1开始。上面显式的GTID表示:具有8eed0f5b-6f9b-11e9-94a9-005056a57a4e的服务器上提交的第23个事务具有此GTID。

工作原理

  1. master更新数据时,会在事务前产生GTID,一同记录到binlog日志中。
  2. slave端的i/o 线程将变更的binlog,写入到本地的relay log中。
  3. sql线程从relay log中获取GTID,然后对比slave端的binlog是否有记录。
  4. 如果有记录,说明该GTID的事务已经执行,slave会忽略。
  5. 如果没有记录,slave就会从relay log中执行该GTID的事务,并记录到binlog。
  6. 在解析过程中会判断是否有主键,如果没有就用二级索引,如果没有就用全部扫描

搭建基于GTID的半同步主从复制

1.修改master的配置文件

[root@master ~]# vim /etc/my.cnf
[mysqld_safe]

[client]
socket=/data/mysql/mysql.sock

[mysqld]
socket=/data/mysql/mysql.sock
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8mb4
#skip-grant-tables
#error log
log-error = chen.err
#general log
general_log
#slow query log
slow_query_log = 1  
long_query_time = 0.001
#二进制日志 log bin
log_bin
server_id = 1
#日志超过3天自动过期
expire_logs_days = 15
#设置半同步超时时间
rpl_semi_sync_master_timeout=1000
#开启半同步主从复制,需要提前安装半同步插件
rpl_semi_sync_master_enabled=1
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql>

2.修改slave的配置文件

[root@slave ~]# vim /etc/my.cnf
[mysqld_safe]
 
[client]
socket=/data/mysql/mysql.sock
 
[mysqld]
socket=/data/mysql/mysql.sock 
port = 3306
open_files_limit = 8192
innodb_buffer_pool_size = 512M
character-set-server=utf8
log_bin
server_id = 2 
#开启从服务器半同步主从复制,需要提前安装半同步插件
rpl_semi_sync_slave_enabled=1
#开启GTID功能
gtid-mode=ON
enforce-gtid-consistency=ON
#开启从服务器将relay log内容也写入自己的二进制日志
log_slave_updates=ON
[mysql]
auto-rehash
prompt=\u@\d \R:\m  mysql> 

3.主和从服务器刷新mysqld服务

[root@master ~]# service mysqld restart
Shutting down MySQL............ SUCCESS! 
Starting MySQL. SUCCESS!
[root@slave ~]# service mysqld restart
Shutting down MySQL............ SUCCESS! 
Starting MySQL. SUCCESS!

4.master服务器新建授权用户,给slave来复制二进制日志

root@(none) 03:27  mysql>grant replication slave on *.* to 'chenlb'@'192.168.31.%' identified by 'Sanchuang1234#';
Query OK, 0 rows affected, 1 warning (0.02 sec)

192.168.31.%--从服务器所在的网段

5.主服务器刷新二进制日志

root@(none) 03:17  mysql>reset master;

6.从服务器修改master info信息,配置同步

#首先暂停slave
root@(none) 02:11  mysql>stop slave;
Query OK, 0 rows affected (0.01 sec)
root@(none) 02:11  mysql> change master to master_host='192.168.31.153', master_user='chenlb',master_password='Sanchuang1234#',master_port=3306,master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.01 sec)

7.查看是否开启半同步和GTID功能

半同步功能

主服务器 在这里插入图片描述

从服务器 在这里插入图片描述

GTID功能

从服务器上查看show slave status;

在这里插入图片描述

8.效果测试

数据同步测试

主服务器上,建库建表插入数据

root@tanxue 02:19  mysql>create database tanx;
Query OK, 1 row affected (1.01 sec)

root@tanxue 03:05  mysql>use tanx;
Database changed
root@tanx 03:05  mysql>create table t1(id int);
Query OK, 0 rows affected (0.01 sec)

root@tanx 03:05  mysql>insert into t1 values(1),(2)
    -> ;
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

root@tanx 03:05  mysql>show master status;
+-------------------+----------+--------------+------------------+------------------------------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                        |
+-------------------+----------+--------------+------------------+------------------------------------------+
| master-bin.000003 |     1326 |              |                  | f9a34f51-dc9e-11ed-ab5b-000c29751c59:1-6 |
+-------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)

从服务器上查看,是否有库有表有数据

root@tanxue 03:06  mysql>show databases;
root@tanxue 03:06  mysql>use tanx;
root@tanx 03:06  mysql>show tables;
root@tanx 03:06  mysql>select * from t1;

查看二进制日志格式是否有gtid字段

主服务器上查看二进制日志

在这里插入图片描述

发现了uuid+GTID的格式

对比GTID值

主服务查看master状态

在这里插入图片描述

从服务器查看slave状态

在这里插入图片描述

对比连个gtid值是否一致,若为一致,就成功了!

到此,GTID半同步主从复制就成功搭建完成!

标签:主从复制,slave,log,MySQL,master,mysql,root,GTID
From: https://blog.51cto.com/u_16070827/6239423

相关文章

  • MySQL 5.7 安装
    MySQL安装1下载解压版文件2配置环境变量3新建my.ini文件[client]port=3306default-character-set=utf8[mysqld]#设置为自己的mysql的安装目录basedir=D:\Mysql\mysql-5.7.19-winx64\#设置为mysql的数据目录datadir=D:\Mysql\mysql-5.7.19-winx64\data\port=330......
  • MySQL DDL表操作
    一、查询创建1、查询当前数据库所有表showtables;2、查看指定表结构desc表名;通过这条指令,我们可以查看到指定表的字段,字段的类型、是否可以为NULL,是否存在默认值等信息。3、查询指定表的建表语句showcreatetable表名;通过这条指令,主要是用来查看建表语句的,而有部分参数......
  • mysql 事务的隔离级别、MVCC
    《凤凰架构》一书中对事务的隔离级别以及事务的定义很清晰https://www.cnblogs.com/suBlog/p/16592859.html总结写锁:排他锁,其他事务不能写入数据,也不能施加读锁(可读,但是不可加读锁)读锁:共享锁,多个事务可以同时施加读锁,但是其他事务不能写入数据范围锁:不能修改范围内已有的数据......
  • mysql -- 存储过程
    存储过程如果需要在MySQL中执行一系列语句,可以将所有语句封装在单个程序中,并在需要的时候调用这个程序,而不是每次发送所有SQL语句。存储过程处理的是一组SQL语句,且没有返回值。除了SQL语句,还可以使用变量来存储结果并在存储过程中执行程序化的内容。例如可以使用if,case语句、......
  • 快速实现 MySQL 主从复制
    MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(Slave库)从另一台MySQL数据库(master库)进行日志的复制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无......
  • win10环境Windows环境下MYSQL5.7免安装版下载、配置(win10-x64位32g内存)
    win101-Windows环境下MYSQL5.7免安装版下载、配置(win10-x64位32g内存)  一、MYSQL免安装版下载二、解压安装三、设置登录、修改密码一、MYSQL免安装版下载1、下载链接:https://downloads.mysql.com/archives/community/.2、MySQL5.x版本以上需要收费,所以我选择了一个最新的(m......
  • MySql记录的一些使用方法和经验MariaDB
    MySql记录的一些使用方法和经验MariaDB MySQL数据库最初由瑞典的TomasUlin、AllanLarsson和MichaelWidenius创立。后来,该公司被SUNMicrosystems购买了,然后在2008年被Oracle购买。Oracle是一个主要提供商的商业数据库公司,这意味着MySQL现在是由Oracle控制并拥有的。然而,MyS......
  • MySQL Workbench和phpMyAdmin
    MySQLWorkbench是MySQL官方提供的一款开源的图形化管理工具,可以用于设计、开发、管理和维护MySQL数据库。MySQLWorkbench提供了一个集成开发环境(IDE),其中包含多个工具和功能,包括:1.数据建模工具:可以用于设计数据库模型、创建和编辑表、定义列、设置约束等。2.SQL编辑器:可以用......
  • MySQL基础命令 | ChatGPT问答记录
    问:MySQL基础命令ChatGPT:MySQL是一种流行的开源关系型数据库管理系统(RDBMS),以下是一些常见的MySQL基础命令:连接到MySQL服务器:mysql-uusername-ppassword-hhostname创建数据库:CREATEDATABASEdatabase_name;删除数据库:DROPDATABASEdatabase_name;选......
  • mysql几个主流版本介绍
    MySQL是一款非常流行的关系型数据库管理系统,历经多个版本。以下是MySQL的主流版本:MySQL5.7:该版本于2013年发布,包含了许多新特性和改进,如更好的性能、JSON支持、多源复制等。MySQL8.0:该版本于2018年发布,引入了原生JSON支持、更好地Unicode支持、解决云端部署时结构化数据需......