Errore MySQL / Amazon RDS: "non disponi dei privilegi SUPER ..."


97

Sto tentando di copiare il mio database mysql da Amazon EC2 a RDS:

Ho eseguito con successo una parte mysqldumpdel mio database nella mia cartella principale usando questo:

root@ip-xx-xx-xx-xx:~# mysqldump my_database -u my_username -p > my_database.sql

Quindi ho provato a trasferire questo file .sql nel mio nuovo database RDS:

root@ip-xx-xx-xx-xx:~# mysql my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Purtroppo, ricevo il seguente messaggio di errore:

You do not have the SUPER privilege and binary logging is enabled 
(you *might* want to use  the less safe log_bin_trust_function_creators variable)

Ho provato GRANT SUPER..in vari modi, ma ricevo errori anche quando provo a farlo. Anche la digitazione mysql > FLUSH privileges;non funziona.

Sono un principiante di mysql, mi dispiace tanto per una domanda così facile. Pensieri?


9
Non puoi GRANT SUPERsu RDS. RDS non offre alcun modo per ottenere privilegi SUPER.
ceejayoz

Usa lo stesso nome utente MySQL per creare il dump e ripristinarlo (per la connessione e la parola chiave DEFINER nel dump). La modifica di log_bin_trust_function_creators non è la soluzione desiderata. La cosa peggiore è usare il parametro -f in questo caso
ad4s

nel mio caso il mio sqlfile ha una CREATE FUNCTIONdichiarazione che necessita di un utente privilegiato. vedere questo
Accountant م

Risposte:


63

Secondo http://getasysadmin.com/2011/06/amazon-rds-super-privileges/ , è necessario impostare log_bin_trust_function_creatorssu 1 nella console AWS per caricare il file di dump senza errori.

Se vuoi ignorare questi errori e caricare il resto del file di dump, puoi usare l' -fopzione:

mysql -f my_database -u my_username -p -h  
my_new_database.xxxxxxxxx.us-east-1.rds.amazonaws.com < my_database.sql

Il -friporterà errori, ma continuerà l'elaborazione del resto del file dump.


ciao @ Ross, grazie per questo. Sfortunatamente, l'utilizzo -fnon ha aiutato. Ho ricevuto lo stesso errore. Utilizzando il tuo collegamento, ho problemi con la sintassi degli strumenti Cli di RDS. Significa che quando vado a modificare i privilegi ottengo il seguente errore:rds-modify-db-parameter-group: Malformed input-Unrecognized option: -–parameters=name=log_bin_trust_function_creators, Usage: rds-modify-db-parameter-group DBParameterGroupName --parameters "name=value, value=value, method=value" [ --parameters "name=value, value=value, method=value" ...] [General Options]
tim peterson

ecco il mio comando che mi dà l'errore di cui sopra: ./rds-modify-db-parameter-group mygroup -–parameters "name=log_bin_trust_function_creators, value=on, method=immediate" –I="accesskeyxxxxxx" –S="secretkeyxxxxxxxx"So che deve essere una citazione o un doppio trattino i ma nessuno di questi tipi di modifiche funziona finora, ugh!
tim peterson

4
L' -fopzione non eliminerà gli errori, ma consentirà semplicemente l'elaborazione delle istruzioni SQL non offensive nel file. Da quello che ho letto, RDS sta soffocando sulle stored procedure nel file di dump. Prova a creare un file di dump senza procedure di archiviazione e verifica se viene caricato correttamente:mysqldump --routines=0 --triggers=0 --events=0 my_database -u my_username -p
Ross Smith II

2
- @ Ross, fantastico che ha funzionato, il mio database è lì, wow questo è un problema fastidioso, sento che AWS dovrebbe fare qualcosa al riguardo.
tim peterson

Almeno posso caricare tutti i dati con l' -fopzione. La seconda fase potrebbe essere quella di scaricare solo routine / stred proc, ecc
Separatamente

134
  1. Apri la console Web RDS.
  2. Apri la scheda "Gruppi di parametri".
  3. Crea un nuovo gruppo di parametri. Nella finestra di dialogo, seleziona la famiglia MySQL compatibile con la tua versione del database MySQL, assegnale un nome e conferma. Selezionare il gruppo di parametri appena creato e immettere "Modifica parametri".
  4. Cerca il parametro "log_bin_trust_function_creators" e imposta il suo valore su "1 ′.
  5. Salva le modifiche.
  6. Apri la scheda "Istanze". Espandi la tua istanza MySQL ed esegui l '"Azione istanza" denominata "Modifica".
  7. Selezionare il gruppo di parametri appena creato e abilitare "Applica immediatamente".
  8. Fare clic su "Continua" e confermare le modifiche.
  9. Attendi il completamento dell'operazione di "Modifica".
  10. Di nuovo, apri la scheda "Istanze". Espandi la tua istanza MySQL ed espandi la scheda "Azione istanza" e seleziona "Riavvia".

