Ch'ti guide de migration MSAccess vers MySQL

Ch'ti guide de migration MSAccess vers MySQL - SQL/NoSQL - Programmation

Marsh Posté le 29-11-2004 à 11:39:05    

Bonjour,
 
Suite à la migration de notre intranet d'entreprise de MSAccess vers Mysql, je vous livre ici la façon dont je m'y suis pris.
 
Attention, je ne prétend pas :
 
- Connaître parfaitement MySQL, Access, PHP et ASP. Bien que je m'en serve beaucoup, ce sont des sujets tellement vastes qu'on en fait jamais vraiment le tour.
 
- Posséder la meilleure solution, vos commentaires seront les bienvenus.
 
Ce post a pour seul but d'aiguiller ceux qui ne savent pas trop
par quel bout commencer (comme ce fut mon cas) pour utiliser ce magnifique outil qu'est MySQL.
 
Pour vous donner une idée du temps que cela vous prendra :
 
Taille de l'application migrée :
- 11 bases Access comportant 178 tables
- 8 sites (chiffrage, gestion commerciale, sav, etc...)
utilisant ce bases, 371 fichiers ASP, 21 fichiers PHP.
 
Durée de l'opération : Une personne, environ un mois, 8h par jour, 4 jours sur 7
 
Outils utilisés :
 
- MSAccess 2000
- IIS 5
- MySQL 4.x http://www.mysql.com
- EditPlus pour ses excellentes qualités dans les "rechercher/remplacer" http://www.editplus.com/
- PhpMyAdmin comme interface de base de données http://phpmyadmin.net
 
Voici donc la démarche que j'ai utilisé avec succès :
 
D'abord, convertissez la structure et les données avec l'utilitaire accessDump.
 
Important : remplacez la virgule (,) par un point (.) comme séparateur décimal dans les options régionales du panneau de configuration, sans quoi tous les nombres décimaux deviendront des entiers lors de l'import dans MySQL.
 
Pour chacune de vos base Access, exportez séparément la structure des tables et les données, comme cela lorsque vous aurez fini la migration sur votre serveur de test, vous pourrez vider vos tables mysql et réimporter rapidement les données à jour de vos utilisateurs pour tout mettre en ligne sur votre serveur de production (ça vous évitera peut-être une nuit blanche pizza/bière lors de la bascule).
 
J'ai essayé plusieurs de ces utilitaires, et j'ai retenu celui-ci car il convertit de façon relativement précise :
 
- Les formats des champs
- Les champs compteurs
- Les indexes !!!
 
Attention toutefois, car il ne convertit pas les valeurs par défaut des champs, il faut se les taper à la main, et dans certains cas modifier les scripts (cas du champ au format date/heure ayant la valeur Now() par défaut dans Access)
 
Si votre site/application web utilise plusieurs bases Access, convertissez-les telles quelles, n'essayez pas de les regrouper car vous risquez fort de vous pélanger les médales avec les connections ODBC, surtout si certains de vos scripts en utilisent plusieurs simultanément. Vous pourrez effecturer ce regroupement plus tard si vous le souhaitez.
 
En résumé : n bases Access => n bases MySQL
 
Faites ensuite éxécuter les fichiers .sql ainsi créés à MySQL en utilisant son interpréteur de commandes (mysql.exe) en utilisant sa commande "source".
 
Une fois la conversion effectuée, "débranchez" vos sources ODBC de vos bases Access et "rebranchez" les sur vos base MySQL à l'identique.
 
Attention, si certains de vos scripts (asp ou php) comportent des scripts SQL basés sur des requêtes Access (internes au fichier .mdb), vous devrez les modifier :
 
- Soit pour qu'ils utilisent exclusivement les tables
- Soit en utilisant les vues (tables temporaires) de MySQL
 
J'ai choisi la première solution car elle peut être appliquée peu à peu sur un serveur de production sans dommages pour les utilisateurs (si on fait attention) avant le début de la migration proprement dite.
 
Voici une liste (non exhaustive) des différences de syntaxe et de fonctionnement entre les langages SQL de MSAccess et MySQL. Prenez-les une par une et effectuez les modifications correspondantes dans vos scripts (j'ai pour ma part utilisé la puissante fonction "find in files" d'EditPlus). Certaines supportent le remplacement brutal dans tous les fichiers (IIF), mais la plupart vous obligeront à effectuer
un travail de fourmi.
 
-- snip --
 
WHERE NOT field_1 = value
=> WHERE field_1 <> value
 
SELECT TOP n field_1 FROM table_1 WHERE 1
=> SELECT field_1 FROM table_1 WHERE 1 LIMIT 0,n
 
