sviluppo-web-qa.it

Come posso esportare i privilegi da MySQL e quindi importarli in un nuovo server?

So come esportare/importare i database usando mysqldump e va bene, ma come ottengo i privilegi nel nuovo server.

Per i punti extra, ci sono già un paio di database esistenti su quello nuovo, come posso importare i privilegi dei vecchi server senza nuocere alla coppia esistente di quelli.

Vecchio server: 5.0.67-community

Nuovo server: 5.0.51a-24 + lenny1

EDIT: Ho un dump del db 'mysql' dal vecchio server e ora voglio conoscere il modo corretto di unire il 'mysql' db sul nuovo server.

Ho provato un 'Import' semplice usando phpMyAdmin e ho finito con un errore riguardante un duplicato (uno che ho già migrato manualmente).

Qualcuno ha un modo elegante di unire i due database "mysql"?

90
Gareth

Non scherzare con il mysql db. C'è molto altro da fare lì oltre alla semplice tabella degli utenti. La tua scommessa migliore è il comando " SHOW GRANTS FOR". Ho molti alias di manutenzione della CLI e funzioni nel mio .bashrc (in realtà i miei .bash_alias che ho creato nel mio .bashrc). Questa funzione:

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;}'
}

Il primo comando mysql utilizza SQL per generare un SQL valido che viene reindirizzato al secondo comando mysql. L'output viene quindi reindirizzato attraverso sed per aggiungere commenti piuttosto.

$ @ Nel comando ti permetterà di chiamarlo come: mygrants --Host = prod-db1 --user = admin --password = secret

È possibile utilizzare il kit di strumenti unix completo su questo in questo modo:

mygrants --Host=prod-db1 --user=admin --password=secret | grep Rails_admin | mysql --Host=staging-db1 --user=admin --password=secret

Questo è il modo giusto per spostare gli utenti. Il tuo ACL MySQL è modificato con SQL puro.

171
Bruno Bronosky

Esistono due metodi per l'estrazione di SQL Grants da un'istanza MySQL

METODO # 1

Puoi usare pt-show-grants da Percona Toolkit

MYSQL_CONN="-uroot -ppassword"
pt-show-grants ${MYSQL_CONN} > MySQLUserGrants.sql

METODO # 2

Puoi emulare pt-show-grants con il seguente

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

Entrambi i metodi produrranno un dump SQL puro delle sovvenzioni MySQL. Non resta che eseguire lo script su un nuovo server:

mysql -uroot -p -A < MySQLUserGrants.sql

Provaci !!!

48
RolandoMySQLDBA

La risposta di Richard Bronosky è stata estremamente utile per me. Grazie molto!!!

Ecco una piccola variazione che mi è stata utile. È utile per trasferire utenti ad es. tra due installazioni Ubuntu che eseguono phpmyadmin. Scarica i privilegi per tutti gli utenti tranne root, phpmyadmin e debian-sys-maint. Il codice è quindi

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;}'
}
15
rmldj

Oppure utilizza percona-toolkit (ex maatkit) e usa pt-show-grants (o mk-show-grants) per quello scopo. Non sono necessari script ingombranti e/o procedure memorizzate.

7
MrkiMile

Puoi mysqldump il database 'mysql' e importarlo in quello nuovo; saranno richiesti flush_privileges o restart e sicuramente vorrai prima eseguire il backup del database mysq esistente.

Per evitare di rimuovere i privilegi esistenti, assicurarsi di aggiungere anziché sostituire le righe nelle tabelle dei privilegi (db, column_priv, Host, func, ecc.).

5
nedm

Che ne dici di uno PHP? :)

Visualizza la fonte su questo script e avrai tutti i privilegi elencati:

//connect
mysql_select_db("mysql", mysql_connect("localhost","root",""));

//create grants select statements
$rs = mysql_query("SELECT DISTINCT CONCAT('SHOW GRANTS FOR ''', user, '''@''', Host, ''';') AS query FROM user");

//iterate through grants
while ($row=mysql_fetch_array($rs)) {
    //run grant query
    $rs2 = mysql_query($row['query']);
    //iterate through results
    while($row2 = mysql_fetch_array($rs2)){
        //print results
        echo $row2[0] . ";\n\n";
    }
}
4
Ibrahim Lawal

Potresti anche farlo come una procedura memorizzata:

CREATE PROCEDURE spShowGrants()
    READS SQL DATA
    COMMENT 'Show GRANT statements for users'
BEGIN
    DECLARE v VARCHAR(64) CHARACTER SET utf8;
    DECLARE c CURSOR FOR
    SELECT DISTINCT CONCAT(
        'SHOW GRANTS FOR ', user, '@', Host, ';'
    ) AS query FROM mysql.user;
    DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;  
    OPEN c;
    WHILE TRUE DO
        FETCH c INTO v;
        SET @v = v;
        PREPARE stmt FROM @v;
        EXECUTE stmt;
    END WHILE;
    CLOSE c;
END

e chiamalo con

$ mysql -p -e "CALL spShowGrants" mysql

quindi reindirizzare l'output tramite il comando sed di Richard per ottenere un backup dei privilegi.

4
Lenny

Mentre sembra che la risposta di @Richard Bronosky sia quella corretta, mi sono imbattuto in questa domanda dopo aver provato a migrare un set di database da un server a un altro e la soluzione era molto più semplice:

server1$ mysqldump -u root -p --all-databases > dbdump.sql

server2$ mysql -u root -p < dbdump.sql

A questo punto, tutti i miei dati erano visibili se ho effettuato l'accesso come root, il mysql.user La tabella conteneva tutto ciò che mi aspettavo, ma non sono riuscito ad accedere come nessuno degli altri utenti e ho trovato questa domanda supponendo che avrei dovuto rilasciare nuovamente le istruzioni GRANT.

Tuttavia, si scopre che il server mysql doveva semplicemente essere riavviato per i privilegi aggiornati in mysql.* tabelle per rendere effettive:

server2$ Sudo restart mysql

Spero che ciò aiuti qualcun altro a raggiungere quello che dovrebbe essere un compito semplice!

3
Tom

crea un file di script Shell con il seguente codice:

echo "SELECT DISTINCT CONCAT (\"show grants for '\", user, \"'@'\", Host, \"';\") AS query FROM mysql.user; " >   script.sql    
echo "*** You will be asked to enter the root password twice ******"    
mysql -u root -p  < script.sql > output.sql ;    
cat output.sql | grep show > output1.sql  ; rm output.sql -f ; 
mysql -u root -p  < output1.sql > output.sql ;
clear
echo "-----Exported Grants-----"    
cat  output.sql ; rm  output.sql   output1.sql -f    
echo "-------------------------"
rm  script.sql -f

**** quindi eseguilo su Shell in questo modo: ti verrà chiesto di inserire la password di root due volte e quindi GRANTS SQL verrà visualizzato sullo schermo. ****

2
Rony

One-liner fa praticamente lo stesso del fantastico pt-show-grants:

mysql --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',Host,''';') FROM mysql.user WHERE user<>''" | mysql --skip-column-names -A | sed 's/$/;/g'

Basato solo su strumenti unix, non è necessario alcun software aggiuntivo.

Eseguire all'interno di una shell bash, si presume che tu abbia un .my.cnf Funzionante in cui è possibile leggere la password del tuo utente mysql root.

0
sjas