- SHOW RELICA STATUS, SHOW SLAVE STATUS  문으로 원본서버, 복제서버간의 연결 구성 및 상태 정보 확인 가능

- MySQL 8.0.22 부터 SHOW SLAVE STATUS 문은 사용되지 않는다. 

  대신 SHOW REPLICA STATUS 를 사용

- PERFORMANCE_SCHEMA 에 replication_ 로 시작하는 테이블에서 복제 관련 정보를 확인할 수 있다. 

  - 원본서버는 하트 비트 간격보다 긴 기간동안 바이너리 로그에 업데이트 겂어 보내지 않는 이벤트가 없는 경우 하트 비트 신호를 복제본으로 전송한다. 

    CHANGE MASTER TO 문의 MASTER_HEARTBEAT_PERIOD 설정은 하트 비트 빈도를 지정한다. (기본값 slave_net_timeout의 1/2)

  - replication_connection_status 테이블에는 복제가 최선 하트 비트 신호를 언제 수신했는지 여부와 하트 비트 신호 수가 표시된다. 

 

SHOW RELICA STATUS, SHOW SLAVE STATUS 에서 제공하는 정보 중 주요정보 

- Replica_IO_State : 복제의 현재 상태
- Replica_IO_Running : 원본 바이너리 로그를 읽기위한 I/O 스레드 실행 상태 
- Replica_SQL_Running : 릴레이 로그의 이벤트를 실행하는 SQL 쓰레드 실행 상태 
- Last_IO_Error, Last_SQL_Error : 릴레이 로그를 처리 할 때 I/O 및 SQL 쓰레드에 의해 등록 된 마지막 오류
- Seconds_Behind_Source : 복제 SQL 쓰레드가 원본 바이너리 로그의 처리를 지연 시간 (초)
  - Seconds_Behind_Source값 0은 일반적으로 복제가 소스에 따라 잡았다는 것을 의미하는 것으로 해석 할 수 있지만, 엄밀하게는 true가 아닌 경우도 있다.

    예를 들어 원본과 복제본 간의 네트워크 연결이 끊어졌지만, 복제 I / O thread가 아직 이를 모르고 ( slave_net_timeout이 아직 경과하지 않은) 경우에 발생할 수 있다.

  - Seconds_Behind_Source임시 값이 상황을 정확히 반영하지 않을 수도 있다.

    복제 I/O thread가 아직 새로운 이벤트를 대기하는 경우 복제 SQL 쓰레드가 새로운 이벤트의 실행을

    종료 할 때까지 , Seconds_Behind_Source큰 값이 표시 될 수 있다. 이것은 이벤트에 오래된 타임 스탬프가있는

   경우에 문제가 발생할 수 있다. 이런 경우 비교적 짧은 기간에 SHOW REPLICA STATUS,  SHOW SLAVE STATUS 를

   여러 번 실행하면이 값이 0에서 비교적 큰 값까지 반복적으로 변경 될 수 있다. 

 

두가지를 같이 확인해야되는 정보

- show replica status, show slave status 에서 출력되는 값은 같으나 아래와 같이 다르게 나오는 부분이 있다. 

  - show slave status 에서 Master, Slave 로 출력되는 항목이 show replica status 에서는 Source, Replica 로 출력된다.

- Master_Log_file, Read_Master_Log_Pos 또는 Source_Log_file, Read_Source_Log_Pos : 복제 I/O thread가 원본 로그에서 이벤트를 읽을 위치 (원본 바이너리 로그 파일과 포지션)
- Relay_Master_Log_File, Exec_Master_Log_Pos 또는 Relay_Source_Log_File, Exec_Source_Log_Pos: 복제 SQL 쓰레드가 로그에서 받은 이벤트를 실행 한 위치 (원본 바이너리 로그 파일과 포지션)
- Relay_Log_File, Relay_Log_Pos : 복제 SQL 쓰레드가 릴레이 로그를 실행 한 위치 

 

 

원본에서 연결 복제 상태 확인

- SHOW PROCESSLIST 문

mysql> show processlist\G;
     Id: 8
   User: repl
   Host: 192.168.137.12:32796
     db: NULL
Command: Binlog Dump GTID
   Time: 1645
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL

- SHOW REPLICAS, SHOW SLAVE HOSTS 문 

mysql> show replicas;
+-----------+------+------+-----------+--------------------------------------+
| Server_Id | Host | Port | Source_Id | Replica_UUID                         |
+-----------+------+------+-----------+--------------------------------------+
|        12 |      | 3306 |        11 | f6d4ffe7-bbd7-11eb-8dde-00155ddba00e |
+-----------+------+------+-----------+--------------------------------------+
1 row in set (0.00 sec)

