php - innodb_force_recovery - repair innodb table
Mesa de mysql bloqueada después de fallas de php (3)
Ok, entonces, después de leer mi publicación, me di cuenta de que respondía mi propia pregunta. La conexión persistía, incluso durante el bloqueo, porque estaba usando mysql_pconnect () para conectarme a la base de datos. Lo cambié a mysql_connect (), y funcionó bien. Lo siento si malgasto el tiempo de alguien, pero espero que esto ayude a alguien !!
--Joshua
Tengo una base de datos MySQL y una tabla innoDB. Tengo una página php que conecta, bloquea la tabla, realiza algunas actualizaciones y luego desbloquea la tabla. La página PHP se sirve con apache a través de wamp.
La página php sube un archivo a la base de datos. Decidí simular el bloqueo del sistema cargando un archivo que tiene un tamaño mayor que la memoria asignada a PHP. Esto definitivamente causó este error: permitido el tamaño de la memoria de 18874368 bytes agotado (intentado asignar 6176754 bytes). Después de eso, las tablas que estaban bloqueadas durante las actualizaciones todavía están bloqueadas.
El error que recibo cuando intento acceder a las tablas después de este error es: La tabla ''a'' no estaba bloqueada con LOCK TABLES. Sé que es un problema de bloqueo porque abriré un mensaje de SQL e intentaré seleccionar de la tabla que estaba bloqueada, y simplemente espera, exactamente como lo hace cuando la tabla está bloqueada. Si luego mato el proceso de Apache, la sentencia que intenté ejecutar en un prompt de SQL finalmente se procesará. Supongo que cuando elimino el proceso de Apache, MySQL se da cuenta de que el bloqueo de la tabla debe ser liberado debido a que la conexión se ha cortado.
¿¿Algunas ideas??
Puede usar una función de apagado para desbloquear las tablas:
http://php.net/manual/en/function.register-shutdown-function.php
Qoute de: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html
Si la conexión para una sesión de cliente finaliza, ya sea de manera normal o anormal, el servidor libera implícitamente todos los bloqueos de tabla mantenidos por la sesión (transaccional y no transaccional). Si el cliente se vuelve a conectar, los bloqueos ya no estarán vigentes. Además, si el cliente tenía una transacción activa, el servidor retrotrae la transacción al desconectarse, y si se vuelve a conectar, la nueva sesión comienza con el autocommit habilitado.
Como su conexión es persistente después de que la página ha ejecutado y completado / eliminado la conexión todavía está presente.
No debe hacer la conexión persistente IMO