좌충우돌 MySQL RDS dump/load 하기

인문학적 개발자 늘한·2020년 10월 22일
4

현재 우리 회사에서는 AWS RDS를 사용하는데, prd, dev로 두개의 데이터베이스를 같이 운용하고 있다.

데이터베이스가 따로 사용되고 있다보니 몇가지 문제점이 있었는데, 그 중 두 데이터베이스의 데이터가 많이 달라졌을 경우 dev에서 잡히지 않는 버그, 에러가 prd 에서 잡히는 경우가 있었다는 것이다.

기존에 이런 경우에는 EC2 서버 인스턴스에서 같이 돌리던 MySQL에서 데이터베이스를 뜯어와서, 로컬 호스트 mysql에 붙이는 식으로 작업했었다.

RDS에서도 크게 다르지는 않지만 몇가지 신경써주지 않으면 에러가 날 확률이 높기 때문에 글로 정리를 해본다.

Dump

mysqldump  -u <USER> -p -h <RDS_URL> -v <DATABASE> > <FILENAME>.sql

dump 자체는 간단하게 이루어 진다.

Load

mysql -u <USER> -p -h <RDS_URL> <DATABASE> < <FILENAME>.sql

위와 같이 옮겨주고 싶은 데이터베이스에 dump 해둔 sql 파일을 넣어주면 된다.


ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER, SYSTEM_VARIABLES_ADMIN or SESSION_VARIABLES_ADMIN privilege(s) for this operation


하지만 RDS 에서 dump해온 sql 파일을 load 하려고 하면 위와 같은 에러가 발생할 수 있다.
이는 RDS가 제공하는 MySQL 서버가, 사용자가 아닌 다른 DEFINER가 지정된 sql 파일을 허용하지 않기 때문이라고 한다.

이를 해결하기 위해서 Unix의 sed 커맨드를 활용해서 일괄적으로 DEFINER가 명시된 부분을 지워준다.
(mac linux 커맨드가 살짝 다르다)

LINUX

sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i <FILENAME>.sql

MAC

sed -i '' 's/\sDEFINER=`[^`]*`@`[^`]*`//g' <FILENAME>.sql

변경된 sql 파일을 다시 load 해본다.


위와 같이 DEFINER를 다 지워주고 시도하면 환경에 따라 바로 해결될 수도 있지만, 또 다른 에러가 발생할 수 있다.

아래의 친구들이 문제인데, DEFINER를 모두 삭제하는 경우 충돌하는 것 같다.
RDS 에서 허용하지 않는 옵션들이라고 한다.

SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

위의 코드들을

-- SET @@SESSION.SQL_LOG_BIN= 0;
-- SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;

이렇게 주석처리해준다.

애초에 dump할 때
--set-gtid-purged=OFF 옵션을 붙이면 해결된다는 이야기도 있었지만 나의 경우에는 해결되지 않았다.


추가

아래의 링크를 보고, RDS 파라미터 log_bin_trust_function_creators도 변경해주었지만 효과가 있지는 않았었다.
혹시 위의 방법을 모두 시도해도 해결이 되지 않는다면, 참고해보시길.

https://aws.amazon.com/ko/premiumsupport/knowledge-center/error-1227-mysqldump/


Ref

https://aws.amazon.com/ko/premiumsupport/knowledge-center/error-1227-mysqldump/
http://blog.naver.com/PostView.nhn?blogId=kkson50&logNo=221908346699&categoryNo=9&parentCategoryNo=0&viewDate=¤tPage=1&postListTopCurrentPage=1&from=search
https://stackoverflow.com/questions/44015692/access-denied-you-need-at-least-one-of-the-super-privileges-for-this-operat

profile
영어영문학과 출신의 개발자 늘한입니다. Python 을 좋아합니다.

4개의 댓글

comment-user-thumbnail
2021년 5월 28일

감사합니다:)

답글 달기
comment-user-thumbnail
2022년 6월 20일

정말 많은 도움이 되었습니다 ㅠㅠ 감사합니다!

답글 달기
comment-user-thumbnail
2022년 12월 8일

저의 구원자이십니다. 감사합니다!

답글 달기
comment-user-thumbnail
2024년 2월 19일

큰 도움 됐습니다.. 감사합니다!

답글 달기