๋ฐ์ํ
- ์ ๊ธ์ ๋ ๋ฒจ
- MySQL ๋ ๋ฒจ์ ์ ๊ธ
- ๋ชจ๋ ์คํ ๋ฆฌ์ง ์์ง์ ์ํฅ์ ๋ฏธ์นจ
- ํ ์ด๋ธ ๋ฝ ์ธ์๋ ๋ฉํ๋ฐ์ดํฐ ๋ฝ(ํ ์ด๋ธ ๊ตฌ์กฐ ์ ๊ธ), ๋ค์๋ ๋ฝ ๋ฑ ๊ธฐ๋ฅ ์ ๊ณต
- ์คํ ๋ฆฌ์ง ์์ง ๋ ๋ฒจ์ ์ ๊ธ
- ์คํ ๋ฆฌ์ง ์์ง ๊ฐ ์ํธ ์ํฅ ์์
- 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 ์ฉ์ด ์ฐธ๊ณ
๋ฐ์ํ