¿Cómo copiar privilegios de usuario con MySQL?

12

Tengo una instalación de MySQL con muchas bases de datos y usuarios que necesito migrar a una nueva instalación de MySQL. Puedo usar phpMyAdmin para exportar y luego importar las bases de datos / tablas, pero no sé nada para mover los usuarios y los permisos. ¿Cómo puedo hacer esto fácilmente?

Nathan Osman
fuente

Respuestas:

17

Un script como este usará el cliente mysql cli para imprimir una serie de declaraciones de subvención que necesitaría usar para recrear las cuentas de usuario. Este comando funcionará mejor si tiene sus credenciales de base de datos almacenadas en usted .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

Si está saltando de una versión de mysql a otra, puede usar esto en lugar de simplemente volcar la base de datos mysql. El esquema de la base de datos mysql ocasionalmente se actualiza.

Esto también le permitirá elegir y elegir las cuentas que desea volver a crear, si hay algún problema que le gustaría eliminar.


Recientemente estaba usando esto en un usuario que incluía espacios en los nombres, lo que confundía read, ya que IFS por defecto incluye el carácter de espacio como separador. Mi nuevo y mejorado comando, que parecía funcionar mejor en sistemas con nombres de usuario extraños.

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
fuente
3

Esto creará un SHOW GRANTS;archivo para cada usuario.

Luego, repita cada usuario SHOW GRANTS;y agregue un punto y coma a cada línea.

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

También puede descargar y usar estas herramientas para hacer lo mismo:

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
2

Creo que debería poder migrar estos datos haciendo una copia de seguridad y restaurando la mysqlbase de datos.

pkaeding
fuente
En particular, la tabla mysql.user
Coops
2
Debe asegurarse de que ambas instancias de MySQL ejecuten la misma versión principal; de lo contrario, deberá ejecutar scripts de actualización incluidos en el servidor MySQL de destino.
Maxwell el