返回顶部
首页 > 资讯 > 数据库 >怎么理解MySQL的GTID复制
  • 860
分享到

怎么理解MySQL的GTID复制

2024-04-02 19:04:59 860人浏览 薄情痞子
摘要

这篇文章主要介绍“怎么理解Mysql的GTID复制”,在日常操作中,相信很多人在怎么理解mysql的GTID复制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Mysq

这篇文章主要介绍“怎么理解Mysql的GTID复制”,在日常操作中,相信很多人在怎么理解mysql的GTID复制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Mysql的GTID复制”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

什么是GTID

什么是GTID呢, 简而言之,就是全局事务ID(global transaction identifier ),最初由Google实现,官方MySQL在5.6才加入该功能。
GTID是事务提交时创建分配的唯一标识符,所有事务均与GTID一一映射。

GTID的格式类似于:
5882bfb0-c936-11e4-a843-000c292dc103:1
这个字符串,用“:”分开,前面表示这个服务器的server_uuid,这是一个128位的随机字符串,在第一次启动时生成(函数generate_server_uuid),对应的variables是只读变量server_uuid。 它能以极高的概率保证全局唯一性,并存到文件
DATADIR/auto.cnf中。因此要注意保护这个文件不要被删除或修改。

第二部分是一个自增的事务ID号,事务id号+server_uuid来唯一标示一个事务。

mysql> show global variables like '%gtid%';
+--------------------------+------------------------------------------+
| Variable_name            | Value                                    |
+--------------------------+------------------------------------------+
| enforce_gtid_consistency | ON                                       |
| gtid_executed            | 5882bfb0-c936-11e4-a843-000c292dc103:1-6 |
| gtid_mode                | ON                                       |
| gtid_owned               |                                          |
| gtid_purged              |                                          |
+--------------------------+------------------------------------------+
5 rows in set (0.00 sec)

mysql> show global variables like '%uuid%';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | 5882bfb0-c936-11e4-a843-000c292dc103 |
+---------------+--------------------------------------+
1 row in set (0.00 sec)

shell> cat auto.cnf 
[auto]
server-uuid=5882bfb0-c936-11e4-a843-000c292dc103

设置GTID复制

  1. 同步主从数据

    mysql> SET @@global.read_only = ON;
    Query OK, 0 rows affected (0.01 sec)
  2. 停止所有数据库

    shell> mysqladmin -u root -p shutdown
  3. 设置开发GTID模式并启动所有数据库

    shell> vi my.cnf  添加如下内容
    ================================================================
    [mysqld]
    gtid_mode=ON
    log-slave-updates=ON
    enforce-gtid-consistency=ON          #强制GTID的一致性
    ================================================================
  4. 从库指定主库

    mysql> CHANGE MASTER TO  
         -> MASTER_HOST = host, 
         -> MASTER_PORT = port, 
         -> MASTER_USER = user, 
         -> MASTER_PASSWord = password, 
         -> MASTER_AUTO_POSITION = 1;
    
    mysql> START SLAVE;
    Query OK, 0 rows affected (0.04 sec)
  5. 禁止read-only模式

    mysql> SET @@global.read_only = OFF;
    Query OK, 0 rows affected (0.00 sec)

GTID复制的限制

GTID 模式实例和非GTID模式实例是不能进行复制的,要求非常严格,要么都是GTID,要么都不是
gtid_mode 是只读的,要改变状态必须1)关闭实例、2)修改配置文件、3) 重启实例

  • 更新非事务引擎表
    在同一事务中更新事务表与非事务表将导致多个GTIDs分配给同一事务

mysql> cretea table tt (id int) engine=myisam;
mysql> insert into tt values(1),(2);
mysql> cretea table t (id int) engine=innodb;
mysql> insert into t values(1),(2);
mysql> set autocommit = 0;
mysql> begin;

mysql> update t set id = 3 where id =2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update tt set id = 3 where id =2;
ERROR 1785 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, updates to non-transactional tables can 
only be done in either autocommitted statements or single-statement transactions, and never in the same 
statement as updates to transactional tables.
  • CREATE TABLE … SELECT statements
    安全的基于语句复制,实际是两个独立的事件,一个用于建表,一个用于向新表插入源表数据。

