Jak skopiować uprawnienia użytkownika za pomocą MySQL?

12

Mam instalację MySQL z wieloma bazami danych i użytkownikami, których potrzebuję do migracji do nowej instalacji MySQL. Mogę użyć phpMyAdmina do eksportowania, a następnie importowania baz danych / tabel, ale nie wiem nic o przeniesieniu użytkowników i uprawnień. Jak mogę to zrobić łatwo?

Nathan Osman
źródło

Odpowiedzi:

17

Taki skrypt użyje klienta mysql cli do wydrukowania serii instrukcji dotacji, których należy użyć do odtworzenia kont użytkowników. To polecenie będzie działać najlepiej, jeśli przechowywane są poświadczenia bazy danych .my.cnf

#!/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

Jeśli przeskakujesz z jednej wersji mysql do innej, możesz chcieć użyć tego zamiast zwykłego zrzutu bazy danych mysql. Schemat bazy danych mysql czasami się aktualizuje.

Umożliwi to również wybranie kont, które chcesz ponownie utworzyć, jeśli istnieje cruft, który chcesz wyeliminować.


Ostatnio używałem tego na użytkowniku, który zawarł spacje w nazwach, co pomieszało read, ponieważ IFS domyślnie zawiera spację jako separator. Moje nowe i ulepszone polecenie, które wydawało się działać lepiej na dziwnych nazwach systemów.

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
źródło
3

Spowoduje to utworzenie SHOW GRANTS;pliku dla każdego użytkownika.

Następnie powtórz echo każdemu użytkownikowi SHOW GRANTS;i dodaj średnik do każdej linii.

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

Możesz również pobrać i użyć tych narzędzi, aby zrobić to samo:

Spróbuj !!!

RolandoMySQLDBA
źródło
2

Uważam, że powinieneś mieć możliwość migracji tych danych poprzez tworzenie kopii zapasowej i przywracanie mysqlbazy danych.

pkaeding
źródło
W szczególności tabela mysql.user
Coops
2
Musisz upewnić się, że w obu instancjach MySQL działa ta sama wersja główna, w przeciwnym razie musisz uruchomić skrypty aktualizacji dołączone do docelowego serwera MySQL.
Maxwell