Come posso cambiare il DEFINER di una VISTA in Mysql?


35

Quando eseguo mysqldump, viene visualizzato un errore:

mysqldump: Got error: 1449: The user specified as a definer ('root'@'foobar') does not exist when using LOCK TABLES

Questo ha senso perché foobarè una macchina legacy che non esiste più.

Come posso modificare il definitore di tutte le mie tabelle in "root" @ "localhost"?


4
Hai viste? Le tabelle non hanno dei definitori, ne sono certa ... Vedi anche dba.stackexchange.com/q/4129/630
gbn

1
@gbn +1 avevi ragione - erano visualizzazioni - grazie per il link, ma non riuscivo a farlo funzionare bene. Tuttavia, sono stato in grado di modificare le visualizzazioni in SQLyog in modo da poter eseguire il dump.
kfmfe04,

Funziona per me. {{concedi tutto . a "root" @ "%" identificato da "password" con l'opzione di concessione; }}
Muhammad Azeem,

Risposte:


33

Quello che penso è che il database che si sta tentando di scaricare contiene procedure / metodi che sono stati definiti da un utente durante l'accesso come root @ 'foobar'.

Ora la soluzione è che devi sostituire il definitore per tali procedure / metodi

quindi è possibile generare il dump senza l'errore.

puoi farlo come ..

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar'

Fai attenzione, perché questo cambierà tutti i definitori per tutti i database.

Provalo....!

AGGIORNAMENTO il 9 febbraio 2012

Come ho visto il link fornito da @gbn che è una risposta data da @Rolando che può anche essere il caso. Si prega di visitare il link

EDIT di @RolandoMySQLDBA 2011-12-16 11:20 EDT

Sebbene rischiosa, questa risposta è buona. Solo per chiarire: è possibile specificare il database nella query in questo modo:

 UPDATE `mysql`.`proc` p SET definer = 'root@localhost' WHERE definer='root@foobar' AND db='whateverdbyouwant';

1
Il link sopra mostra come farlo con le istruzioni ALTER che potrebbero essere meno rischiose ... Inoltre, controlla il mio aggiornamento per i definitori nel tuo AGGIORNAMENTO
gbn

UPDATEcambiato il tavolo, ma mysqldumpnon la vede: mysqldump: Got error: 1449: The user specified as a definer ('root'@'%') does not exist when using LOCK TABLES. Anche dopo il riavvio mysql. Sto correndo mysql-5.5.31.
X-yuri,

Colpa mia. Ho avuto opinioni anche con un definitore sbagliato. update mysql.procl'approccio funziona davvero.
x-yuri,

Non ha funzionato ....
カ オ ナ シ

3
Questa risposta funziona per cambiare i definitori di procedure e funzioni ma non cambia il definitore di una vista .
Anthony G - giustizia per Monica il

35

Più facile da usare l' --single-transactioninterruttore:

mysqldump --single-transaction -u username -p db > db.sql

1
Siamo spiacenti, in che modo risolve il problema descritto nella domanda originale? Sembra che tu abbia risposto alla domanda sbagliata ...
dezso

6
La struttura della risposta è errata, perché --le transazioni singole devono essere precedenti al nome del database, ma la risposta è effettivamente corretta. La specifica di questa opzione aggira il problema modificando il comportamento di blocco di mysqldump, quindi l'errore nella domanda originale non si verifica più.
Michael - sqlbot,

ho affrontato lo stesso problema. ha funzionato - single-transazione.

Non sono sicuro di cosa faccia, ma ha funzionato! Grazie
Sri Harsha Kappala il

17

La soluzione più rapida sarebbe semplicemente ricreare il definitore in modo che esista, purché non crei conflitti con gli utenti esistenti.

CREATE USER 'root'@'foobar';


E se l'utente fosse 'root' @ '%'? Nego semplicemente una cosa del genere su un server di cui siamo responsabili.
Attila Fulop

@AttilaFulop Sì, sicuramente la sicurezza dovrebbe essere una considerazione, ma ho detto che questa era la soluzione "più veloce", non quella perfetta. Una volta completata l'importazione, l'utente potrebbe essere eliminato per mitigare i rischi di avere utenti extra.
ColinM

Hai ragione. Volevo solo attirare l'attenzione anche su questo aspetto particolare. I miei compagni di lavoro avrebbero aggiunto 'root' @ '%' e lo avrebbero lasciato finché Chuck Norris è vivo, cioè. per sempre ;)
Attila Fulop,

6

Esporta tutte le visualizzazioni del database <DB>:

mysql -BNe "SELECT TABLE_NAME FROM TABLES WHERE TABLE_SCHEMA = '<DB>' AND TABLE_TYPE = 'VIEW'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

o:

mysql -BNe "SELECT TABLE_NAME FROM VIEWS WHERE TABLE_SCHEMA = '<DB>'" \
    information_schema | xargs mysqldump --single-transaction --no-data <DB> >views.sql

Modificali views.sqle ricreali:

cat views.sql | mysql <DB>

Specificare -u e -pcambiare se necessario.


Questa è la risposta più pulita
Wolfe, l'
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.