Convertir tablas Moodle/MySQL/MariaDB de Antelope a Barracuda

Actualizando a Moodle 3.5 he tenido que cambiar las tablas de Antelope a Barracuda ya que era un requisito (además de tener que añadir PHP 7 al servidor CentOS/Plesk), y siguiendo la documentación oficial de Moodle [1] he intentado ejecutar el script mysql_compressed_rows.php flag —fix, lo cual me ha devuelto un error por no tener innodb_file_per_table habilitado, razón por la que he tenido que hacerlo mediante las sentencias SQL que el flag «–showsql» del script mysql_compressed_rows.php me ha mostrado, más la línea SET GLOBAL innodb_large_prefix=1 ya que el instalador se me seguía quejando…

Según la documentación oficial de MySQL [2], InnoDB soporta actualmente dos formatos:

  • Antelope is the original InnoDB file format, which previously did not have a name. It supports COMPACT and REDUNDANT row formats for InnoDB tables and is the default file format in MySQL 5.6 to ensure maximum compatibility with earlier MySQL versions that do not support the Barracuda file format.
  • Barracuda is the newest file format. It supports all InnoDB row formats including the newer COMPRESSED and DYNAMIC row formats. The features associated with COMPRESSED and DYNAMIC row formats include compressed tables, efficient storage of off-page columns, and index key prefixes up to 3072 bytes (innodb_large_prefix).

Dejo a continuación la salida de los scripts de Moodle para la posteridad:

# php admin/cli/mysql_compressed_rows.php --list
mdl_data Compact (needs fixing)
mdl_data_fields Compact (needs fixing)
mdl_enrol_paypal Compact (needs fixing)
mdl_lti Compact (needs fixing)
mdl_user Compact (needs fixing)
mdl_user_info_field Compact (needs fixing)
# php admin/cli/mysql_compressed_rows.php --fix
Cannot enable GLOBAL innodb_file_per_table setting, use --showsql option and execute the statements manually.!!! Error al escribir a la base de datos !!!
#php admin/cli/mysql_compressed_rows.php --showsql
Copy the following SQL statements and execute them using account with SUPER privilege:

USE moodle;
SET SESSION sql_mode=STRICT_ALL_TABLES;
SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=Barracuda;
ALTER TABLE mdl_data ROW_FORMAT=Compressed;
ALTER TABLE mdl_data_fields ROW_FORMAT=Compressed;
ALTER TABLE mdl_enrol_paypal ROW_FORMAT=Compressed;
ALTER TABLE mdl_lti ROW_FORMAT=Compressed;
ALTER TABLE mdl_user ROW_FORMAT=Compressed;
ALTER TABLE mdl_user_info_field ROW_FORMAT=Compressed;

¡ACLARACIÓN! Si tenemos varias versiones de php instaladas en nuestro servidor/vps es posible que  tengamos que indicar la ruta completa de php o cambiar la versión de php que estemos utilizando en nuestra terminal por una superior, como fue mi caso. Por ejemplo en el caso de Plesk las versiones de PHP las encontramos dentro de /opt/plesk/php/ siendo la ruta del ejecutable para por ejemplo la versión de php 7.2 /opt/plesk/php/7.2/bin/php

Añadir por último que en otros artículos que he consultado, hablaban de agregar la configuración en la sección [mysqld] del archivo my.cnf, pero esto no he llegado a probarlo…

¡Nueva Actualización!

En actualizaciones posteriores la página de entorno me pedía lo siguiente:

mysql_full_unicode_support#File_format
Su base de datos tiene tablas que están usando Antelope como sistema de ficheros. Para un soporte completo de UTF-8 en MySQL y MariaDB requiere Barracuda como sistema de ficheros. Por favor convierta las tablas al sistema de ficheros Barracuda. Mire la documentación Administración vía línea de comandos para ver los detalles de alguna herramienta para convertir las tablas de InnoDB a Barracuda.

mysql_full_unicode_support#File_per_table
Para el soporte completo de UTF-8 en MySQL y MariaDB se requiere cambiar la opción de MySQL ‘innodb_file_per_table’ a ‘ON’. Mira la documentación para más detalles.

mysql_full_unicode_support#Large_prefix
Para el soporte completo de UTF-8 en MySQL y MariaDB se requiere cambiar la opción de MySQL ‘innodb_large_prefix’ a ‘ON’. Mira la documentación para más detalles.

Las dos últimas advertencias simplemente se solucionan agregando al archivo de configuración de MySQL my.cnf las líneas siguientes:

innodb_file_per_table=1
innodb_large_prefix=1

Pero en este caso al ejecutar el script mysql_compressed_rows.php –list me decía que todas la tablas ya estaban «compressed» y tanto –-fix como –-showsql me decía que «no changes necessary».

mdl_data Compressed 
mdl_data_fields Compressed 
mdl_enrol_lti_lti2_consumer Compressed 
mdl_enrol_paypal Compressed 
mdl_lti Compressed 
mdl_oauth2_issuer Compressed 
mdl_user Compressed 
mdl_user_info_field Compressed

Buscando por internet encontré que la opción -i del comando mysql_compressed_rows.php devuelve la información de la base de datos:

Database version: 5.5.55
Database name: moodle
Database engine: InnoDB
innodb_file_per_table: ON
innodb_file_format: Antelope

La solución que encontré fue agregar al my.cnf la siguiente línea (junto a las dos anteriores):

innodb_file_format=Barracuda

Y tras reiniciar MySQL la información de la tabla ya salía correcta y la página de entorno de moodle no devolvía estas advertencias:

Database version: 5.5.55
Database name: moodle
Database engine: InnoDB
innodb_file_per_table: ON
innodb_file_format: Barracuda

Al igual que en la actualización anterior, posiblemente también lo podría haber solucionado cambiando los valores mediante sentencias SQL pero esta opción no llegué a probarla:

SET GLOBAL innodb_file_per_table=1;
SET GLOBAL innodb_file_format=Barracuda;
SET GLOBAL innodb_large_prefix = ON;

Otra forma de consultar el estado de estas variables es con la sentencia SQL show variables like «%innodb_file%»:

mysql> show variables like "%innodb_file%";
+--------------------------+-----------+
| Variable_name | Value |
+--------------------------+-----------+
| innodb_file_format | Barracuda |
| innodb_file_format_check | ON |
| innodb_file_format_max | Barracuda |
| innodb_file_per_table | ON |
+--------------------------+-----------+
4 rows in set (0.00 sec)

Referencias (ojo con la versión que estemos utilizando de MySQl y Moodle que podría haber cambios):

[1] https://docs.moodle.org/all/en/Administration_via_command_line

[2] https://dev.mysql.com/doc/refman/5.6/en/innodb-file-format.html

https://docs.moodle.org/all/es/MySQL_soporte_unicode_completo

https://docs.moodle.org/all/en/MySQL_full_unicode_support

https://moodle.org/mod/forum/discuss.php?d=312220

Deja un comentario