2025. 3. 16. 15:10γDatabase
μλΉμ€κ° 컀μ§μ λ°λΌ λ€μν κΈ°λ₯λ€μ΄ μΆκ°λκ³ , μ΄μ λ°λΌ μλΉμ€ λ·νΈμμλ λΉμ¦λμ€ λ‘μ§ λΏ μλλΌ DBκΉμ§ μλ§μ λ³κ²½μ λ€μ΄ μ겨λ©λλ€.
μ΄ λλ§λ€ μλΉμ€ μ€λ¨ κ³΅κ³ λ₯Ό λ΄μ μ¬μ©μ νΈλν½μ μμ² μ°¨λ¨νκ³ ν¨μΉλ₯Ό μ§ννλ€λ©΄ κ°λ°μ μ μ₯μμλ νΈν μ§ λͺ°λΌλ, μ€λ¨λ λ§€ μμ μ΄ μΌμ’ μ μμ€λ‘ λ³Ό μ μμ΄ μ½κ² μκ°ν λ¬Έμ λ μλλλ€.
μ¦, μλΉμ€μ κ΄μ μμλ νΌμΉλͺ»ν κ²½μ°λ₯Ό μ μΈνλ©΄ 무μ€λ¨μΌλ‘ κΈ°λ₯μ΄ μΆκ°λλ νΈμ΄ λ λμμ΄ λ리λΌλ κ²μ μλͺ ν©λλ€.
νμ§λ§ 무μ€λ¨ λ°°ν¬λ₯Ό νκ³ μΆλ€κ³ 무쑰건 ν μ μλ κ²μ μλλλ€. DB λ μ΄μ΄μ λ³κ²½μ μ μ©νλ€λ³΄λ©΄ λΉμ μ€νλκ³ μλ νΈλμμ μ Blockingμ΄ λ μλ, νΉμ μμ λ¬Έμ κ° λ°μν΄ μ’ λ£κ° λ μ μμ΅λλ€. μ΄λ¬ν κ²½μ° μ μ μ μλΉμ€ μ΄μ©μ λ¬Έμ κ° μλ κ²μ΄κΈ° λλ¬Έμ, μ€νλ € μλΉμ€ μ€λ¨μ μ¬μ μ 곡μ§νκ³ μ€λ¨ λ°°ν¬λ₯Ό νλ κ²λ³΄λ€ λ ν° λ¬Έμ κ° λ μ μμ΅λλ€.
λ°λΌμ DB λ 벨μ λ³κ²½μ λ€μ μ€μ μ μ©ν λμλ μ΅λν λΌμ΄λΈ μλΉμ€μ μν₯μ΄ κ°μ§ μλ λ°©λ²μ μμλ΄κ³ μ μ©ν΄μΌν©λλ€.
μ μ κ²½μ°μ μ΅κ·Ό 무μ€λ¨ λ°°ν¬μμ DDLμ μ€ννλ λμ€ λͺλͺμ μ μ νΈλμμ μ΄ λ€μ μλ¬λ₯Ό λ±μΌλ©° μ€ν¨νλ μν©μ κ²ͺμμ΅λλ€.
ERROR 1412 (HY000): Table definition has changed, please retry transaction
μ΄ λ¬Έμ λ₯Ό κ²ͺκ³ λ λ€, ν΄λΉ μ£Όμ μ λν΄ κ²½κ°μ¬μ κ°κ² λμκ³ μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ νμ΅ν λ΄μ©λ€μ λ€λ€λ³΄λ €κ³ ν©λλ€. μ΄ κΈμμλ MySQL Online DDLμ κ°λ , μκ³ λ¦¬μ¦ μ νκ³Ό μ κΈ λ°©μ, 무μ€λ¨ λ°°ν¬λ₯Ό μν μ λ΅, κ·Έλ¦¬κ³ μΈλ ν€ μ μ½ μ‘°κ±΄ μΆκ° μ λ°μν μ μλ λ¬Έμ μ ꡬ체μ μΈ ν΄κ²°μ± κΉμ§ ν¬κ΄μ μΌλ‘ λ€λ£¨κ² μ΅λλ€.
DDL Algorithm, Lock
Mysql 8λ²μ λΆν°λ DDL μ€ν λμ€μλ μλΉμ€μ μ€λ¨μ μ΄ μ΅μνλ μ μλλ‘ Online DDLμ΄ λμ λμμ΅λλ€.
μ΄μ κΉμ§λ μ΄ μν©μμ ptoscμ κ°μ κΈ°μ μ μ΄μ©νμ¬ μ΄ λ¬Έμ λ€μ νμμΌλ, μ΄μ λ λλΆλΆμ μΌμ΄μ€μμ Mysqlμ΄ μ§μ μ΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μκ² λ κ²μ λλ€. (Mysql Online DDLμ΄ λ¬Έμ λ₯Ό ν΄κ²°νμ§ λͺ»νλ μΌμ΄μ€: https://medium.com/daangn/mysql-online-ddl-faf47439084c)
Mysql Online DDLμμλ ALTER TABLE λ¬Έμ΄ λ°μνλ©΄, μ΅μνμ μλΉμ€ μν₯λλ₯Ό κ°λ DDL μκ³ λ¦¬μ¦, λ½μ μ ννλ κ³Όμ μ κ±°μΉ©λλ€.
μ΄ λ μ μ©λ μ μλ μκ³ λ¦¬μ¦κ³Ό λ½μ μ’ λ₯λ μλμ κ°μ΅λλ€.
- Algorithm
- INSTANT
- Mysql 8λ²μ μμ μ κ· λμ λμμΌλ©° λͺ©ν ν μ΄λΈ λ΄ λ°μ΄ν°μλ μ ν μν₯μ λ―ΈμΉμ§ μκ³ , ν΄λΉ ν μ΄λΈμ λ©νλ°μ΄ν°λ§μ λ³κ²½ν λ€ μ’ λ£λλ λ°©μμΌλ‘ λμ
- μ€ν μλκ° λ§€μ° λΉ λ₯΄λ©° μλΉμ€μ κ±°μ μν₯μ μ£Όμ§ μμ
- λ€λ§ λ§€μ° μ νμ μΌλ‘ μ¬μ© κ°λ₯ (ex. ν μ΄λΈμ λλΆλΆμ μΉΌλΌ μΆκ°, μΉΌλΌ κΈ°λ³Έκ° μμ , ν μ΄λΈ μ΄λ¦ λ³κ²½)
- INPLACE
- λͺ©ν ν μ΄λΈμ λν΄, DDL μμ νμ΄μ¦μ μ’ λ£ νμ΄μ¦μ μ§§κ² λ½μ΄ 걸리μ§λ§ κ·Έ μΈ μ€ν λμ€μλ μ½κΈ° μμ κ³Ό μ°κΈ° μμ μ΄ λͺ¨λ κ°λ₯ν λ°©μ
- μλ³Έ ν μ΄λΈμ 볡μ νκ³ λ³΅μ λ³Έμ μμ μ κ°νλ COPY λ°©μκ³Όλ λ¬λ¦¬, INPLACE λ°©μμ μλ³Έ ν μ΄λΈ μ체μ Mysql νμ΄μ§ λ¨μλ‘ μ κ·Όνμ¬ μ€ν€λ§ μμ μ κ°ν¨
- DDL λμ μ€ λ°μνλ DMLμ μ°μ online_alter_logμ μ μ₯λκ³ , μ€ν€λ§ μμ μ΄ μλ£λ μ§νμ μ€μ ν μ΄λΈμ λ°μ
- μ΄ λ online_alter_log μ μ₯μκ° κ°λμ°° κ²½μ°, DDLμ΄ μ€ν¨νκΈ° λλ¬Έμ μ΄ κ²½μ°μ 128MBλ‘ κΈ°λ³Έ μ€μ λ innodb_online_alter_log_max_size κ°μ ν€μμΌ ν¨. (μΈμ λ³ μμ κ°λ₯)
- COPY
- μ€ν€λ§ λ³κ²½μ μ΄ μ μ©λ ν μ΄λΈμ μλ‘ μμ±νκ³ κΈ°μ‘΄ λ°μ΄ν°λ₯Ό μΌκ΄ 볡μ ν μ΅μ’ μ μΌλ‘ RENAMEνμ¬ μλ‘μ΄ μλ³Έ ν μ΄λΈμ΄ λλλ‘ νλ λ°©μ
- μ΄ κ²½μ° DDL μ€ν μ€ μ½κΈ° μμ λ§ νμ©λ¨
- INSTANT
- Lock
- NONE
- μλ¬΄λ° μ κΈμ΄ λ°μνμ§ μμ
- SHARED
- μ½κΈ° μμ λ§ νμ©νλ μ κΈ λ°μ
- EXCLUSIVE
- μ½κΈ°, μ°κΈ° λͺ¨λ λΆκ°λ₯ν μ κΈ λ°μ
- NONE
무μ€λ¨ λ°°ν¬λ₯Ό μν΄μλΌλ©΄?
무μ€λ¨ λ°°ν¬λ₯Ό 보μ₯νκΈ° μν΄μλ SELECT, INSERT, UPDATE λ¬Έμ λͺ¨λ 보μ₯νλ Algorithm = INPLACE, Lock = NONE
μ‘°ν©μΌλ‘ DDLμ μνν μ μμ΄μΌ ν©λλ€.
νμ¬ μ μ©ν΄μΌνλ DDLμ΄ μ΄λ€ μκ³ λ¦¬μ¦κ³Ό λ½μ νμλ‘ νλμ§ λͺ¨λ₯΄κ² λ€λ©΄ μ°μ ALTER TABLE ~ , Algorithm = INSTANT
λ‘ ν
μ€νΈ νκ²½μμ μ€νν΄λ³΄κ³ , ν΄λΉ μκ³ λ¦¬μ¦μΌλ‘ DDLμ μννλ κ²μ΄ λΆκ°λ₯νλ€κ³ μλ¬κ° λλ€λ©΄ κ·Έ ν ALTER TABLE ~ , Algorithm = INPLACE, Lock = NONE
μΌλ‘ μ€νν΄λ³΄λ©΄ λ©λλ€. λ§μ½ μ΄μ‘°μ°¨λ λΆκ°λ₯νλ€λ©΄ μ€λ¨ λ°°ν¬λ₯Ό κ³ λ €ν΄λ΄μΌ ν©λλ€.
λ¬Όλ‘ Mysql 곡μλ¬Έμμμλ κ° DDLμ΄ μ΄λ€ μκ³ λ¦¬μ¦μΌλ‘ λμνλμ§μ Online DDLμ μν΄ κ³ λ €ν΄μΌν λΆλΆλ€μ μ 리νκ³ μμ΅λλ€. (https://dev.mysql.com/doc/refman/8.4/en/innodb-online-ddl-operations.html μ°Έμ‘°)
무μ€λ¨μΌλ‘ FK μΆκ°νκΈ° (Feat. ERROR 1412 (HY000): Table definition has changed, please retry transaction)
λ€μ μλ‘ μμ μΈκΈν μλ¬λ‘ λμμ, μ΄ λ¬Έμ λ₯Ό νμ¬λ μ΄λ»κ² ν΄κ²°νλμ§ μ€λͺ νλ©° ν΄λΉ κΈμ λ§μΉκ² μ΅λλ€.
μλ¬κ° λ°μν λΉμμ μν©μ μ‘°κΈ λ μ€λͺ νμλ©΄, λΌμ΄λΈ Mysql DBμ μ κ· κΈ°λ₯μ μν μΌλ ¨μ DDLλ€μ μ€νν΄μΌνλ μν©μ΄μμ΅λλ€. μ¬κΈ°μλ μ κ· ν μ΄λΈμ μΆκ° λ° κΈ°μ‘΄ ν μ΄λΈλ‘μ FK μ°Έμ‘° μΆκ°κ° ν¬ν¨λμ΄ μμμ΅λλ€. μ λ DDLμ μ€ννκ³ μ΄λ μΌλ§ μκ° μ±κ³΅νμ§λ§, λ§μ μ ν¬ μλ² λ‘κ·Έμλ λͺλͺμ μμ²μ΄ ν΄λΉ μλ¬λ₯Ό λ±μΌλ©° μ€ν¨ν κ²μ νμΈνμ΅λλ€.
μ΄μ μλ ν΄λΉ μλ¬λ₯Ό λ³Έ μ μ΄ μ΄λ―Έ μμμ΄μ, μ λ λΉμμλ μ΄λ€ DDLμ΄ μ€νλμλμ§ νμΈν΄λ³΄μκ³ κ·Έ λμλ 'μ κ· ν μ΄λΈ μΆκ° > κΈ°μ‘΄ ν μ΄λΈμ λν FK μ°Έμ‘° μ μ½ μμ±'μ ν¨ν΄μ΄ μ‘΄μ¬νμλ€λ κ²μ μ μ μμμ΅λλ€.
FKλ₯Ό μΆκ°νλ μμ
μ κΈ°λ³Έμ μΌλ‘ Algorithm = COPY, LOCK = SHARED
λ‘ λμνκΈ° λλ¬Έμ νμ°μ μΌλ‘ λ³λμ ν
μ΄λΈμ΄ μλ‘ μ겨λκ³ , μ΄λ‘ μΈν΄ νΈλμμ
μμ μ΅μ΄ μ°Έμ‘°νλ ν
μ΄λΈμ ꡬ쑰μλ λ¬λΌμ Έλ²λ¦¬κΈ° λλ¬Έμ λ°μν©λλ€.
μ¬κΈ°κΉμ§ νμ ν λ€ 'κ·ΈλΌ FKκ° μΆκ°λλ μν©μλ λ§€λ² μ€λ¨ λ°°ν¬λ₯Ό ν΄μΌνλ건κ°'λΌλ μκ°μ μ κΉ νμ§λ§, μ κ° νμ¬ κ°λ°νκ³ μλ μλΉμ€μ μλͺ μ£ΌκΈ°λ₯Ό μκ°νμ λ κ·Έλ¬κΈ°μ μ½μ§ μλ€κ³ νλ¨νκ³ λ€λ₯Έ λ°©λ²μ κ°κ΅¬νμ΅λλ€.
μ΅μ’
μ μΌλ‘ λ°κ²¬ν ν΄κ²°μ±
μ DDL μΈμ
μ νμ ν΄μ foreign_key_checks
μ΅μ
μ κΊΌλ²λ¦¬λ κ²μ
λλ€. Mysql 곡μλ¬Έμμλ μλμ²λΌ μ€λͺ
νκ³ μμ΅λλ€. (κ²°κ΅ κ³΅μλ¬Έμμ λ΅μ΄ μλ€λ...)
The INPLACE algorithm is supported when foreign_key_checks is disabled. Otherwise, only the COPY algorithm is supported.
λ¬Όλ‘ νΉμλ FK μ²΄ν¬ μ μ½μ κΊΌλ²λ¦¬λ©΄ λ¬΄μ¨ μλ―Έκ° μλλκ³ ν μ μμ§λ§ foreign_key_checks
μ΅μ
μ μΈμ
λ 벨μμ μ μ΄κ° κ°λ₯ν΄μ λΌμ΄λΈ μλΉμ€μμλ μ¬μ ν FK μ μ½μ΄ μ λμν κ²μ΄λ©° 'μ κ· ν
μ΄λΈμ μμ±νκ³ μ΄λ₯Ό κΈ°μ‘΄ ν
μ΄λΈκ³Ό μ°κ²°νλ μν©'μμλ μ μ΄μ μλ² λ‘μ§μ΄ λ°°ν¬λκΈ° μ κΉμ§λ μ κ· ν
μ΄λΈμ λ°μ΄ν°κ° μ‘΄μ¬νμ§ μμ κ²μ΄κΈ° λλ¬Έμ λ¬Έμ κ° μλ€κ³ νλ¨νμ΅λλ€. (λ€λ§ κΈ°μ‘΄μ μ‘΄μ¬νλ ν
μ΄λΈλ€ κ°μ FK μ μ½ μΆκ° μΌμ΄μ€μμλ μ¬μ©ν μ μλλ°, μ΄ κ²½μ°λ μ μ΄μ ν
μ΄λΈ μ€κ³ λ 벨μμ μλͺ»λ μΌμ΄μ€μ΄κΈ°λ νκ³ κ±°μ μ‘΄μ¬νμ§ μλ μΌμ΄μ€μ΄κΈ° λλ¬Έμ μ΄λμ λ λ°°μ λμμ΅λλ€. μ΄ λ μ΄μ© μ μμ΄ μ€λ¨ λ°°ν¬λ₯Ό ν΄μΌλμ§ μμμ§...)
μ€μ μ€νλλ 쿼리λ μλμ κ°μ΅λλ€.
SET SESSION foreign_key_checks = 0;
ALTER TABLE ... ADD FOREIGN KEY ..., Algorithm = INPLACE, LOCK = NONE;
SET SESSION foreign_key_checks = 1;
Mysql Online DDL Checker (250324 μΆκ°)
ν΄λΉ κΈμ μμ±ν λ€, Mysql Online DDLμ μκ³ λ¦¬μ¦κ³Ό λ½μ νμΈνλ λ°©λ²μ΄ λ무 λ²κ±°λ‘λ€λ μκ°μ λ¨μΉ μ μμμ΅λλ€. κ·Έλμ κ·Έλ₯ μ§μ κ°λ°νμ¬ μ€νμμ€λ‘ λ°°ν¬ν΄λ³΄λ©΄ μ΄λ¨κΉ μκ°νκ³ μλ νλ‘μ νΈλ₯Ό μ§ννμ΅λλ€.
https://github.com/One-armed-boy/mysql-ddl-checker
ν΄λΉ ν¨ν€μ§λ₯Ό npmμ ν΅ν΄ λ΄λ €λ°μλ€λ©΄, λ£¨νΈ κ²½λ‘μ μ€μ νμΌμ μΈν νκ³ μλμ²λΌ λͺ λ Ήμ΄λ₯Ό μννκΈ°λ§ νλ©΄ λ©λλ€. (νμΌ μΈν λ²μ 리λλ―Έλ₯Ό μ°Έμ‘°ν΄μ£ΌμΈμ.)
npx mysql-ddl-checker "ALTER TABLE users ADD COLUMN email VARCHAR(255)"
(κΈνκ² μμ±ν΄λ³Έ νλ‘μ νΈλΌ λΆμ‘±ν λΆλΆλ λ§κ³ μμ§ λͺ¨λ DDLμ 컀λ²νμ§ λͺ»ν μ μμ΄μ νΈνκ² μ΄μ μ 보λ κΈ°μ¬ν΄μ£Όμ λ λ©λλ€.)
'Database' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
λ μ½λ λλ€ μ‘°νλ₯Ό ν΅ν λκ΄μ λ½ μ±λ₯ κ°μ κΈ° (with μ¬μ΄λ νλ‘μ νΈ) (1) | 2024.05.02 |
---|---|
Database PK μμ± μ λ΅ (without DB, Mysql) (3) | 2024.03.17 |
νμ΄μ§λ€μ΄μ λ°©λ²λ‘ λΉκ΅(Offset vs Cursor) (0) | 2024.02.17 |
JOINμ μ λ§ λλ¦°κ° (μμ κ·ν) (0) | 2024.01.07 |
Slow Query νμΈλ² (in Mysql, Postgresql) (0) | 2023.12.13 |