찾다
데이터 베이스MySQL 튜토리얼MySQL 5.6 GTID 새로운 기능 practice_MySQL

GTID 소개

GTID란 무엇인가요

GTID(Global Transaction ID)는 제출된 트랜잭션의 번호로, 전역적으로 고유한 번호입니다.

GTID는 실제로 UUID+TID로 구성됩니다. UUID는 MySQL 인스턴스의 고유 식별자입니다. TID는 이 인스턴스에서 커밋된 트랜잭션 수를 나타내며 트랜잭션이 커밋됨에 따라 단조롭게 증가합니다. 다음은 GTID의 구체적인 형태입니다

3E11FA47-71CA-11E1-9E33-C80AA9429562:23

자세한 소개는 공식문서를 참고하세요

GTID의 역할

그렇다면 GTID 기능의 목적은 무엇인가요? 구체적인 요약에는 주로 다음 두 가지 내용이 포함됩니다.

GTID에 따르면 트랜잭션이 처음 제출된 인스턴스를 알 수 있습니다. GTID가 있으면 복제의 장애 조치가 용이해집니다. 여기서는 두 번째 사항에 대해 자세히 설명합니다. MySQL 5.6의 GTID가 등장하기 전의 복제 장애 조치(failover) 작업 과정을 살펴보겠습니다. 아래와 같은 환경이 있다고 가정합니다

이번에는 A서버의 서버가 다운되어 B서버로 업무를 전환해야 합니다. 동시에 서버 C의 복제 소스를 서버 B로 변경해야 합니다. 복사 소스 수정을 위한 명령 구문은 매우 간단합니다. 즉, CHANGE MASTER TO MASTER_HOST='xxx', MASTER_LOG_FILE='xxx', MASTER_LOG_POS=nnnn입니다. 어려운 점은 동일한 트랜잭션이라도 머신마다 binlog 이름과 위치가 다르기 때문에 현재 서버 C의 동기화 중지 지점과 이에 대응하는 서버 B의 master_log_file, master_log_pos가 무엇인지 찾는 것이 문제가 된다는 점이다. 이는 M-S 복제 클러스터가 MMM 및 MHA와 같은 추가 관리 도구를 사용해야 하는 중요한 이유입니다.

5.6에서 GTID가 등장한 이후에는 이 문제가 매우 간단해 보입니다. 동일한 트랜잭션의 GTID는 모든 노드에서 동일한 값을 갖기 때문에 서버 B의 GTID는 서버 C의 현재 중지 지점의 GTID를 기준으로 고유하게 찾을 수 있습니다. MASTER_AUTO_POSITION 함수의 출현으로 인해 GTID의 구체적인 값을 알 필요가 없으며 CHANGE MASTER TO MASTER_HOST='xxx', MASTER_AUTO_POSITION 명령을 직접 사용하여 장애 조치 작업을 직접 완료할 수 있습니다. 참 쉽죠?

GTID 기반 마스터-슬레이브 복제 소개

빌드

mysql_sandbox 스크립트를 기반으로 마스터 1개와 슬레이브 3개로 구성된 위치 기반 복제 환경을 먼저 만들었습니다. 그런 다음 구성 수정을 통해 전체 아키텍처가 GTID 기반 복제용으로 설계되었습니다.

공식 MySQL 문서에 제공된 GTID 구성 제안에 따르면. 마스터 및 슬레이브 노드의 구성을 한 번 수정하고 서비스를 다시 시작해야 합니다. 이러한 작업은 프로덕션 환경에서 업그레이드할 때 분명히 허용되지 않습니다. Facebook, Booking.com, Percona는 모두 패치를 통해 이를 최적화하고 더욱 우아한 업그레이드를 달성했습니다. 구체적인 작업 방법은 향후 블로그 게시물에서 소개될 예정입니다. 여기에서는 공식 문서에 따라 실험적인 업그레이드를 수행합니다.

주요 업그레이드 단계는 다음과 같습니다.

