Lösung 1:
Leg dich nicht mit der mysql db an. Dort passiert viel mehr als nur die Benutzertabelle. Ihre beste Wahl ist der Befehl "SHOW GRANTS FOR". Ich habe viele CLI-Wartungsaliase und -funktionen in meiner .bashrc-Datei (eigentlich meine .bash_aliases, die ich in meiner .bashrc-Datei beziehe). Diese Funktion:
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;}'
}
Der erste mysql-Befehl verwendet SQL, um gültiges SQL zu generieren, das an den zweiten mysql-Befehl weitergeleitet wird. Die Ausgabe wird dann durch sed geleitet, um hübsche Kommentare hinzuzufügen.
Das [email protected] im Befehl ermöglicht es Ihnen, ihn wie folgt aufzurufen:mygrants --host=prod-db1 --user=admin --password=secret
Sie können Ihr vollständiges Unix-Toolkit wie folgt verwenden:
mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret
Das ist DER richtige Weg, um Nutzer zu bewegen. Ihre MySQL-ACL wird mit reinem SQL modifiziert.
Lösung 2:
Es gibt zwei Methoden zum Extrahieren von SQL Grants aus einer MySQL-Instanz
METHODE #1
Sie können pt-show-grants verwenden aus dem Percona Toolkit
MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql
METHODE #2
Sie können pt-show-grants
emulieren mit folgendem
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
Beide Methoden erzeugen einen reinen SQL-Dump der MySQL-Zuteilungen. Es bleibt nur noch, das Skript auf einem neuen Server auszuführen:
mysql -uroot -p -A < MySQLUserGrants.sql
Probieren Sie es aus !!!
Lösung 3:
Die Antwort von Richard Bronosky war für mich äußerst nützlich. Vielen Dank!!!
Hier ist eine kleine Variation, die für mich nützlich war. Es ist hilfreich für die Übertragung von Benutzern, z. zwischen zwei Ubuntu-Installationen, auf denen phpmyadmin ausgeführt wird. Geben Sie einfach die Privilegien für alle Benutzer außer root, phpmyadmin und debian-sys-maint aus. Der Code lautet dann
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;}'
}
Lösung 4:
Oder verwenden Sie percona-toolkit (ehemals maatkit) und verwenden Sie pt-show-grants
(oder mk-show-grants
) zu diesem Zweck. Keine Notwendigkeit für umständliche Skripte und/oder gespeicherte Prozeduren.
Lösung 5:
Sie können die 'mysql'-Datenbank mysqldump und in die neue importieren; ein flush_privileges oder Neustart ist erforderlich, und Sie sollten auf jeden Fall zuerst die vorhandene mysq-Datenbank sichern.
Um das Entfernen Ihrer vorhandenen Berechtigungen zu vermeiden, stellen Sie sicher, dass Sie Zeilen in den Berechtigungstabellen (db, column_priv, host, func usw.) anhängen und nicht ersetzen.