IIF(condition, True, False)
=> IF(condition, 1, 0)
 
LEN(string)
=> LENGTH(string)
 
SELECT field_1 & field_2 AS alias
=> SELECT CONCAT(IF(field_1 IS NULL, '', field_1), IF(field_2 IS NULL, '', field_2)) AS field_3
 
WHERE field_1 = CDATE('" & "dd/mm/yy" & "')"
=> "WHERE field_1 = '" & DateMySQL('jj/mm/aa') & "'" (voir la fonction DateMySQL() ci-dessous)
 
WHERE field_1 IN (subquery)
=> WHERE field_1 IN (Valeur1, Valeur2, ...) Or
=> WHERE field_1 IN (" & InSelect(subquery_string) & " )" (voir la fonction InSelect() ci-dessous)  
 
HAVING
=> WHERE (Evitez HAVING, cette clause est intolérablement lente car elle ignore les indexes)
 
Si vous ne pouvez pas faire autrement :
HAVING field_1 = value
=> field_1 doit être inclu dans la clause SELECT, MySQL effectue un tri après-coup.
 
SELECT FORMAT(MaDate,'dd/mm/yy') AS Alias
=> MySQL ne comprend pas la fonction SQL FORMAT(), effectuez la mise en forme dans le script.
 
...WHERE MaDate < " & date & " + 1
=> WHERE MaDate < " & DateMySQL(Cdate(date) + 1) (voir la fonction DateMySQL())
 
WHERE true
=> WHERE 1
 
champs avec Now() comme valeur par défaut
=> Ajoutez "MaDate = '" & date("Y-m-d" ) & "'" dans vos scripts
 
-- snip --
 
Voici les fonction utilisées. Elles sont en ASP mais il doit être facile de les convertir en PHP.
 
Function DateMySQL(strg1)
 If Len(strg1) = 8 Then annee = Mid(strg1, 7, 2)
 If Len(strg1) = 10 Then annee = Mid(strg1, 7, 4)
 mois = Mid(strg1, 4, 2)
 jour = Mid(strg1, 1, 2)
 DateMySQL = annee & "-" & mois & "-" & jour
End Function
 
'Fonction d'émulation des sous-requêtes (SELECT IN non supporté par MySQL pour l'instant)
 
Function InSelect(sql, TypeChamp, DBInsel) 'Pour que ça marche, le champ résultat doit être 'AS Champ1'
 
 Set InSel = DBInsel.Execute(sql)
 
 If Not InSel.EOF Then
 
  Select Case TypeChamp
 
  Case "Num"
 
   Do While Not InSel.EOF
    strg1 = strg1 & InSel("Champ1" ) & ","
   InSel.MoveNext : Loop
 
  Case "Alpha"
 
   Do While Not InSel.EOF
    strg1 = strg1 & "'" & SQLGuillemets(InSel("Champ1" )) & "',"
   InSel.MoveNext : Loop
   
  End Select
 
  strg1 = Left(strg1, Len(strg1)-1)
 
 End If
 
 InSelect = strg1 : InSel.Close
 
End Function
 
Dernières étapes :
 
- Dressez un liste de vos scripts et testez-les vous-même un par un en utilisant PhpMyAdmin pour déboguer les scripts SQL (bonne chance !)
 
- Demandez à un utilisateur représentatif de chaque application d'effectuer des tâches courantes et/ou complexes sur le serveur de test.
 
- Videz toutes les tables du serveur de test.
 
Lors de l'absence de vos utilisateurs (ou de l'arrêt des services web, à vous de voir) :
 
- Installez et configurez MySQL et PhmMyAdmin sur votre serveur de production (utilisez les mêmes versions que sur votre serveur de test)
 
- Copiez les tables du serveur de test vers le serveur de production.
Ce sont des fichiers .frm, .myd et .myi situés dans des dossiers portant normalement les mêmes noms que feu vos bases Access. Copiez les dossiers tels quels, sauf le dossier mysql qui sert au au fonctionnement de mysql et qui existe déjà sur votre serveur de production.
 
Importez les dernières données en date :
AccessDump -> fichiers .sql (données uniquement) -> mysql.exe, commande "source"
 
Reconfigurez vos sources de données ODBC.
Vérifiez que ça marche.
 
Préparez-vous à affronter les utilisateurs (ça va forcément merdouiller un peu au début, il ne faut pas rêver !)
 
Hope this help.
 
-
 
Le texte ci-dessus est libre de droits, en revanche toutes les fautes d'orthographe, de grammaire, etc... sont copyrights (c) J.Roger, 2004

Reply

Marsh Posté le 29-11-2004 à 11:39:05   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed