2017-05-17 34 views
14

Więc próbuję importować plik sql na rds (1G MEM, 1 CPU). Plik SQL jest jak 1.4GOdmowa dostępu; potrzebujesz (przynajmniej jeden) uprawnienia SUPER dla tej operacji

mysql -h xxxx.rds.amazonaws.com -u użytkownik -ppass --max-wolno-pakiet = 33554432 db < db.sql

on utknął w:

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

rzeczywista zawartość SQL jest:

/*!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 nie istniał w RDS, więc robię:

GRANT ALL PRIVILEGES ON db.* TO [email protected]'localhost'; 

Nadal nie ma szczęścia.

Odpowiedz

23

Usuń instrukcję DEFINER=.. z pliku sqldump lub zastąp wartości użytkownika wartością CURRENT_USER.

Serwer MySQL dostarczany przez RDS nie zezwala na składnię DEFINER dla innego użytkownika (według mojego doświadczenia).

Można użyć sed skrypt, aby usunąć je z pliku:

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

Jesteś poprawne. Powodem, dla którego nie działa, jest to, że określenie innego użytkownika jako "DEFINER", gdy zalogowany użytkownik nie ma uprawnienia "SUPER" (które samo nie jest dozwolone w RDS) pozwoliłoby na arbitralne eskalowanie uprawnień - przechowywane programy uruchamiane z referencje i przywileje ich 'DEFINERU '(domyślnie w przeciwieństwie do użytkownika wywołującego - ich" INVOKER "). Również [w Server Fault] (https://serverfault.com/a/555983/153161). –

+0

Człowiek, który jesteś ratunkiem życia. Gdyby moja firma hostingowa powiedziała mi uszkodzoną bazę danych po wyeksportowaniu i nic, co można by zrobić, aby przywrócić. Idealne rozwiązanie. – Woody

+3

Z jakiegoś powodu musiałem użyć * zamiast +: '' '' sed 's/\ sDEFINER = '[^'] * '@' [^ '] *' //' -i oldfile.sql''' ' –