Wie kopiere ich Benutzerrechte mit MySQL?

12

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 nichts, um die Benutzer und Berechtigungen zu verschieben. Wie kann ich das einfach machen?

Nathan Osman
quelle

Antworten:

17

Ein solches Skript verwendet den mysql cli-Client, um eine Reihe von Grant-Anweisungen auszudrucken, die Sie zum erneuten Erstellen der Benutzerkonten benötigen würden. Dieser Befehl funktioniert am besten, wenn Ihre Datenbankanmeldeinformationen in Ihrer Datei .my.cnf gespeichert sind

#!/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 Version von MySQL zu einer anderen wechseln, können Sie dies anstelle eines einfachen Speicherauszugs der MySQL-Datenbank verwenden. Das Schema der MySQL-Datenbank wird gelegentlich aktualisiert.

Auf diese Weise können Sie auch Konten auswählen, die Sie neu erstellen möchten.


Ich habe dies kürzlich für einen Benutzer verwendet, der Leerzeichen in Namen enthielt, was verwirrend ist read, da IFS standardmäßig das Leerzeichen als Trennzeichen enthält. Mein neuer und verbesserter Befehl, der auf seltsamen Benutzernamen besser zu funktionieren schien.

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")
Zoredache
quelle
3

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

Dann wiederholen Sie jeden Benutzer SHOW GRANTS;und fügen ein Semikolon an jede Zeile an.

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} -ANe < /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 !!!

RolandoMySQLDBA
quelle
2

Ich glaube, Sie sollten in der Lage sein, diese Daten zu migrieren, indem Sie die mysqlDatenbank sichern und wiederherstellen .

pkaeding
quelle
Insbesondere die mysql.user-Tabelle
Coops
2
Sie müssen sicherstellen, dass beide MySQL-Instanzen dieselbe Hauptversion ausführen, andernfalls müssen Sie Upgrade-Skripts ausführen, die mit dem Ziel-MySQL-Server gebündelt sind.
Maxwell