마스터에서 my.cnf를 수정하기 위해 새 데이터가 기록되지 않도록 마스터에서 read_only를 구성합니다. 슬레이브에서 my.cnf를 수정하려면 서비스를 다시 시작하세요. master_auto_position=1에서 GTID 기반 복제를 활성화합니다. 실험적인 환경이므로 read_only 및 서비스를 다시 시작하는 것은 큰 문제가 아닙니다. 공식 GTID 구성 권장 사항을 따르면 업그레이드를 성공적으로 완료할 수 있습니다. 자세한 프로세스는 여기에서 설명하지 않습니다. 아래에는 업그레이드 과정에서 쉽게 발생할 수 있는 몇 가지 오류가 나열되어 있습니다.

흔히 저지르는 실수

my.cnf에서는 gtid_mode=ON, log_slave_updates 및 Enforce_gtid_consistency의 세 가지 매개변수를 동시에 구성해야 합니다. 그렇지 않으면 mysql.err

에 다음 오류가 나타납니다.

2016-10-08 20:11:08 32147 [ERROR] --gtid-mode=ON 또는 UPGRADE_STEP_1 또는 UPGRADE_STEP_2에는 --log-bin 및 --log-slave-updates가 필요합니다
2016-10-08 20:13:53 32570 [ERROR] --gtid-mode=ON 또는 UPGRADE_STEP_1에는 --enforce-gtid-consistency가 필요합니다

마스터를 다음으로 변경한 후 경고

