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

최종 업데이트 날짜: 2020년 5월 29일

mysqldump를 사용하여 MySQL DB 인스턴스에 대한 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에서 데이터베이스 사용자로 객체를 생성하려는 경우 데이터베이스 사용자가 대상 데이터베이스에 없으면 트리거됩니다. MySQL에서 localhost에 대한 사용자를 생성하려고 하면 이 작업은 Amazon RDS에서 허용되지 않으므로 비슷한 오류가 발생할 수 있습니다. 이는 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 마스터 사용자의 이름으로 대체합니다.