Global Transaction IDentifiers. 원본 서버에서 커밋된 트랜잭션과 연결된 식별자
GTID = server_uuid:transaction_id
server_uuid
: 트랜잭션이 최초로 실행된 서버의 고유 식별자(UUID).transaction_id
: 해당 서버에서 실행된 트랜잭션의 일련 번호.gtid_mode
옵션시스템 변수 gtid_mode
로 GTID를 활성화/비활성화 가능. MySQL 5.6 이상 사용 가능
GTID 가 없는 트랜잭션을 포함하는 빈로그는 GTID가 활성화된 서버에서 사용할 수 없음
GTID 복제 구성에서 CREATE TABLE .. SELECT
구문을 사용하는 경우
binlog 포맷이 statement 이면 하나의 트랜잭션으로 기록되지만, row형식으로 사용되면 두 개의 GTID와 함께 두 개의 트랜잭션으로 기록됨
마스터가 statement 형식, 슬레이브가 row면 슬레이브는 트랜잭션을 바르게 사용할 수 없음
MySQL 8.0.21 부터는 CTAS 사용 가능
mysql> create table tb_test_ctas as select * from tb_test;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
mysql> create table tb_test_like like tb_test;
Query OK, 0 rows affected (0.01 sec)
mysql> insert into tb_test_like
-> select * from tb_test;
Query OK, 8130 rows affected (0.32 sec)
Records: 8130 Duplicates: 0 Warnings: 0
임시 테이블 (CREATE TEMPORARYE TABLE, DROP TEMPORARY TABLE)
mysql> create temporary table v (a varchar(1));
Query OK, 0 rows affected (0.03 sec)
mysql> drop temporary table v;
Query OK, 0 rows affected (0.02 sec)
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
mysql> create temporary table v (a varchar(1));
ERROR 1787 (HY000): Statement violates GTID consistency: CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can only be executed outside transactional context. These statements are also not allowed in a function or trigger because functions and triggers are also considered to be multi-statement transactions.
Slave \ Master | OFF | OFF_PERMISSIVE | ON_PERMISSIVE | ON |
---|---|---|---|---|
OFF | Y | Y | N | N |
OFF_PERMISSIVE | Y | Y | Y | Y |
ON_PERMISSIVE | Y | Y | Y | Y |
ON | N | N | Y | Y |
# gtid_mode 값이 OFF 인 상태에서 ON 으로 변경하기 위한 과정
SET GLOBAL enforce_gtid_consistency = WARN;
SET GLOBAL enforce_gtid_consistency = ON;
SET GLOBAL gtid_mode = OFF_PERMISSIVE;
SET GLOBAL gtid_mode = ON_PERMISSIVE;
SET GLOBAL gtid_mode = ON;
# my.cnf에 추가
enforce_gtid_consistency=ON
gtid_mode=ON
gtid_next = AUTOMATIC (binary log on) | gtid_next = AUTOMATIC (binary log off) | gtid_next = AUTOMATIC:<TAG> | gtid_next = ANONYMOUS | gtid_next = <UUID>:<NUMBER> | gtid_next = <UUID>:<TAG>:<NUMBER> | |
---|---|---|---|---|---|---|
gtid_mode = OFF | ANONYMOUS | ANONYMOUS | Error | ANONYMOUS | Error | Error |
gtid_mode = OFF_PERMISSIVE | ANONYMOUS | ANONYMOUS | Error | ANONYMOUS | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
gtid_mode = ON_PERMISSIVE | New GTID | ANONYMOUS | New GTID | ANONYMOUS | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
gtid_mode = ON | New GTID | ANONYMOUS | New GTID | Error | <UUID>:<NUMBER> | <UUID>:<TAG>:<NUMBER> |
# gtid_next는 세션 변수. NHNCloud RDS 기본값은 AUTOMATIC
SET gtid_next = 'AUTOMATIC';