Mysql - gksrlfw/study GitHub Wiki

Mysql

μ˜΅ν‹°λ§ˆμ΄μ €

μ‚¬μš©μžμ˜ 쿼리에 λŒ€ν•΄ 졜적의 싀행방법(μ‹€ν–‰κ³„νš)을 κ²°μ •ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.

μ˜΅ν‹°λ§ˆμ΄μ €μ—λŠ” κ·œμΉ™κΈ°λ°˜κ³Ό λΉ„μš©κΈ°λ°˜μ΄ 있으며, κ΄€κ³„ν˜• DB μ—λŠ” λΉ„μš©κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

λΉ„μš©κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €

쿼리λ₯Ό μ²˜λ¦¬ν•˜λŠ”λ° ν•„μš”ν•œ κ°€μž₯ 적은 λΉ„μš©μ΄ λ“œλŠ” μ‹€ν–‰κ³„νšμ„ μ„ νƒν•˜λŠ” λ°©μ‹μœΌλ‘œ, λΉ„μš©μ€ μ˜ˆμƒ μ†Œμš”μ‹œκ°„ ν˜Ήμ€ μžμ› μ‚¬μš©λŸ‰μ„ μ˜λ―Έν•©λ‹ˆλ‹€. 이λ₯Ό μ˜ˆμΈ‘ν•˜κΈ° μœ„ν•΄ ν…Œμ΄λΈ”, 인덱슀, 칼럼 λ“±μ˜ 객체 톡계정보와 μ‹œμŠ€ν…œ 톡계정보λ₯Ό μ΄μš©ν•˜λ©°, 톡계정보가 μ—†λŠ” κ²½μš°μ—λŠ” μ •ν™•ν•œ λΉ„μš© 예츑이 λΆˆκ°€λŠ₯ν•΄μ Έμ„œ λΉ„νš¨μœ¨μ μΈ μ‹€ν–‰κ³„νšμ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ€μ•ˆκ³„νšμƒμ„±κΈ°μ—μ„œ μ μš©μˆœμ„œλ³€κ²½, 연산방법변경, μ‘°μΈμˆœμ„œλ³€κ²½ λ“±μœΌλ‘œ λ‹€μ–‘ν•œ λŒ€μ•ˆ κ³„νšμ„ μƒμ„±ν•˜μ—¬ 졜적의 λ°©μ•ˆμ„ 찾으며, 이에 λŒ€ν•œ λΉ„μš©μ„ μ˜ˆμΈ‘ν•˜λŠ” λͺ¨λ“ˆλ„ μ‘΄μž¬ν•©λ‹ˆλ‹€.

λŒ€μ•ˆκ³„νšμ˜ μ •ν™•ν•œ λΉ„μš©μ„ μ˜ˆμΈ‘ν•˜κΈ° μœ„ν•΄μ„œ μ—°μ‚°μ˜ 쀑간 μ§‘ν•©μ˜ 크기 및 κ²°κ³Ό μ§‘ν•©μ˜ 크기, 뢄포도 λ“±μ˜ 예츑이 μ •ν™•ν•΄μ•Ό ν•˜λ―€λ‘œ, 보닀 λ‚˜μ€ μ˜ˆμΈ‘μ„ μœ„ν•΄ μ˜΅ν‹°λ§ˆμ΄μ €λŠ” μ •ν™•ν•œ 톡계정보λ₯Ό ν•„μš”λ‘œ ν•©λ‹ˆλ‹€. λ˜ν•œ λŒ€μ•ˆ κ³„νšμ„ κ΅¬μ„±ν•˜λŠ” 각 연산에 λŒ€ν•œ λΉ„μš© 계산식이 μ •ν™•ν•΄μ•Ό ν•©λ‹ˆλ‹€.

κ·œμΉ™κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €λŠ” 인덱슀λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€λ©΄ 항상 ν’€ ν…Œμ΄λΈ” μŠ€μΊ” λ³΄λ‹€λŠ” 인덱슀λ₯Ό μ‚¬μš©ν•˜λŠ” μ‹€ν–‰κ³„νšμ„ μƒμ„±ν•˜μ§€λ§Œ, λΉ„μš©κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €λŠ” 인덱슀λ₯Ό μ‚¬μš©ν•˜λŠ” λΉ„μš©μ΄ ν’€ ν…Œμ΄λΈ” μŠ€μΊ” λΉ„μš©λ³΄λ‹€ 크닀고 νŒλ‹¨λ˜λ©΄ 전체 ν…Œμ΄λΈ” μŠ€μΊ”μ„ μˆ˜ν–‰ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ‹€ν–‰κ³„νšμ„ 생성할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

