MySQL学习笔记07基于GTID的复制

1.1.1. 相关概念

(1)GTID

GTID是Global Transaction Identifier的缩写。GTID是一个跟提交的事务有关的标识符,由提交事务所在的原始MySQL的UUID和事务的编号组成;因此,每个GTID在每个参与的MySQL中都是唯一的,而且由GTID可以取得该事务所在的原始MySQL以及事务在原始MySQL上的编号。

GTID格式如下:

GTID = MySQL原始UUD:事务编号

GTID的例子如下:

GTID=a2392929-6dfb-11e7-b294-000c29b1c103:1

一个GTID序列可以简写为:

GTID序列 = MySQL原始UUD:开始事务编号-结束事务编号

例如:

GTID=a2392929-6dfb-11e7-b294-000c29b1c103:1-5

(2)mysql.gtid_executed表。

在启用了GTID选项之后,MySQL将提交的事务的GTID记录到mysql.executed数据表中。根据GTID记录,在基于GTID的复制体系中,slave无需记录master的Binary Log文件和位置。

gtid_executed数据表的结构如下:

mysql> show create table mysql.gtid_executed;

| Table         | Create Table                                                                                                                                                                                                                                                                                                                                                                             | gtid_executed | CREATE TABLE `gtid_executed` (

`source_uuid` char(36) NOT NULL COMMENT ‘uuid of the source where the transaction was originally executed.‘,

`interval_start` bigint(20) NOT NULL COMMENT ‘First number of interval.‘,

`interval_end` bigint(20) NOT NULL COMMENT ‘Last number of interval.‘,

PRIMARY KEY (`source_uuid`,`interval_start`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1 |

(3)基于GTID的复制。

在数据库中每个已经提交的事务,都有一个唯一的GTID。这个特点在用于复制时,可以代替Binary Log的文件名和位置,。通过比较master和slave的最后执行的GTID,即可知道下一个GTID,从而不必指定Binary Log文件名和位置。

由于GTID跟事务密切相关,因此基于GTID的复制,只适用于支持事务的存储引擎,比如InnoDB;对于不支持事务的存储引擎,比如MyISAM,则不支持。

1.1.2. 部署基于GTID的主从复制

目标:实现基于GTID的主从复制。

master:192.168.197.111

slave:  192.168.197.112

(1)修改master上的MySQL的配置文件。

做以下修改:

(a)设置一个唯一的server_uuid。

(b)启用GTID模式。

[mysqld]

gtid_mode=ON

enforce-gtid-consistency=true

log-bin=mysql-bin

server-id=111

sync_binlog=1

innodb_flush_log_at_trx_commit=1

(2)修改master的server-uuid。

修改auto.cnf文件。

sudo cat /opt/mysql/data/auto.cnf

[auto]

server-uuid=a2392929-6dfb-11e7-b294-000c29b1c111

(3)在master上创建用于复制的用户。

mysql> create user ‘repl‘@‘%‘ identified by ‘123456‘;

Query OK, 0 rows affected (0.02 sec)

mysql> grant replication slave  on *.* to ‘repl‘@‘%‘;

Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.01 sec)

(4)修改slave上的MySQL配置文件。

[mysqld]

gtid_mode=ON

enforce-gtid-consistency=true

log-bin=mysql-bin

server-id=112

innodb_flush_log_at_trx_commit=1

sync_binlog=1

log-slave-updates=true

replicate-wild-ignore-table=mysql.%

replicate-wild-ignore-table=information_schema.%

replicate-wild-ignore-table=performance_schema.%

replicate-wild-ignore-table=sys.%

其中log-slave-updates的作用是在slave上启用日志功能,从而使得slave能够作为其它MySQL服务的master,即组建多层级的master-slave复制体系。

(5)修改slave的server-uuid。

sudo cat /opt/mysql/data/auto.cnf

[auto]

server-uuid=a2392929-6dfb-11e7-b294-000c29b1c112

(6)重新启动master和slave上的MySQL服务。

(7)建立master-slave复制关系。

如果slave上之前部署了基于Binary Log的复制,则需要先完全清除掉这种复制的痕迹。

mysql> stop slave;

Query OK, 0 rows affected (0.01 sec)

mysql> reset slave all;

Query OK, 0 rows affected (0.00 sec)

mysql> reset master;

Query OK, 0 rows affected, 1 warning (0.04 sec)

再在slave上执行以下命令建立复制关系。

mysql> CHANGE MASTER TO

->  MASTER_HOST = ‘192.168.197.111‘,

->  MASTER_PORT = 3306,

->  MASTER_USER = ‘repl‘,

->  MASTER_PASSWORD = ‘123456‘,

->  MASTER_AUTO_POSITION = 1;

Query OK, 0 rows affected, 2 warnings (0.02 sec)

查看复制状态如下:

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State:

Master_Host: 192.168.197.111

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File:

Read_Master_Log_Pos: 4

Relay_Log_File: 112-relay-bin.000001

Relay_Log_Pos: 4

Relay_Master_Log_File:

Slave_IO_Running: No

Slave_SQL_Running: No

Replicate_Do_DB:

Replicate_Ignore_DB:

Replicate_Do_Table:

Replicate_Ignore_Table:

Replicate_Wild_Do_Table:

Replicate_Wild_Ignore_Table: mysql.%,information_schema.%,performance_schema.%,sys.%

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 0

Relay_Log_Space: 194

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: NULL

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: 0

Master_UUID:

Master_Info_File: /opt/mysql/data/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State:

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: a2392929-6dfb-11e7-b294-000c29b1c111:1-6,

a2392929-6dfb-11e7-b294-000c29b1c112:1-2

Auto_Position: 1

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

(8)在slave上启动复制。

mysql> show processlist;

+----+------+-----------+------+---------+------+----------+------------------+

| Id | User | Host      | db   | Command | Time | State    | Info             |

+----+------+-----------+------+---------+------+----------+------------------+

|  3 | root | localhost | NULL | Query   |    0 | starting | show processlist |

+----+------+-----------+------+---------+------+----------+------------------+

1 row in set (0.00 sec)

mysql> start slave;

Query OK, 0 rows affected (0.00 sec)

mysql> show processlist;

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

| Id | User        | Host      | db   | Command | Time | State                                                  | Info             |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

|  3 | root        | localhost | NULL | Query   |    0 | starting                                               | show processlist |

|  4 | system user |           | NULL | Connect |    3 | Waiting for master to send event                       | NULL             |

|  5 | system user |           | NULL | Connect |  207 | Slave has read all relay log; waiting for more updates | NULL             |

+----+-------------+-----------+------+---------+------+--------------------------------------------------------+------------------+

在建立了复制关系后,可以进一步实际验证复制关系是否能够正常运作。

最简单的验证方式是在master上创建一些数据,然后在slave上查看是否有这些数据,同时查看复制状态是否正常。

在master上创建数据:

mysql> create database test;

Query OK, 1 row affected (0.02 sec)

mysql> use test;

Database changed

mysql> create table data (name2 varchar(100));

Query OK, 0 rows affected (0.07 sec)

mysql> insert into data (name2) values (‘001‘) , (‘002‘) , (‘003‘);

Query OK, 3 rows affected (0.04 sec)

Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from data;

+-------+

| name2 |

+-------+

| 001   |

| 002   |

| 003   |

+-------+

3 rows in set (0.00 sec)

在master上查看复制状态:

mysql> show master status\G

*************************** 1. row ***************************

File: mysql-bin.000002

Position: 1350

Binlog_Do_DB:

Binlog_Ignore_DB:

Executed_Gtid_Set: a2392929-6dfb-11e7-b294-000c29b1c111:1-6

1 row in set (0.00 sec)

在slave上查看数据:

mysql> use test;

Database changed

mysql> select * from data;

+-------+

| name2 |

+-------+

| 001   |

| 002   |

| 003   |

+-------+

3 rows in set (0.00 sec)

slave上的数据与master上完全一致。

在slave上查看复制状态:

mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.197.111

Master_User: repl

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysql-bin.000003

Read_Master_Log_Pos: 194

Relay_Log_File: 112-relay-bin.000003

Relay_Log_Pos: 407

Relay_Master_Log_File: mysql-bin.000003

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: mysql.%,information_schema.%,performance_schema.%,sys.%

Last_Errno: 0

Last_Error:

Skip_Counter: 0

Exec_Master_Log_Pos: 194

Relay_Log_Space: 2021

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: 111

Master_UUID: a2392929-6dfb-11e7-b294-000c29b1c111

Master_Info_File: /opt/mysql/data/master.info

SQL_Delay: 0

SQL_Remaining_Delay: NULL

Slave_SQL_Running_State: Slave 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: a2392929-6dfb-11e7-b294-000c29b1c111:1-6

Executed_Gtid_Set: a2392929-6dfb-11e7-b294-000c29b1c111:1-6

Auto_Position: 1

Replicate_Rewrite_DB:

Channel_Name:

Master_TLS_Version:

1 row in set (0.00 sec)

至此,基于GTID的复制关系已经成功建立了。

时间: 2024-08-10 23:17:49

MySQL学习笔记07基于GTID的复制的相关文章

MySQL学习笔记06基于Binary Log的复制

1.1.1. 相关概念 (1)Binary Log 当变量log_bin的值为ON时,MySQL将启用Binary Log,这将在data目录下产生类似mysql-bin.00001, mysql-bin.00002的二进制日志文件,这些文件记录了数据库中执行的各种操作. binlog_format变量指定了MySQL的二进制日志的格式,支持三种类型的格式: ROW       使用数据表的行记录来记录日志.优点是避免了STATEMENT格式时SQL语句中自增字段的不良影响.缺点时一条更新大量记

MySQL学习笔记11复制错误处理(二)删除不存在的行的问题

(1)问题情况 在master上删除某个数据表的某一行,而该行在slave上并不存在,则slave上的复制过程会出错. MySQL的log文件中发现如下错误信息: 2017-08-15T04:52:19.529509Z 13 [ERROR] Slave SQL for channel '': Could not execute Delete_rows event on table test.test; Can't find record in 'test', Error_code: 1032;

MYSQL 基于GTID的复制

1.概述 从MYSQL5.6 开始,mysql开始支持GTID复制. 基于日志点复制的缺点: 从那个二进制日志的偏移量进行增量同步,如果指定错误会造成遗漏或者重复,导致数据不一致. 基于GTID复制: 1.从服务器会告诉主服务器已执行的事务的GTID值. 2.主库会告诉从哪些GTID事务没有被执行. 同一个事务在指定的从库执行一次. 什么是GTID GTID即全局事务ID,器保证为每一个在主上提交的事务在复制集群中可以生成一个唯一的ID. GTID=source_id:transaction_i

MySQL5.6基于GTID同步复制,与如何实现MySQL负载均衡、读写分离。

MySQL想必大家都不陌生,之前文章也有介绍同步复制与半同步复制,今天先来了解下什么是GTID. GTID(global transaction ID)全局事务ID,是由服务器的UUID+一段随机数事务ID. 特性:从服务器从主服务器复制过来的事务,GTID不变,也就是说一个事务在全局复制架构中的ID不变. 有什么用: 在MySQL集群中,当Master故障时,需要从Slave中挑选一个提升为Master可以基于GTID对比其他Slave来保证数据的一致性. MySQL主从同步如何配置数据过滤

MySQL主从复制——MySQL-5.6基于GTID及多线程的复制

一.Mysql 5.6 新特性 .... 复制功能的改进 ⒈支持多线程复制,(slave-parallel-workers=0     0: 表示禁用多线程功能:)事实上是针对每个database开启相应的独立线程.即每个库有一个单独的(sql thread),如果线上业务中,只有一个database或者绝大多数压力集中在个别database的话,多线程并发复制特性就没有意义了. ⒉支持启用GTID,对运维人员来说应该是一件令人高兴的事情,在配置主从复制,传统的方式里,你需要找到binlog和P

MySQL 设置基于GTID的复制

GTID的概念 GTID(全名 global transaction identifier)是事务的唯一标识符.格式如下:GTID = source_id:transaction_idsource_id:标识了源服务器,通常是服务器的server_uuidtransaction_id:按照服务器上提交的事务顺序进行排序的序列号.例如: 60f9111a-cdba-11e7-b354-005056a30507:1 在配置文件中添加以下信息来启用GTID模式 [mysqld]gtid_mode=ON

学习笔记 07 --- JUC集合

学习笔记 07 --- JUC集合 在讲JUC集合之前我们先总结一下Java的集合框架,主要包含Collection集合和Map类.Collection集合又能够划分为LIst和Set. 1. List的实现类主要有: LinkedList, ArrayList, Vector, Stack. (01) LinkedList是双向链表实现的双端队列:它不是线程安全的.仅仅适用于单线程. (02) ArrayList是数组实现的队列,它是一个动态数组.它也不是线程安全的,仅仅适用于单线程. (03

MySql学习笔记(转载)

/* 启动MySQL */net start mysql /* 连接与断开服务器 */mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */mysqld --skip-grant-tables-- 修改root密码密码加密函数password()update mysql.user set password=password('root'); SHOW PROCESSLIST -- 显示哪些线程正在运行SHOW VARIABLES -- /* 数据库操

MySql学习笔记(一)之DQL常用查询

MySql学习笔记(一)之DQL常用查询 前言:mysql是中小型的数据库软件,SQL语言分为DDL,DCL,DML,DQL四种,在这里重点讲解DQL的单表查询. 正文:在学习mysql单表查询之前,我们先做一些准备工作. 需要安装的软件如下: 1.mysql,版本可以选择5.1或者5.5,安装过程可以参考博客:http://www.cnblogs.com/ixan/p/7341637.html 2.mysql图形化管理软件:Navicate,sqlyog(二选一,推荐使用sqlyog). 本文