mysql> show slave hosts;
+-----------+------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Master_id | Slave_UUID                           |
+-----------+------+------+-----------+--------------------------------------+
|        12 |      | 3306 |        11 | f6d4ffe7-bbd7-11eb-8dde-00155ddba00e |
+-----------+------+------+-----------+--------------------------------------+
1 row in set, 1 warning (0.00 sec)

 

참고

https://dev.mysql.com/doc/refman/8.0/en/replication-administration-status.html

 

'MySQL' 카테고리의 다른 글

ANALYZE TABLE Statement  (0) 2021.06.17
GTID - 트랜잭션 건너뛰기  (0) 2021.06.13
GTID 사용시 복제본 복구  (0) 2021.06.10
GTID를 사용한 복제구성  (0) 2021.06.09
GTID  (0) 2021.06.09

- my.cnf 기준 필요한 설정값.

  -  현재 원본 서버는 구동되는 상태이므로, 원본 서버에 my.cnf 를 복하여 server-id만 변경해서 복제본에서 사용

gtid-mode = on
enforce-gtid-consistency=on
binlog-checksum=NONE
log-slave-updates=on
server-id = 1234  # 복제를 구성하는 서버간의 값이 달라야함

 

- 복제용 계정, 원본서버에 생성 

CREATE USER 'repl'@'복제본서버 IP' IDENTIFIED BY '패스워드';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'복제본서버 IP';

-  슬레이브 장비에서 마스터 서버를 대상으로 아래의 복제 설정을 추가.

change master to
master_host = '원본 서버 IP',
master_port =원본 서버 Port,
MASTER_USER='repl',
MASTER_PASSWORD='패스워드',
MASTER_AUTO_POSITION =1; 

-  원본 서버에서 백업 수행.

  -  gtid사용시 --all-databases --triggers --routines --events  옵션 권장

  - 개별 디비 백업 시 경고 발생. (개별 디비 백업 수행 대신 디비 전체 백업을 사용)

mysqldump --default-character-set=utf8mb4 -u아이디 -p패스워드 --single-transaction --all-databases --triggers --routines --events -S "mysql.sock 파일위치" | gzip > backup.sql.gz

- 슬레이브에서 백업 데이터 임포트 전 gtid관련 정보 퍼지.

show global variables like 'gtid_executed';
+-----------------+-------------------------------------------------------+
| Variable_name   | Value                                                 |
+-----------------+-------------------------------------------------------+
| gtid_executed   | 027f123c-51b5-22ef-eeb3-225056ac2425:1-1322           |
+-----------------+-------------------------------------------------------+
1 row in set (0.01 sec)

show global variables like 'gtid_purged';
+-----------------+-------------------------------------------------------+
| Variable_name   | Value                                                 |
+-----------------+-------------------------------------------------------+
| gtid_purged     | 019f728c-52b5-11ea-aeb3-005056ac2425:1-1520           |
+-----------------+-------------------------------------------------------+

reset master;

show global variables like 'gtid_executed';
+-----------------+-------------+
| Variable_name   | Value       |
+-----------------+-------------+
| gtid_executed   |             |
+-----------------+-------------+
1 row in set (0.00 sec)

show global variables like 'gtid_purged';
+-----------------+-------------+
| Variable_name   | Value       |
+-----------------+-------------+
| gtid_purged     |             |
+-----------------+-------------+
1 row in set (0.00 sec)

 

- 백업 데이터 임포트

mysql --default-character-set=utf8mb4 -u아이디 -p패스워드 -S "mysql.sock 파일위치" < backup.sql

- 복제 시작 설정

start slave;

- 정상상태 확인

  - 원본, 복제본 비교

show global variables like 'gtid_executed';
show global variables like 'gtid_purged';

 

  - 복제 상태 확인 (Slave_IO_Running, Slave_SQL_Running 이 Yes 인지 확인)

show slave status\G

- 원본 서버에서 테스트 DB 생성후 복제본 DB에 생성되는지 확인 

create database test_db;

 

 

참고

- slave장비 붙이기

https://minsugamin.tistory.com/entry/MySQL-57-GTID

- 에러메세지 관련

https://www.percona.com/blog/2013/02/08/how-to-createrestore-a-slave-using-gtid-replication-in-mysql-5-6/

'MySQL' 카테고리의 다른 글

GTID - 트랜잭션 건너뛰기  (0) 2021.06.13
GTID 복제 상태 확인  (0) 2021.06.12
GTID를 사용한 복제구성  (0) 2021.06.09
GTID  (0) 2021.06.09
MySQL InnoDB Row 형식  (0) 2021.06.04

원본-복제본 1:1 로 구성되어 있는 경우 GTID를 적용하기 위한 방법은 아래와 같다. 

1. 서버 동기화 

- GTID를 사용하지 않고 복제 구성이 되어 있는 경우에만 필요

- 신규 서버의 경우 3단계부터 진행 

- 각 서버를 읽기 전용으로 설정 

