๐Ÿ“š Databases/RealMySQL 8.0

5.2 MySQL ์—”์ง„์˜ ์ž ๊ธˆ

iseunghan 2023. 2. 28. 21:49
๋ฐ˜์‘ํ˜•

 

  • ์ž ๊ธˆ์˜ ๋ ˆ๋ฒจ
    • MySQL ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ
      • ๋ชจ๋“  ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„์— ์˜ํ–ฅ์„ ๋ฏธ์นจ
      • ํ…Œ์ด๋ธ” ๋ฝ ์™ธ์—๋„ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ(ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ์ž ๊ธˆ), ๋„ค์ž„๋“œ ๋ฝ ๋“ฑ ๊ธฐ๋Šฅ ์ œ๊ณต
    • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๋ ˆ๋ฒจ์˜ ์ž ๊ธˆ
      • ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ๊ฐ„ ์ƒํ˜ธ ์˜ํ–ฅ ์—†์Œ

5.2.1 Global Lock(๊ธ€๋กœ๋ฒŒ ๋ฝ)

DML(Data Manipulation Language, ๋ฐ์ดํ„ฐ ์กฐ์ž‘์–ด)๋ž€?

  • ์ •์˜๋œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ž…๋ ฅ๋œ ๋ ˆ์ฝ”๋“œ๋ฅผ ์กฐํšŒ, ์ˆ˜์ •, ์‚ญ์ œ ๋“ฑ์˜ ์—ญํ• ์„ ํ•˜๋Š” ์–ธ์–ด
  • SELECT INSERT UPDATE DELETE

DDL(Data Definition Language, ๋ฐ์ดํ„ฐ ์ •์˜์–ด)๋ž€?

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ์–ธ์–ด (๋ฐ์ดํ„ฐ ์ „์ฒด์˜ ๊ณจ๊ฒฉ์„ ๊ฒฐ์ •)
  • CREATE ALTER DROP TRUNCATE
  • FLUSH TABLES WITH READ LOCK ๋ช…๋ น์œผ๋กœ ํš๋“
  • MySQL์—์„œ ์ œ๊ณตํ•˜๋Š” ์ž ๊ธˆ ๊ฐ€์šด๋ฐ ๊ฐ€์žฅ ๋ฒ”์œ„๊ฐ€ ํผ
  • ํ•œ ์„ธ์…˜์—์„œ ๊ธ€๋กœ๋ฒŒ ๋ฝ ํš๋“ ์‹œ,
    • ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ SELECT๋ฅผ ์ œ์™ธํ•œ ๋Œ€๋ถ€๋ถ„์˜ DDL, DML ๋ฌธ์žฅ ์‹คํ–‰์ด ๋Œ€๊ธฐ์ƒํƒœ๋กœ ๋‚จ์Œ
  • ๊ธ€๋กœ๋ฒŒ ๋ฝ์˜ ์˜ํ–ฅ ๋ฒ”์œ„ : MySQL ์„œ๋ฒ„ ์ „์ฒด
    • ์ž‘์—… ๋Œ€์ƒ ํ…Œ์ด๋ธ”์ด๋‚˜ DB๊ฐ€ ๋‹ค๋ฅด๋”๋ผ๋„ ๋™์ผํ•˜๊ฒŒ ์˜ํ–ฅ
  • MySQL 8.0 ์ดํ›„
    • InnoDB ๊ธฐ๋ณธ ์ŠคํŠธ๋ฆฌ์ง€ ์—”์ง„ ์ฑ„ํƒ
    • Backup Lock(๋ฐฑ์—… ๋ฝ) ๋„์ž…
      • Xtrabackup์ด๋‚˜ Enterprise Backup๊ณผ ๊ฐ™์€ ๋ฐฑ์—… ํˆด๋“ค์˜ ์•ˆ์ •์  ์‹คํ–‰์„ ์œ„ํ•œ ๋ฐฑ์—… ๋ฝ ๋„์ž…
    • ์ฝ”๋“œ
    mysql> LOCK INSTANCE FOR BACKUP;
    -- // ๋ฐฑ์—… ์‹คํ–‰
    mysql> UNLOCK INSTANCE;
    • ํŠน์ • ์„ธ์…˜์—์„œ ๋ฐฑ์—… ๋ฝ ํš๋“ ์‹œ, ๋ชจ๋“  ์„ธ์…˜์—์„œ ๋‹ค์Œ ์ •๋ณด๋Š” ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€
      • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐ ํ…Œ์ด๋ธ” ๋“ค ๋ชจ๋“  ๊ฐ์ฒด ์ƒ์„ฑ ๋ฐ ๋ณ€๊ฒฝ, ์‚ญ์ œ
      • REPAIR TABLE๊ณผ OPTIMIZE TABLE ๋ช…๋ น
      • ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
    • ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ํ…Œ์ด๋ธ”์˜ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์€ ํ—ˆ์šฉ
    • ๋ฐฑ์—…์˜ ์‹คํŒจ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ DDL ๋ช…๋ น์ด ์‹คํ–‰๋˜๋ฉด ๋ณต์ œ๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•˜๋Š” ์—ญํ• 

