2009-12-16 9 views
49

Tengo varios miles de usuarios de MySQL configurados para permitir el acceso desde un host específico. El problema es que ahora voy a tener dos máquinas (más en el futuro) que necesitarán usar la misma cuenta para acceder a cada una de sus bases de datos.Reasignar permiso de acceso de host al usuario de MySQL

Me gustaría una manera rápida y fácil (lo más automatizada posible) de ejecutar y modificar la parte de host de cada cuenta de usuario para que se ajuste a un comodín de red interno. Por ejemplo:

'bugsy' @ 'internalfoo' tiene acceso a la base de datos 'bugsy'.

Quiero permitir el acceso bugsy ahora desde cualquier punto de la red interna

'bugsy'@'10.0.0.%' tiene acceso a la 'Bugsy' DB.

+1

Me pregunto si esto tendría más suerte en serverfault.com –

+0

Gracias T.J. Voy a retirar también serverfault.com (¡no lo sabía!) –

+0

Ahora que ha publicado esta pregunta allí, le sugiero que la cierre aquí. En realidad no está relacionado con la programación, mucho más es una falla del servidor. –

Respuesta

100

Como referencia, la solución es:

UPDATE mysql.user SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root'; 
UPDATE mysql.db SET host = '10.0.0.%' WHERE host = 'internalfoo' AND user != 'root'; 
FLUSH PRIVILEGES; 
+0

¡Buen trato! (Y sí, mucho mejor para publicar esto como una respuesta que el comentario original. Me perdí su comentario en el momento ...) –

+3

Esto no reasigna correctamente todos los privilegios, @pedrocheckos respuesta a continuación realiza correctamente la acción requerida. –

1

No he tenido que hacer esto, así que tome esto con un grano de sal y una gran cantidad de "prueba, prueba, prueba".

¿Qué pasa si (en un entorno de prueba controlado seguro) modifica directamente la columna de la Host en los mysql.user y probablemente mysql.db tablas? (Por ejemplo, con una declaración update). No creo que MySQL use el host del usuario como parte de la contraseña (la función PASSWORD no sugiere que lo haga), pero tendrá que intentarlo para asegurarse. Es posible que deba emitir un comando FLUSH PRIVILEGES (o detener y reiniciar el servidor).

Para algunos motores de almacenamiento (MyISAM, por ejemplo), es posible que también deba verificar/modificar el archivo .frm las vistas que el usuario haya creado. El archivo .frm almacena el definidor, incluido el host del definidor. (I tener que hacer esto, al mover bases de datos entre hosts donde había habido una mala configuración haciendo que el host incorrecto para ser grabada ...)

+0

Gracias por su respuesta T.J. Intenté modificar un registro de usuario para mysql.user y mysql.db y aunque los cambios parecían ejecutarse correctamente, todavía no puedo conectarme desde ningún host en la red interna que no sea el host original al que se le permitió el acceso. No estoy seguro de cómo modificar los archivos .frm (son binarios) ... Supongo que se refiere a los que están en el directorio mysql/(y no a los DB aplicables a los que el usuario tiene acceso). Sin embargo, dudo en ir a buscar archivos directamente. ¿Realmente no hay una forma compatible de hacerlo en MySQL? Parece ser bastante miope. –

+0

Al haber cambiado las tablas, espero que deba ejecutar un comando 'FLUSH PRIVILEGES' (vea http://dev.mysql.com/doc/refman/5.0/en/flush.html) o, por supuesto, detener y comenzar el servicio. Los archivos 'frm' de los que estoy hablando serían para vistas en la base de datos, y así estarían en el subdirectorio de la base de datos. Los que me gustan con el motor de almacenamiento MyISAM son texto sin formato; YMMV. –

+0

"familiary"? Mis habilidades de mecanografía se han deteriorado realmente ...;) –

4

La respuesta más general es

UPDATE mysql.user SET host = {newhost} WHERE user = {youruser} 
54

La respuesta aceptada solo renombró al usuario pero los privilegios se dejaron atrás.

le recomiendo usar:

RENAME USER 'foo'@'1.2.3.4' TO 'foo'@'1.2.3.5'; 

Según MySQL documentation:

Cambiar nombre de usuario hace que los privilegios del usuario anterior a las sostenidas por el nuevo usuario.

+0

Recibo 'ERROR 1396 (HY000): la operación RENAME USER falló para 'foo' @ '%'' –

Cuestiones relacionadas