Error al leer de la BD

Error al leer de la BD

de David Jiménez -
Número de respuestas: 3

Hola, necesito ayuda urgentemente... estoy desesperado y ya no sé qué hacer... estoy intentando realizar copias de seguridad de mis cursos pero cuando lleva un rato realizándolas y se encuentra al 98% se para y arroja un error de:

"error al leer de la base de datos"

Utilizo la versión moodle 3.11.6+ con php 8.0 y Mysql 5.7 

La depuración arroja lo siguiente: (en archivo pdf adjunto...)

Alojamiento en servidor compartido. La respuesta que me dan es la siguiente:


"Informarle que, por defecto, el servidor MySQL tiene un timeout configurado de 60 segundos, por lo que si una conexión a la base de datos dura más de dicho tiempo se cancelará.

 Para resolverlo, deberá subir el tiempo del timeout a un valor más elevado justo después de la conexión, por ejemplo 5 minutos:

 set session wait_timeout=300;

 Deberá introducir esta línea en el fichero que realiza la conexión a la base datos, justo después de la misma."

He probado en varios sitios del archivo config.php que creo que es el que realiza la conexión con la BD y no parece que funcione...
copio aquí el contenido del archivo que conecta con la BD por si pudieran indicarme exactamente dónde he de incluirlo. (oculto datos por privacidad con XXXX) (en archivo pdf adjunto...)



Me comentan también que:

"la línea de código para que la sesión duré más debe introducirse tras la propia conexión, es decir, en el código que realiza esa conexión a la base de datos que entendemos estará en un fichero .PHP del propio Moodle o plugin."

No se si debo introducirlo en config.php o en otro archivo que realice la conexión con la BD.

Muchas gracias por la ayuda que puedan prestarme!

 

El fichero que nos facilita usted es un fichero con información para esa conexión, la cual consultarán los ficheros que la realizan directamente y es ahí donde debe introducirse.





Promedio de valoraciones: -
En respuesta a David Jiménez

Re: Error al leer de la BD

de Jose García | Nosolored -
Imagen de Moodlers de gran ayuda
Hola, David.

El valor set session wait_timeout=300 es para el fichero de configuración de MySQL my.cnf (motor de base de datos).
Al estar en un hosting compartido no podrás modificarlo.

Lo que si puedes hacer es activar el debug de Moodle y MySQL como indican en https://docs.moodle.org/311/en/Debugging (Debug SQL queries)
para saber que consultas pueden estar agotando el tiempo de conexión con la base de datos.

Otros parámetros que tienes que revisar en PHP es el tiempo de ejecución, memoria asignada a los scripts php, etc. que te pueden ayudar a saber si incrementando la memoria asignada o el tiempo de ejecución te permite terminar la copia de los cursos.

¿Es una copia completa de un curso? ¿Te ocurre también si desmarcas algunas opciones de la copia del curso (logs, comentarios, bloques, etc.)?
¿Has probado a hacer las copias en algún momento que no tenga tanta carga el servidor?

Administración del sitio / ► Cursos / ► Copias de seguridad / ► Copia de seguridad programada
..../admin/settings.php?section=automated
en la opción

Guardar en
backup | backup_auto_destination
Valor por defecto: Vacío
Ruta completa del directorio en el que desea que se guarden las copias de seguridad
(dejarlo en blanco para guardarlas en el directorio por defecto de cada curso)

puedes indicarle que las guarde en otra ruta distinta del moodledata (o el nombre que tenga asignado en config.php).
Recuerda que tienes que insertar la ruta Linux completa y que tenga permisos para escribir en ella. Puedes crear una dentro de moodledata y que se almacenen ahí temporalmente las copias.

Lo puedes cambiar en cualquier momento y dejarle por defecto como es lo habitual.

Un saludo y a cuidarse.
En respuesta a Jose García | Nosolored

Re: Error al leer de la BD

de David Jiménez -
Antes de nada muchas gracias por su ayuda.
El error que arroja en modo depuración es el siguiente:

