Salta al contenuto

Come posso risolvere gli errori 1227 e definer quando utilizzo mysqldump per importare dati nella mia istanza database Amazon RDS per MySQL?

3 minuti di lettura
0

Quando utilizzo mysqldump per importare dati in un'istanza database Amazon Relational Database Service (Amazon RDS) per MySQL, ricevo un errore 1227 o definer.

Risoluzione

Per esaminare gli eventi e le modifiche del database, esamina il log binario. Per ulteriori informazioni, consulta The binary log (Il log binario) sul sito web MySQL.

Errore 1227

Quando attivi la registrazione binaria e il file mysqldump contiene un oggetto memorizzato, come un trigger, una vista, una funzione o un evento, potresti ricevere il seguente errore:

"Error: 1227 SQLSTATE: 42000 (ER_SPECIFIC_ACCESS_DENIED_ERROR) Access denied; you need (at least one of) the %s privilege(s) for this operation."

Per risolverlo, completa i seguenti passaggi:

  1. Nel gruppo di parametri del database personalizzato creato per l'istanza database, imposta il parametro log_bin_trust_function_creators su True.
  2. Rimuovi le righe di comando come SET @ @SESSION .SQL_LOG_BIN= 0; dal file di dump prima di eseguire il file sull'istanza.

Errore definer

Si verifica un errore definer quando MySQL tenta di creare un oggetto come utente del database che non esiste nel database di destinazione. Oppure quando MySQL tenta di creare un utente per il localhost perché Amazon RDS non ha le autorizzazioni del superutente. Potresti ricevere un errore simile al seguente:
"Definer error: example: /*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER customer_update AFTER UPDATE ON `customer` FOR EACH ROW" error message."

Per risolverlo, intraprendi le seguenti azioni.

Rimuovi la riga DEFINER

Individua la riga DEFINER ed eliminala:

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

Esempio di output:

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

Rinomina gli utenti DEFINER

Rinomina il root masteruser e localhost %host:

/*!50017 DEFINER=`masteruser`@`%host`*/

Esempio di output:

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

Nota: puoi utilizzare % come carattere jolly per tutti gli host.

Rimuovi l'attributo DEFINER, quindi crea o ricrea il file di dump

L'utilità dump di MySQL non include un'opzione per rimuovere l'attributo DEFINER. Alcune utilità client di MySQL forniscono un'opzione per ignorare l'attributo DEFINER quando crei backup logici, ma questa funzionalità non è disponibile per impostazione predefinita. Per determinare se hai la possibilità di ignorare l'attributo DEFINER, consultate la documentazione del tuo client MySQL preferito. Il client a riga di comando MySQL non può escludere l'attributo DEFINER. Tuttavia, puoi utilizzare il client con strumenti di terze parti per rimuovere l'attributo DEFINER o individuare e sostituire il nome utente e l'host.

Per individuare ed eliminare la riga DEFINER in Linux, macOS o Windows Subsystem per Linux (WSL), esegui questo comando:

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

Per individuare e sostituire il nome utente e l'host in Linux, macOS o WSL, esegui questo comando:

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

Nota: sostituisci masteruser con il nome del tuo utente principale Amazon RDS.

Informazioni correlate

Amazon RDS per MySQL

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