λΉ„μš©κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €λŠ” 톡계정보, DBMS 버전, DBMS μ„€μ • 정보 λ“±μ˜ 차이둜 인해 동일 SQL 문도 μ„œλ‘œ λ‹€λ₯Έ μ‹€ν–‰κ³„νšμ΄ 생성될 수 있고, λΉ„μš©κΈ°λ°˜ μ˜΅ν‹°λ§ˆμ΄μ €μ˜ λ‹€μ–‘ν•œ ν•œκ³„λ“€λ‘œ 인해 μ‹€ν–‰κ³„νšμ˜ 예츑 및 μ œμ–΄κ°€ μ–΄λ ΅λ‹€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

table full scan 인 경우

  1. SQL 문에 쑰건이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 경우

SQL 문에 쑰건이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것은 ν…Œμ΄λΈ”μ˜ λͺ¨λ“  블둝을 μ½μœΌλ©΄μ„œ 무쑰건 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  1. SQL 문의 μ£Όμ–΄μ§„ 쑰건에 μ‚¬μš© κ°€λŠ₯ν•œ μΈλ±μŠ€κ°€ μ‘΄μž¬ν•˜λŠ” μ•ŠλŠ” 경우

μ‚¬μš© κ°€λŠ₯ν•œ μΈλ±μŠ€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터λ₯Ό μ½μœΌλ©΄μ„œ μ£Όμ–΄μ§„ 쑰건을 λ§Œμ‘±ν•˜λŠ”μ§€ κ²€μ‚¬ν•˜κ³ , μ£Όμ–΄μ§„ 쑰건에 μ‚¬μš© κ°€λŠ₯ν•œ μΈλ±μŠ€λŠ” μ‘΄μž¬ν•˜λ‚˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 인덱슀 μΉΌλŸΌμ„ λ³€ν˜•ν•œ κ²½μš°μ— 인덱슀λ₯Ό μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

  1. μ˜΅ν‹°λ§ˆμ΄μ €μ˜ 취사 선택

쑰건을 λ§Œμ‘±ν•˜λŠ” 데이터가 λ§Žμ€ 경우, κ²°κ³Όλ₯Ό μΆ”μΆœν•˜κΈ° μœ„ν•΄μ„œ ν…Œμ΄λΈ”μ˜ λŒ€λΆ€λΆ„μ˜ 블둝을 μ•‘μ„ΈμŠ€ν•΄μ•Ό ν•œλ‹€κ³  μ˜΅ν‹°λ§ˆμ΄μ €κ°€ νŒλ‹¨ν•˜λ©΄ 쑰건에 μ‚¬μš© κ°€λŠ₯ν•œ μΈλ±μŠ€κ°€ μ‘΄μž¬ν•΄λ„ 전체 ν…Œμ΄λΈ” μŠ€μΊ” λ°©μ‹μœΌλ‘œ 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. κ·Έ λ°–μ˜ 경우 λ³‘λ ¬μ²˜λ¦¬ λ°©μ‹μœΌλ‘œ μ²˜λ¦¬ν•˜λŠ” 경우 λ˜λŠ” 전체 ν…Œμ΄λΈ” μŠ€μΊ” λ°©μ‹μ˜ 힌트λ₯Ό μ‚¬μš©ν•œ κ²½μš°μ— 전체 ν…Œμ΄λΈ” μŠ€μΊ” λ°©μ‹μœΌλ‘œ 데이터λ₯Ό 읽을 수 μžˆμŠ΅λ‹ˆλ‹€.

index scan

리프 λΈ”λŸ­μ€ 인덱슀λ₯Ό κ΅¬μ„±ν•˜λŠ” 칼럼의 데이터와 ν•΄λ‹Ή 데이터λ₯Ό κ°€μ§€κ³  μžˆλŠ” ν–‰μ˜ μœ„μΉ˜λ₯Ό κ°€λ¦¬ν‚€λŠ” λ ˆμ½”λ“œ μ‹λ³„μž(RID) 둜 κ΅¬μ„±λ©λ‹ˆλ‹€. 리프 λΈ”λŸ­μ€ μ–‘λ°©ν–₯ 링크둜써, λ‚΄λ¦Ό, μ˜€λ¦„μ°¨μˆœ 검색을 μ‰½κ²Œν•  수 μžˆμ–΄, '=', '>', between λ“± μ—°μ‚°μžλ‘œ κ²€μƒ‰ν•˜λŠ” 방법에 λͺ¨λ‘ μ ν•©ν•©λ‹ˆλ‹€.