문서에 따라 마스터를 으로 변경하면 두 가지 경고가 표시됩니다. 실제로 이는 정상적인 동기화에 영향을 미치지 않는 두 가지 보안 경고입니다(관심 있는 독자는 이 경고의 자세한 소개를 읽을 수 있습니다. 경고의 구체적인 내용은 다음과 같습니다.

slave1 [localhost] {msandbox} ((none)) > stop slave;
Query OK, 0 rows affected (0.03 sec)
slave1 [localhost] {msandbox} ((none)) > change master to master_host='127.0.0.1',master_port =21288,master_user='rsandbox',master_password='rsandbox',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
slave1 [localhost] {msandbox} ((none)) > show warnings;
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Note | 1759 | Sending passwords in plain text without SSL/TLS is extremely insecure. |
| Note | 1760 | Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. |
+-------+------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

실험 1: 슬레이브가 요구하는 트랜잭션에 해당하는 GTID가 마스터에서 제거된 경우

'%gtid%'와 같은 전역 변수 show 명령 결과에 따르면 GTID와 관련된 변수 중 gtid_purged가 있음을 알 수 있습니다. 문자 그대로의 의미와 공식 문서를 통해 이 변수에 기록된 내용은 로컬 시스템에서 실행되었지만 명령에 대한 바이너리 로그 제거에 의해 정리된 gtid_set임을 알 수 있습니다.
이 섹션에서는 슬레이브가 가져오지 않은 일부 gtid 이벤트를 마스터가 제거하는 경우 어떤 일이 발생하는지 테스트합니다.

다음 명령은 마스터에서 실행됩니다

master [localhost] {msandbox} (test) > show global variables like '%gtid%';
+---------------------------------+----------------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------------+
| binlog_gtid_simple_recovery | OFF |
| enforce_gtid_consistency | ON |
| gtid_executed | 24024e52-bd95-11e4-9c6d-926853670d0b:1 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | |
| simplified_binlog_gtid_recovery | OFF |
+---------------------------------+----------------------------------------+
7 rows in set (0.01 sec)
master [localhost] {msandbox} (test) > flush logs;create table gtid_test2 (ID int) engine=innodb;
Query OK, 0 rows affected (0.04 sec)
Query OK, 0 rows affected (0.02 sec)
master [localhost] {msandbox} (test) > flush logs;create table gtid_test3 (ID int) engine=innodb;
Query OK, 0 rows affected (0.04 sec)
Query OK, 0 rows affected (0.04 sec)
master [localhost] {msandbox} (test) > show master status;
+------------------+----------+--------------+------------------+------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+------------------------------------------+
| mysql-bin.000005 | 359 | | | 24024e52-bd95-11e4-9c6d-926853670d0b:1-3 |
+------------------+----------+--------------+------------------+------------------------------------------+
1 row in set (0.00 sec)
master [localhost] {msandbox} (test) > purge binary logs to 'mysql-bin.000004';
Query OK, 0 rows affected (0.03 sec)
master [localhost] {msandbox} (test) > show global variables like '%gtid%';
+---------------------------------+------------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------------+
| binlog_gtid_simple_recovery | OFF |
| enforce_gtid_consistency | ON |
| gtid_executed | 24024e52-bd95-11e4-9c6d-926853670d0b:1-3 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | 24024e52-bd95-11e4-9c6d-926853670d0b:1 |
| simplified_binlog_gtid_recovery | OFF |
+---------------------------------+------------------------------------------+
7 rows in set (0.00 sec)

在slave2上重新做一次主从,以下命令在slave2上执行

slave2 [localhost] {msandbox} ((none)) > change master to master_host='127.0.0.1',master_port =21288,master_user='rsandbox',master_password='rsandbox',master_auto_position=1;
Query OK, 0 rows affected, 2 warnings (0.04 sec)
slave2 [localhost] {msandbox} ((none)) > start slave;
Query OK, 0 rows affected (0.01 sec)
slave2 [localhost] {msandbox} ((none)) > show slave status\G
*************************** 1. row ***************************
......
Slave_IO_Running: No
Slave_SQL_Running: Yes
......
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 0
Relay_Log_Space: 151
......
Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'
Last_SQL_Errno: 0
Last_SQL_Error:
......
Auto_Position: 1
1 row in set (0.00 sec)

实验二:忽略purged的部分,强行同步

那么实际生产应用当中,偶尔会遇到这样的情况:某个slave从备份恢复后(或者load data infile)后,DBA可以人为保证该slave数据和master一致;或者即使不一致,这些差异也不会导致今后的主从异常(例如:所有master上只有insert没有update)。这样的前提下,我们又想使slave通过replication从master进行数据复制。此时我们就需要跳过master已经被purge的部分,那么实际该如何操作呢?

我们还是以实验一的情况为例:

先确认master上已经purge的部分。从下面的命令结果可以知道master上已经缺失24024e52-bd95-11e4-9c6d-926853670d0b:1这一条事务的相关日志

master [localhost] {msandbox} (test) > show global variables like '%gtid%';
+---------------------------------+------------------------------------------+
| Variable_name | Value |
+---------------------------------+------------------------------------------+
| binlog_gtid_simple_recovery | OFF |
| enforce_gtid_consistency | ON |
| gtid_executed | 24024e52-bd95-11e4-9c6d-926853670d0b:1-3 |
| gtid_mode | ON |
| gtid_owned | |
| gtid_purged | 24024e52-bd95-11e4-9c6d-926853670d0b:1 |
| simplified_binlog_gtid_recovery | OFF |
+---------------------------------+------------------------------------------+
7 rows in set (0.00 sec)

在slave上通过set global gtid_purged='xxxx'的方式,跳过已经purge的部分

slave2 [localhost] {msandbox} ((none)) > stop slave;
Query OK, 0 rows affected (0.04 sec)
slave2 [localhost] {msandbox} ((none)) > set global gtid_purged = '24024e52-bd95-11e4-9c6d-926853670d0b:1';
Query OK, 0 rows affected (0.05 sec)
slave2 [localhost] {msandbox} ((none)) > start slave;
Query OK, 0 rows affected (0.01 sec)
slave2 [localhost] {msandbox} ((none)) > show slave status\G 
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
......
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 359
Relay_Log_File: mysql_sandbox21290-relay-bin.000004
Relay_Log_Pos: 569
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
......
Exec_Master_Log_Pos: 359
Relay_Log_Space: 873
......
Master_Server_Id: 1
Master_UUID: 24024e52-bd95-11e4-9c6d-926853670d0b
Master_Info_File: /data/mysql/rsandbox_mysql-5_6_23/node2/data/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
......
Retrieved_Gtid_Set: 24024e52-bd95-11e4-9c6d-926853670d0b:2-3
Executed_Gtid_Set: 24024e52-bd95-11e4-9c6d-926853670d0b:1-3
Auto_Position: 1
1 row in set (0.00 sec)

可以看到此时slave已经可以正常同步,并补齐了24024e52-bd95-11e4-9c6d-926853670d0b:2-3范围的binlog日志。

以上所述是小编给大家介绍的MySQL 5.6 GTID新特性实践,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP 8.3发布:新特性一览PHP 8.3发布:新特性一览Nov 27, 2023 pm 12:52 PM

PHP8.3发布:新特性一览随着技术的不断发展和需求的不断变化,编程语言也在不断更新和改进。作为一种广泛应用于网络开发的脚本语言,PHP一直在不断进步,为开发者提供更强大和高效的工具。最近发布的PHP8.3版本带来了许多期待已久的新特性和改进,下面让我们来看一下这些新特性的一览。非空属性的初始化在过去的PHP版本中,如果一个类的属性没有被明确赋值,它的值

学习PHP8的新特性,深入理解最新技术的指南学习PHP8的新特性,深入理解最新技术的指南Dec 23, 2023 pm 01:16 PM

深入解析PHP8的新特性,助您掌握最新技术随着时间的推移,PHP编程语言一直在不断演进和改进。最近发布的PHP8版本为开发者提供了许多令人兴奋的新特性和改进,为我们的开发工作带来了更多便利和效率。在本文中,我们将深入解析PHP8的新特性,并提供具体的代码示例,旨在帮助您更好地掌握这些最新的技术。JIT编译器PHP8引入了JIT(Just-In-Time)编

PHP8.1引入的新的Redis扩展PHP8.1引入的新的Redis扩展Jul 07, 2023 pm 09:41 PM

PHP8.1引入的新的Redis扩展随着互联网的快速发展,大量的数据需要进行存储和处理。为了提高数据处理的效率和性能,缓存成为了一个不可或缺的部分。而在PHP开发中,Redis作为一种高性能的键值对存储系统,被广泛应用于缓存和数据存储的场景。为了进一步提升Redis在PHP中的使用体验,PHP8.1引入了新的Redis扩展,本文将介绍这一扩展的新增功能,并给

CSS3的新特性一览:如何使用CSS3实现过渡效果CSS3的新特性一览:如何使用CSS3实现过渡效果Sep 09, 2023 am 11:27 AM

CSS3的新特性一览:如何使用CSS3实现过渡效果CSS3作为CSS的最新版本,在众多新特性中,最有趣和实用的应该是过渡效果(transition)。过渡效果可以让我们的页面在交互时更加平滑、漂亮,给用户带来良好的视觉体验。本文将介绍CSS3过渡效果的基本用法,并附带相应的代码示例。transition-property属性:指定需要过渡的CSS属性过渡效果

php8有什么新特性php8有什么新特性Sep 25, 2023 pm 01:34 PM

php8新特性有JIT 编译器、类型推导、命名参数、联合类型、属性、错误处理改进、异步编程支持、新的标准库函数和匿名类的扩展等。详细介绍:1、JIT编译器,PHP8引入了JIT编译器,这是一个重要的性能改进,JIT编译器可以对一些高频执行的代码进行实时编译和优化,从而提高运行速度;2、类型推导,PHP8引入了类型推导功能,允许开发者在声明变量时自动推导出变量的类型等等。

go语言有什么新特性go语言有什么新特性Aug 24, 2023 pm 01:36 PM

go语言的新特性有:1、Go模块,用于管理Go语言项目的依赖关系;2、错误处理,增加了一个新的错误类型error,使得错误处理更加灵活和简洁;3、上下文包,用于在goroutine之间传递请求范围的值;4、嵌入,即一个结构体可以嵌入到另一个结构体中;5、同步包,更好地控制goroutine之间的同步和通信;6、错误值,更好地区分不同类型的错误;7、泛型,让开发者编写更灵活。

CSS3的新特性一览:如何使用CSS3实现水平居中布局CSS3的新特性一览:如何使用CSS3实现水平居中布局Sep 09, 2023 pm 04:09 PM

CSS3的新特性一览:如何使用CSS3实现水平居中布局在网页设计和布局中,水平居中布局是一项常见的需求。过去,我们经常使用复杂的JavaScript或CSS技巧实现此目的。然而,CSS3引入了一些新的特性,使得水平居中布局更加简单和灵活。本文将介绍一些CSS3的新特性,并提供一些代码示例,演示如何使用CSS3实现水平居中布局。一、使用flexbox布局fle

jdk8新特性jdk8新特性Aug 11, 2023 am 10:51 AM

jdk8新特性:1、Lambda表达式;2、Stream API;3、函数式接口;4、默认方法;5、方法引用;6、新的日期和时间API;7、并发增强;8、其他改进等等。

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.