> cosa fa il punto 9 ... regola la tua istanza per utilizzare il gruppo di parametri definito in precedenza. Per maggiori dettagli vedere questo post originale del blog di Daniel Ferbers: techtavern.wordpress.com/2013/06/17/…
AndrewL

Ciò interromperà la replica di RDS Mysql?
Ramratan Gupta

ciao @ arun-r, seguo i passaggi che hai spiegato, ma il parametro 'log_bin_trust_function_creators' non è disponibile nel caso. Penso che qualcosa sia cambiato nell'ultimo AWS RDS. Puoi aiutarmi, per favore, come posso farlo ora? grazie,
Pawan Developers

@RamratanGupta Non si fermerà
arun-r

1
@ arun-r grazie per la tua risposta. Ho risolto il mio problema. In realtà ho trovato log_bin_trust_function_creators nell'elenco. ma il mio problema è stato risolto contattando il supporto AWS
Pawan Developers

33

Il problema con i trigger e le stored procedure nel file dump è che queste definizioni includono l'utente da cui deve essere creata la stored procedure, il DEFINER. L'utente molto probabilmente non esiste in RDS, quindi viene generato un errore. Per poter caricare il file dump è possibile rimuovere il DEFINER utilizzando sed o Perl e creare la stored procedure / trigger con l'utente che sta eseguendo l'importazione.

perl -pe 's/\sDEFINER=`[^`]+`@`[^`]+`//' < mysqldump.sql > mysqldump.fixed.sql

Ora dovresti essere in grado di caricare il file di dump corretto

mysql my_database -u my_username -p -h rds_host < mysqldump.fixed.sql

Come detto nella risposta precedente, dovresti impostare il parametro DB:

log_bin_trust_function_creators = 1

1
La pulizia dei definitori può essere eseguita anche con sed: sed -i 's / DEFINER = OldDefiner@ localhost/ DEFINER = NewDefiner@ localhost/ g' ./TargetSqlFile.sql
siliconrockstar

14

Per me, c'erano solo 2 comandi nel mio file di dump che richiedevano privilegi SUPER:

  • SET @@GLOBAL.gtid_purged
  • SET @@SESSION.SQL_LOG_BIN

Secondo i documenti di mysqldump puoi disabilitarli con --set-gtid-purged=OFF.

Quindi guardando l' uomo mysqldump :

Utilizzare ON se si intende distribuire un nuovo slave di replica utilizzando solo alcuni dei dati dal server di cui è stato eseguito il dumping. Utilizzare OFF se si intende riparare una tabella copiandola all'interno di una topologia. Utilizzare OFF se si intende copiare una tabella tra topologie di replica che sono disgiunte e rimarranno tali.

Quindi ho deciso di aggiungere --set-gtid-purged=OFFal mio mysqldumpcomando e quindi ho potuto importare con successo il file di dump risultante.


1
Sì, è stato questo. Il mio file di dump era relativamente piccolo, quindi ho rimosso tutte le occorrenze di questi 2 comandi da esso.
Zolbayar

6

Come definito nella documentazione AWS, i trigger, le procedure e le funzioni sono disabilitati per impostazione predefinita perché la registrazione binaria è abilitata per impostazione predefinita. La disabilitazione fondamentalmente rende il tuo db più sicuro, ma se lo hai adeguatamente protetto attraverso la rete non importa.

Segui questi passaggi e il tuo problema verrà risolto https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-functions/

Inoltre, non dovresti usare i definitori durante la creazione delle procedure. Un semplice comando sed può rimuoverlo.



1

Dopo aver utilizzato la risposta arun-r, se il problema non viene risolto, è necessario modificare il file di dump. È semplice.

Nel file dump troverai righe come:

DELIMITER ;;
CREATE DEFINER=`username_from_dumped_database`@`host_from_dumped_database` PROCEDURE `procedure_or_function_name`()
BEGIN

Devi sostituire:

  • username_from_dumped_database dal tuo nome utente sul database rds.
  • host_from_dumped_databse di %

Non so perché, ma questo trucco ha funzionato per me. Un semplice editor di testo è sufficiente per farlo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.