Migration vers MySQL ?????

Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
- - Dernière réponse : cs_globule
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
- 14 juil. 2006 à 19:42
J’ai récemment posé une question sur le forum VBfrance concernant le remplacement des bases Access par une autre base plus solide et supportant le client/serveur, sans que cela ait un coût pour mes clients.



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
 




SQLServeur étant trop cher (la version gratuite est limitée a 4Go …) on m’a conseillé MySql.



 




Cependant, je viens de voir sur un site que MySQL n’était pas adapté à des gros volumes. Je cherche donc les conseilles de personnes qui l’utilisent dans le cadre professionnel, avec des grosses bases (20 a 50 Go …) en client/serveur. MySQL tient t’il le cou ?



 




Avez-vous des exemples en VB6 ou VB.NET (car on va tous être obligé de migrer …)



 




De plus j’ai vu qu’il existe des DLL pour l’attaquer directement. J’ai également vu que c’était possible avec ODBC. Quelle est la meilleure méthode ? Sachant que je ne peux pas prendre le risque d’intégrer quelque chose qui ne sera plus maintenu ou développé par un particulier (Merci à MS pour l’abandon du VB6 …)



 




Merci
Afficher la suite 

20/49 réponses

Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Salut,

Il ne faut pas trop attendre, pour moi Mysql est trop puissant surtout les dernières versions (5) de ce SGBD qui intègre les Trigger, les vues ..., en ce qui concerne la taille de la base de données, j'ai lu il y a pas mal de temps dans la documentation de mysql qu'il y ait une société qui a atteint 1TO de données sans prob (reste à les croire :-D) http://dev.mysql.com/doc/refman/5.0/fr/innodb-overview.html.

Pour la connexion, je pense qu'il n'y a pas grand-chose à modifier au niveau de ce point il faut juste installer MyODBC http://dev.mysql.com/downloads/connector/odbc/3.51.html, et changer une partie de la syntaxe de connexion utilisée dans ado (à noter Provider=SQLOLEDB.1 => DRIVER={MySQL ODBC 3.51 Driver}) pour plus de détail voici une source qui vient d'être posté traitant le sujet Mysql-Vb  http://www.vbfrance.com/codes/VB-MYQSL_38227.aspx, Pour le reste, je pense qu'il va rester inchangé.

Ben pour terminer, il faut voir juste, si le contenu de ta base de données est compatible avec la syntaxe de MySql.

Bonne programmation.

Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Merci pour ces precieuse reponses. Je vais tester
Commenter la réponse de cs_globule
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Effectivement, j'ai converti mon projet et ca tourne super bien

J'ai juste 2 questions:

1/ La Requête suivante est très lente ave MySQL, beaucoup plus que sur une base Access (Alors que tous le reste est très rapide)

RequeteSql = "select MAX(Num) as MyVal from MATABLE"

Comment optimiser ça (Num est une clé primaire) ?

2/ la fonction Date() ne marche plus
Requete = "SELECT Notes.* FROM Notes where SUPPRIME=0 and DateDeclenchement<=Date()"
Quel est l'équivalent
Commenter la réponse de cs_globule
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Il y a des endroits ou c'est beaucoup plus lent qu'Access

exemple

        Set RSMyRecordSet = New ADODB.Recordset
        RSMyRecordSet.open "MABASE", AdoMyConnectionMySQL_ONEOPEN_BDR, adOpenKeyset, adLockOptimistic

Sur une grosse base, cette opération (le open) necessite plusieurs secondes. Avec la même base au format MDB, c'est instantannée

Idem pour la la recherche d'une valeur maximum dans une base de données (j'ai essayé les differentes méthodes et c'est toujours aussi lent)

Ce qui est supprenant c'est que la requete suivante (même base MySQL) est tres rapide.
        Set RSMyRecordSet = New ADODB.Recordset
        RSMyRecordSet.open "Select * from MABASE where Cle=" & MyCle, AdoMyConnectionMySQL_ONEOPEN_BDR, adOpenKeyset, adLockOptimistic

Comment gérer ce probleme, Merci
Commenter la réponse de cs_globule
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Bonjour,