mysql> SET @@GLOBAL.read_only = ON;

- 진행중인 모든 트랜잭션이 커밋 또는 롤백 될때까지 기다린다. 

  복제본에 모든 트랜잭션이 적용되었느지 확인한다. 

 

2. 두 서버 중지 

- mysqladmin 을 사용하여 각 서버를 중지한다.

  그런데 mysqladmin 으로 서버 내려본적이 없네 ㅋㅋㅋ 

shell> mysqladmin -uusername -p shutdown

 

3. GTID 에 필요한 옵션을 적용하여 서버 구동 

gtid_mode=ON
enforce-gtid-consistency=ON

- 복제 설정을 구성하기전에 --skip-slave-start 옵션을 사용하여 복제본을 시작한다. 

  --skip-slave-start 옵션 적용시 복제본이 시작될때 복제시작을 하지 않는다. 

- 복제 구성을 위해서 원본서버는 바이너리 로그가 활성화되어 있어야한다. 복제본은 바이너리 로그 없이 GTID를 사용할수 있다. 복제본 서버에서 바이너리 로그를 비활성화 해야되는 경우 --skip-log-bin, --log-slave-updates=OFF옵션을 지정하여 바이너리 로그ㄹ르 비활성화할 수 있다.

 

4. GTID 기반의 자동 위치 지젖을 사용하도록 복제본 구성 

mysql> CHANGE MASTER TO
     >     MASTER_HOST = host,
     >     MASTER_PORT = port,
     >     MASTER_USER = user,
     >     MASTER_PASSWORD = password,
     >     MASTER_AUTO_POSITION = 1;

Or from MySQL 8.0.23:

mysql> CHANGE REPLICATION SOURCE TO
     >     SOURCE_HOST = host,
     >     SOURCE_PORT = port,
     >     SOURCE_USER = user,
     >     SOURCE_PASSWORD = password,
     >     SOURCE_AUTO_POSITION = 1;

- 원본서버의 호스트 이름 또는 IP, 포트 번호에 적절한 값을 지정하여 원본서버에 연결하는데 사용할 수 있는 복제 사용자 계정의 사용자 이름과 암호를 지정해야 한다. 

 

5. GTID가 적용된 백업 생성 

- GTID 를 적용하기전에 생성된 백업은 GTID가 적용된 서버에 사용할 수 없기 때문에 이시점에서 새로운 백업을 한다. 

 

6. 복제를 시작하고 읽기 전용 모드 해제

mysql> START SLAVE;
Or from MySQL 8.0.22:
mysql> START REPLICA;

- 1단계에서 서버를 읽기 전용으로 구성한 경우 서버가 업데이트를 적용할 수 있도록 다음 명령문을 실행한다. 

mysql> SET @@GLOBAL.read_only = OFF;

 

참고

https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-howto.html

'MySQL' 카테고리의 다른 글

GTID 복제 상태 확인  (0) 2021.06.12
GTID 사용시 복제본 복구  (0) 2021.06.10
GTID  (0) 2021.06.09
MySQL InnoDB Row 형식  (0) 2021.06.04
online ddl 알고리즘  (0) 2021.05.27

GTID 개념

- GTID(Global Transaction Identifiler)는 원본 서버(Source)에서 Commit된 각각의 트랜잭션들이 가지게되는 고유한 전역 식별자로 원본 서버에만 고유한것이 아니라 복제 설정의 모든 서버에서 고유한 값을 가진다. 

- 모든 트랜잭션과 모든 GITD 사이에는 일대일 매핑이 있다. 

 

GITD 부여 방식 

- auto.cnf 파일에 설정된 server-uuid:transaction_id 로 표시 되며 transaction_id는 트랜잭션이 Commit된 순서에 의해 결정된다. (server-uuid 로 원본서버를 식별한다.)

 

GTID 확인 

- Binary Log, SHOW SLAVE STATUS 문에서 확인 가능

- mysqlbinlog --base64-output=DECODE-ROWS 문으로 log file에서 확인하거나 SHOW BINLOG EVENTS의 결과에서도 확인 가능

- SHOW MASTER STATUS, SHOW SLAVE STATUS 문의 결과와 같이 동일한 서버에서 생성된 GTID의 순서는 아래와 같이 단문으로 축소되어 보여진다. 

  3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5

- MySQL 5.6.6 이상부터 START SLAVE 문에 SQL_BEFORE_GITDS, SQL_AFTER_GTIDS 옵션을 제공한다. 

 

GTID 세트 

- GTID 세트는 다음과 같이 표시되는 글로벌 트랜잭션 식별자 세트 

gtid_set:
    uuid_set [, uuid_set] ...
    | ''

uuid_set:
    uuid:interval[:interval]...

uuid:
    hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh

h:
    [0-9|A-F]

interval:
    n[-n]

    (n >= 1)

