Come risolvere un errore 1227 o di definer comparso in fase di importazione dei dati su un'istanza database Amazon RDS per MySQL con mysqldump?

3 minuti di lettura
0

Quando utilizzo mysqldump per importare dei dati in un'istanza database Amazon Relational Database Service (Amazon RDS) per MySQL ricevo un errore simile a uno dei seguenti:

Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation.
Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

Breve descrizione

Un errore 1227 si verifica quando il registro binario è abilitato nel database e il file mysqldump contiene un oggetto archiviato, ad esempio un trigger, una vista, una funzione o un evento. Ulteriori informazioni sono disponibili nella pagina dedicata al registro binario.

Gli errori di definer vengono attivati quando MySQL tenta di creare un oggetto da associare a un utente che non esiste nel database di destinazione. Un errore simile verrebbe mostrato, ad esempio, se MySQL tentasse di creare un utente per localhost. Questa operazione non è consentita per Amazon RDS, poiché quest'ultima non offre autorizzazioni di livello super utente.

Risoluzione

Risolvere l'errore 1227

1.    Impostare il parametro log_bin_trust_function_creators su true nel gruppo di parametri DB creato su misura per l'istanza del database.

2.    Alcuni comandi generalmente presenti nei file di dump di MySQL, come "SET @@SESSION.SQL_LOG_BIN= 0;" non sono disponibili in RDS. Queste stringhe dovranno essere eliminate o corredate di note sul file di dump prima dell'esecuzione sull'istanza RDS.

Risolvere un errore di definer

Gli errori di definer possono essere risolti:

  • rimuovendo la linea di definer;
  • rinominando gli utenti di definer;
  • (ri)creando il file di dump senza includere l'opzione definer.

Rimuovere la stringa di definer

/*!50017 DEFINER=`root`@`localhost`*/

Dopo la modifica, la stringa mostrerebbe un output simile a questo:

/*!50003 CREATE*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

Rinominare gli utenti di definer

Rinominare la radice come masteruser e localhost come %host:

/*!50003 CREATE*/ /*!50017 DEFINER=`masteruser`@`%`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW

**Nota:**per tutti gli host è possibile utilizzare il simbolo % come jolly.

(Ri)creare il file di dump senza includere l'opzione definer.

L'utilità dump di MySQL non consente di rimuovere un DEFINER. Alcuni client MySQL permettono però di ignorarlo durante la creazione di un backup logico, opzione che generalmente, tuttavia, non è disponibile per impostazione predefinita. Per scoprire se questa possibilità è disponibile in un caso specifico è necessario consultare la documentazione del client MySQL scelto. Il client della linea di comando MySQL non è in grado di escludere il definer. Per rimuoverlo o per trovare e sostituire il nome utente e l'host sarà necessario abbinarlo a uno strumento esterno apposito

Di seguito sono indicati alcuni esempi su come rimuovere un DEFINER in Linux, macOS e Windows Subsystem for Linux (WSL):

Rimuovi:

sed -i -e 's/DEFINER=`root`@`localhost`//g' dump.sql

Trova e sostituisci:

sed -i -e 's/DEFINER=`root`@`localhost`/DEFINER=`masteruser`@`%`/g' dump.sql

**Nota:**sostituire il valore per masteruser con il nome del masteruser Amazon RDS.


Informazioni correlate

MySQL su Amazon RDS

Esportazione di dati da un'istanza database MySQL tramite la replica