Oui effectivement Date() n'est pas reconnue dans Mysql, cependant comme dans oracle tu peux utiliser SYSDATE() ou NOW() ou CURRENT_DATE() (il ya une panoplie de fonctions permettant la manipulation des dates sous mysql http://www.toutestfacile.com/sql/cours/printables/SQLFacile.com-functdate.php).
En ce qui concerne la rapidité d'exécution de la fonction d'agrégation Max, vraiment c'est bizarre, tout d'abord essaye de voir si la colonne utilisée et bien de type int (entier ou en générale nombre) et si elle contient des valeurs NULL. autre chose essaye d'exécuter la même requête en utilisant PhpMyAdmin installable avec easyPHP.
Bonne programmation.

Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
En fait je me suis rendu compte que c'etait l'ouverture des recordSet qui etait longue
Par exemple
RequeteSql = "select MAX(Num) as MyVal from MATABLE" est tres lent sur une grosse base (au moins 3 secondes)

par contre, la requete suivante qui produit le même resultat est instantanée
RequeteSql = "select MAX(Num) as MyVal from MATABLE limit 1"

Idem, pour l'ajout de champ dans la base
un
RS.Open "Matable", ...
RS.addnew
...
RS.update

Sera tres lent
Par contre
RS.Open "select * from Matable limite 1", ...
RS.addnew
...
RS.update
Produit le même resultat et est 50 fois plus rapide
Bref, sans indiquer le limit, j'ai l'impression que MySQL stocke temporairement la base entiere dans un buffet ...
Bien sur, on peut utiliser directement la Insert ..., mais ca m'oblige a recoder les 5000 requetes de mon projet ...

Il me reste une interrogation :
La ligne suivante fonctionne
RS.Fields("MonChamp").value

Mais pas celle ci
RS.Fields("MATABLE.MonChamp").value
Hors dans un cas d'une requete sur 2 tables avec des champs portant le même nom, il est obligatoire de pouvoir indiquer le nom de la table ...
Commenter la réponse de cs_globule
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Salut,

Si cela marche bien, à condition qu'il ait vraiment une confusion dans les noms, car par défaut mysql utilise le nom de l'entité en cas de jointure de plusieurs tables il ajoute le nom de la table MATABLE.MonChamp pour les champs existant dans les deux tables.

Mais de toute façon tu peux donner des synonymes à tes champs sauf si tu as tendance à utiliser le * dans select.

select max(monchamp) as ValMax, table1.champx as MonChampX1, table2.champx as MonChampX2
from table1 join table2 using(champY)
groupby champz;

Tu peux omettre le As.
Bonne programmation.

Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Merci
Commenter la réponse de cs_globule
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Ca commence a super bien tourner. MySQL n'à rien à voir avec Access. Surtout en réseau
J'ai encore quelques questions

Comment faire un programme de sauvegarde (sans arrêter le serveur MySQL de préférence). En gros comment appeler la fonction dump avec ADO (ou une autre fonction)

J'ai également acheté un produit pour convertir mes bases Access en MySQL. Connaissez vous un utilitaire qui est capable de donner le code "create table ..." d'une base MySQL existante. Vu le nombre de tables que j'ai, il sera plus simple de faire un copier-coller d'une code valide, plutôt que de tout refaire "a la main"

Je rencontre également une difficulté sur la gestion des dates en MySQL, et notamment pour adapter le # et le between des requêtes access
exemple :
Select * from ma table where dateSaisie BETWEEN # " & datedeb & "# and #" & DateFin & "#"



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
 




Enfin, faut il que je fasse quelque chose de particulier (lors de la création des tables ou autres), pour avoir le support InnoDB, étant donnée que j’utilise la version 5 de MySQL. Ce n’est pas très clair dans la doc.


Merci
Commenter la réponse de cs_globule
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Commenter la réponse de medelidrissi
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Bonjour,

Tu t'es précipité à acheter ce convertisseur alors qu'il y est des programmes avec leurs codes sources, en vb, qu'ils fassent ce genre de travail.
Étant donné qu'il y a pas mal de personnes qui ont traité ce sujet, je te donne carrément la source de mes sources , où tu trouveras ton plaisir :
http://www.planet-source-code.com/vb/scripts/BrowseCategoryOrSearchResults.asp?optSort=Alphabetical&txtCriteria=mysql+access&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE&lngWId=1