- GTID 세트는 MySQL 서버에서 여러가지 방식으로 사용된다. 

  - EX) gtid_executed, gtid_purged 시스템 변수로 저장된 값은 GTID 세트로 표시된다.

         GTID_SUBSET(), GTID_SUBTRACT() 함수는 GTID 세트 입력값이 필요하다.

- GTID 는 항상 원본(소스)와 복제본간에 유지된다. 

   바이너리 로그를 검사하여 복제본에 적용된 모든 트랜잭션의 원본(소스)를 항상 확인할 수 있다. 

- 주어진 GTID를 가진 트랜잭션이 주어진 서버에서 Commit 되면 동일한 GTID를 가진 모든 후속 트랜잭션이 해당 서버에서 무시된다. 원본(소스)에서 커밋 된 트랜잭션은 복제본에 한번만 적용될 수 있으므로 일관성이 보장된다. 

- GTID를 사용할때 복제본에는 소스의 파일 이름 및 해당 파일 내의 위치와 같은 비 로컬 데이터가 필요하지 않다. 

- 소스와 동기화하는데 필요한 모든 정보는 복제 데이터 스트림에서 직접 가져온다. 

- 원본, 복제본 간의 데이터 흐름의 시작, 중지 또는 재게하는 시점을 결정하는데 필요했던 file-offset pairs를 대체한다. 

- 복제를 위해서 GTID를 사용할때 CHNAGE MASTER TO 구문에서 MASTER_LOG_FILE, MASTER_LOG_POS 옵션을 사용할 필요가 없다. 대신 MASTER_AUTO_POSITION 옵션을 사용한다. 

 

GTID의 생성 및 수명주기는 다음 단계로 구성된다. 

1. 트랜잭션이 원본(소스)에서 실행되고 Commit

   이 트랜잭션에는 원본(소스)의 UUID와 서버에서 사용되지 않은 가장 작은 트랜잭션 시퀀스 번호(0보다 큰)를 사용하여 GTID가 할당된다. GTID는 원본(소스)의 바이너리 로그에 기록된다. 

2. 바이너리 로그 데이터가 복제본으로 전송되고 복제본의 릴레이 로그에 저장되면 복제본은 GTID를 읽어서 gtid_next 시스템 변수값으로 설정한다. 

3. 복제본은 이 GTID가 잔체 바이너리 로그에 트랜잭션을 기록하는데 아직 사용되지 않았는지 확인한다. 

   이 GTID가 사용되지 않은 경우에만 복제본은 GTID를 사용하여 트랜잭션을 적용한다. (그리고 트랜잭션을 바이너리 로그에 기록한다.) 

   트랜잭션을 실행하기 전에 트랜잭션의 GTID를 먼저 읽고 확인하는것은, 아직 Commit되거나 적용되지 않은 트랜잭션에 대해 복제본은 이 GTID가 있는 이전 트랜잭션이 복제본에 적용되지 않았을뿐만 아니라 다른 세션이 GTID를 읽지 않았음을 보장한다. 

4. gtid_next 값이 비어있지 않기 때문에 복제본은 이 트랜잭션에 대한 GTID를 생성하려고 시도하지 않고 이 변수에 저장된 GTID(원본에서 얻은 GTID)의 트랜잭션(바이너리 로그에 저정된)을 실행한다. 

 

mysql.gtid_executed 테이블 (5.7 에서 추가됨)

- 현재 활성화된 바이너리 로그 파일에 저장된 트랜잭션을 제외하고 MySQL 서버에 적용된 모든 트랜잭션에 할당된 GTID를 저장하는데 사용되는 테이블 

- 이 테이블의 행에는 각 GTID 또는 GTID 집합에 대해 원본 서버의 UUID와 집합의 시작 및 종료, 트랜잭션 ID가 포함된다. 단일 GTID만 참조하는 행의 경우 마지막 두 값은 동일하다. 

- 이 테이블은 복제본에서 바이너리 로깅이 비활성화 된 경우 복제본이 GTID를 사용할 수 있드록 하고 바이너리 로그가 손실된 경우 GTID를 유지할 수 있게 해준다. 

- RESET MASTER 문을 실행할 경우 mysql.gtid_executed 테이블은 초기화된다.

- gtid_mode 가 ON 또는 ON_PERMISSIVE 모드일 때만 GTID가 mysql.gtid_executed 테이블에 저장된다. 

 

 

GTID 의 Life Cycle

1. 트랜잭션이 커밋되면 GTID를 할당 받고 원본의 바이너리 로그에 기록된다. 

2. 할당된 GTID는 gtid_executed 시스템 변수(@@GLOBAL.gtid_executed)와 mysql.gtid_executed 테이블에 저장된다. 

3. 원본의 바이너리 로그 데이터가 복제본의 릴레이 로그에 저장되면 복제본은 GTID를 읽고 gtid_next 시스템 변수를 설정한다. 

