Migration de MySQL 4.1 vers MySQL 5.0 avec mysql_upgrade

Introduction

Un bref article sur la méthodologie pour migrer un serveur MySQL 4.0/4.1 vers MySQL 5.0 avec le binaire mysql_upgrade introduit avec MySQL 5.0.

A partir de MySQL 5.0, l'exécution du script mysql_fix_privilege_tables ne suffit plus et toutes les opérations de migration d'un serveur MySQL sont désormais encapsulées dans le binaire mysql_upgrade fourni pour toutes les plateformes à partir de la version 5.0.25 et qui prend en charge la migration de la base système mysql et la migration éventuelle des tables dans les bases utilisateur.

Généralités sur mysql_upgrade avec MySQL 5.0

mysql_upgrade est désormais fourni à partir de la version 5.0 de MySQL pour migrer un serveur MySQL vers la version courante.

Le binaire mysql_upgrade vérifie (check) dans toutes les tables de toutes les bases de données toute éventuelle incompatibilité avec la version courante de MySQL. Si une table possède une éventuelle incompatibilité, elle est vérifiée et si un problème est détecté, la table est réparée.

mysql_upgrade prend en charge également la migration des tables systèmes de la base mysql afin de bénéficier des nouveaux privilèges et nouvelles fonctionnalités éventuellement ajoutées avec la nouvelle version (par exemple la table proc pour les procédures stockées et triggers introduits avec la version 5.0).

Toutes les tables vérifiées et réparées sont marquées avec la version courante de MySQL. Ceci permet d'éviter de vérifier et réparer à nouveau la table si mysql_upgrade est à nouveau exécuté avec la même version de serveur.

mysql_upgrade sauvegarde également le numéro de version de MySQL dans un fichier appelé mysql_upgrade.info dans le répertoire des données (datadir) du serveur MySQL. Ce fichier est utilisé pour vérifier rapidement si les tables ont déjà été analysées pour la version en cours, auquel cas cette étape de vérification/réparation est écartée lors d'un nouvel appel de mysql_upgrade. Pour ignorer le fichier mysql_upgrade.info, l'option --force doit être invoquée dans l'appel du binaire mysql_upgrade.

Mode opératoire de mysql_upgrade (mysqlcheck et mysql_fix_privilege_tables)

Pour vérifier/réparer les tables et migrer les tables systèmes, mysql_upgrade exécute les commandes ci-dessous :

shell > mysqlcheck --check-upgrade --all-databases --auto-repair
shell > mysql_fix_privilege_tables 

L'option --check-upgrade est une nouveauté de la version 5.0 (5.0.19 plus exactement) du binaire mysqlcheck, option qui permet de déclencher les commandes SQL CHECK TABLE avec la nouvelle option FOR UPGRADE :

CHECK TABLE <tblname> FOR UPGRADE 

