it-swarm.it

Modifica DEFINER su molte viste

Sto riscontrando problemi backup dei miei database dopo un aggiornamento. Ho cercato il mio sistema cercando di capire perché. Una query che ho eseguito ha restituito questo risultato.

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

Dopo alcune indagini sembra che il definitore di queste viste sia un vecchio account sviluppatore che è stato eliminato dal sistema. I database e le viste con questo problema vengono utilizzati molto raramente e la maggior parte viene conservata per scopi di archiviazione.

Esistono circa 40 visualizzazioni con un definitore che non esiste più. C'è un modo semplice per cambiare il definitore in un account diverso su tutto in una volta? C'è un modo per convincere mysqldump a scaricare semplicemente tutte le viste in un file in modo da poterlo modificare e ricreare le viste?

27
Zoredache

Crea un file di testo con tutte le definizioni della vista:

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('SHOW CREATE VIEW ',table_schema,'.',table_name,'\\G') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A --skip-column-names > AllMyViews.sql

Modifichi AllMyViews.sql da lì. Quindi, rilascia le viste

mysql -uusername -ppassword -A --skip-column-names -e"SELECT CONCAT('DROP VIEW ',table_schema,'.',table_name,';') FROM information_schema.tables WHERE engine IS NULL" | mysql -uusername -ppassword -A

Dopo aver modificato AllMyViews.sql ricaricarli

mysql -uusername -ppassword -A < AllMyViews.sql

Provaci !!!

14
RolandoMySQLDBA

È possibile utilizzare ALTER VIEW insieme a schema informativo . Hai detto di scaricarlo in un file di testo, quindi forse qualcosa del genere:

SELECT CONCAT("ALTER DEFINER=`youruser`@`Host` VIEW `",table_name,"` AS ", view_definition,";") 
FROM information_schema.views WHERE table_schema='databasename'

Mescola questo con la riga di comando mysql (supponendo * nix, che non ha familiarità con Windows):

> echo "*abovequery*" | mysql -uuser -p > alterView.sql
> mysql -uuser -p databasename < alterView.sql

Sidenote: Non è possibile modificare direttamente le voci information_schema . Nota2: funziona solo per un database alla volta, se si interrompe DOVE table_schema è necessario inserire i comandi USE tra ciascuno.

26
Derek Downey

Automatizzando la soluzione di Derek, questo cambierà DEFINER in [email protected] e imposta SQL SECURITY INVOKER (assicurati di volerlo prima!) in tutte le viste in tutti i database:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
    mysql -BNe "SELECT CONCAT(\"ALTER DEFINER=\`root\`@\`localhost\` SQL SECURITY INVOKER VIEW \",table_name,\" AS \", view_definition,\";\") FROM information_schema.views WHERE table_schema=\"$DB\"" | \
    mysql $DB
done

ATTENZIONE: assicurati di aver effettuato un backup completo di mysql (es. Arrestando mysqld e eseguendo il backup di tutti i file in/var/lib/mysql) prima di eseguirlo - nel caso ... Ha funzionato per io, ma YMMV.

dovresti anche controllare tutti i tuoi tavoli/viste con:

mysql -BNe 'show databases' | \
egrep -v '^(information_schema|performance_schema)$' | \
while read DB
do 
   mysql -BNe 'show tables' $DB | \
   while read t
   do
      echo "check table $t;"
   done | mysql -BN $DB
done | \
egrep -v 'status\s*OK'

non dovrebbe più lamentarsi delle definizioni non valide nelle viste.

3
Matija Nalis

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

Modificare views.sql (cambia definitore) e ricrearli:

cat views.sql | mysql <DB>

Specifica -u e -p cambia se necessario.

3
x-yuri

Ho creato un semplice python che sostituisce il definitore db di produzione con il definitore db locale. Questo script modifica i file di dump e importa automaticamente i database specificati.

Repository GIT: https://github.com/mjakal/db-auto-import

0
Martin