4. 복제본에서 gtid_next 에 설정된 GTID의 트랜잭션이 반영되지 않았을 경우 반영한다. 

5. 복제본에 바이너리 로그가 활성화된 경우 커밋후 GTID를 바이너리 로그에 기록하고 복제본의 gtid_executed 시스템 변수(@@GLOBAL.gtid_executed)와 mysql.gtid_executed 테이블에 저장된다.  바이너리 로그가 비활성화된 경우 바이너로 로그에 기록하는 부분을 제외하고는 동일하게 처리된다. 

 

GTID Auto-Positioning

- 복제구성시 GTID를 사용할 경우 복제본이 원본과 동기화하는데 필요한 모든 정보를 복제 데이터 스트림에서 직접 가져온다. 

- 복제 구성시 MySQL 8.0.23 버전부터는 CHANGE REPLICATION SOURCE TO  문을 사용한다. 이전 버전의 경우 CHANGE MASTER TO 문을 사용한다. GTID 사용시  SOURCE_AUTO_POSITION  또는 MASTER_AUTO_POSITION 옵션을 사용한다.  SOURCE_LOG_FILE, MASTER_LOG_FILE, SOURCE_LOG_POS, MASTER_LOG_POS 등의 옵션을 사용하지 않는다. 

- 복제본에 GTID가 활성화 (GTID_MODE=ON, ON_PERMISSIVE,또는 OFF_PERMISSIVE) 되고 MASTER_AUTO_POSITION 옵션이 활성화되면 원본에 연결하기 위한 바이너리 파일의 위치를 찾는다. 

- 복제본은 원본에 수신, 커밋 또는 둘다 수행한 트랜잭션이 포함된 GTID 세트를 보내고 원본 서버는 이 GTID 세트에 포함되지 않은 바이너리 로그의 모든 트랜잭션을 전송한다. 이때 원본에서 전송해야되는 트랜잭션이 바이너리 로그에서 제거되었거나 다른 방법으로 gtid_purged 시스템 변수에 GTID가 추가된 경우 복제본에 ER_MASTER_HAS_PURGED_REQUIRED_GTIDS 오류를 전송하고 복제는 시작되지 않는다. 

- 누락된 트랜잭션의 GTID는 원본서버의 에러로그에 warning message ER_FOUND_MISSING_GTIDS 에 기록된다.

- 이 상황에서 MASTER_AUTO_POSITION 옵션을 사용하여 복제를 구성하기 위해 복제본을 복구하려면 다른 원본에서 ER_FOUND_MISSING_GTIDS에 기록된 GTID의 트랜잭션을 복제하거나 원본서버를 백업받아 복제본을 새로 구성해야 한다. ( binlog_expire_logs_seconds 가 발생하지 않도록 바이너리 로그 보관기간을 조정한다.)

 

 

참고

https://dev.mysql.com/doc/refman/5.6/en/replication-gtids-concepts.html

https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-concepts.html

https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-concepts.html

https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-lifecycle.html

https://dev.mysql.com/doc/refman/8.0/en/replication-gtids-auto-positioning.html

 

 

 

 

'MySQL' 카테고리의 다른 글

GTID 사용시 복제본 복구  (0) 2021.06.10
GTID를 사용한 복제구성  (0) 2021.06.09
MySQL InnoDB Row 형식  (0) 2021.06.04
online ddl 알고리즘  (0) 2021.05.27
binlog format  (0) 2021.05.15

InnoDB 스토리지 엔진은 REDUNDANT, COMPACT, DYNAMIC, COMPRESSED의 네가지 Row 형식을 지원한다. 

REDUNDANT

- 이전 버전의 MySQL 과의 호환됨

  기존의 File Format Antelope 과 5.0 이후에 추가된 Barracuda 도 지원

- 가변 길이 컬럼값의 768 바이트까지는 B-Tree 노드의 인덱스에 저장하고 나머지는 Overflow Page에 저장한다. 

- 768 바이트보다 크거나 같은 고정길이 컬럼은 가변 길이 컬럼으로 인코딩되어 Off-Page 에 저장할 수 있다. 

- 컬럼값이 768 바이트 이하이면 Overflow Page를 사용하지 않고 값이 B-Tree 노드에 저장되어 I/O가 약간 절약될 수 있다. 이경우 상대적으로 짧은 BLOB 컬럼값에 적합 하지만 B-Tree 노드가 키 값이 아닌 데이터로 채워져 효율성이 떨어질 수 있다. 

- BLOB 컬럼이 많은 테이블은 B-Tree 노드가 너무 다득차고 너무 적은 행를 포함하여 행이 더 짧거나 컬럼 값이 off-page에 저장된 경우보다 전체 인덱스의 효율성이 떨어질 수 있다.

  

 

COMPACT

