현재 우리 회사에서는 AWS RDS를 사용하는데, prd, dev로 두개의 데이터베이스를 같이 운용하고 있다.
데이터베이스가 따로 사용되고 있다보니 몇가지 문제점이 있었는데, 그 중 두 데이터베이스의 데이터가 많이 달라졌을 경우 dev에서 잡히지 않는 버그, 에러가 prd 에서 잡히는 경우가 있었다는 것이다.
기존에 이런 경우에는 EC2 서버 인스턴스에서 같이 돌리던 MySQL에서 데이터베이스를 뜯어와서, 로컬 호스트 mysql에 붙이는 식으로 작업했었다.
RDS에서도 크게 다르지는 않지만 몇가지 신경써주지 않으면 에러가 날 확률이 높기 때문에 글로 정리를 해본다.
mysqldump -u <USER> -p -h <RDS_URL> -v <DATABASE> > <FILENAME>.sql
dump 자체는 간단하게 이루어 진다.
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 커맨드가 살짝 다르다)
sed 's/\sDEFINER=`[^`]*`@`[^`]*`//g' -i <FILENAME>.sql
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/
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
감사합니다:)