λ§Œμ•½ 37 ~ 50 을 μ°Ύκ³ μžν•œλ‹€λ©΄, λ¨Όμ € 37에 ν•΄λ‹Ήν•˜λŠ” λ¦¬ν”„λΈ”λŸ­μ„ μ°Ύκ³ , μ–‘λ°©ν–₯링크λ₯Ό 톡해 50보닀 큰 값을 λ§Œλ‚ λ•ŒκΉŒμ§€ 였λ₯Έμͺ½μœΌλ‘œ μ΄λ™ν•˜λ©΄μ„œ 인덱슀λ₯Ό μ½μŠ΅λ‹ˆλ‹€. (λ§Œμ•½ μΈλ±μŠ€μ— μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” 칼럼의 값이 ν•„μš”ν•˜λ‹€λ©΄ 읽은 λ ˆμ½”λ“œ μ‹λ³„μžλ‘œ ν…Œμ΄λΈ”μ„ μ—‘μ„ΈμŠ€ν•©λ‹ˆλ‹€.)

SQL λ¬Έμ—μ„œ ν•„μš”λ‘œ ν•˜λŠ” λͺ¨λ“  칼럼이 인덱슀 ꡬ성 μΉΌλŸΌμ— ν¬ν•¨λœ 경우 ν…Œμ΄λΈ”μ— λŒ€ν•œ μ•‘μ„ΈμŠ€λŠ” λ°œμƒν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μΈλ±μŠ€λŠ” 인덱슀 ꡬ성 칼럼의 μˆœμ„œλ‘œ μ •λ ¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 인덱슀의 ꡬ성 칼럼이 A+B 라면 λ¨Όμ € 칼럼 A 둜 μ •λ ¬λ˜κ³  칼럼 A 의 값이 동일할 κ²½μš°μ—λŠ” 칼럼 B 둜 μ •λ ¬λ˜λ©° 칼럼 B κΉŒμ§€ λͺ¨λ‘ λ™μΌν•˜λ©΄ λ ˆμ½”λ“œ μ‹λ³„μžλ‘œ μ •λ ¬λ©λ‹ˆλ‹€. μΈλ±μŠ€κ°€ ꡬ성 칼럼으둜 μ •λ ¬λ˜μ–΄ 있기 λ•Œλ¬Έμ— 인덱슀λ₯Ό κ²½μœ ν•˜μ—¬ 데이터λ₯Ό 읽으면 κ·Έ κ²°κ³Ό λ˜ν•œ μ •λ ¬λ˜μ–΄ λ°˜ν™˜λ©λ‹ˆλ‹€.

인덱슀 μŠ€μΊ”μ€ μΈλ±μŠ€μ— μ‘΄μž¬ν•˜λŠ” λ ˆμ½”λ“œ μ‹λ³„μžλ₯Ό μ΄μš©ν•΄μ„œ κ²€μƒ‰ν•˜λŠ” λ°μ΄ν„°μ˜ μ •ν™•ν•œ μœ„μΉ˜λ₯Ό μ•Œκ³ μ„œ 데이터λ₯Ό μ½μœΌλ―€λ‘œ 인덱슀 μŠ€μΊ” λ°©μ‹μ—μ„œλŠ” λΆˆν•„μš”ν•˜κ²Œ λ‹€λ₯Έ 블둝을 더 읽을 ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ ν•œλ²ˆμ˜ I/O μš”μ²­μ— ν•œ 블둝씩 데이터λ₯Ό μ½λŠ” 반면, ν’€ ν…Œμ΄λΈ” μŠ€μΊ”μ€ 데이터λ₯Ό 읽을 λ•Œ ν•œλ²ˆμ˜ I/O μš”μ²­μœΌλ‘œ μ—¬λŸ¬ 블둝을 ν•œκΊΌλ²ˆμ— μ½μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œ λŒ€μš©λŸ‰ 데이터 μ€‘μ—μ„œ 극히 μΌλΆ€μ˜ 데이터λ₯Ό 찾을 λ•Œ, 인덱슀 μŠ€μΊ” 방식은 인덱슀λ₯Ό μ΄μš©ν•΄ λͺ‡ 번의 I/O 만으둜 μ›ν•˜λŠ” 데이터λ₯Ό μ‰½κ²Œ 찾을 수 μžˆμ§€λ§Œ ν’€ ν…Œμ΄λΈ” μŠ€μΊ”μ€ ν…Œμ΄λΈ”μ˜ λͺ¨λ“  데이터λ₯Ό μ½μœΌλ©΄μ„œ μ›ν•˜λŠ” 데이터λ₯Ό μ°Ύμ•„μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— λΉ„νš¨μœ¨μ μΈ 검색을 ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ°˜λŒ€λ‘œ ν…Œμ΄λΈ”μ˜ λŒ€λΆ€λΆ„μ˜ 데이터λ₯Ό 찾을 λ•ŒλŠ” ν•œ 블둝씩 μ½λŠ” 인덱슀 μŠ€μΊ” 방식 λ³΄λ‹€λŠ” μ–΄μ°¨ν”Ό λŒ€λΆ€λΆ„μ˜ 데이터λ₯Ό 읽을 거라면 ν•œλ²ˆμ— μ—¬λŸ¬ 블둝씩 μ½λŠ” ν’€ ν…Œμ΄λΈ” μŠ€μΊ” 방식이 μœ λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λŠ₯