- 이전 버전의 MySQL 과의 호환됨

  기존의 File Format Antelope 과 5.0 이후에 추가된 Barracuda 도 지원

- COMPACT 은 일부 작업에 CPU 사용을 늘리는 대신 REDUNDANT 에 비해 행 저장 공간을 약 20% 줄여준다.

- 워크로드가 캐시 적중률과 디스크 속도에 의해 제한되는 일반적인 작업인 경우 COMPACT 가 더 빠를 수 있다.

  워크로드가 CPU 속도에 의해 제한되는 경우 COMPACT 이 느려질 수 있다.

- COMPACT 을 사용하는 테이블은 B 트리 노드 내의 인덱스 레코드에 처음 768바이트의 가변 길이 컬럼 값(VARCHAR, VARBINARY 및 BLOB 및 TEXT 형식)을 저장하고 나머지는 Overflow Page에 저장된다.

  768바이트보다 크거나 같을 수록 고정 길이 컬럼은 페이지 밖에서 저장할 수 있는 가변 길이 컬럼으로 인코딩된다.

  예를 들어, CHAR(255) 컬럼은 utf8mb4와 마찬가지로 문자 세트의 최대 바이트 길이가 3보다 큰 경우 768바이트를 초과할 수 있다. 

- 컬럼 값이 768바이트 이하인 경우 Overflow Page가 사용되지 않으며 값이 B-tree 노드에 완전히 저장되므로 I/O에서 일부 절감이 발생할 수 있다. 이는 비교적 짧은 BLOB 컬럼 값에 적합하지만 B-트리 노드가 키 값이 아닌 데이터로 채워지므로 효율성이 저하될 수 있다. BLOB 컬럼이 많은 테이블은 B-tree 노드가 너무 가득 차있고 Row가 너무 적어져 Row가 짧거나 컬럼 값이 페이지 밖에서 저장된 경우보다 전체 인덱스의 효율성이 떨어질 수 있다. 

 

 

DYNAMIC

- DYNAMIC Row Format 은 COMPACT Row Format과 동일한 저장소 특성을 제공하지만 긴 가변 길이 컬럼에 대한 향상된 스토리지 기능을 추가하고 큰 인덱스 키 접두사를 지원한다.
- Barracuda File Format은  DYNAMIC Row Format을 지원한다. 

 

- ROW_FORMAT=DYNAMIC로 테이블이 만들어지면 InnoDB는 Overflow Page에 20바이트 포인터만 포함하는 클러스터된 인덱스 레코드를 사용하여 긴 가변 길이 컬럼 값(VARCHAR, VARBINARY 및 BLOB 및 TEXT 형식의 경우)을 완전히 Off-Page 로 저장할 수 있다. 768바이트보다 크거나 같을 수 있는 고정 길이 필드는 가변 길이 필드로 인코딩된다. 예를 들어, CHAR(255) 컬럼은 utf8mb4와 마찬가지로 문자 세트의 최대 바이트 길이가 3보다 큰 경우 768바이트를 초과할 수 있다.
- 컬럼이 페이지 밖에서 저장되는지 여부는 페이지 크기와 Row의 총 크기에 따라 다릅니다. Row가 너무 길면 클러스터드 인덱스 레코드가 B 트리 페이지에 맞을 때까지 페이지 밖에서 가장 긴 열이 선택된다. 40바이트 미만이거나 동일한 텍스트 및 BLOB 컬럼은 Line에 저장된다. 

- DYNAMIC Row Format 은 COMPACT,  REDUNDANT Format과 마찬가지로 인덱스 노드에 전체 Row를 저장하는 효율성을 유지하지만 DYNAMIC Row Format은 많은 수의 데이터 바이트의 데이터 바이트로 B-트리 노드를 채우는 문제를 방지한다. DYNAMIC Row Format은 긴 데이터 값의 일부가 페이지 밖에서 저장되는 경우 일반적으로 전체 값을 페이지 밖에서 저장하는 것이 가장 효율적이라는 생각을 기반으로 한다. DYNAMIC Format을 사용하면 짧은 컬럼이 B 트리 노드에 남아 있는 경우 지정된 Row에 필요한 Overflow Page 수를 최소화할 수 있다.

- DYNAMIC Row Format은 인덱스 키 접두사를 최대 3072바이트까지 지원한다. 이 기능은 기본적으로 활성화되는 innodb_large_prefix 변수에 의해 제어된다.

- DYNAMIC Row Foramt을 사용하는 테이블은 시스템 테이블스페이스, 테이블당 파일 테이블 스페이스 및 일반 테이블스페이스에 저장할 수 있다. 시스템 테이블 스페이스에 DYNAMIC 테이블을 저장하려면 innodb_file_per_table 사용하지 않도록 설정하고 테이블 만들기 또는 테이블 변경 문을 사용하거나 테이블 만들기 또는 테이블 변경과 함께 테이블스페이스 [=] innodb_system 테이블 옵션을 사용한다. innodb_file_per_table 및 innodb_file_format 변수는 일반 테이블스페이스에 적용되지 않으며, 테이블스페이스 [=] innodb_system 테이블 옵션을 사용하여 시스템 테이블스페이스에 DYNAMIC 테이블을 저장할 때는 적용할 수 없다.

 

 

