Wie kopiere ich Benutzerrechte mit MySQL?

Wie kopiere ich Benutzerrechte mit MySQL?

Ich habe eine MySQL-Installation mit vielen Datenbanken und Benutzern, die ich auf eine neue MySQL-Installation migrieren muss. Ich kann phpMyAdmin verwenden, um die Datenbanken/Tabellen zu exportieren und dann zu importieren, aber ich kenne keine Methode zum Verschieben der Benutzer und Berechtigungen. Wie kann ich das einfach tun?

Antwort1

Ein solches Skript verwendet den MySQL-CLI-Client, um eine Reihe von Grant-Anweisungen auszudrucken, die Sie zum Neuerstellen der Benutzerkonten benötigen. Dieser Befehl funktioniert am besten, wenn Sie Ihre Datenbankanmeldeinformationen in Ihrer .my.cnf-Datei gespeichert haben.

#!/bin/bash
# adapted from (http://www.pyrosoft.co.uk/blog/2006/10/18/show-grants-for-all-users-on-mysql/)
(
 mysql --batch --skip-column-names -e "SELECT user, host FROM user" mysql 
) | while read user host
do
  echo "# $user @ $host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
done

Wenn Sie von einer MySQL-Version zu einer anderen wechseln, möchten Sie dies möglicherweise anstelle eines einfachen Dumps der MySQL-Datenbank verwenden. Das Schema der MySQL-Datenbank wird gelegentlich aktualisiert.

Auf diese Weise können Sie auch die Konten auswählen, die Sie neu erstellen möchten, falls es Datenmüll gibt, den Sie beseitigen möchten.


Ich habe dies kürzlich bei einem Benutzer verwendet, dessen Namen Leerzeichen enthielten, was verwirrend war read, da IFS standardmäßig Leerzeichen als Trennzeichen verwendet. Mein neuer und verbesserter Befehl schien bei Systemen mit seltsamen Benutzernamen besser zu funktionieren.

IFS=$'\t'; while read user host; do
  echo "user:$user host:$host"
  mysql --batch --skip-column-names -e"SHOW GRANTS FOR '$user'@'$host'"
  echo ""
done < <(mysql --batch --skip-column-names -e "SELECT user, host FROM mysql.user")

Antwort2

Dadurch wird SHOW GRANTS;für jeden Benutzer eine Datei erstellt.

Geben Sie dann für jeden Benutzer ein Echo aus SHOW GRANTS;und fügen Sie jeder Zeile ein Semikolon hinzu.

MYSQL_CONN="-uroot -prootpassword"
SQLSTMT="SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';')"
SQLSTMT="${SQLSTMT} FROM mysql.user WHERE user<>''"
mysql ${MYSQL_CONN} -ANe"${SQLSTMT}" > /tmp/ShowGrants.sql
mysql ${MYSQL_CONN} -AN < /tmp/ShowGrants.sql | sed 's/$/;/g' > MySQLUserGrants.sql
rm -f /tmp/ShowGrants.sql

Sie können diese Tools auch herunterladen und verwenden, um dasselbe zu tun:

Versuche es !!!

Antwort3

Ich glaube, Sie sollten diese Daten migrieren können, indem Sie die mysqlDatenbank sichern und wiederherstellen.

verwandte Informationen