Outre le fait qu'avec la version 5.0 la commande CHECK TABLE permet également de détecter les vues invalides (référencement à des tables inexistantes ou altérées etc...), l'option FOR UPGRADE de la commande CHECK TABLE vérifie que la table est compatible avec la version courante de MySQL (types de données, types d'indexes etc...).

Options du binaire mysql_upgrade

Pour utiliser mysql_upgrade, le serveur MySQL doit être démarré avec la nouvelle version MySQL et le binaire mysql_upgrade est lancé avec les options adéquates :

shell > mysql_upgrade [options] 

Les options du binaire mysql_upgrade sont les suivantes :

--help (-?) affiche le message d'aide sur les options de mysql_upgrade.
--basedir=path (-b) chemin du répertoire d'installation de MySQL (/Software/mysql/mysql-5.0)
--datadir=path (-d) chemin du répertoire des données (/dba/mysql/AXA_P1_MYS/data) et contenant notamment la base de données mysql.
--force (-f) force l'exécution du binaire mysqlcheck même si mysql_upgrade a déjà été exécuté pour la version courante de MySQL (le fichier mysql_upgrade.info est ignoré).
--user (-u) user MySQL pour se connecter au serveur.
--verbose (-v) applique un mode plus verbeux pour une meilleure visibilité des opérations lancées par la programme mysql_upgrade.

D'autres options indispensables peuvent être passées à mysqlcheck et mysql_fix_privilege_tables. Aussi il peut être nécessaire de passer les autres options ci-dessous avec mysql_upgrade :

--password (-p) mot de passe du user MySQL pour se connecter au serveur.
--port (-P) port du serveur MySQL.
--socket (-S) socket du serveur MySQL.

Exemple concret - migration du serveur QFX_P1_MYS

Voici un exemple concret d'une migration avec mysql_upgrade sur le serveur MySQL QFX_P1_MYS installé selon la norme décrite dans le document  Normalisation et installation de serveurs MySQL 4.1.x et 5.0.x sous Solaris (Rubrique MySQL > Administration)

La migration effectue un saut de la version 4.1.16 vers la version 5.0.37, QFX_P1_MYS contient par ailleurs une base de données InnoDB. (Est ce bien utile de l'écrire mais bien entendu, penser à sauvegarder le serveur MySQL avant les opérations de migration).

Étape 1

Le serveur QFX_P1_MYS est d'abord arrêté avec le shell stop_server.ksh dans le répertoire /Software/mysql/dba/bin

%> stop_server.ksh -S QFX_P1_MYS 

Étape 2

L'environnement du serveur MySQL QFX_P1_MYS est ensuite migré de la version 4.1 vers la version 5.0. La mise à jour de l'environnement de QFX_P1_MYS de la version 4.1 à 5.0 consiste à mettre à jour les deux fichiers :

  • $DBA/etc/QFX_P1_MYS.mys (/Software/mysql/dba/etc/QFX_P1_MYS.mys)
  • $CFG/QFX_P1_MYS.cnf (/Software/mysql/dba/QFX_P1_MYS/cfg/QFX_P1_MYS.cnf)

Dans le fichier QFX_P1_MYS.mys, la variable MYSQL_VERSION n'a plus pour valeur 4.1 mais 5.0

# Putting the MySQL version for the server
MYSQL_VERSION="5.0"
export MYSQL_VERSION 

Dans le fichier QFX_P1_MYS.cnf, la variable basedir n'a plus pour valeur /Software/mysql/mysql-4.1 mais /Software/mysql/mysql-5.0

# Specifying datadir directory
basedir=/Software/mysql/mysql-5.0/ 

Étape 3

Le serveur QFX_P1_MYS est alors redémarré en version 5.0 de MySQL avec le shell start_server.ksh dans le répertoire /Software/mysql/dba/bin

%> start_server.ksh -S QFX_P1_MYS 

Étape 4

Le binaire mysql_upgrade peut alors être exécuté sur le serveur MySQL QFX_P1_MYS démarré en version 5.0

QFX_P1_MYS > mysql_upgrade -b/Software/mysql/mysql-5.0
-d/dba/mysql/QFX_P1_MYS/data -uroot -p<xxxx>
-S/tmp/QFX_P1_MYS.sock 

Le message error : Table upgrade required. Please do "REPAIR TABLE `<table_name>`" to fix it! apparaît quand une inconsistence apparaît. La réparation des tables est déclenchée qu'à l'issue de la vérification de l'intégralité des tables.

Tous les messages d'erreur 'Duplicate column' et 'Unknown column' peuvent être ignorés en toute sécurité. Ces messages d'erreur peuvent arriver dans la seconde étape de la migration (mysql_fix_privilege_tables), étape qui concerne la migration des tables systèmes dans la base mysql, or les tables systèmes peuvent déjà être à niveau.

Voici le résultat de la migration avec mysql_upgrade pour QFX_P1_MYS :

mysql.columns_priv OK
mysql.db OK
mysql.func OK
mysql.help_category
error : Table upgrade required. Please do "REPAIR TABLE `help_category`" to fix it!
mysql.help_keyword
error : Table upgrade required. Please do "REPAIR TABLE `help_keyword`" to fix it!
mysql.help_relation OK
mysql.help_topic
error : Table upgrade required. Please do "REPAIR TABLE `help_topic`" to fix it!
mysql.host OK
mysql.tables_priv OK
mysql.time_zone OK
mysql.time_zone_leap_second OK
mysql.time_zone_name OK
mysql.time_zone_transition OK
mysql.time_zone_transition_type OK
mysql.user
error : Table upgrade required. Please do "REPAIR TABLE `user`" to fix it!
qflex.alert_status_types
error : Table upgrade required. Please do "REPAIR TABLE `alert_status_types`" to fix it!
qflex.alert_types
error : Table upgrade required. Please do "REPAIR TABLE `alert_types`" to fix it!
qflex.alerts
error : Table upgrade required. Please do "REPAIR TABLE `alerts`" to fix it!
qflex.channels
error : Table upgrade required. Please do "REPAIR TABLE `channels`" to fix it!
qflex.collection_policies
error : Table upgrade required. Please do "REPAIR TABLE `collection_policies`" to fix it!
qflex.companies
error : Table upgrade required. Please do "REPAIR TABLE `companies`" to fix it!
qflex.compression_policies
error : Table upgrade required. Please do "REPAIR TABLE `compression_policies`" to fix it!
qflex.config_attribute_types
error : Table upgrade required. Please do "REPAIR TABLE `config_attribute_types`" to fix it!
qflex.config_attributes
error : Table upgrade required. Please do "REPAIR TABLE `config_attributes`" to fix it!
qflex.config_collection_policies
error : Table upgrade required. Please do "REPAIR TABLE `config_collection_policies`" to fix it!
qflex.config_object_changes
error : Table upgrade required. Please do "REPAIR TABLE `config_object_changes`" to fix it!
qflex.criticality_types
error : Table upgrade required. Please do "REPAIR TABLE `criticality_types`" to fix it!
qflex.frequency_types
error : Table upgrade required. Please do "REPAIR TABLE `frequency_types`" to fix it!
qflex.idle_reason_types
error : Table upgrade required. Please do "REPAIR TABLE `idle_reason_types`" to fix it!
qflex.interval_types
error : Table upgrade required. Please do "REPAIR TABLE `interval_types`" to fix it!
qflex.message_types OK
qflex.monitor_templates
error : Table upgrade required. Please do "REPAIR TABLE `monitor_templates`" to fix it!
qflex.monitor_types
error : Table upgrade required. Please do "REPAIR TABLE `monitor_types`" to fix it!
qflex.monitors
error : Table upgrade required. Please do "REPAIR TABLE `monitors`" to fix it!
qflex.monitors_alert_types OK
qflex.monitors_polling_policies OK
qflex.polling_policies
error : Table upgrade required. Please do "REPAIR TABLE `polling_policies`" to fix it!
qflex.principals
error : Table upgrade required. Please do "REPAIR TABLE `principals`" to fix it!
qflex.qflex_properties
error : Table upgrade required. Please do "REPAIR TABLE `qflex_properties`" to fix it!
qflex.qmanagers
error : Table upgrade required. Please do "REPAIR TABLE `qmanagers`" to fix it!
qflex.queue_stats
error : Table upgrade required. Please do "REPAIR TABLE `queue_stats`" to fix it!
qflex.queue_stats_idleness
error : Table upgrade required. Please do "REPAIR TABLE `queue_stats_idleness`" to fix it!
qflex.queues
error : Table upgrade required. Please do "REPAIR TABLE `queues`" to fix it!
qflex.recovery_types OK
qflex.trig_condition_types
error : Table upgrade required. Please do "REPAIR TABLE `trig_condition_types`" to fix it!
Repairing tables
mysql.help_category OK
mysql.help_keyword OK
mysql.help_topic OK
mysql.user OK
qflex.alert_status_types OK
qflex.alert_types OK
qflex.alerts OK
qflex.channels OK
qflex.collection_policies OK
qflex.companies OK
qflex.compression_policies OK
qflex.config_attribute_types OK
qflex.config_attributes OK
qflex.config_collection_policies OK
qflex.config_object_changes OK
qflex.criticality_types OK
qflex.frequency_types OK
qflex.idle_reason_types OK
qflex.interval_types OK
qflex.monitor_templates OK
qflex.monitor_types OK
qflex.monitors OK
qflex.polling_policies OK
qflex.principals OK
qflex.qflex_properties OK
qflex.qmanagers OK
qflex.queue_stats OK
qflex.queue_stats_idleness OK
qflex.queues OK
qflex.trig_condition_types OK
ERROR 1060 (42S21) at line 22: Duplicate column name 'File_priv'
@hadGrantPriv:=1
1
1
1
1
1
ERROR 1060 (42S21) at line 28: Duplicate column name 'Grant_priv'
ERROR 1060 (42S21) at line 29: Duplicate column name 'Grant_priv'
ERROR 1060 (42S21) at line 30: Duplicate column name 'Grant_priv'
ERROR 1060 (42S21) at line 41: Duplicate column name 'ssl_type'
ERROR 1061 (42000) at line 66: Duplicate key name 'Grantor'
ERROR 1054 (42S22) at line 102: Unknown column 'Type' in 'columns_priv'
ERROR 1060 (42S21) at line 124: Duplicate column name 'type'
@hadShowDbPriv:=1
1
1
1
1
1
ERROR 1060 (42S21) at line 134: Duplicate column name 'Show_db_priv'
ERROR 1060 (42S21) at line 151: Duplicate column name 'max_questions'
ERROR 1060 (42S21) at line 161: Duplicate column name 'Create_tmp_table_priv'
ERROR 1060 (42S21) at line 164: Duplicate column name 'Create_tmp_table_priv'
ERROR 1054 (42S22) at line 253: Unknown column 'Create_view_priv' in 'where clause'
ERROR 1054 (42S22) at line 288: Unknown column 'Create_routine_priv' in 'where clause'
ERROR 1054 (42S22) at line 337: Unknown column 'Create_user_priv' in 'where clause'
ERROR 1060 (42S21) at line 370: Duplicate column name 'Routine_type'