mysql> create table t engine=innodb as select * from tt;
ERROR 1786 (HY000): CREATE TABLE ... SELECT is forbidden when @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1.
  • 临时表
    事务内部不能执行创建删除临时表语句,但可以在事务外执行,但必须设置set autocommit = 1

mysql> create temporary table tttt(id int);
ERROR 1787 (HY000): When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and 
DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.
mysql> set autocommit = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> create temporary table tttt(id int);
Query OK, 0 rows affected (0.04 sec)
  • 不执行不支持的语句
    启用--enforce-gtid-consistency选项启动GTID模式,上述不支持的语句将会返回错误。

运维操作

a. 忽略复制错误
当备库复制出错时,传统的跳过错误的方法是设置sql_slave_skip_counter,然后再START SLAVE。
但如果打开了GTID,就会设置失败:

mysql> stop slave;
Query OK, 0 rows affected (0.03 sec)

mysql> set global sql_slave_skip_counter = 1;
ERROR 1858 (HY000): sql_slave_skip_counter can not be set when the server is running with @@GLOBAL.GTID_MODE = ON.
Instead, for each transaction that you want to skip, generate an empty transaction with the same GTID as the transaction

提示的错误信息告诉我们,可以通过生成一个空事务来跳过错误的事务。
我们手动产生一个备库复制错误:

