mysqldump를 사용하여 Amazon RDS for MySQL 인스턴스로 데이터를 가져올 때 정의자 오류를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 4월 18일

mysqldump를 사용하여 MySQL 인스턴스에 대한 Amazon Relational Database Service(Amazon RDS)로 데이터를 가져오려고 하면 다음과 비슷한 오류가 발생합니다.

Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

간략한 설명

정의자 오류는 MySQL에서 데이터베이스 사용자로 객체를 생성하려는 경우 데이터베이스 사용자가 대상 데이터베이스에 없으면 트리거됩니다. Amazon RDS에는 수퍼유저 권한이 없기 때문에 MySQL에서 localhost에 대한 사용자를 생성하려고 하면 이 작업은 Amazon RDS에서 허용되지 않으므로 비슷한 오류가 발생할 수 있습니다.

​해결 방법

정의자 오류는 다음과 같은 여러 가지 방법으로 해결할 수 있습니다.

1.    다음과 같은 정의자 행을 제거합니다.

/*!50017 DEFINER=`root`@`localhost`*/

이 행은 다음과 같이 표시되어야 합니다. 

/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

2.    정의자 사용자 rootlocalhost 이름을 각각 masteruser%host로 대체합니다.

/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

참고: 모든 호스트에 대해 와일드카드로 %를 사용할 수 있습니다.

3.    정의자 옵션 없이 덤프 파일을 생성하거나 다시 생성합니다.

MySQL 덤프 유틸리티는 DEFINER를 제거하는 옵션을 제공하지 않습니다. 일부 MySQL 클라이언트는 논리 백업을 생성할 때 정의자를 무시하는 옵션을 제공하지만, 기본적으로 이 옵션은 수행되지 않습니다. 선호하는 MySQL 클라이언트에 대한 설명서를 검토하여 DEFINER를 무시하는 옵션이 사용 가능한지 확인합니다. MySQL 명령줄 클라이언트에서는 정의자를 제외할 수 없습니다. 그러나 클라이언트에서 타사 도구를 함께 사용하여 DEFINER를 제거하거나 사용자 이름 및 호스트를 찾아서 대체할 수 있습니다.

Linux, macOS 및 WSL(Windows Subsystem for Linux)에서 DEFINER를 제거하는 방법은 다음 예제를 참조하십시오.

제거

sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql

찾은 후에 대체

sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql

참고: masteruser 값을 Amazon RDS 마스터 사용자의 이름으로 대체합니다.