계정

계성생성

μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ 계정을 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

CREATE USER 'μ‚¬μš©μžλͺ…'@'접속 호슀트 IP' IDENTIFIED BY 'λΉ„λ°€λ²ˆν˜Έ';

λ§Œμ•½ νŠΉμ • 호슀트(111.111.111.111)만 계정에 μ ‘κ·Όκ°€λŠ₯ν•˜κ²Œ ν•˜λ €λ©΄ 'web'@'111.111.111.111' 와 같이 ν•  수 있고, μ•„λ¬΄κ³³μ—μ„œλ‚˜ μ ‘κ·Όκ°€λŠ₯ν•˜κ²Œ ν•˜λ €λ©΄ 'web'@'%' λ₯Ό ν•©λ‹ˆλ‹€. λ˜ν•œ, 'web'@'192.68.%.%' 와 같이 νŠΉμ • λŒ€μ—­ν­μœΌλ‘œ IP λ₯Ό μ„€μ •ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

참고둜 μ‚¬μš©μžλͺ…이 동일해도 IP κ°€ λ‹€λ₯΄λ©΄ λ‹€λ₯Έ κ³„μ •μœΌλ‘œ μ·¨κΈ‰λ©λ‹ˆλ‹€. λ”°λΌμ„œ κΆŒν•œλ„ 각각 λΆ€μ—¬ν•΄μ•Όν•©λ‹ˆλ‹€.

κΆŒν•œλΆ€μ—¬

계정에 따라 μˆ˜ν–‰ν•  수 μžˆλŠ” κΆŒν•œμ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

# μΈμŠ€ν„΄μŠ€ λ ˆλ²¨λ‹¨μœ„
GRANT κΆŒν•œλͺ…, κΆŒν•œλͺ… ON *.* TO 'μ‚¬μš©μžλͺ…'@'접속 호슀트 IP';
# λ°μ΄ν„°λ² μ΄μŠ€ λ ˆλ²¨λ‹¨μœ„
GRANT κΆŒν•œλͺ…, κΆŒν•œλͺ… ON λ°μ΄ν„°λ² μ΄μŠ€λͺ….* TO 'μ‚¬μš©μžλͺ…'@'접속 호슀트 IP';
# 였브젝트 λ ˆλ²¨λ‹¨μœ„
GRANT κΆŒν•œλͺ…, κΆŒν•œλͺ… ON λ°μ΄ν„°λ² μ΄μŠ€λͺ….였브젝트λͺ….* TO 'μ‚¬μš©μžλͺ…'@'접속 호슀트 IP';

μ•„λž˜λŠ” 일반적인 μ˜ˆμ œμž…λ‹ˆλ‹€.

GRANT create, drop ON db1.* to 'web'@'111.111.111.111';
GRANT ALL PRIVILEGES ON *.* TO 'web'@'111.111.111.111';

κΆŒν•œνšŒμˆ˜

μ•„λž˜ λͺ…λ Ήμ–΄λ‘œ κΆŒν•œμ„ νšŒμˆ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

REVOKE κΆŒν•œλͺ…, κΆŒν•œλͺ… ON *.* FROM 'μ‚¬μš©μžλͺ…'@'접속 호슀트 IP';

Replication

Replication 방식

