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


99

그래서 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';

여전히 운이 없습니다.

답변:


180

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

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

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

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

3
당신이 맞습니다. 작동하지 않는 이유 DEFINER는 로그인 한 사용자에게 SUPER권한 이 없을 때 (RDS에서 자체적으로 허용 되지 않음) 다른 사용자를 지정 하면 임의의 권한 상승이 허용되기 때문입니다. DEFINER(통화 사용자의 것과는 반대로-their INVOKER), 기본적으로. 또한 서버 오류에서 .
Michael-sqlbot

당신은 생명의 은인입니다. 내 호스팅 회사가 내보낼 때 데이터베이스가 손상되었고 복원 할 수있는 작업이 없다고 말했습니까? 완벽한 솔루션.
Woody

5
어떤 이유로 + 대신 *를 사용해야했습니다.sed 's/\sDEFINER=`[^`]*`@`[^`]*`//' -i oldfile.sql
Berend de Boer

감사 @BerenddeBoer
Awolad의 Hossain

1
@WonderLand 당신은 시도 할 수 있습니다 awk보다 조금 더 빨리 될 수있는sed
hjpotter92

50

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

처음에는:

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

끝 :

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

13
명령 에 추가하여 --set-gtid-purged=OFF이를 방지 할 수 있습니다 mysqldump. 여기에서 찾을 수 있습니다 : stackoverflow.com/a/56251925
Illya Moskvin

17

또 다른 유용한 트릭은 출력 파일에 다음 줄을 쓰지 않는 --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에 대해 잘 모르겠습니다.


1
감사! 그것은 RDS의 경우에 저를 도왔다
빅터

감사합니다. 제 경우에는 SET @@GLOBAL.GTID_MODE = OFF;소스 데이터베이스의 내보내기 측에서 MySql Workbench에서 실행 했습니다
Byron Wong

8

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

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

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

맥 OS 카탈리나에 MariaDB 10.4을 사용하여 2020 년 기준으로 작동
웨인

4

문제 : 데이터 (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

3

데이터베이스 파일을 .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


2

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


2

전체 솔루션

위의 모든 솔루션은 괜찮습니다. 그리고 여기에서는 모든 상황에서 작동하도록 모든 솔루션을 결합 할 것입니다.

  1. 고정 DEFINER

Linux 및 Mac 용

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

Windows
다운로드 atom 또는 notepad ++의 경우 atom 또는 notepad ++로 덤프 SQL 파일을 열고 Ctrl + F를 눌러 DEFINER
단어를 검색 한 다음 모든 곳에서 DEFINER = @ 줄 (또는 약간 다를 수 있음)을 제거하고 파일을 저장합니다. 예를 들어 해당 줄을 제거하기 전 : CREATE DEFINER = @ PROCEDURE 해당 줄을 제거한 후 : CREATE PROCEDUREadmin%

admin%MyProcedure
MyProcedure

  1. 3 줄 제거 덤프 파일에서이 3 줄을 모두 제거합니다. sed 명령을 사용 하거나 Atom 편집기에서 파일을 열고 각 줄을 검색 한 다음 해당 줄을 제거 할 수 있습니다.
    예 : Atom에서 Dump2020.sql을 열고 ctrl + F를 누르고 SET @@ SESSION.SQL_LOG_BIN = 0을 검색 하고 해당 줄을 제거합니다.
SET @@SESSION.SQL_LOG_BIN= 0;
SET @@GLOBAL.GTID_PURGED=/*!80000 '+'*/ '';
SET @@SESSION.SQL_LOG_BIN = @MYSQLDUMP_TEMP_LOG_BIN;
  1. 생성 된 파일에 문제가 있습니다. 생성 된 dump.sql 파일이 적절하지 않은 경우 몇 가지 문제가 발생할 수 있습니다. 하지만 여기서는 덤프 파일을 생성하는 방법을 설명하지 않겠습니다. 하지만 당신은 나에게 물어볼 수 있습니다 ( _ )

1

나는 모든 줄 SET*.sql파일 에서 시작 한다고 주석을 달았고 작동했습니다.


0

* 답변은 MacOS에만 해당 될 수 있습니다. *

.sql 파일을 도커 컨테이너로 가져 오려고 할 때 오류 메시지가 표시되었습니다.

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

그런 다음 다른 제안을 시도하는 동안 MacOS (osx)에서 아래 오류를 받았습니다.

sed : RE 오류 : 잘못된 바이트 시퀀스

마지막으로이 리소스 의 다음 명령으로 "액세스 거부"문제가 해결되었습니다.

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

따라서 다음을 사용하여 도커 데이터베이스로 가져올 수 있습니다.

docker exec -i dockerContainerName mysql -uuser -ppassword table < importFile.sql

도움이 되었기를 바랍니다! :)


0

서버 측에서 "on"서버 매개 변수 "log_bin_trust_function_creators"를 설정해야합니다. 이것은 azure maria db 인 경우 왼쪽 블레이드에서 쉽게 찾을 수 있습니다.


-1

성명서

DEFINER = username@`%

백업 덤프의 문제입니다.

해결할 수있는 솔루션은 SQL 덤프 파일에서 모든 항목을 제거하고 GCP 콘솔에서 데이터를 가져 오는 것입니다.

고양이 DUMP_FILE_NAME.sql | sed -e 's / DEFINER = <username>@ %// g'> NEW-CLEANED-DUMP.sql

새 파일 (NEW-CLEANED-DUMP.sql)을 가져 오십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.