COMPRESSED 

- COMPRESSED Rwo Format은 DYNAMIC 과 동일한 저장소 특성 및 기능을 제공하지만 테이블 및 인덱스 데이터 압축에 대한 지원을 추가한다.

- Barracuda File Format은  COMPRESSED Row Format을 지원한다. 

- COMPRESSED Rwo Format은 테이블 및 인덱스 데이터의 추가 저장소 및 성능 고려 사항이 압축되고 더 작은 페이지 크기를 사용하여 DYNAMIC Row Foramt 과 유사한 내부 세부 정보를 사용한다. COMPRESSED Rwo Format을 사용하면 KEY_BLOCK_SIZE 옵션으로 클러스터된 인덱스에 저장된 컬럼 데이터의 양과 Overflow Page에 배치되는 양을 제어한다. 

- COMPRESSED  Row Format은 인덱스 키 접두사를 최대 3072바이트까지 지원한다. 이 기능은 기본적으로 활성화되는 innodb_large_prefix 변수에 의해 제어된다.

- COMPRESSED  Row Format을 사용하는 테이블은 테이블당 파일 테이블 스페이스 또는 일반 테이블 스페이스에서 만들 수 있다. 시스템 테이블 스페이스는 압축행 형식을 지원하지 않는다. 압축테이블을 테이블당 파일 테이블에 저장하려면 innodb_file_per_table 변수를 사용하도록 설정해야 하며 innodb_file_format을 Barracuda 로 설정해야 한다. innodb_file_per_table 및 innodb_file_format 변수는 일반 테이블 스페이스에 적용되지 않는다. 일반 테이블 스페이스는 압축 및 압축되지 않은 테이블이 서로 다른 물리적 페이지 크기로 인해 동일한 일반 테이블 스페이스에 공존할 수 없는 주의 사항으로 모든 Row Format 을 지원한다. 

 

참고 

https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html

'MySQL' 카테고리의 다른 글

GTID를 사용한 복제구성  (0) 2021.06.09
GTID  (0) 2021.06.09
online ddl 알고리즘  (0) 2021.05.27
binlog format  (0) 2021.05.15
인덱스 최대 크기  (0) 2021.05.13

차산지 3년이 되어가는구나
메모리 카드를 교체하다 우연히 액정하단 터치가 안되는걸 발견
찾아보니 이모델에선 흔히 발생하는 문제
이번기회에 블랙박스 바꿀까 고민하다 as받기로 결정!
차 점검을 맡겨놓고 아이트로닉스로 출발


아이트로닉스는 기흥에 있다.
폭스바겐 판교정비센터에서 기흥은 택시타고 갈만하다.

도착해서 증상진단해보니 액정을 교체해야되는데 28000원을 내면 새걸로 바꾸어준다.


이건 고장없이 오래 쓰고 싶다

'일상' 카테고리의 다른 글

외장형 비비 장착 실패  (0) 2021.05.23
자전거 스프라켓 교체  (0) 2021.05.13
S20  (0) 2021.01.16

mysql 5.6 부터 online ddl이 추가 되었다.

 

각 버전별 online ddl 지원 범위가 다르다 메뉴얼을 한번 읽어보자.
https://dev.mysql.com/doc/refman/5.6/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl.html
https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html

 

InnoDB에서 지원하는 online ddl 알고리즘 

- copy

- inplace 

- instant (mysql 8.0)

 

copy 

- 변경된 스키마가 적용된 임시 테이블을 생성하여 기존 테이블의 데이터를 복사한 후 테이블 이름을 변경하는 방식

- ALGORITHM 구문 미사용시 INPLACE -> COPY 순으로 처리됨 

  INPLACE 로 처리 가능한 경우 INPLACE 를 사용하고 처리 불가능시 COPY 사용

단점 

- DDL 작업 일시중지, 작업중 I/O, CPU 사용제한 메커니즘 없음

- 작업중 롤백이 발생할 수 있으며, 롤백시 많은 비용이 소모됨 

- ALTER TABLE 작업 동안 Concurrent DML (inserts,updates,deletes) 이 차단됨

  LOCK = SHARED 일 때 Select는 가능함 

- 복제 지연이 발생 가능성 있음 

 

 

inplace

- 원본 테이블에 직접 변경작업을 적용함 

- 작업 준비(during perparation) 실행단계(executioin pahases of the operation)에서 테이블에 대한 배타적 메다 데이터 잠금(exclusive metadata lock)이 잠깐 동안 수행될 수 있다.