[slave]
mysql> alter table t add primary key pk_id(id);
Query OK, 2 rows affected (0.12 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> insert into t values(1);
mysql> insert into t values(4);
mysql> insert into t values(5);

mysql> show master status ;
+-------------------+----------+--------------+------------------+-------------------------------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+-------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-info.000004 |      914 |              |                  | 5882bfb0-c936-11e4-a843-000c292dc103:1-17 |
+-------------------+----------+--------------+------------------+-------------------------------------------+
1 row in set (0.00 sec)

mysql> show slave status \G
*************************** 1. row ***************************
     ...
       Slave_IO_Running: Yes
       lave_SQL_Running: No
             Last_Errno: 1062
             Last_Error: Could not execute Write_rows event on table db_test.t; Duplicate entry '1' for key 'PRIMARY', 
       Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY; the event's master log mysql-info.000004, end_log_pos 401
     Retrieved_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-15
      Executed_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-14,
                         f1e6584a-c935-11e4-a840-000c29348dbe:1
          Auto_Position: 1
1 row in set (0.00 sec)


mysql> SET @@SESSION.GTID_NEXT= '5882bfb0-c936-11e4-a843-000c292dc103:15';
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> SET SESSION GTID_NEXT = AUTOMATIC;

mysql> start slave;

mysql> show slave status\G
*************************** 1. row ***************************
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
                   Last_Errno: 0
           Retrieved_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-17
            Executed_Gtid_Set: 5882bfb0-c936-11e4-a843-000c292dc103:1-17,
                               f1e6584a-c935-11e4-a840-000c29348dbe:1
                Auto_Position: 1
1 row in set (0.00 sec)

再查看show slave status,就会发现错误事务已经被跳过了。这种方法的原理很简单,空事务产生的GTID加入到GTID_EXECUTED中,
这相当于告诉备库,这个GTID对应的事务已经执行了,此时主从数据不一致。

到此,关于“怎么理解MySQL的GTID复制”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么理解MySQL的GTID复制

本文链接: https://lsjlt.com/news/66842.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么理解MySQL的GTID复制
    这篇文章主要介绍“怎么理解MySQL的GTID复制”,在日常操作中,相信很多人在怎么理解MySQL的GTID复制问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解MySQ...
    99+
    2024-04-02
  • 怎么理解mysql GTID主从复制
    本篇内容介绍了“怎么理解mysql GTID主从复制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 一、...
    99+
    2024-04-02
  • MySQL的GTID复制怎么应用
    这篇文章主要介绍“MySQL的GTID复制怎么应用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“MySQL的GTID复制怎么应用”文章能帮助大家解决问题。从MySQ...
    99+
    2024-04-02
  • MySQL之GTID复制怎么使用
    本篇内容主要讲解“MySQL之GTID复制怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“MySQL之GTID复制怎么使用”吧!从MySQL 5.6.5开始新增了一种基于GTID的复制方式...
    99+
    2023-06-30
  • Mysql 主从复制GTID
    --------------------------------------------安装准备配置/etc/my.cnf主master grant 分配复制帐号从slave ...
    99+
    2024-04-02
  • 说GTID - GTID-based复制中的限制
    同一个事务(语句)中,不能同时涉及事务和非事务数据表的变更,这会导致一个事务对应多个GTID,违反了事务与GTID的一对一对应原则。[root@mysql.sock][db1]> show creat...
    99+
    2024-04-02
  • MySQL复制之GTID复制的具体使用
    目录GTID是什么GTID改进有哪些GTID的工作原理一主一从GTID复制的搭建master的配置slave的配置遇到的问题从MySQL 5.6.5开始新增了一种基于GTID的复制方...
    99+
    2024-04-02
  • MySQL GTID 主从复制的原理及配置
        GTID是一个基于原始mysql服务器生成的一个已经被成功执行的全局事务ID,它由服务器ID以及事务ID组合而成。这个全局事务ID不仅仅在原始服务器器上唯一,在所有存在主从关系 ...
    99+
    2024-04-02
  • MySQL GTID复制中断修复过程
    slave中出现错误: 2020-04-09T07:40:18.719203Z 16 [ERROR] Slave SQL for channel '': Could not execute ...
    99+
    2024-04-02
  • 浅析mysql主从复制中的gtid
    gtid(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号。它的官方定义如下:gtid= source_id :transaction_id 每一个 gtid...
    99+
    2024-04-02
  • mysql之 MySQL 主从基于 GTID 复制原理概述
    一、 什么是GTID ( Global transaction identifiers ): MySQL-5.6.2开始支持,MySQL-5.6.10后完善,GTID 分成两部分,一部分是服务的UUid...
    99+
    2024-04-02
  • Mysql中基于GTID的复制模式是什么
    这篇文章主要介绍了Mysql中基于GTID的复制模式是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。GTID定义GTID( Global...
    99+
    2024-04-02
  • MySQL GTID复制的优缺点分别是什么
    MySQL GTID复制的优缺点分别是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。 GTID(Glob...
    99+
    2024-04-02
  • MySQL基于GTID复制的设置方法
    下文给大家带来有关MySQL基于GTID复制的设置方法内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完MySQL基于GTID复制的设置方法你一定会有所收获。GTI...
    99+
    2024-04-02
  • Mysql 主从复制之半同步复制(基于gtid)
    Mysql主从复制mysql主从复制原理:从库有两个线程IO线程和SQL线程1.从库的IO线程向主库的主进程发送请求,主库验证从库,交给主库IO线程负责数据传输;2.主库IO线程对比从库发送过来的maste...
    99+
    2024-04-02
  • MariaDB基于GTID的复制
    1、配置主从节点的服务配置文件1.1、配置master节点:#binlog_format=mixedbinlog-format=ROW# required unique id between 1 and 2...
    99+
    2024-04-02
  • mysql GTID复制跳过复制错误的方式有哪些
    这篇文章主要介绍mysql GTID复制跳过复制错误的方式有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 1、从库执行了事务,主库执行语句时导致冲...
    99+
    2024-04-02
  • MySQL5.6怎么建立GTID主从复制
    本篇内容介绍了“MySQL5.6怎么建立GTID主从复制”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • 如何进行MySQL主从GTID复制修复
    如何进行MySQL主从GTID复制修复,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。GTID是5.6新增特性,减少DBA运维的工作。在以前一主...
    99+
    2024-04-02
  • MySQL-5.6 基于GTID及多线程的复制
    MySQL 5.6引入的GTID(Global Transaction IDs)使得其复制功能的配置、监控及管理变得更加易于实现,且更加健壮。要在MySQL 5.6中使用复制功能,其服务配置段[mysqld...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作