Řešení 1:
Nezahrávejte si s mysql db. Děje se tam mnohem víc než jen tabulka uživatelů. Nejlepším řešením je příkaz „ZOBRAZIT GRANTY PRO“. V mém .bashrc mám spoustu aliasů údržby CLI a funkcí (ve skutečnosti mých aliasů .bash_aliases, které mám v mém .bashrc). Tato funkce:
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;}'
}
První příkaz mysql používá SQL ke generování platného SQL, který je přenesen do druhého příkazu mysql. Výstup je pak veden přes sed, aby se přidaly pěkné komentáře.
Pří[email protected] v příkazu vám umožní volat jej jako:mygrants --host=prod-db1 --user=admin --password=secret
Na to můžete použít svou úplnou unixovou sadu nástrojů takto:
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
To je ten správný způsob, jak přesunout uživatele. Váš MySQL ACL je upraven pomocí čistého SQL.
Řešení 2:
Existují dva způsoby extrahování grantů SQL z instance MySQL
METODA #1
Můžete použít pt-show-grants z Percona Toolkit
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
METODA #2
Můžete emulovat pt-show-grants
s následujícím
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
Obě metody vytvoří čistý SQL výpis grantů MySQL. Vše, co zbývá udělat, je spustit skript na novém serveru:
mysql -uroot -p -A < MySQLUserGrants.sql
Vyzkoušejte to !!!
Řešení 3:
Odpověď Richarda Bronoského pro mě byla nesmírně užitečná. Mnohokrát děkuji!!!
Zde je malá variace, která se mi hodila. Je to užitečné pro přenos uživatelů, např. mezi dvěma instalacemi Ubuntu se spuštěným phpmyadmin. Stačí vypsat oprávnění pro všechny uživatele kromě root, phpmyadmin a debian-sys-maint. Kód je pak
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;}'
}
Řešení 4:
Nebo použijte percona-toolkit (bývalý maatkit) a použijte pt-show-grants
(nebo mk-show-grants
) za tímto účelem. Není potřeba složitých skriptů a/nebo uložených procedur.
Řešení 5:
Můžete mysqldump databázi 'mysql' a importovat do nové; bude vyžadován flush_privileges nebo restart a určitě budete chtít nejprve zálohovat existující mysq db.
Abyste předešli odebrání stávajících oprávnění, nezapomeňte řádky v tabulkách oprávnění (db, columns_priv, host, func atd.) přidávat, nikoli nahrazovat.