- 일반적으로 Concurrent DML 을 지원함 

단점

- 지원하지 않는 DDL 구문이 있음 

  지원여부 확인을 위해 ALGORITHM=INPLACE 구문을 사용해서 확인 가능 

- 테이블을 수정하는 동안 변경된 데이터량이 innodb_online_alter_log_max_size 를 초과할 경우 

  online ddl 이 실패하고 변경된 데이터는 롤백된다. 

  2시간 정도 돌아가다 에러나면서 롤백되면 환장한다... (경험담)

- 장기간 실행되는 DLL 작업은 슬레이브에서 복제 지연을 유발할 수있다.

  ALTER TABLE 작업은 마스터에서 작업이 완료되면 슬레이브로 전달된다. 

- 동시성이 높은 서버의 큰 테이블에 대해 높은 I/O 사용량을 유발할 수 있다. 

 

 

instant 

- mysql 8.0 에서 추가됨

- 메타 정보만 수정하여 변경 사항 반영

  스키마 변경중에 메타 데이터 잠금을 획득하지 않으며, 테이블의 데이터 파일도 건드리지 않는다. 

- ALGORITHM 구문 미사용시 INSTANT -> INPLACE -> COPY 순으로 처리됨 

 

단점

- 컬럼 추가시 테이블의 마지막 열로만 추가 가능, 컬럼 위치 지정 불가 

- ROW_FORMAT=COMPRESSED 를 사용하는 테이블에는 컬럼 추가 불가 

- FULLTEXT 인덱스를 포함하는 테이블에는 컬럼 추가 불가

- 임시 테이블에는 컬럼 추가 불가 

  임시테이블은 ALGORITHM=COPY 만 지원 

- 데이터 딕셔너리 테이블 스페이스 (공유 테이블 스페이스)에 있는 테이블에는 컬럼 추가 불가 

 

 

LOCK 

- 테이블에 대한 동시 엑세스 수준을 조정

- mysql은 ddl 작업시 가능한 작은 level 의 lock을 사용한다. 

  더 제한적인 감금을 적용하기 위해서 LOCK 절을 지정함 

- 특정 DDL 조작에서 허용되는 lock 레벨보다 더 적은 제한 레벨 lock을 지정하면 SQL Statement는 오류와 함께 실패한다. 

 

- LOCK=NONE

  Concurrent query,  Concurrent DML 허용

- LOCK=SHARED

  Concurrent query 허용,  Concurrent DML 불가

- LOCK=DEFAULT

  수행 가능한 동시성 작업에 대해서 허용 

- LOCK=EXCLUSIVE

  Concurrent query 불가,  Concurrent DML 불가

  빠른 시간내에 DDL 이 완료되거나, 동시 쿼리나 DML 이 없을 경우 사용

 

 

oline ddl 단계

- Initializaton

  Storage Engine 기능, 명령문으로 지정된 작업, 사용자 지정의 ALGORITHM 및 Lock 옵션을 고려하여 

  작업에 허용가능한 옵션 결정

  테이블 정의를 보호하기 위해 가능한 Shared Upgradeable Metadata Lock 을 수행

 

- Execution

  명령문이 준비되고 실행됨 

  Metadata Lock의 Exclusive 여부는 Initializaton 단계에서 평가된 내역에 따라 다르며, Exclusive Metadata Lock 이 필요한 경우 Alter 문을 주비하는 동안 잠깐 수행됨 

 

- Commit Table Definition

  테이블의 구조가 완료됨 

  Metadata Lock은 테이블 정의를 커밋하기 위해 Exclusive 로 업그레이드됨 

  Exclusive Metadata Lock 은 짧은 시간동안 잡힘

 

 

'MySQL' 카테고리의 다른 글

GTID  (0) 2021.06.09
MySQL InnoDB Row 형식  (0) 2021.06.04
binlog format  (0) 2021.05.15
인덱스 최대 크기  (0) 2021.05.13
MySQL 포퍼먼스 튜닝  (0) 2021.05.12

데이터 파일 48G짜리 테이블의 컬럼 데이터 타입 수정 작업을 해야된다. 

 

online ddl 이 된다고 해도 table rebuild 가 발생하는 작업으로 생각을 좀 해보자.

다행이 서비스를 다 내리고 점검중에 진행하는 작업이다. 

 

1안 pt-online-schema-change 사용 (점검 없이 한다고 했으면 1안으로 선택했을듯)

2안 컬럼 데이터 타입이 변경이 적용된 임시 테이블을 만들어서 데이터 INSERT 하고 테이블 이름 변경 (복제가 걸려 있어서 선택안함)

3안 SET SQL_LOG_BIN=Off 로 지정하고 마스터/슬레이브 각각에서 데이터 타입 변경 (선택)

 

 

+ Recent posts