MySQL을 AWS RDS로 마이그레이션하는 과정에서 발생할 수 있는 대표적인 에러와
그 해결 방법을 정리해둡니다.
MySQL 8.0 기반 환경에서 직접 겪은 실제 사례를 바탕으로 작성되었습니다.
docker exec <mysql-container-name> \
sh -c 'mysqldump -uroot -p"$MYSQL_ROOT_PASSWORD" \
--databases your_db_name \
--routines \
--events \
--triggers \
--single-transaction \
--set-gtid-purged=OFF \
--column-statistics=0 \
--skip-lock-tables' > your_db_name.sql
| 옵션 | 설명 |
|---|---|
--databases | USE your_db; 포함 |
--set-gtid-purged=OFF | GTID 충돌 방지 |
--column-statistics=0 | MySQL 8.x 이상에서 RDS 호환 |
--routines, --events, --triggers | 프로시저, 이벤트, 트리거 포함 |
--skip-lock-tables | 테이블 잠금 방지 |
SET GLOBAL, SET @@GLOBALDEFINER=...USE mysql, CREATE TABLE mysql.*, INSERT INTO mysql.*component 시스템 테이블FUNCTION 정의 시 DETERMINISTIC, READS SQL DATA 빠진 경우cp your_db_name.sql your_db_name.clean.sql
# SYSTEM 변수 제거
sed -i '' '/^SET GLOBAL/d' your_db_name.clean.sql
sed -i '' '/^SET @@GLOBAL/d' your_db_name.clean.sql
sed -i '' '/^\/\*!.*SET GLOBAL/d' your_db_name.clean.sql
sed -i '' '/^\/\*!.*SET @@GLOBAL/d' your_db_name.clean.sql
# DEFINER 제거
sed -i '' 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/g' your_db_name.clean.sql
# mysql DB 관련 제거
sed -i '' '/^USE `mysql`/d' your_db_name.clean.sql
sed -i '' '/^CREATE TABLE `mysql`./,/^);/d' your_db_name.clean.sql
sed -i '' '/^INSERT INTO `mysql`./d' your_db_name.clean.sql
# component 테이블 제거
sed -i '' '/^CREATE TABLE `component`/,/^);/d' your_db_name.clean.sql
sed -i '' '/DROP TABLE IF EXISTS `component`/d' your_db_name.clean.sql
# FUNCTION 선언 보완
sed -i '' 's/CREATE FUNCTION /CREATE FUNCTION DETERMINISTIC READS SQL DATA /g' your_db_name.clean.sql
docker run --rm mysql:8 \
mysql -h <RDS-ENDPOINT> -P <PORT> -u root -p"<PASSWORD>" \
-e "CREATE DATABASE \`your_db_name\` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
docker run --rm -i -v "$PWD:/backup" mysql:8 \
sh -c 'mysql -h <RDS-ENDPOINT> -P <PORT> -u root -p"<PASSWORD>" < /backup/your_db_name.clean.sql'
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA...
log_bin_trust_function_creators = 1 설정SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
CREATE FUNCTION your_func(...) RETURNS ...
DETERMINISTIC
READS SQL DATA
BEGIN
...
END;
SELECT COUNT(*) FROM your_table;SHOW TABLES;CREATE USER 'appuser'@'%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON your_db_name.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
MySQL 데이터를 RDS로 마이그레이션할 때는
단순한 덤프 & 복원이 아닌, RDS 제약사항을 고려한 전처리가 반드시 필요하다.
에러를 하나씩 해결해 나가면 안정적인 이전이 가능하며,
이 과정을 자동화하면 추후 프로젝트에서도 재사용하기 좋다.