AWS RDS로 MySQL 데이터 이전 시 발생하는 문제와 해결 방법

아이구·2025년 4월 8일
post-thumbnail

MySQL을 AWS RDS로 마이그레이션하는 과정에서 발생할 수 있는 대표적인 에러와
그 해결 방법을 정리해둡니다.
MySQL 8.0 기반 환경에서 직접 겪은 실제 사례를 바탕으로 작성되었습니다.


마이그레이션 단계 요약

  1. 기존 환경(Docker/EC2)에서 특정 DB만 덤프
  2. 덤프 파일 내 RDS 비호환 구문 정리
  3. RDS에 수동 복원
  4. 사용자 및 권한 수동 설정

1. 특정 DB만 RDS 호환 방식으로 덤프하기

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

옵션 설명

옵션설명
--databasesUSE your_db; 포함
--set-gtid-purged=OFFGTID 충돌 방지
--column-statistics=0MySQL 8.x 이상에서 RDS 호환
--routines, --events, --triggers프로시저, 이벤트, 트리거 포함
--skip-lock-tables테이블 잠금 방지

2. RDS 비호환 구문 제거

제거해야 할 항목

  • SET GLOBAL, SET @@GLOBAL
  • DEFINER=...
  • USE mysql, CREATE TABLE mysql.*, INSERT INTO mysql.*
  • component 시스템 테이블
  • FUNCTION 정의 시 DETERMINISTIC, READS SQL DATA 빠진 경우

sed 명령어로 자동 제거 (macOS 기준)

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

3. RDS에 수동 복원

DB 미리 생성

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'

4. ERROR 1418 - Function 생성 오류

에러 메시지

ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA...

해결 방법

A. 파라미터 그룹에서 설정

  1. RDS 콘솔 → 파라미터 그룹 생성
  2. log_bin_trust_function_creators = 1 설정
  3. DB 인스턴스에 적용 후 재시작
  4. 확인 쿼리:
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';

B. 함수 정의에 속성 추가

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 제약사항을 고려한 전처리가 반드시 필요하다.
에러를 하나씩 해결해 나가면 안정적인 이전이 가능하며,
이 과정을 자동화하면 추후 프로젝트에서도 재사용하기 좋다.

profile
정리하는 벨로그

0개의 댓글