[Aurora MySQL] 메이저 버전 업그레이드 시 AUTO_INCREMENT가 올바르게 설정되지 않는 버그

IANAKEDIARY·2025년 12월 10일

[MySQL]

목록 보기
2/3

Aurora MySQL에서 In-place 업그레이드 및 Blue/Green 업그레이드 모두에서 3.08 미만의 버전에서 3.08이상으로 올리는 최초 1회에 걸쳐 발생하는 버그에 대한 내용을 기록합니다.

상황 설명

업그레이드 이전에 테이블에 AUTO_INCREMENT 설정 값이 업그레이드 이후 테이블에서 적절히 설정되지 않아 문제가 발생하는 경우가 있습니다.

어떤 경우에 이런 현상이 발생하며, 어떻게 조치해야되는지에 대해 소개합니다.

테스트 환경 구성

create database test;

use test;
  
CREATE TABLE users (
 id INT AUTO_INCREMENT PRIMARY KEY,
 username VARCHAR(50) NOT NULL,
 email VARCHAR(100) NOT NULL
);

INSERT INTO users (username, email) VALUES
('user1', 'user1@example.com'),
('user2', 'user2@example.com'),
('user3', 'user3@example.com'),
('user4', 'user3@example.com'),
('user5', 'user3@example.com'),
('user6', 'user3@example.com'),
('user7', 'user3@example.com'),
('user8', 'user3@example.com'),
('user9', 'user3@example.com'),
('user10', 'user3@example.com');

예시 1

업그레이드 이전

# 'users' 테이블에 10까지 데이터가 있었으며 1을 제외하고 모두 삭제
delete from users where id > 1; 

# AUTO_INCREMENT는 11로 설정되어있는 상태(다음 Insert 시 11로 삽입됨을 의미)
# SHOW CREATE TABLE로 확인

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.28    |
+-----------+

mysql> select * from users;
+----+----------+-------------------+
| id | username | email             |
+----+----------+-------------------+
|  1 | user1    | user1@example.com |
+----+----------+-------------------+
1 row in set (0.00 sec)


mysql> SHOW CREATE TABLE users;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                             |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW TABLE STATUS LIKE 'users';
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name  | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation          | Checksum | Create_options | Comment |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| users | InnoDB |      10 | Dynamic    |    1 |          16384 |       16384 |               0 |            0 |         0 |             11 | 2025-12-09 07:35:59 | 2025-12-09 07:36:09 | NULL       | utf8mb4_0900_ai_ci |     NULL |                |         |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
1 row in set (0.00 sec)

업그레이드 이후

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.42    |
+-----------+
1 row in set (0.00 sec)

mysql> select * from users;
+----+----------+-------------------+
| id | username | email             |
+----+----------+-------------------+
|  1 | user1    | user1@example.com |
+----+----------+-------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE TABLE users;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                            |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW TABLE STATUS LIKE 'users';
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| Name  | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation          | Checksum | Create_options | Comment |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
| users | InnoDB |      10 | Dynamic    |    1 |          16384 |       16384 |               0 |            0 |         0 |             11 | 2025-12-09 07:35:59 | 2025-12-09 07:36:09 | NULL       | utf8mb4_0900_ai_ci |     NULL |                |         |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+--------------------+----------+----------------+---------+
1 row in set (0.00 sec)

=> SHOW CREATE TABLE 로 확인 시 "AUTO_INCREMENT=2"로 잘못 생성된걸로 확인된다.

이럴 경우에 아래 커맨드를 통해 올바르게 수정해줘야 한다.

ALTER TABLE table_name AUTO_INCREMENT = n;

예시2

Truncate 된 테이블이 있을 때, 업그레이드가 진행된다면?

업그레이드 이전과 이후가 동일하게 AUTO_INCREMENT가 1로 설정된다.
즉 새롭게 테이블을 생성한 것과 동일하다. 따라서 결과는 한 번만 기록한다.

mysql> SHOW CREATE TABLE users;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW TABLE STATUS LIKE 'users';
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| Name  | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation          | Checksum | Create_options | Comment |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
| users | InnoDB |      10 | Dynamic    |    0 |              0 |       16384 |               0 |            0 |         0 |              1 | 2025-12-09 07:45:05 | NULL        | NULL       | utf8mb4_0900_ai_ci |     NULL |                |         |
+-------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+--------------------+----------+----------------+---------+
1 row in set (0.00 sec)

예시3

AURO_INCREMENT 컬럼의 데이터가 10000까지 생성되었으며, 1~9999까지 데이터가 삭제된 상황이라면 어떨까.

결과부터 말하자면 정상적으로 반영된다.
업그레이드 된 후에도 해당 테이블의 AURO_INCREMENT가 10001로 설정되어 있다.

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.28    |
+-----------+

mysql> select * from users ;
+-------+-----------+-----------------------+
| id    | username  | email                 |
+-------+-----------+-----------------------+
| 10000 | user10000 | user10000@example.com |
+-------+-----------+-----------------------+
1 row in set (0.00 sec)

mysql> show create table users ;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

업그레이드 후

mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.42    |
+-----------+
1 row in set (0.00 sec)

mysql> show create table users;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| users | CREATE TABLE `users` (
  `id` int NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  `email` varchar(100) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10001 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)

결론

업그레이드 이전과 이후 테이블에서 "SHOW CREATE TABLE"을 통해 AURO_INCREMENT 컬럼 값 비교를 통해 다른 값이 있다면 수정해야하는 과정이 필요하다.

번거롭겠지만 현재로써는 최선의 workaround 로 보인다.

cf )
SHOW TABLE STATUS LIKE 'users' 를 통한 비교를 추천하지 않는 이유는 마지막 예시3의 경우 업그레이드 전과 후의 Auto_increment 값이 다르게 확인되었다.
다른 예시에서는 업그레이드 전과 후의 "SHOW TABLE STATUS LIKE"의 값은 동일하게 확인되었는데, 예시3에서는 다르게 확인되었다.
=> 따라서 가장 정확한 비교 방법은 "SHOW TABLE STATUS LIKE table_name" 이다.

profile
Database Engineering

0개의 댓글