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');
업그레이드 이전
# '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;
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)
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" 이다.