5.2.2 Table Lock(ํ…Œ์ด๋ธ” ๋ฝ)


  • ๊ฐœ๋ณ„ ํ…Œ์ด๋ธ” ๋‹จ์œ„๋กœ ์„ค์ •๋˜๋Š” ์ž ๊ธˆ
  • ๋ช…์‹œ์  ๋˜๋Š” ๋ฌต์‹œ์ ์œผ๋กœ ํŠน์ • ํ…Œ์ด๋ธ” ๋ฝ ํš๋“ ๊ฐ€๋Šฅ
  • ๋ช…์‹œ์ ์œผ๋กœ ํš๋“ํ•œ ํ…Œ์ด๋ธ” ๋ฝ
    • LOCK TABLES table_name [READ | WRITE] ๋ช…๋ น์œผ๋กœ ํŠน์ • ํ…Œ์ด๋ธ” ๋ฝ ํš๋“
    • UNLOCK TABLES : ์ž ๊ธˆ ๋ฐ˜๋‚ฉ(ํ•ด์ œ)
    • ๊ธ€๋กœ๋ฒŒ ๋ฝ๊ณผ ๋™์ผํ•˜๊ฒŒ ์˜จ๋ผ์ธ ์ž‘์—…์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ๋ฏธ์นจ
  • ๋ฌต์‹œ์ ์ธ ํ…Œ์ด๋ธ” ๋ฝ
    • ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ž๋™์œผ๋กœ ํš๋“๋๋‹ค๊ฐ€ ์ฟผ๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋˜๊ณ  ์ž๋™ ํ•ด์ œ
    • ํ•˜์ง€๋งŒ InnoDB ํ…Œ์ด๋ธ”์€ ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ฐจ์›์—์„œ ๋ ˆ์ฝ”๋“œ ๊ธฐ๋ฐ˜์˜ ์ž ๊ธˆ ์ œ๊ณต
      • ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์ฟผ๋ฆฌ๋กœ ์ธํ•ด ๋ฌต์‹œ์ ์ธ ํ…Œ์ด๋ธ” ๋ฝ์ด ์„ค์ •๋˜์ง€ ์•Š์Œ
      • ํ…Œ์ด๋ธ” ๋ฝ์ด ์„ค์ •์€ ๋˜์ง€๋งŒ DDL์˜ ๊ฒฝ์šฐ์—๋งŒ ์˜ํ–ฅ

5.2.3 Named Lock(๋„ค์ž„๋“œ ๋ฝ)


  • ๋‹จ์ˆœํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ํš๋“ํ•˜๊ณ  ๋ฐ˜๋‚ฉํ•˜๋Š” ์ž ๊ธˆ
  • ์‚ฌ์šฉ์ฒ˜
    • ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ƒํ˜ธ ๋™๊ธฐํ™”๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ
    • ๋งŽ์€ ๋ ˆ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋ณต์žกํ•œ ์š”๊ฑด์œผ๋กœ ๋ ˆ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํŠธ๋žœ์žญ์…˜์ผ ๊ฒฝ์šฐ
  • MySQL 8.0 ์ดํ›„, ๋„ค์ž„๋“œ ๋ฝ ์ค‘์ฒฉ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
    • ํ•œ ๋ฒˆ์— ๋ฝ ํ•ด์ œ๋„ ๊ฐ€๋Šฅ
  • ์ฝ”๋“œ
