it-swarm-es.com

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

Sé cómo exportar/importar las bases de datos usando mysqldump y está bien, pero ¿cómo obtengo los privilegios en el nuevo servidor?.

Para obtener puntos adicionales, ya hay un par de bases de datos existentes en la nueva, ¿cómo importo los privilegios de los servidores antiguos sin eliminar la pareja de los existentes?.

Servidor antiguo: 5.0.67-comunidad

Nuevo servidor: 5.0.51a-24 + lenny1

EDITAR: Tengo un volcado de la base de datos 'mysql' del servidor antiguo y ahora quiero saber la forma correcta de fusionarme con la base de datos 'mysql' en el servidor nuevo.

Intenté una 'Importación' directa usando phpMyAdmin y terminé con un error relacionado con un duplicado (uno que ya he migrado manualmente).

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

90
Gareth

No te metas con el mysql db. Allí hay mucho más que solo la tabla de usuarios. Su mejor apuesta es el comando " MOSTRAR SUBVENCIONES PARA". Tengo muchos alias y funciones de mantenimiento de CLI en mi .bashrc (en realidad, mis .bash_aliases que obtengo en mi .bashrc). Esta función:

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

El primer comando mysql usa SQL para generar SQL válido que se canaliza al segundo comando mysql. La salida se canaliza a través de sed para agregar bonitos comentarios.

El $ @ en el comando le permitirá llamarlo como: mygrants --Host = prod-db1 --user = admin --password = secret

Puede usar su kit de herramientas de Unix completo de esta manera:

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

Esa es LA forma correcta de mover a los usuarios. Su ACL MySQL se modifica con SQL puro.

171
Bruno Bronosky

Hay dos métodos para extraer subvenciones SQL de una instancia de MySQL

MÉTODO 1

Puede usar pt-show-Grant de Percona Toolkit

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

MÉTODO # 2

Puedes emular pt-show-grants con lo siguiente

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 métodos producirá un volcado de SQL puro de las concesiones de MySQL. Todo lo que queda por hacer es ejecutar el script en un nuevo servidor:

mysql -uroot -p -A < MySQLUserGrants.sql

Darle una oportunidad !!!

48
RolandoMySQLDBA

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

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

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

O utilice percona-toolkit (anteriormente maatkit) y use pt-show-grants (o mk-show-grants) para ese propósito. No hay necesidad de guiones engorrosos y/o procedimientos almacenados.

7
MrkiMile

Puede mysqldump la base de datos 'mysql' e importar a la nueva; Se requerirá un flush_privileges o un reinicio y definitivamente querrá hacer una copia de seguridad del mysq db existente primero.

Para evitar eliminar sus privilegios existentes, asegúrese de agregar en lugar de reemplazar filas en las tablas de privilegios (db, columnas_priv, Host, func, etc.).

5
nedm

¿Qué tal un PHP script? :)

Vea la fuente en este script y tendrá todos los privilegios enumerados:

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

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ámalo con

$ mysql -p -e "CALL spShowGrants" mysql

luego canalice la salida a través del comando Richards sed para obtener una copia de seguridad de los privilegios.

4
Lenny

Si bien parece que la respuesta de @Richard Bronosky es la correcta, me encontré con esta pregunta después de intentar migrar un conjunto de bases de datos de un servidor 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 iniciaba sesión como root, la mysql.user la tabla tenía todo lo que esperaba, pero no pude iniciar sesión como cualquiera de los otros usuarios y encontré esta pregunta suponiendo que tendría que volver a emitir las declaraciones GRANT.

Sin embargo, resulta que el servidor mysql simplemente necesitaba reiniciarse para obtener los privilegios actualizados en el mysql.* tablas para que surtan efecto:

server2$ Sudo restart mysql

¡Ojalá eso ayude a alguien más a lograr lo que debería ser una tarea simple!

3
Tom

cree un archivo de script Shell con el siguiente código:

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

**** luego ejecútelo en el Shell de esta manera: se le pedirá que ingrese la contraseña de root dos veces y luego se mostrará GRANTS SQL en la pantalla. ****

2
Rony

One-liner haciendo casi lo mismo que el increíble 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 solo en herramientas Unix, no se necesita software adicional.

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

0
sjas