Mysql 의 볡제 방식은 기본적으둜 동기, λΉ„λ™κΈ°λ‘œ λ‚˜λ‰©λ‹ˆλ‹€. 동기 방식은 Master λ…Έλ“œμ— 데이터 변경이 λ°œμƒν•  경우 Slave λ…Έλ“œκΉŒμ§€ λ™μ‹œμ— μ μš©λ˜λŠ” 것을 보μž₯ν•˜λŠ” 방식이며, 비동기 방식은 Master λ…Έλ“œμ˜ λ³€κ²½κ³Ό Slave λ…Έλ“œλ‘œμ˜ 적용이 λ™μ‹œμ— 이루어지지 μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 동기 λ°©μ‹μ˜ 경우 Master λ…Έλ“œμ— μž₯μ• κ°€ 생겨도 Slave λ…Έλ“œλ₯Ό 톡해 μ„œλΉ„μŠ€λ₯Ό μ΄μ–΄κ°ˆ 수 μžˆμ§€λ§Œ, λΉ„λ™κΈ°μ˜ 겨우 데이터 정합성에 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Mysql 의 Replication 은 기본적으둜 λΉ„λ™κΈ°λ‘œ λ™μž‘ν•©λ‹ˆλ‹€. Single point of failure λ₯Ό μ—†μ• λ €λŠ” cluster 와 달리 λ‹¨μˆœνžˆ λ°μ΄ν„°λ§Œ λ³΅μ œν•˜λ©°, λͺ¨λ“  데이터가 λ™κΈ°ν™”λ˜λŠ” cluster 와 달리 동기화가 λΉ„λ™κΈ°μ μœΌλ‘œ λ°œμƒν•©λ‹ˆλ‹€.

cluster 와 λΉ„κ΅ν•˜μ—¬ 동기화도 보μž₯ν•˜μ§€ μ•Šκ³  쿼리λ₯Ό λΆ„μ‚°ν•  μˆ˜λ„ μ—†μ§€λ§Œ, 값을 λ³€κ²½ν•˜κΈ° μœ„ν•΄μ„œ ν΄λŸ¬μŠ€ν„° ꡰ을 μ΄λ£¨λŠ” λ‹€λ₯Έ μ„œλ²„λ“€λ„ 값이 λ³€κ²½λ˜μ—ˆλŠ”μ§€ ν™•μΈν•΄μ•Όν•˜λŠ” cluster 보닀 λΉ λ₯΄κ²Œ 데이터λ₯Ό λ³€κ²½ν•  수 μžˆμ–΄ 쿼리 μ„±λŠ₯이 λΉ λ₯΄λ―€λ‘œ, μ‹€μ‹œκ°„ 동기화가 ν•„μš”μ—†λŠ” 경우 cluster λŒ€μ‹  replication 을 μ‚¬μš©ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ, 쿼리의 μ€‘μš”λ„λ₯Ό νŒλ‹¨ν•˜μ—¬ 맀우 μ€‘μš©ν•œ μΏΌλ¦¬λŠ” Master λ…Έλ“œλ‘œ, μ΄μ™Έμ˜ 읽기 μΏΌλ¦¬λŠ” Slave λ…Έλ“œλ‘œ λΆ„κΈ°μ‹œμΌœμ•Ό ν•©λ‹ˆλ‹€. (보톡 Master 둜 μ“°κΈ° & 읽기, Slave 둜 읽기 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.)

λ™μž‘λ°©μ‹

Master λ…Έλ“±μ—μ„œ λ³€κ²½λ˜λŠ” 데이터에 λŒ€ν•œ 이λ ₯을 Binary log 에 κΈ°λ‘ν•˜λ©΄ Replication Master Thread κ°€ λΉ„λ™κΈ°μ μœΌλ‘œ 이λ₯Ό μ½μ–΄μ„œ slave 에 μ „μ†‘ν•˜κ³  Relay log 에 κΈ°λ‘ν•©λ‹ˆλ‹€.

image

Binary log, Relay log

데이터 볡ꡬλ₯Ό λͺ©μ μœΌλ‘œ Create, Drop λ“±μ˜ DDL κ³Ό Insert, Update λ“±μ˜ DML 이벀트λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. (일반적인 show, select 문은 μ €μž₯λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.) μ•„μΉ΄μ΄λΈŒλœ 데이터가 있고 μ•„μΉ΄μ΄λΈŒ 된 λ‹€μŒμ— λ“€μ–΄μ˜¨ 이벀트λ₯Ό κΈ°λ‘ν•œ Binary log κ°€ 있으면 μ›ν•˜λŠ” μ‹œμ μœΌλ‘œ 데이터λ₯Ό 볡ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ³€κ²½ν•˜λŠ” λͺ¨λ“  μ΄λ²€νŠΈκ°€ μ €μž₯λ˜μ–΄ μžˆμœΌλ―€λ‘œ 이λ₯Ό Slave μ—μ„œ λ‹€μ‹œ μ‹€ν–‰ν•˜λŠ” κ²ƒλ§ŒμœΌλ‘œλ„ λ³΅μ‚¬λœ λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ§Œλ“€μ–΄μ§‘λ‹ˆλ‹€.