// mylock ์ด๋ผ๋Š” ๋ฌธ์ž์—ด ์ž ๊ธˆ ๊ด€๋ จ ์ฝ”๋“œ
mysql> SELECT GET_LOCK('mylock', 2); // ์ž ๊ธˆ ์‚ฌ์šฉ์ค‘์ผ ๊ฒฝ์šฐ, 2์ดˆ ๋Œ€๊ธฐ
mysql> SELECT IS_FREE_LOCK('mylock'); // ํ•ด๋‹น ๋ฌธ์ž์—ด์˜ ์ž ๊ธˆ ์„ค์ • ํ™•์ธ
mysql> SELECT RELEASE_LOCK('mylock'); // ์ž ๊ธˆ ๋ฐ˜๋‚ฉ(ํ•ด์ œ)
// 2๊ฐœ ์ด์ƒ์˜ ๋„ค์ž„๋“œ ๋ฝ ์‚ฌ์šฉ ๊ฐ€๋Šฅ (MySQL 8.0 ์ดํ›„)
mysql> SELECT GET_LOCK('mylock_1', 10);
mysql> SELECT GET_LOCK('mylock_2', 10);
mysql> SELECT RELEASE_ALL_LOCK();  // ๋ชจ๋“  ๋„ค์ž„๋“œ ๋ฝ ํ•ด์ œ

5.2.4 Metadata Lock(๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฝ)


  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ์ฒด(ํ…Œ์ด๋ธ”, ๋ทฐ ๋“ฑ)์˜ ์ด๋ฆ„์ด๋‚˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ์— ์ž ๊ธˆ ํš๋“
    • ๋ช…์‹œ์ ์œผ๋กœ ํš๋“ํ•˜๊ฑฐ๋‚˜ ํ•ด์ œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ์•„๋‹˜
    • RENAME TABLE ๋ช…๋ น๊ณผ ๊ฐ™์ด ํ…Œ์ด๋ธ” ์ด๋ฆ„ ๋ณ€๊ฒฝ ์‹œ, ์ž๋™ ํš๋“
    • RENAME TABLE ๋ช…๋ น์€ ์›๋ณธ ์ด๋ฆ„๊ณผ ๋ณ€๊ฒฝ ์ด๋ฆ„ ๋ชจ๋‘ ์ž ๊ธˆ ์„ค์ •
  • ํ•œ ์„ธ์…˜์—์„œ ํŠธ๋žœ์žญ์…˜์„ ๋ช…์‹œ์ ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ ์ค‘
    • ๋‹ค๋ฅธ ์„ธ์…˜์—์„œ ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ฒŒ ๋˜๋ฉด Metadata Lock ์œผ๋กœ ๋Œ€๊ธฐ๋ฅผ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
-- Session 1
select CONNECTION_ID();
+-----------------+
| CONNECTION_ID() |
+-----------------+
|               4 |
+-----------------+
<-- Session 1์˜ Process ID ๋Š” 4 ๋กœ ํ™•์ธ๋จ

-- ํŠธ๋žœ์žญ์…˜ ์‹œ์ž‘
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_info;
+----+------+
| id | name |
+----+------+
|  1 | jade |
|  2 | Tom  |
+----+------+
2 rows in set (0.00 sec)

-- Session 2 : ์ปฌ๋Ÿผ ์ถ”๊ฐ€ ์‹œ๋„
mysql> alter table user_info add column col2 varchar(100);
<!!--- ๋ฝ ํš๋“ ์‹คํŒจ ๋ฐ ๋ฝ์— ์˜ํ•ด ๋Œ€๊ธฐ์ค‘

-- Session 1 : Full processlist
mysql> show full processlist;
+----+------------+------+------+---------------------------------+----------------------------------------------------+
| Id | User       | db   | Time | State                           | Info                                               |
+----+------------+------+------+---------------------------------+----------------------------------------------------+
|  2 | system user| NULL | 1321 | Connecting to master            | NULL                                               |
|  4 | root       | npm  |    0 | starting                        | show full processlist                              |
|  8 | root       | npm  |   10 | Waiting for table metadata lock | alter table user_info add column col2 varchar(100) |
+----+------------+------+------+---------------------------------+----------------------------------------------------+
<!!-- Metadata lock ์— ์˜ํ•ด Session 2๊ฐ€ ๋Œ€๊ธฐ ํ•˜๋Š” ์ƒํ™ฉ

์ฐธ๊ณ ์‚ฌ์ดํŠธ

  • MySQL ํŠธ๋žœ์žญ์…˜๊ณผ ์ž ๊ธˆ ์ฐธ๊ณ 

MySQL - ํŠธ๋žœ์žญ์…˜ ๊ณผ ์ž ๊ธˆ (1) - Real MySQL 8.0

  • DDL, DML, DCL ์šฉ์–ด ์ฐธ๊ณ 

DDL, DML, DCL ์ด๋ž€?

๋ฐ˜์‘ํ˜•