Pour la sauvegarde des Bases de Données MYSQL :
http://www.planet-source-code.com/vb/scripts/BrowseCategoryOrSearchResults.asp?optSort=Alphabetical&txtCriteria=mysql+backup&blnWorldDropDownUsed=TRUE&txtMaxNumberOfEntriesPerPage=10&blnResetAllVariables=TRUE&lngWId=1

Dans mysql les chaînes de caractères à noter les dates doivent être entre apostrophes '. 
Select * from ma table where dateSaisie BETWEEN '" & datedeb & "' and '" & DateFin & "'"

Le type InnoDB regroupe pas mal de fonctionnalité qu'on trouve dans les grands sgbd comme oracle à noter la prise en charge des clés étrangère.... Pour l' utiliser il faut le spécifier avant le ; de la requête de création de ta table.

-- Table RSS
CREATE TABLE `RSS` (
        Code_RSS int(11) unsigned NOT NULL auto_increment,
        IPP int(11) unsigned NULL,
        RUM_Prin int(11) unsigned NULL,
        Mode_Entree varchar(100) NULL,
        Mode_Sortie varchar(100) NULL,
        Date_Entree date NULL,
        Date_Sortie date NULL,
     CMD int(5) NULL,
        GHM int(11) NULL,
        PRIMARY KEY(Code_RSS),
        FOREIGN KEY(IPP) REFERENCES patient(IPP) ON DELETE CASCADE,
     FOREIGN KEY(RUM_Prin) REFERENCES RUM(Code_RUM) ON DELETE CASCADE
) ENGINE=InnoDB;

Je te conseille d'installer, le gestionnaire par excellence des bases de données mysql "PhpMyadmin". (cherche easyphp = serveur apache + mysql + php+ phpmyadmin, sinon il faut installer le serveur apache puis phpMyadmin).

Bonne programmation.
Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Ok, merci. J'ai recupéré le module de SVG et ca à l'air de fonctionner


Par contre je rencontre une difficulté qui est plus génante


Si je travaille en reseau et lorsque je modifie 2 champs identiques dans la même base (à partir de chacun des poste), une erreur


-2147217864 se produit, "la ligne n'à pas pu etre trouvée pour la mise a jour. Certaines valeurs ont peut-être changé depuis leur derniere lecture"


 


 
Commenter la réponse de cs_globule
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Je decris un exemple de ce qui pose probleme. Je gere une trace du dernier code le dernier client dans la table utilisateurs. Lorsque je ferme la fiche du client je place la valeur -1 pour indiquer que ce dernier est libre.

Dans le cas d'un reseau, j'obtiens regulierement l'erreur 2147217864, "la ligne n'à pas pu etre trouvée pour la mise a jour. Certaines valeurs ont peut-être changé depuis leur derniere lecture". Ce qui n'etait pas le cas avec Access.
Comment gerer correctement le muti-utilisateurs lors des MAJ de bases

RequeteSql = "Select * from MyUtilisateurs where Code= " & G_Code

    Set RS = New ADODB.Recordset
    RS.open RequeteSql, AdoMyConnectionMySQL, adOpenKeyset, adLockOptimistic
    
    
    On Error Resume Next
    AdoMyConnectionMySQL.BeginTrans


    If Not RS.EOF And Not RS.BOF Then
        RS.fields("ClientActuel").value = "-1"
        RS.Update
    End If


    AdoMyConnectionMySQL.CommitTrans
    If Err.Number <> 0 Then GoTo RStrans_Err
    Err.Number = 0
    On Error GoTo 0  ' fin de la gestion d’erreur
   
    ' Fermeture du recordset
    If (Not RS Is Nothing) Then
        If RS.State = adStateOpen Then RS.Close
        Set RS = Nothing
    End If


   
Exit Sub
RStrans_Err:
            MsgBox "Erreur code : " & Err.Number & " DESCRIPTION : " & Err.Description, vbInformation
Commenter la réponse de cs_globule
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Bonjour

Je pense que pour des raisons de performances, il vaut mieux faire un update directement, essaye d'utiliser la requête et regarde si le prob se présente tjrs :RequeteSql "Update MyUtilisateurs set  ClientActuel -1 where Code= " & G_Code
(le champ Code est a priori une clé primaire de la table  MyUtilisateurs).