λ°”μ΄λ„ˆλ¦¬ 둜그λ₯Ό ν™œμ„±ν™”ν•˜λ©΄ 둜그λ₯Ό μ œμ–΄ν•˜κ³  λ³€κ²½λœ 이벀트λ₯Ό μž‘μ„±ν•΄μ•Ό ν•˜λ―€λ‘œ μ„±λŠ₯이 μ•½κ°„ μ €ν•˜λ©λ‹ˆλ‹€. λ˜ν•œ, replication 을 μ‚¬μš©ν•˜λ©΄ Master λ…Έλ“œμ—μ„œ 둜그λ₯Ό μ½μ–΄κ°€λ―€λ‘œ λ””μŠ€ν¬ I/O 도 λ°œμƒν•˜κ²Œ λ©λ‹ˆλ‹€.

my.cnf μ—μ„œ ν™œμ„±ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

[mysqld]
log-bin=/data dir/base_name

mysqlbinlog ν”„λ‘œκ·Έλž¨μœΌλ‘œ 둜그λ₯Ό 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

Relay log λŠ” Slave 에 μ €μž₯되며 Binary log 와 λ‚΄μš©, 포맷 λͺ¨λ‘ λ™μΌν•©λ‹ˆλ‹€.

Cluster

MySQL Cluster λŠ” 기쑴의 MySQL Replication 의 Master & Slave 의 단점을 λ³΄μ™„ν•˜κ³  보닀 μ•ˆμ „ν•œ μ‹œμŠ€ν…œ κ΅¬ν˜„μ΄ κ°€λŠ₯ν•˜κ²Œ ν•΄μ€λ‹ˆλ‹€. λŒ€μ²΄λ‘œ Cluster 둜 λ¬Άμ—¬μ§„ μ„œλ²„λŠ” Multi Master μ„œλ²„λ‘œ ν™œμš©λ˜μ–΄ μ–΄λŠ μ„œλ²„μ—μ„œ 데이터가 μž…λ ₯, μˆ˜μ •, μ‚­μ œ λ˜λ”λΌλ„ λ‹€λ₯Έ 데이터 μ„œλ²„λ‘œμ˜ 갱신이 μ‹ μ†νžˆ μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

λ˜ν•œ Replication μ—μ„œμ™€λŠ” λ‹€λ₯΄κ²Œ μž₯μ•  λ°œμƒμ‹œ, μž₯μ•  포인트λ₯Ό μΈμ§€ν•˜μ—¬ 슀슀둜 λ³΅μ›ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  μžˆμ–΄ 무정지 DBμ‹œμŠ€ν…œμ„ μ›ν•˜λŠ” κ³ κ°μ—κ²Œ ꢌμž₯ν• λ§Œ ν•©λ‹ˆλ‹€. λ‹€λŸ‰μ˜ 접속이 이루어져 DB μ„œλ²„κ°€ λ‹€μš΄λ˜μ–΄λ„ 또 λ‹€λ₯Έ μ„œλ²„λ‘œ μ„œλΉ„μŠ€λ₯Ό μœ μ§€ν•˜κΈ° μœ„ν•œ μ‹œμŠ€ν…œμœΌλ‘œ 보면 λ©λ‹ˆλ‹€.

νŠΈλžœμž­μ…˜

autocommit

μ—¬λŸ¬ μ€„μ˜ μΏΌλ¦¬μ—μ„œ rollback ν˜Ήμ€ commit 연산을 λ§Œλ‚˜λ©΄ ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ΄ μ’…λ£Œλ©λ‹ˆλ‹€. MySQL 의 κΈ°λ³Έ μŠ€ν† λ¦¬μ§€ 엔진은 InnoDB 둜, 기본적으둜 autocommit (쀄 λ‹¨μœ„ 컀밋) λͺ¨λ“œκ°€ μΌœμ ΈμžˆλŠ” μƒνƒœμ΄λ―€λ‘œ νŠΈλžœμž­μ…˜μ΄ μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ„ 지원받기 μœ„ν•΄μ„œλŠ” autocommit λͺ¨λ“œλ₯Ό false 둜 λ³€κ²½ν•΄μ•Όν•©λ‹ˆλ‹€.

show variables like '%commit%'; // commit λͺ¨λ“œ ν™•μΈν•˜κΈ° 
set @@autocommit=0;               // autocommitλͺ¨λ“œ false둜 λ³€κ²½
show variables like '%commit%';

