[mysql] 접근 불가; 이 작업에 대한 SUPER 권한이 필요합니다.

그래서 SQL 파일을 rds (1G MEM, 1 CPU)로 가져 오려고합니다. SQL 파일은 1.4G와 같습니다.

mysql -h xxxx.rds.amazonaws.com -u user -ppass –max-allowed-packet = 33554432 db <db.sql

다음과 같이 붙어 있습니다.

ERROR 1227 (42000) at line 374: Access denied; you need (at least one of) the SUPER privilege(s) for this operation

실제 SQL 내용은 다음과 같습니다.

/*!50003 CREATE*/ /*!50017 DEFINER=`another_user`@`1.2.3.4`*/ /*!50003 TRIGGER `change_log_BINS` BEFORE INSERT ON `change_log` FOR EACH ROW
IF (NEW.created_at IS NULL OR NEW.created_at = '00-00-00 00:00:00' OR NEW.created_at = '') THEN
        SET NEW.created_at = NOW();
END IF */;;

another_user rds에 존재하지 않으므로 다음을 수행합니다.

GRANT ALL PRIVILEGES ON db.* TO another_user@'localhost';

여전히 운이 없습니다.



답변

DEFINER=..sqldump 파일에서 문을 제거 하거나 사용자 값을 CURRENT_USER.

RDS에서 제공하는 MySQL 서버 DEFINER는 다른 사용자 (내 경험상)에 대한 구문을 허용하지 않습니다 .

sed스크립트를 사용 하여 파일에서 제거 할 수 있습니다 .

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


답변

덤프 파일 DEFINER에이 없는 경우 아래 행이있는 경우 제거하거나 다음으로 주석 처리했는지 확인하십시오 --.

처음에는:

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

끝 :

-- SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;


답변

또 다른 유용한 트릭은 출력 파일에 다음 줄을 쓰지 않는 –set-gtid-purged = OFF 옵션을 사용하여 mysqldump를 호출하는 것입니다.

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

DEFINER에 대해 잘 모르겠습니다.


답변

hjpotter92 답변에 대한 MacOS 추가 업데이트입니다.

sedMacOS에서 패턴을 인식 하려면 =다음과 같이 기호 앞에 백 슬래시를 추가해야합니다 .

sed -i old 's/\DEFINER\=`[^`]*`@`[^`]*`//g' file.sql


답변

문제 : 데이터 (mysqldump 파일 사용)를 mysql 데이터베이스로 가져 오려고하는데 해당 작업을 수행 할 권한이없는 것 같습니다.

솔루션 : 데이터가 마이그레이션되고, mysql 데이터베이스에서 시드 및 업데이트되었다고 가정하고, mysqldump를 사용하여 스냅 샷을 만들고 파일로 내 보냅니다.

mysqldump -u [username] -p [databaseName] --set-gtid-purged=OFF > [filename].sql

mysql 문서에서 :

GTID- 글로벌 트랜잭션 식별자 (GTID)는 원본 서버 (마스터)에서 커밋 된 각 트랜잭션과 생성되고 연결된 고유 식별자입니다. 이 식별자는 원본 서버에 고유 할뿐만 아니라 지정된 복제 설정의 모든 서버에서 고유합니다. 모든 트랜잭션과 모든 GTID 사이에는 일대일 매핑이 있습니다.

–set-gtid-purged = OFF SET @@ GLOBAL.gtid_purged는 출력에 추가되지 않고 SET @@ SESSION.sql_log_bin = 0은 출력에 추가되지 않습니다. GTID가 사용되지 않는 서버의 경우이 옵션 또는 AUTO를 사용하십시오. 필요한 GTID 세트가 대상 서버의 gtid_purged에 이미 있고 변경해서는 안되는 것이 확실하거나 누락 된 GTID를 수동으로 식별하고 추가하려는 경우 GTID가 사용중인 서버에만이 옵션을 사용하십시오.

그런 다음 root 사용자로 mysql에 연결하고 권한을 부여하고 플러시하고 사용자 권한이 올바르게 업데이트되었는지 확인합니다.

mysql -u root -p
UPDATE mysql.user SET Super_Priv='Y' WHERE user='johnDoe' AND host='%';
FLUSH PRIVILEGES;
mysql> SHOW GRANTS FOR 'johnDoe';
+------------------------------------------------------------------+
| Grants for johnDoe                                               |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `johnDoe`                                  |
| GRANT ALL PRIVILEGES ON `db1`.* TO `johnDoe`                     |
+------------------------------------------------------------------+

이제 데이터를 다시로드하면 작업이 허용됩니다 .

mysql -h [host] -u [user] -p[pass] [db_name] < [mysql_dump_name].sql


답변

데이터베이스 파일을 .sql.gz형식으로 가져 오려면 정의자를 제거하고 아래 명령을 사용하여 가져 오기

zcat path_to_db_to_import.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db_name
  1. 이전에는 아래 명령을 사용하여 .sql.gz 형식으로 데이터베이스를 내 보냅니다.

    mysqldump -u user -p old_db | gzip -9 > path_to_db_exported.sql.gz;

  2. 내 보낸 데이터베이스를 가져오고 아래 명령을 사용하여 정의자를 제거하고,

    zcat path_to_db_exported.sql.gz | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | mysql -u user -p new_db


답변

백업을 복원 할 때 이전 항목과 새 항목에 대해 동일한 사용자 이름으로 시도하십시오.