Autor Tema: Bloqueo de base de datos  (Leído 13911 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Bloqueo de base de datos
« en: Octubre 17, 2013, 08:27:01 pm »
En mi proyecto hay una aplicación secundaria que correrá en el servidor de la base de datos, cuya única tarea es hacer actualizaciones masivas de datos una vez al día. La configuraría para ejecutarse diariamente a partir de las 4 am, para tener menos oportunidad de que hubiera alguien utilizando la aplicación principal en una de las computadoras donde se empleará. En ese momento la base de datos no debiera admitir ninguna petición de la aplicación principal, porque podría afectar el resultado final.
Entonces, aquí va mi duda: ¿es suficiente con que comience una transacción (trabajo con VB6 y MySQL) desde la aplicación del servidor, realice todos los procesos y luego culmine la transacción (CommitTrans), o debo bloquear la base de datos de alguna manera? Si fuese correcta la segunda opción, ¿cuál es la manera más conveniente de hacerlo? Y si fuese la primera la adecuada, ¿la base de datos rechazaría o postergaría toda otra petición (que viniera de la aplicación principal, desde otra computadora) hasta que se finalice la transacción de la aplicación que corre en el servidor (ya sea con CommitTrans o con RollBackTrans)?
¡Muchas gracias!

Jerónimo

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #1 en: Octubre 18, 2013, 12:25:40 pm »
Tu inquietud me plantea esta pregunta ¿Que MySQL siendo un motor potente y grande no puede permitir los backups en caliente?

Te comento un poco, Si usas Access lo que comentas es muy valido, Access es susceptible a daños cuando haces un backup por el tema de la exclusividad, pero eso es Access, una BD que algunos entendidos les molesta llamarlo Base de Datos, me parece que todos los motores C/S no tienen esa restriccion.
En mi cuasi olvidado motor FirebirdSQL que es un motor potente que a nivel técnico es casi al nivel de las grandes (MySQL, SQL Server, etc) se puede hacer un backup en caliente. Tengo varios ejemplos pero el mas antiguo es uno que desde hace casi 3 años todos los dias a las 10am y a las 6pm (la tienda abre a las 9am y cierra a las 8pm) el sistema hace backup como dije TODOS LOS DIAS (bueno domingos no) sin necesidad de bloquear a nadie y muchos hasta ya se olvidaron que el backupeo esta corriendo en segundo plano (obvio solo en el servidor) y hasta la fecha no tenemos ningún problema, tanto que hasta ya me molesta jaja. Solo hice hace unos pocos meses un restore y un redefinicion de los indices por un tema de simple mantenimiento debido a nuevos querys que habia creado.
Te comento esto para decir: Si FirebirdSQL puede ¿porque MySQL no?, yo creo que si se puede, debe haber en MySQL alguna funcionalidad externa o interna que te permita hacer eso, en el caso de Firebird por ejemplo es externa usando un utilitario llamado GBack que dicho vulgar y simplemente hace una fotografia de la BD y la empieza a reconstruir (+/-).
Para estos motores no es necesario interrumpir la operatividad del sistema, estuve incluso en época de campaña navideña (alto trafico para la BD) entre 5pm y 7pm y podía ver que habían casi 10 usuarios atacando concurrentemente a la BD y todo ferpecto.

Ya algún compañero conocedor de MySQL te podrá dar la fija de que hacer en este caso con los backups de MySQL.
« última modificación: Octubre 18, 2013, 12:28:13 pm por YAcosta »
Me encuentras en YAcosta.com

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #2 en: Octubre 18, 2013, 04:32:11 pm »
En realidad no se trata de hacer backups. Lo que hace la aplicación del lado del servidor es actualizar algunos campos de algunos registros de algunas tablas. Por supuesto, calculo que todo el proceso se correrá en 30 segundos y no creo que justo a las 4 am (o cuando se encienda el equipo) nadie vaya a hacer nada, pero quiero evitar que justo en el medio la aplicación principal acceda a la base para modificar algo, porque no sé cómo resultaría si eso sucediera.
A raíz de esta duda leí el hilo que iniciaste en este mismo foro (http://leandroascierto.com/foro/index.php?topic=473.msg2368#msg2368) y no me termina de quedar claro. No sé si con solo hacer "bd.BeginTrans" se posterga cualquier otra petición a la base de datos (incluso, desde otras computadoras) hasta que se haga "bd.CommitTrans", de manera que nada afecte ninguna tabla hasta que se terminen de hacer todas las operaciones. Porque lo que quiero es eso: que nada altere ningún campo de ningún registro de ninguna tabla mientras la aplicación del lado del servidor esté haciendo esta tarea. Ahora bien, una vez que termina, que se pueda seguir accediendo a la bd normalmente.
¡Muchas gracias!

Jerónimo

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #3 en: Octubre 18, 2013, 05:38:52 pm »
Sorry doc, tienes razon, eso me pasa por hacer las cosas apurado, ya acabo de verificar que pusiste "actualizaciones masivas", y no tiene nada que ver con backup sorry.

Ok, entonces quieres hacer un proceso en "bath", bien en ese caso no basta con el tema del begin/commit porque esto solo es para la transacción de las tablas que afecta no de toda la BD.

Para no marear con Firebird debe haber algún método en MySQL para que cuando lances ese proceso que entiendo sera otro aplicativo, puedas abrir la BD en modo exclusivo, o sea, ese aplicativo verifique que no halla nadie conectado, una vez que lo verifica se conecta a la BD de forma exclusiva y en ese caso ninguna otra conexión se podra realizar y eso lo gestiona la BD y luego liberas esta cuando tu procesos por lotes termine.
Me encuentras en YAcosta.com

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #4 en: Octubre 18, 2013, 05:40:28 pm »
Me encuentras en YAcosta.com

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #5 en: Octubre 18, 2013, 05:51:45 pm »
Para no marear con Firebird debe haber algún método en MySQL para que cuando lances ese proceso que entiendo sera otro aplicativo, puedas abrir la BD en modo exclusivo, o sea, ese aplicativo verifique que no halla nadie conectado, una vez que lo verifica se conecta a la BD de forma exclusiva y en ese caso ninguna otra conexión se podra realizar y eso lo gestiona la BD y luego liberas esta cuando tu procesos por lotes termine.
Es exactamente eso lo que nececito.

Mira doc, aqui creo que esta tu tema

http://dev.mysql.com/doc/refman/5.0/es/lock-tables.html
Eso lo había leído, pero habla de bloquear tablas y yo pensé que se podía bloquear toda la bd (obviamente, sin tener que especificar cada tabla). Si no encuentro la manera de bloquear toda la bd, entonces iré con esta opción y bloquearé de un saque todas las tablas que se vean afectadas por los procesos que debe correr el aplicativo.
¡Muchas gracias!

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #6 en: Octubre 18, 2013, 07:13:01 pm »
La otra alternativa menos ortodoxa si es que algun camarada no alcanza otra alternativa mejor que el Lock Table, es que lo hagas por aplicativo, o sea programando.

Te suelto una idea, ten una tabla que llames por ejemplo BLOQUEO con un campo y un solo registro con valor cero. Bueno, cuando corres el programa Bath cambias el estado de 0 a 1. Tu aplicativo normal deberá preguntar (usando una función para que sea facil, algo asi como If BdBloqueada Then... y fncBdBloqueada sera una función que solo devuelva true o false) por dicho valor, si lo encuentra en 1 da un mensaje a usuario y se cierra el programa (porque el bath estará trabajando) y si intenta volver a conectarse de entrada no mas lo botas.
Cuando termine el programa de bath vuelves el estado a cero.

El inconveniente que habría es que si por alguna razón el programa bath se queda a la mitad, o si se va la luz o lo que fuera, la BD quedara "bloqueada", entonces deberá haber alguien con los permisos adecuados para que mediante una interfaz cambie el valor de 1 a 0.
El otro punto es que representa un poquito de chamba, deberás llamar a esa función (fncBdBloqueada) antes de entrar a un BeginTrans, o sea, antes de grabar nada... al final se trata de un simple copy/paste por todos los módulos transaccionales. Pon en balanza cual te da mas chamba y cual pueda ser sostenible, si meter mano a bloquear todas las tablas con el lock o meter mano a todos los módulos con la función... o esperar que algun colega venga con el procedimiento MySQL con el cual bloqueas la BD completa de forma exclusiva.

Suerte
« última modificación: Octubre 18, 2013, 07:15:28 pm por YAcosta »
Me encuentras en YAcosta.com

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Bloqueo de base de datos
« Respuesta #7 en: Octubre 19, 2013, 12:35:32 am »
Una "negrada" ... cambia el nombre de la base de datos durante la actualizacion masiva x'D

Los programas que intenten conectarse simplemente no encontrarán la base de datos....

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #8 en: Octubre 19, 2013, 03:26:36 pm »
asu mae, si que es una negrada jajaja



Tanta vaina mejor en tu soft de bath programa el cierre o borra el puerto del MySQL y luego que termina lo vuelves abrir o crear.

Me encuentras en YAcosta.com

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #9 en: Octubre 21, 2013, 12:19:40 pm »
Una "negrada" ... cambia el nombre de la base de datos durante la actualizacion masiva x'D
Eso mismo se me había ocurrido, pero, justamente por lo que ponés al principio, quise buscar una solución más "elegante". Pero hasta ahora me parece la más concreta y fácil de implementar.

Tanta vaina mejor en tu soft de bath programa el cierre o borra el puerto del MySQL y luego que termina lo vuelves abrir o crear.
En eso no había pensado y también me gustó. Incluso, creo que es mejor que cambiar el nombre a la bd.
Voy a probar primero con esta última opción, a ver qué pasa.
¡Muchas gracias, muchachos!

Jerónimo

wolf_kof

  • Visitante
Re:Bloqueo de base de datos
« Respuesta #10 en: Octubre 21, 2013, 07:00:47 pm »
Y por que en vez de bloquear la base de datos, en mysql no te creas un usuario para las terminales y otro para el servidor y bloqueas el usuario para las terminales???????

y cuando acabes de actualizar masivamente lo desbloqueas y ya stubo.

y con respecto al backup en clientes

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=59638&lngWId=1

cao

wolf_kof

  • Visitante
Re:Bloqueo de base de datos
« Respuesta #11 en: Octubre 21, 2013, 07:07:31 pm »
Mirate el Administración de usuarios de este, esta bien explicado.

http://www.xtec.cat/~acastan/textos/Administracion%20de%20MySQL.html

YAcosta

  • Moderador Global
  • Exabyte
  • *****
  • Mensajes: 2853
  • Reputación: +160/-38
  • Daddy de Qüentas y QüeryFull
    • Ver Perfil
    • Personal
Re:Bloqueo de base de datos
« Respuesta #12 en: Octubre 22, 2013, 04:09:14 am »
Y por que en vez de bloquear la base de datos, en mysql no te creas un usuario para las terminales y otro para el servidor y bloqueas el usuario para las terminales???????

y cuando acabes de actualizar masivamente lo desbloqueas y ya stubo.

y con respecto al backup en clientes

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=59638&lngWId=1

cao

Esa idea es buena siempre y cuando se controlen usuarios por BD y muchas veces pasa que se crean y controlan usuarios por aplicativo. No se como es en MySQL pero sino es muy complicado implementar eso entonces seria buena alternativa.
Me encuentras en YAcosta.com

raul338

  • Terabyte
  • *****
  • Mensajes: 894
  • Reputación: +62/-8
  • xD fan!!!!! xD
    • Ver Perfil
    • Raul's Weblog
Re:Bloqueo de base de datos
« Respuesta #13 en: Octubre 22, 2013, 11:27:53 pm »
Esa idea es buena siempre y cuando se controlen usuarios por BD y muchas veces pasa que se crean y controlan usuarios por aplicativo. No se como es en MySQL pero sino es muy complicado implementar eso entonces seria buena alternativa.

Toda aplicacion se conecta mediante un usuario,  de ahí que controle sus propios usuarios es otra cosa. Se puede aplicar perfectamente.

Jeronimo

  • Gigabyte
  • ****
  • Mensajes: 402
  • Reputación: +33/-2
    • Ver Perfil
Re:Bloqueo de base de datos
« Respuesta #14 en: Octubre 22, 2013, 11:42:50 pm »
Me parece que voy a hacer una conjunción de varias de las cosas que me están sugiriendo.
Hasta ahora lo que más me conviene (porque en teoría daría resultado y porque es lo único que sé cómo hacer) es lo siguiente:
Creo un usuario para la aplicación que corre en el servidor y otro para las aplicaciones que corren en las pc.
Cuando la aplicación del servidor necesita realizar sus tareas, cambia la clave del usuario de las terminales. Además, busca si el usuario de las terminales está conectado. En caso afirmativo, espera que se desconecte. Luego realiza su trabajo y, finalmente, restablece la clave del usuario de las terminales.
¿Cómo la ven?