¿Cómo puedo exportar los privilegios de MySQL y luego importarlos a un nuevo server?

Sé cómo exportar / importar las bases de datos con mysqldump y eso está bien, pero ¿cómo puedo get los privilegios en el nuevo server.

Para los puntos extra, hay un par de bases de datos existentes en el nuevo ya, ¿cómo puedo importar los privilegios de serveres antiguos sin nuking la pareja existente de unos.

Servidor antiguo: 5.0.67-comunidad

Nuevo server: 5.0.51a-24 + lenny1

EDIT: Tengo un dump 'mysql' del server antiguo y ahora quiero saber la forma correcta de fusionar con el db 'mysql' en el nuevo server.

Intenté una 'import' directa usando phpMyAdmin y terminé con un error con respecto a un duplicado (uno que ya he migrado manualmente).

¿Alguien tiene una forma elegante de fusionar las dos bases de datos 'mysql'?

No te metas con el db mysql. Hay mucho más por ahí que sólo la tabla de usuarios. Su mejor apuesta es el command " SHOW GRANTS FOR". Tengo muchos alias de mantenimiento y funciones de CLI en mi .bashrc (en realidad mis .bash_aliases que obtengo en mi .bashrc). Esta function:

mygrants() { mysql -B -N $@ -e "SELECT DISTINCT CONCAT( 'SHOW GRANTS FOR \'', user, '\'@\'', host, '\';' ) AS query FROM mysql.user" | \ mysql $@ | \ sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}' } 

El primer command mysql utiliza SQL para generar SQL válido que se canaliza al segundo command mysql. La salida se canaliza a través de sed para añadir comentarios bonitos.

El $ @ en el command le permitirá llamarlo como: mygrants –host = prod-db1 –user = admin –password = secreto

Usted puede utilizar su kit completo de herramientas de Unix en esto como así:

 mygrants --host=prod-db1 --user=admin --password=secret | grep rails_admin | mysql --host=staging-db1 --user=admin --password=secret 

Esa es la manera correcta de mover a los usuarios. Su ACL de MySQL se ha modificado con SQL puro.

Hay dos methods para extraer las concesiones de SQL de una instancia de MySQL

MÉTODO 1

Puede utilizar pt-show-subvenciones de Percona Toolkit

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

MÉTODO # 2

Puede emular pt-show-grants con los siguientes

 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 

Cualquiera de los methods producirá un volcado SQL puro de las concesiones de MySQL. Todo lo que queda por hacer es ejecutar el script en un nuevo server:

 mysql -uroot -p -A < MySQLUserGrants.sql 

Darle una oportunidad !!!

La respuesta de Richard Bronosky fue muy útil para mí. ¡¡¡Muchas gracias!!!

Aquí hay una pequeña variación que fue útil para mí. Es útil para transferir usuarios, por ejemplo, entre dos instalaciones de Ubuntu que ejecutan phpmyadmin. Solo dump privilegios para todos los usuarios aparte de root, phpmyadmin y debian-sys-maint. El código es entonces

 mygrants() { mysql -B -N $@ -e "SELECT DISTINCT CONCAT( 'SHOW GRANTS FOR ''', user, '''@''', host, ''';' ) AS query FROM mysql.user WHERE user NOT IN ('root','phpmyadmin','debian-sys-maint')" | \ mysql $@ | \ sed 's/\(GRANT .*\)/\1;/;s/^\(Grants for .*\)/## \1 ##/;/##/{x;p;x;}' } 

O bien, utilice percona-toolkit (antiguo maatkit) y use pt-show-grants (o mk-show-grants ) para ese propósito. No hay necesidad de scripts incómodos y / o procedimientos almacenados.

Puede mysqldump la database mysql e importar a la nueva; se requerirá un flush_privileges o reinicio y definitivamente querrá hacer una copy de security del db mysq existente primero.

Para evitar la eliminación de los privilegios existentes, asegúrese de agregar en lugar de sustituir filas en las tablas de privilegios (db, columns_priv, host, func, etc.).

También puede hacerlo como un procedimiento almacenado:

 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 

y llámelo con

 $ mysql -p -e "CALL spShowGrants" mysql 

luego canaliza la salida a través del command Richards sed para get una copy de security de los privilegios.

Mientras que aparece la respuesta @Richard Bronosky es la correcta, me encontré con esta cuestión después de tratar de migrar un set de bases de datos de un server a otro y la solución fue mucho más simple:

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

En este punto, todos mis datos estaban visibles si entré como root , la tabla mysql.user tenía todo lo que esperaba, pero no pude iniciar session como cualquiera de los otros usuarios y encontré esta pregunta suponiendo que tienen que volver a emitir las declaraciones GRANT .

Sin embargo, resulta que el server mysql simplemente necesitaba ser reiniciado para los privilegios actualizados en las tablas mysql.* Para tener efecto:

 server2$ sudo restart mysql 

Esperemos que ayude a alguien a lograr lo que debería ser una tarea sencilla!

¿Qué tal un script PHP? 🙂

Ver código fuente en este script y tendrás todos los privilegios listdos:

 //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"; } } 

cree un file de commands de shell con el código siguiente:

############################################## 3

 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 

#

**** a continuación, ejecutarlo en el shell de esta manera: se le pedirá que ingrese la contraseña de root dos veces y luego el GRANTS SQL se mostrará en la pantalla. ****

One-liner haciendo casi lo mismo que el impresionante 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' 

Basado únicamente en herramientas unix, no se necesita ningún software adicional.

Ejecutar desde dentro de un shell bash, se supone que tiene un .my.cnf trabajo donde se puede leer la contraseña de su usuario mysql root .