Come copiare i privilegi dell'utente con MySQL?


12

Ho un'installazione MySQL con molti database e utenti che devo migrare verso una nuova installazione MySQL. Posso usare phpMyAdmin per esportare e quindi importare i database / le tabelle, ma non so nulla per spostare gli utenti e le autorizzazioni. Come posso farlo facilmente?

Risposte:


17

Uno script come questo utilizzerà il client mysql cli per stampare una serie di dichiarazioni di sovvenzione da utilizzare per ricreare gli account utente. Questo comando funzionerà in modo ottimale se le credenziali del database sono memorizzate in .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

Se stai saltando da una versione di mysql a un'altra, potresti voler usare questo invece di un semplice dump del database mysql. Lo schema del database mysql viene occasionalmente aggiornato.

Ciò ti consentirà anche di scegliere gli account che desideri ricreare, se è presente una sequenza che desideri eliminare.


Recentemente lo stavo usando su un utente che includeva spazi nei nomi, che confondevano read, poiché IFS per impostazione predefinita include il carattere spazio come separatore. Il mio comando nuovo e migliorato, che sembrava funzionare meglio su sistemi nomi utente strani.

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")

3

Questo creerà un SHOW GRANTS;file per ogni utente.

Quindi, fai eco a ciascun utente SHOW GRANTS;e aggiungi un punto e virgola a ogni riga.

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

Puoi anche scaricare e utilizzare questi strumenti per fare la stessa cosa:

Provaci !!!


2

Credo che dovresti essere in grado di migrare questi dati eseguendo il backup e il ripristino del mysqldatabase.


In particolare la tabella mysql.user
Coops il

2
Devi assicurarti che entrambe le istanze di MySQL eseguano la stessa versione principale, altrimenti dovrai eseguire gli script di aggiornamento in bundle con il server MySQL di destinazione.
Maxwell,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.