×Información de depuración: MySQL server has gone away
SELECT COUNT(*)
FROM mdl_backup_ids_temp b
JOIN mdl_user u ON u.id = b.itemid
WHERE b.backupid = ?
AND b.itemname = 'userfinal'
AND u.mnethostid != ?
[array (
0 => '93dc0c08bf970ee0a3c53cdb9dba7b96',
1 => '1',
)]
Error code: dmlreadexception
×Trazado de la pila (stack):
line 486 of /lib/dml/moodle_database.php: dml_read_exception thrown
line 1273 of /lib/dml/mysqli_native_moodle_database.php: call to moodle_database-
>query_end()
line 1671 of /lib/dml/moodle_database.php: call to mysqli_native_moodle_database-
>get_records_sql()
line 1744 of /lib/dml/moodle_database.php: call to moodle_database->get_record_sql()
line 1954 of /lib/dml/moodle_database.php: call to moodle_database->get_field_sql()
line 477 of /backup/util/dbops/backup_controller_dbops.class.php: call to
moodle_database->count_records_sql()
line 1930 of /backup/moodle2/backup_stepslib.php: call to
backup_controller_dbops::backup_includes_mnet_remote_users()
line 88 of /backup/util/plan/backup_structure_step.class.php: call to
backup_main_structure_step->define_structure()
line 181 of /backup/util/plan/base_task.class.php: call to backup_structure_step-
>execute()
line 191 of /backup/util/plan/base_plan.class.php: call to base_task->execute()
line 145 of /backup/util/plan/backup_plan.class.php: call to base_plan->execute()
line 419 of /backup/controller/backup_controller.class.php: call to backup_plan-
>execute()
line 136 of /backup/util/ui/backup_ui.class.php: call to backup_controller-
>execute_plan()
line 175 of /backup/backup.php: call to backup_ui->execute()

He subido los valores en php max_execution_time a 600
max_input_time está a 60
memory_limit a 1024
post_max_size a 1Gb
upload_max_filesize a 1Gb

También he subido el valor del límite de memoria de PHP extra en el menú de Rendimiento (extramemorylimit a 4096M) siendo el Valor por defecto: 512M pues según indica el menú de Moodle “Algunas secuencias de comandos como búsqueda, copia de seguridad / restaurar o cron requieren más memoria. Establezca valores más altos para los sitios grandes.”
y sigue dando el mismo problema
He realizado, siguiendo su consejo, las copias en otros momentos donde se supone que los servidores estarán menos saturados pero… nada, sigue el problema.
Lo único que me ha permitido realizar las copias de seguridad ha sido desmarcando la casilla de backup de los archivos subidos (pero… claro, no realizan las copias de seguridad de esos archivos en su mayoría vídeos) por lo que tampoco me resultan muy útiles esas copias… (debe ser que el archivo de backup es muy pesado)
Reitero muy agradecimiento por la ayuda prestada…
En respuesta a David Jiménez

Re: Error al leer de la BD

de Jose García | Nosolored -
Imagen de Moodlers de gran ayuda
Hola, David.

El cuello de botella son los archivos subidos al curso. Si te deja realizar la copia sin esa configuración es porque tiene un tamaño bastante grande en Gigas.

El error que te indica es debido a la limitación de los 60 segundos de timeout de MySQL. Cualquier consulta a la base de datos que supere ese minuto te dará error ya que agotará el tiempo de conexión, sea una copia, consulta de ejercicios, informes, etc.

Si la mayoría de los archivos subidos por los usuarios son videos y estos ocupan mucho espacio, la copia individual de cada curso tardará más de 1 minuto y se parará el proceso.

Los archivos mbz (las copias de Moodle) internamente están comprimidos como los tar.gz de Linux. Los videos ya llevan compresión y al comprimirlos para añadirlos en la copia de Moodle se usa mucho tiempo de CPU, memoria, disco, etc.

Una posible opción sería que desde la consola Linux en el hosting, lancen la copia de Moodle, pueden probar los siguientes comandos (tienen que estar en la ruta de tu dominio o poner la ruta completa Linux del directorio donde se encuentra):

php admin/cli/cron.php para que intente realizarla con el propio cron.

o para ejecutar solo las copias de seguridad automáticas:
php admin/cli/automated_backups.php

También con php admin/tool/task/cli/schedule_task.php --execute=\\core\\task\\automated_backup_task

Con la opción de memoria siguiente php -d memory_limit=4096M o php -d memory_limit=-1 puede ajustar la memoria asigna a php cli en la consola en tiempo de ejecución.

Es posible que la ruta de php sea distinta (depende de la configuración de cada alojamiento) o incluso que tengan que añadirle más memoria a PHP para que se ejecute.

Otra opción, más lenta, es que descargues el sitio completo por FTP, SFTP. Si usas Filezilla tienes que activar el modo de transferencia en binario (binary mode) en la configuración del software para que respete todos los archivos de la carpeta moodledata.

Existe un plugin https://moodle.org/plugins/report_coursesize que te puede ayudar con el tamaño de los cursos y el espacio que ocupan.
Sin un un curso utiliza bastantes gigas va a ser difícil con esa limitación de la base de datos que puedas disponer de una copia completa con el Moodle.

Una curiosidad, ¿en el hosting usan discos SSD o NVMe? Ayudaría cualquier de ellos ya que incrementa exponencialmente la velocidad de lectura/escritura. Si son SATA normales, son más lentos que los anteriores.

Un saludo.