Soluzione 1:
Non scherzare con il database mysql. C'è molto di più in corso oltre al semplice tavolo degli utenti. La soluzione migliore è il comando "MOSTRA SOVVENZIONI PER". Ho molti alias e funzioni di manutenzione della CLI nel mio .bashrc (in realtà i miei .bash_aliases che ho trovato nel mio .bashrc). Questa funzione:
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';'
) AS query FROM mysql.user" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
Il primo comando mysql utilizza SQL per generare SQL valido che viene reindirizzato al secondo comando mysql. L'output viene quindi reindirizzato attraverso sed per aggiungere commenti carini.
Il [email protected] nel comando ti permetterà di chiamarlo come:mygrants --host=prod-db1 --user=admin --password=secret
Puoi usare il tuo kit di strumenti unix completo su questo in questo modo:
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
Questo è IL modo giusto per spostare gli utenti. Il tuo MySQL ACL viene modificato con puro SQL.
Soluzione 2:
Esistono due metodi per estrarre le concessioni SQL da un'istanza MySQL
METODO N. 1
Puoi utilizzare pt-show-grants da Percona Toolkit
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
METODO N. 2
Puoi emulare pt-show-grants
con quanto segue
MYSQL_CONN="-uroot -ppassword"
mysql ${MYSQL_CONN} --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql ${MYSQL_CONN} --skip-column-names -A | sed 's/$/;/g' > MySQLUserGrants.sql
Entrambi i metodi produrranno un dump SQL puro delle concessioni MySQL. Tutto ciò che resta da fare è eseguire lo script su un nuovo server:
mysql -uroot -p -A < MySQLUserGrants.sql
Fai un tentativo!!!
Soluzione 3:
La risposta di Richard Bronosky mi è stata estremamente utile. Molte grazie!!!
Ecco una piccola variazione che mi è stata utile. È utile per il trasferimento di utenti, ad es. tra due installazioni di Ubuntu che eseguono phpmyadmin. Basta eseguire il dump dei privilegi per tutti gli utenti tranne root, phpmyadmin e debian-sys-maint. Il codice è quindi
mygrants()
{
mysql -B -N [email protected] -e "SELECT DISTINCT CONCAT(
'SHOW GRANTS FOR ''', user, '''@''', host, ''';'
) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \
mysql [email protected] | \
sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}'
}
Soluzione 4:
Oppure, utilizza percona-toolkit (ex maatkit) e usa pt-show-grants
(o mk-show-grants
) per quello scopo. Non sono necessari script ingombranti e/o stored procedure.
Soluzione 5:
Puoi eseguire il mysqldump del database "mysql" e importarlo in quello nuovo; sarà richiesto un flush_privileges o un riavvio e vorrai sicuramente eseguire prima il backup del database mysq esistente.
Per evitare di rimuovere i tuoi privilegi esistenti, assicurati di aggiungere anziché sostituire le righe nelle tabelle dei privilegi (db, columns_priv, host, func, ecc.).