MariaDB : passage des tables système en InnoDB
Pour ceux d’entre vous qui ne seraient pas férus de MySQL / MariaDB en particulier, sachez que ce moteur de bases de données relationnelles contient un schéma – une database – dans lequel sont stockées toutes les tables dites système. Les données stockées dans la base mysql concernent avant tout la gestion des droits, à l’image des tables mysql.user et mysql.db. Au fil des versions et des évolutions fonctionnelles, elles se sont étoffées de données complémentaires à l’image des tables innodb_table_stats et innodb_index_stats. Et puis, vous y trouverez également les tables general_log et slow_log au format CSV qui consignent l’activité sur la base lorsque vous affectez la valeur ‘TABLE’ à la variable système log_output.
La procédure de conversion des tables du schéma mysql au format InnoDB
Cinq bases ne peuvent pas être converties en InnoDB :
- mysql.user, mysql.db, mysql.host,
- mysql.general_log, mysql.slow_log.
Les tables user, db et host peuvent être converties en Aria.
Ce script a été mis en œuvre sur MariaDB 10.2 ! La procédure convert_mysql_innodb est créée ici dans le schéma tools.
CREATE DATABASE tools; USE tools; -- DROP PROCEDURE IF EXISTS convert_mysql_innodb; DELIMITER // CREATE PROCEDURE convert_mysql_innodb() BEGIN DECLARE done INT DEFAULT FALSE; DECLARE strTable VARCHAR(255); DECLARE curTables CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE table_schema ='mysql' AND table_type='BASE TABLE' AND TABLE_NAME NOT IN ('db','host','user','general_log','slow_log'); DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; OPEN curTables; read_loop: LOOP FETCH curTables INTO strTable; IF done THEN LEAVE read_loop; END IF; SET @t=strTable; SET @sql=CONCAT('ALTER TABLE `mysql`.`',@t,'` ENGINE=InnoDB'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; END LOOP; CLOSE curTables; END; // DELIMITER ;
Exécution de la procédure de conversion
Sous MySQL / MariaDB, l’exécution d’une procédure se fait à l’aide de l’instruction CALL :