μœ„ λͺ…령을 톡해 μ„Έμ…˜λ‹¨μ—μ„œ autocommit λͺ¨λ“œλ₯Ό μ‘°μž‘ν•  수 있고, DB 의 κΈ°λ³Έμ„ΈνŒ…μ„ λ³€κ²½ν•˜κΈ° μœ„ν•΄μ„œλŠ” config νŒŒμΌμ„ μž‘μ„±ν•΄μ•Όν•©λ‹ˆλ‹€.

[mysqld]
autocommit=0

DDL

DDL rollback

DDL 은 νŠΈλžœμž­μ…˜ μ•ˆμ—μ„œ μ‹€ν–‰λ˜λ”λΌλ„ λ‘€λ°±λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ‘€λ°± λŒ€μƒμ΄ μ•„λ‹ˆλ―€λ‘œ 항상 autocommit λ©λ‹ˆλ‹€. (https://dev.mysql.com/doc/refman/5.7/en/cannot-roll-back.html)

Todo. Online DDL

μ˜ˆμ „μ˜ DDL 의 경우, μƒˆλ‘­κ²Œ μ •μ˜λœ μŠ€ν‚€λ§ˆλ‘œ 빈 ν…Œμ΄λΈ”μ„ μž‘μ„±ν•œ 후에 데이터λ₯Ό λ³΅μ‚¬ν•˜κ³ , 기쑴의 ν…Œμ΄λΈ”κ³Ό κ΅μ²΄ν•˜λŠ” ν˜•μ‹μœΌλ‘œ μ²˜λ¦¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 이 κ³Όμ •μ—μ„œλŠ” ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ read λŠ” κ°€λŠ₯ν•˜μ§€λ§Œ write λŠ” ν•  수 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

mysql 5.1 의 InnoDB plugin κ³Ό 5.5 μ—λŠ” Fast index creation μ΄λΌλŠ” κΈ°λŠ₯이 μΆ”κ°€λ˜μ–΄, 인덱슀λ₯Ό μΆ”κ°€ν•  λ•Œ μƒˆλ‘œμš΄ μ •μ˜μ˜ ν…Œμ΄λΈ”μ„ μž‘μ„±ν•˜κ³  데이터λ₯Ό μ™„μ „νžˆ λ³΅μ‚¬ν•˜λŠ” λŒ€μ‹  μΈλ±μŠ€λ§Œμ„ μž‘μ„±ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€. 즉, Secondary index 에 λŒ€ν•œ CREATE INDEX λ‚˜ DROP INDEX κ°€ μˆ˜ν–‰λ˜λ„λ‘ μ΅œμ ν™”λ˜μ–΄ 인덱슀 μž‘μ„±μ— 걸리던 μ‹œκ°„μ€ μ§§μ•„μ‘Œμ§€λ§Œ, λ§ˆμ°¬κ°€μ§€λ‘œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 변경은 λΆˆκ°€λŠ₯ν–ˆμŠ΅λ‹ˆλ‹€.

5.6 μ—μ„œλŠ” 온라인 DDL 이 μΆ”κ°€λ˜μ–΄, μ˜¨λΌμΈμ—μ„œ ν…Œμ΄λΈ” μ •μ˜μ˜ 변경이 μ‹€ν–‰ κ°€λŠ₯ν•œ 경우 데이터λ₯Ό λ³΅μ‚¬ν•˜λŠ” μ€‘μ—μ„œλ„ μ°Έμ‘° 뿐 μ•„λ‹ˆλΌ 변경도 κ°€λŠ₯ν•΄μ‘ŒμŠ΅λ‹ˆλ‹€. 단, ALTER TABLE 의 μ‹œμž‘κ³Ό μ’…λ£Œμ‹œμ μ—λŠ” ν…Œμ΄λΈ” μ •μ˜μ˜ 정합성을 μœ„ν•΄ exclusive 처리λ₯Ό ν•˜μ—¬ row lock 이 ν•„μš”ν•œ νŠΈλžœμž­μ…˜κ³ΌλŠ” λ™μ‹œμ— μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€.

Lock

μ•„λž˜μ—μ„œλŠ” μ‹€μ œ lock 은 λ¦¬μ†ŒμŠ€(row, table λ“±)에 λ°œμƒν•˜κ³ , ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•œ νŠΈλžœμž­μ…˜μ€ lock 을 μ·¨λ“ν–ˆλ‹€κ³  ν‘œν˜„ν•©λ‹ˆλ‹€.

Shared lock (LS, Read lock)

읽기 잠금으둜, ν•˜λ‚˜μ˜ λ¦¬μ†ŒμŠ€μ— λŒ€ν•΄ λ™μ‹œμ— 읽을 μˆ˜λŠ” μžˆμ§€λ§Œ 변경은 λΆˆκ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” lock μž…λ‹ˆλ‹€. ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ—μ„œ λ¦¬μ†ŒμŠ€λ₯Ό 읽으렀고 ν•  λ•Œ, λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ—μ„œμ˜ shared lock 은 ν—ˆμš©λ˜μ§€λ§Œ exclusive lock 은 λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€. 즉, λ¦¬μ†ŒμŠ€μ— λŒ€ν•΄ shared lock λΌλ¦¬λŠ” λ™μ‹œμ— μ ‘κ·Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Exclusive lock (LX, Wirte lock)

μ“°κΈ° 잠금으둜, ν•˜λ‚˜μ˜ νŠΈλžœμž­μ…˜μ—μ„œ 데이터λ₯Ό λ³€κ²½ν•  λ•Œ, νŠΈλžœμž­μ…˜μ΄ μ™„λ£Œλ˜κΈ° μ „κΉŒμ§€λŠ” ν•΄λ‹Ή ν…Œμ΄λΈ”μ„ μ½κ±°λ‚˜ μ“°μ§€λͺ»ν•˜κ²Œ ν•©λ‹ˆλ‹€.

ν•œ νŠΈλžœμž­μ…˜μ΄ exclusive lock 을 μ·¨λ“ν•˜λ©΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ shared lock 을 취득할 수 μ—†μŠ΅λ‹ˆλ‹€. ν•œ νŠΈλžœμž­μ…˜μ΄ exclusive lock 을 μ·¨λ“ν•˜λ©΄ ν•΄λ‹Ή ν…Œμ΄λΈ”μ— λŒ€ν•΄ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ€ exclusive lock 을 취득할 수 μ—†μŠ΅λ‹ˆλ‹€.

Metadata lock (이슈)

μ‚¬μš©μ€‘μΈ 였브젝트(table, trigger, event λ“±) μ ‘κ·Όκ³Ό 데이터 일관성을 μœ μ§€ν•˜κΈ° μœ„ν•΄ metadata lock 을 μ‚¬μš©ν•©λ‹ˆλ‹€. νŠΈλžœμž­μ…˜μ΄ μœ μ§€λ˜λŠ” λ™μ•ˆμ— DDL μž‘μ—…μ΄ λ“€μ–΄μ˜€λ©΄ 락이 걸리고, DDL μž‘μ—…μ΄ λŒ€κΈ°ν•˜λŠ” λ™μ•ˆ μ‹ κ·œλ‘œ μœ μž…λœ DML 쿼리 μ—­μ‹œ λŒ€κΈ°μƒνƒœλ‘œ λΉ μ§‘λ‹ˆλ‹€. 이 λ•Œ λŒ€κΈ°μ€‘μΈ 쿼리듀은 "Waiting for table metadata lock" state κ°€ λ©λ‹ˆλ‹€.

즉, autocommit 이 off 일 λ•ŒλŠ” μ–΄λ– ν•œ 쿼리가 μ‹€ν–‰λ˜λ“ μ§€κ°„μ— νŠΈλžœμž­μ…˜μ΄ μ‹œμž‘λ˜κ³  commit ν˜Ήμ€ rollback 이 되기 μ „μ—λŠ” μ‚¬μš©λœ λͺ¨λ“  μ˜€λΈŒμ νŠΈμ— metadata lock 이 μ„€μ •λ˜λ―€λ‘œ DDL 을 μ‹€ν–‰ν•  수 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 항상 λͺ…μ‹œμ μœΌλ‘œ commit/rollback 을 μž‘μ„±ν•˜μ—¬ νŠΈλžœμž­μ…˜μ„ μ’…λ£Œν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.

λΉˆλ„κ°€ 높은 였브젝트일수둝 운영 μ‹œκ°„λŒ€μ— λ³€κ²½ν•˜κΈ° μ–΄λ ΅μ§€λ§Œ μ›ν•œλ‹€λ©΄ metadata lock 을 μž‘λŠ” λͺ¨λ“  μ„Έμ…˜μ„ μ’…λ£Œν•œ 후에 μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

lock_wait_timeout νŒŒλΌλ―Έν„°λ₯Ό λ³„λ„λ‘œ μ„€μ •ν•˜μ—¬ μ„€μ •λœ μ‹œκ°„λ§Œ λŒ€κΈ°ν•˜κ³  DDL μž‘μ—…μ„ μ·¨μ†Œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/

sql_mode=only_full_group_by

Reference