Bonne programmation.


Cordialement medelidrissi


<hr />

En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Et je garde mes transactions ou je fais juste un open puis un close de cette requete ?
Commenter la réponse de cs_globule
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Bonjour,

J'ai testé les 2 sources de sauvegarde sur le lien que vous m'avez donné, mais aucune ne fonctionnent correctement sur les très grosses bases (Il manque des tables lors de la restauration)

J'ai essayé d'appeler MySQLDump. J'arrive à le faire fonctionner directement sous MSDOS, mais impossible de le faire tourner en VB6 (dans une commande Shell). Je ne sais pas pourquoi.

D'autre part, existe t'il un moyen de sauvegarder directement ma base de donnée. C.A.D. d'arrêter le serveur MySQL et de récupérer directement les fichiers sur le disque dur. Si oui lesquels ?
J'ai essayé
C:\Program Files\MySQL\MySQL Server 5.0\data\MABASE
mais ça ne fonctionne pas.
J'utilise InnoDB



<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /?>
 




Bref, je recherche toute solution de sauvegarde d’une base MySQL « sur » et rapide en VB6



 




Merci
Commenter la réponse de cs_globule
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Salut,

Effectivment, faire une sauvegarde à chaud dans mysql n'est pas une chose faisable pour les grandes bases de donnée.
Si tu as accès au poste accueillant le serveur mysql il vaut mieux faire une copie des fichiers sources de ta base.

1 - pour ce faire arrête ta base
2 - va dans C:\Program Files\MySQL\MySQL Server 5.0\data\
puis copie :
le dossier MABASE
et les fichiers ib_logfile0, ib_logfile1 et ibdata1 : Lorsque tu utilises les bases de données innodb ces fichiers sont nécessaire ibdata1 contient la totalité des données de toutes tes tables innodb de toutes les bases, "eh oui" , de ton serveur.
Dans le dossier de ta sauvegarde par exemple : c:/..../Buckup/

si jamais tu veux faire le test pour voir si ta sauvegarde c'est bien passé :
arrete Mysql
va dans le dossier
C:\Program Files\MySQL\MySQL Server 5.0\
renomme le dossier data en data1 (ou ce que tu veux)
crée un dossier data
puis copie ta sauvegarde dans ce nouveau dossier (en respectant la structure dans c:/..../Buckup/)
copier le dossier .../data1/mysql dans /data/ (attention copier pas couper )

lancer mysql

pour revenir à ta configuration supprime data et renomme data1 en data
sinon tu peux changer les paramètres du fichier de configuration de mysql pour qu'il utilise un autre dossier comme source de donné
le paramètre "datadir"

Bonne programmation.
Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
J'aurais besoin de ta commande qui ne marche pas dans vb pour pouvoir te répondre, car normalement ça doit marcher sans prob.

Bonne programmation.

Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi
Messages postés
327
Date d'inscription
mardi 8 octobre 2002
Statut
Membre
Dernière intervention
6 octobre 2010
0
Merci
Pour le dump, j'ai finalement reussi à l'appeler en VB6 par un Shell, mais ca ne me plait pas trop

Je vais essayer de faire une sauvegarde directe des fichiers. Faut il stopper uniquement la connexion à la base ou arreter le serveur MySQL ?

Je me pose encore une question
Concernant le transfert d'une base Access vers MySQL en InnoDB est il preferable d'utiliser latin1 ou utf8 comme langage (mes clients sont tous francais)
Commenter la réponse de cs_globule
Messages postés
180
Date d'inscription
jeudi 21 août 2003
Statut
Membre
Dernière intervention
26 novembre 2007
1
0
Merci
Je pense qu'il est possible de faire cette sauvegarde sans arrêter la base de données, mais il faut exécuter qlq requête pour la rendre en lecture seule regarde dans la documentation de mysql. En attendant l'arrêt de la base et obligatoire.

Pour le français, je pense latin1 et plus adéquat, sinon à ma connaissance tu dois convertir lors de la lecture

Bonne programmation.

Cordialement medelidrissi

<hr />En Informatique, rien n'est impossible. mais, ce n'est pas toujours évident.
Commenter la réponse de medelidrissi