|
| 1 | +# DB λ§μ΄κ·Έλ μ΄μ
μ€ν κ°μ΄λ |
| 2 | + |
| 3 | +## π λ§μ΄κ·Έλ μ΄μ
νμΌ λͺ©λ‘ |
| 4 | + |
| 5 | +``` |
| 6 | +src/main/resources/db/migration/ |
| 7 | +βββ V2__align_pk_and_fk_types.sql (PK/FK bigint ν΅μΌ) |
| 8 | +βββ V3__convert_varchar_to_enum.sql (varchar β enum λ³ν) |
| 9 | +βββ V4__add_constraints_and_defaults.sql (μ μ½μ‘°κ±΄ λ° κΈ°λ³Έκ°) |
| 10 | +``` |
| 11 | + |
| 12 | +## π μ€ν μμ |
| 13 | + |
| 14 | +### 1οΈβ£ μ¬μ μ€λΉ (νμ) |
| 15 | + |
| 16 | +#### β
μ€λ
μ· νμΈ |
| 17 | +- [ ] Dev DB μ€λ
μ· μμ± μλ£ |
| 18 | +- [ ] Prod DB μ€λ
μ· μμ± μλ£ (μ€μ λ°°ν¬ μ ) |
| 19 | + |
| 20 | +#### β
λ°μ΄ν° κ²μ¦ (νμ) |
| 21 | +```bash |
| 22 | +# varchar λ°μ΄ν°κ° Enumκ³Ό μΌμΉνλμ§ κ²μ¦ |
| 23 | +./run_validation.sh |
| 24 | +``` |
| 25 | + |
| 26 | +**μ€μ:** κ²μ¦ κ²°κ³Όκ° λΉμ΄μμ΄μΌ μ μ (λΆμΌμΉ λ°μ΄ν° μμ) |
| 27 | + |
| 28 | +#### β
FK μ μ½μ‘°κ±΄λͺ
νμΈ (μ ν) |
| 29 | +```bash |
| 30 | +# department, partnershipμ FK μ΄λ¦ νμΈ |
| 31 | +mysql -h <host> -u <user> -p <database> < check_fk_constraints.sql |
| 32 | +``` |
| 33 | + |
| 34 | +--- |
| 35 | + |
| 36 | +### 2οΈβ£ Dev νκ²½ λ§μ΄κ·Έλ μ΄μ
|
| 37 | + |
| 38 | +#### λ°©λ² 1: Flyway μλ μ€ν (κΆμ₯) |
| 39 | +```bash |
| 40 | +# application-dev.ymlμ spring.flyway μ€μ νμΈ |
| 41 | +# spring.jpa.hibernate.ddl-auto: none νμΈ |
| 42 | + |
| 43 | +# μ ν리μΌμ΄μ
μ€ν μ μλμΌλ‘ λ§μ΄κ·Έλ μ΄μ
μ€ν |
| 44 | +./gradlew bootRun --args='--spring.profiles.active=dev' |
| 45 | +``` |
| 46 | + |
| 47 | +#### λ°©λ² 2: μλ μ€ν |
| 48 | +```bash |
| 49 | +# V2 μ€ν |
| 50 | +mysql -h <host> -u <user> -p <database> < src/main/resources/db/migration/V2__align_pk_and_fk_types.sql |
| 51 | + |
| 52 | +# κ²μ¦: PK/FK νμ
νμΈ |
| 53 | +mysql -h <host> -u <user> -p -e " |
| 54 | + SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE |
| 55 | + FROM information_schema.COLUMNS |
| 56 | + WHERE TABLE_SCHEMA = '<database>' |
| 57 | + AND COLUMN_NAME IN ('college_id', 'department_id') |
| 58 | + ORDER BY TABLE_NAME; |
| 59 | +" |
| 60 | + |
| 61 | +# V3 μ€ν |
| 62 | +mysql -h <host> -u <user> -p <database> < src/main/resources/db/migration/V3__convert_varchar_to_enum.sql |
| 63 | + |
| 64 | +# κ²μ¦: Enum νμ
νμΈ |
| 65 | +mysql -h <host> -u <user> -p -e " |
| 66 | + SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE |
| 67 | + FROM information_schema.COLUMNS |
| 68 | + WHERE TABLE_SCHEMA = '<database>' |
| 69 | + AND DATA_TYPE = 'enum' |
| 70 | + ORDER BY TABLE_NAME; |
| 71 | +" |
| 72 | + |
| 73 | +# V4 μ€ν |
| 74 | +mysql -h <host> -u <user> -p <database> < src/main/resources/db/migration/V4__add_constraints_and_defaults.sql |
| 75 | + |
| 76 | +# κ²μ¦: μ μ½μ‘°κ±΄ νμΈ |
| 77 | +mysql -h <host> -u <user> -p -e " |
| 78 | + SHOW CREATE TABLE college; |
| 79 | + SHOW CREATE TABLE menu; |
| 80 | + SHOW CREATE TABLE review; |
| 81 | +" |
| 82 | +``` |
| 83 | + |
| 84 | +--- |
| 85 | + |
| 86 | +### 3οΈβ£ λ§μ΄κ·Έλ μ΄μ
κ²μ¦ |
| 87 | + |
| 88 | +#### μ ν리μΌμ΄μ
ν
μ€νΈ |
| 89 | +```bash |
| 90 | +# μ ν리μΌμ΄μ
μ¬μμ |
| 91 | +./gradlew bootRun --args='--spring.profiles.active=dev' |
| 92 | + |
| 93 | +# λ‘κ·Έ νμΈ |
| 94 | +# - Enum λ§€ν μ€λ₯ μλμ§ |
| 95 | +# - DB μ°κ²° μ μμΈμ§ |
| 96 | +# - API νΈμΆ μ μμΈμ§ |
| 97 | +``` |
| 98 | + |
| 99 | +#### DB λ°μ΄ν° νμΈ |
| 100 | +```sql |
| 101 | +-- Enum κ° μ‘°ν ν
μ€νΈ |
| 102 | +SELECT restaurant, time_part FROM meal LIMIT 10; |
| 103 | +SELECT provider, role, status FROM user LIMIT 10; |
| 104 | + |
| 105 | +-- PK/FK νμ
νμΈ |
| 106 | +SELECT |
| 107 | + TABLE_NAME, |
| 108 | + COLUMN_NAME, |
| 109 | + DATA_TYPE, |
| 110 | + COLUMN_TYPE |
| 111 | +FROM information_schema.COLUMNS |
| 112 | +WHERE TABLE_SCHEMA = '<database>' |
| 113 | + AND COLUMN_NAME IN ('college_id', 'department_id') |
| 114 | +ORDER BY TABLE_NAME, COLUMN_NAME; |
| 115 | + |
| 116 | +-- μ μ½μ‘°κ±΄ νμΈ |
| 117 | +SELECT |
| 118 | + TABLE_NAME, |
| 119 | + CONSTRAINT_NAME, |
| 120 | + CONSTRAINT_TYPE |
| 121 | +FROM information_schema.TABLE_CONSTRAINTS |
| 122 | +WHERE TABLE_SCHEMA = '<database>' |
| 123 | + AND TABLE_NAME IN ('college', 'menu', 'review'); |
| 124 | +``` |
| 125 | + |
| 126 | +--- |
| 127 | + |
| 128 | +### 4οΈβ£ Prod νκ²½ λ§μ΄κ·Έλ μ΄μ
|
| 129 | + |
| 130 | +#### μ€ν μ 체ν¬λ¦¬μ€νΈ |
| 131 | +- [ ] Dev νκ²½ λ§μ΄κ·Έλ μ΄μ
μλ£ λ° κ²μ¦ |
| 132 | +- [ ] Dev νκ²½ μ ν리μΌμ΄μ
μ μ λμ νμΈ |
| 133 | +- [ ] Prod DB μ€λ
μ· μμ± μλ£ |
| 134 | +- [ ] λ°μ΄ν° κ²μ¦ (validate_enum_data.sql) μλ£ |
| 135 | +- [ ] μ¬μ©λμ΄ μ μ μκ°λ μ ν (μλ²½ 2-4μ κΆμ₯) |
| 136 | +- [ ] λ‘€λ°± κ³ν μ립 |
| 137 | + |
| 138 | +#### μ€ν |
| 139 | +```bash |
| 140 | +# Prod νκ²½μμ λμΌνκ² μ€ν |
| 141 | +./gradlew bootRun --args='--spring.profiles.active=prod' |
| 142 | + |
| 143 | +# λλ μλ μ€ν |
| 144 | +mysql -h <prod-host> -u <user> -p <database> < V2__align_pk_and_fk_types.sql |
| 145 | +mysql -h <prod-host> -u <user> -p <database> < V3__convert_varchar_to_enum.sql |
| 146 | +mysql -h <prod-host> -u <user> -p <database> < V4__add_constraints_and_defaults.sql |
| 147 | +``` |
| 148 | + |
| 149 | +--- |
| 150 | + |
| 151 | +## β οΈ μ£Όμμ¬ν |
| 152 | + |
| 153 | +### 1. metadata lock λ°©μ§ |
| 154 | +- μ¬μ©λμ΄ μ μ μκ°λμ μ€ν |
| 155 | +- μ€ν μ€ λ€λ₯Έ μΈμ
μμ DDL μμ
κΈμ§ |
| 156 | + |
| 157 | +### 2. λ°μ΄ν° κ²μ¦ νμ |
| 158 | +```bash |
| 159 | +# V3 μ€ν μ λ°λμ κ²μ¦ |
| 160 | +./run_validation.sh |
| 161 | +``` |
| 162 | + |
| 163 | +### 3. FK μ μ½μ‘°κ±΄ μ²λ¦¬ |
| 164 | +- V2μμ `SET FOREIGN_KEY_CHECKS = 0/1` μ¬μ© |
| 165 | +- FK μ μ½μ‘°κ±΄μ μλμΌλ‘ μ μ§λ¨ |
| 166 | + |
| 167 | +### 4. λ‘€λ°± λ°©λ² |
| 168 | +```bash |
| 169 | +# AWS RDS μ€λ
μ·μΌλ‘ 볡μ |
| 170 | +aws rds restore-db-instance-from-db-snapshot \ |
| 171 | + --db-instance-identifier your-db-restored \ |
| 172 | + --db-snapshot-identifier eatssu-dev-pre-migration-20260207 |
| 173 | +``` |
| 174 | + |
| 175 | +--- |
| 176 | + |
| 177 | +## π λ¬Έμ λ°μ μ |
| 178 | + |
| 179 | +### 1. Enum λ³ν μ€ν¨ |
| 180 | +``` |
| 181 | +ERROR 1265: Data truncated for column 'restaurant' at row 1 |
| 182 | +``` |
| 183 | +**μμΈ:** DBμ Enumμ μλ κ°μ΄ μ‘΄μ¬ |
| 184 | +**ν΄κ²°:** `validate_enum_data.sql` μ€ννμ¬ λΆμΌμΉ λ°μ΄ν° μ°ΎκΈ° |
| 185 | + |
| 186 | +### 2. PK νμ
λ³κ²½ μ€ν¨ |
| 187 | +``` |
| 188 | +ERROR 1833: Cannot change column: used in a foreign key constraint |
| 189 | +``` |
| 190 | +**μμΈ:** FK μ μ½μ‘°κ±΄μ΄ κ±Έλ €μμ |
| 191 | +**ν΄κ²°:** V2 νμΌμ `SET FOREIGN_KEY_CHECKS = 0` μ΄λ―Έ ν¬ν¨λ¨ |
| 192 | + |
| 193 | +### 3. unique μ μ½μ‘°κ±΄ μ€ν¨ |
| 194 | +``` |
| 195 | +ERROR 1062: Duplicate entry for key 'UK_college_name' |
| 196 | +``` |
| 197 | +**μμΈ:** college.nameμ μ€λ³΅ λ°μ΄ν° μ‘΄μ¬ |
| 198 | +**ν΄κ²°:** μ€λ³΅ λ°μ΄ν° μ 리 ν λ€μ μ€ν |
| 199 | + |
| 200 | +--- |
| 201 | + |
| 202 | +## β
μλ£ νμΈ |
| 203 | + |
| 204 | +- [ ] V2, V3, V4 λͺ¨λ μ μ μ€ν |
| 205 | +- [ ] flyway_schema_history ν
μ΄λΈμ κΈ°λ‘ νμΈ |
| 206 | +- [ ] μ ν리μΌμ΄μ
μ μ λμ νμΈ |
| 207 | +- [ ] API ν
μ€νΈ ν΅κ³Ό |
| 208 | +- [ ] λ‘κ·Έμ μ€λ₯ μμ |
0 commit comments