[resolu][java/mysql] restauration de dump

restauration de dump [resolu][java/mysql] - Java - Programmation

Marsh Posté le 04-10-2007 à 00:29:20    

Bonjour je voudrais savoir si quelqu'un a une idée concernant une restauration simple (ne pas reinventer la roue) de dump.
 
Voici les parties pour comprendre mon probleme :
Classes/fonctions:
Messages => redirections et modif des sorties standards
getFile() => permet la recupe de l'emplacement du fichier a charger
getDir() => permet la recupe de l'emplacement du dossier dans lequel est enregistre le dump
 
fonction de dump (ca ca marche bien)

Code :
  1. /**  
  2.      * Permet un mysqldump  
  3.      * @return true/false
  4.      */
  5.     public boolean dump(){
  6.         boolean dump = false;
  7.         String tmp = getDir();
  8.         if(tmp != null){
  9.             String connect = new String("mysqldump -u"+user+" -p"+password+" -h"+host+" --compact --default-character-set=utf8 -r "+tmp+" "+dbname);
  10.             message.info(connect);
  11.             try{
  12.                 process = runtime.exec(connect);
  13.                 int exitVal;
  14.                 try {
  15.                     exitVal = process.waitFor();
  16.                     message.info("Process exitValue: " + exitVal);
  17.                     dump = true;
  18.                 } catch (InterruptedException ex) {
  19.                     message.erreur("Impossible d'ecrire le dump"+ex.getMessage(), getClass());
  20.                 }
  21.             }catch(IOException ex){
  22.                 message.erreur("impossible d'ecrire le dump "+ex.getMessage(), getClass());
  23.             }
  24.         }
  25.         return dump;
  26.     }


 
fonction de restauration : (la ca marche pas)

Code :
  1. /**
  2.      * Permet une restauration a partir d'un fichier dump
  3.      * @return true/false
  4.      */
  5.     public boolean restore(){
  6.         boolean restore = false;
  7.         String tmp = getFile();
  8.         if(tmp != null){
  9.             String connect = new String("mysql -u"+user+" -p"+password+" -h"+host+" -e \"source "+tmp+"\" " );
  10.             message.info(connect);
  11.             try{
  12.                 process = runtime.exec(connect);
  13.                 int exitVal;
  14.                 try {
  15.                     exitVal = process.waitFor();
  16.                     message.info("Process exitValue: " + exitVal);
  17.                     restore = true;
  18.                 } catch (InterruptedException ex) {
  19.                     message.erreur("Impossible de restaurer le dump"+ex.getMessage(), getClass());
  20.                 }
  21.                
  22.             }catch(IOException ex){
  23.                 message.erreur("Impossible de restaurer le dump"+ex.getMessage(), getClass());
  24.                 return false;
  25.             }
  26.         }
  27.         return restore;
  28.     }


Voici ma sortie :  

Citation :

Information: mysql -uXXXX -pXXXXXXXX -h127.0.0.1 -e "source /home/alain/programmation/MonGestionnaire/CLEAN/data.sql"  
Information: Process exitValue: 1


Aucun message d'erreur.  
Si je copie/colle la sortie de la premiere information dans ma console le dump est restauré.
J'ai tente en passant par un Statement (genre newStatement.executeQuery("source  dir/vers/dump.sql" ); ) ca ne marche pas, il me sort une "error in ur sql syntax"
Merci d'avance.

Message cité 1 fois
Message édité par bastet eneada le 06-10-2007 à 19:26:21

---------------
----
Reply

Marsh Posté le 04-10-2007 à 00:29:20   

Reply

Marsh Posté le 04-10-2007 à 18:28:38    

bastet eneada a écrit :


fonction de restauration : (la ca marche pas)

Code :
  1. String connect = new String("mysql -u"+user+" -p"+password+" -h"+host+" -e \"source "+tmp+"\" " );




 
Deux choses me paraissent suspectes dans la commande que tu exécutes :

  • l'absence du nom de la base de données dans la commande. Avec celle que tu utilises pour créer le dump, MySQL devrait retourner une erreur "ERROR 1046 (3D000): Aucune base n'a été sélectionnée".
  • l'option '-e "source dump.sql"'. La commande source est utilisée pour évaluer un script shell, pas un script SQL. Pour ma part, j'utilises une redirection (< dump.sql)


Reply

Marsh Posté le 04-10-2007 à 18:56:04    

riastudio a écrit :


 
Deux choses me paraissent suspectes dans la commande que tu exécutes :

  • l'absence du nom de la base de données dans la commande. Avec celle que tu utilises pour créer le dump, MySQL devrait retourner une erreur "ERROR 1046 (3D000): Aucune base n'a été sélectionnée".
  • l'option '-e "source dump.sql"'. La commande source est utilisée pour évaluer un script shell, pas un script SQL. Pour ma part, j'utilises une redirection (< dump.sql)




 
Le nom de la DB est ecrite dans le dump, extrait du dump:

Code :
  1. use gestionnaire;
  2. -- Drop des tables (ordre de cle)
  3. DROP TABLE IF EXISTS `client`;
  4. -- --------------------------------------------------------
  5. --
  6. -- Structure de la table `client`
  7. --
  8. CREATE TABLE `client` (
  9.   `identifiant` int(11) NOT NULL auto_increment,


 
Une redirection '<' ne peut pas etre utilisee avec un Runtime.
PS: commande mysql source, c'est pratique quand on est deja entré :  
http://dev.mysql.com/doc/refman/5. [...] mands.html

Message cité 1 fois
Message édité par bastet eneada le 04-10-2007 à 20:18:17
Reply

Marsh Posté le 04-10-2007 à 21:58:58    

bastet eneada a écrit :


 
Le nom de la DB est ecrite dans le dump, extrait du dump:

Code :
  1. use gestionnaire;




 
Sur mon installation, le 'use db' ne fait pas partie du dump avec la commande que tu utilises.  

Code :
  1. # mysqldump --version
  2. mysqldump  Ver 10.11 Distrib 5.0.44, for pc-linux-gnu (i686)


 

bastet eneada a écrit :


PS: commande mysql source, c'est pratique quand on est deja entré :  
http://dev.mysql.com/doc/refman/5. [...] mands.html


 
Joker, jamais eu besoin. :sarcastic:  
 
Si l'appli ne fait que sauvegarder/restaurer des bases MySQL, pourquoi ne pas envisager de la remplacer par un ETL (http://www.manageability.org/blog/stuff/open-source-etl/view) ? Tu gagnerais en compatibilité et en portabilité.


---------------
riaStudio - Ecommerce et Applications Internet - Niort
Reply

Marsh Posté le 06-10-2007 à 12:44:48    

Après quelques essais, voici le résultat :
 


Le tout donne un résultat qui fonctionne mais n'est pas vraiment satisfaisant. Il faudra déployer un client mysql avec l'application pour profiter de la sauvegarde / restauration.


---------------
riaStudio - Ecommerce et Applications Internet - Niort
Reply

Marsh Posté le 06-10-2007 à 16:11:56    

Merci, je vais voir tout ça.

Reply

Marsh Posté le 06-10-2007 à 17:29:23    

Tada, ça marche :p merci.
 

Code :
  1. /**
  2.      * Permet une restauration a partir d'un fichier dump
  3.      * @return true/false
  4.      */
  5.     public boolean restore(){
  6.         boolean restore = false;
  7.         String tmp = getFile();
  8.         if(tmp != null){
  9.             String connect = new String("mysql -u"+user+" -p"+password+" -h"+host+" --default-character-set=utf8 -e \"source "+tmp+"\" "+dbname);
  10.             try{
  11.                 // selection de l'OS
  12.                 String OS = System.getProperty("os.name" );
  13.                 String windows = new String("windows" );
  14.                 CharSequence seq = windows.subSequence(0, windows.length()-1) ;
  15.                 if(OS.toLowerCase().contains(seq)){
  16.                     // creation du fichier de lancement de dump pour windows
  17.                     File tmpFile = new File(directionLocale+"/tmp.bat" );
  18.                     FileOutputStream out = new FileOutputStream(tmpFile);
  19.                     out.write(connect.getBytes());
  20.                     out.close();
  21.                     // execution du fichier tmp pour windows
  22.                     process = runtime.exec(directionLocale+"/tmp.bat" );
  23.                     tmpFile.delete();
  24.                 }else{
  25.                     // creation du fichier de lancement de dump pour linux
  26.                     File tmpFile = new File(directionLocale+"/tmp.sql" );
  27.                     FileOutputStream out = new FileOutputStream(tmpFile);
  28.                     out.write(connect.getBytes());
  29.                     out.close();
  30.                     // execution du fichier tmp pour linux
  31.                     process = runtime.exec(new String[]{"/bin/bash", directionLocale+"/tmp.sql"});
  32.                     tmpFile.delete();
  33.                 }
  34.                 int exitVal;
  35.                 try {
  36.                     exitVal = process.waitFor();
  37.                     if(exitVal==0){
  38.                         JOptionPane.showMessageDialog(null, properties.getLabel("ENREGISTREMENT_OK" ), properties.getLabel("MESSAGE_TITRE_INFORMATION" ), JOptionPane.INFORMATION_MESSAGE);
  39.                     }else{
  40.                         message.ecrire(process);
  41.                         JOptionPane.showMessageDialog(null, properties.getLabel("ENREGISTREMENT_PAS_OK" ), properties.getLabel("MESSAGE_TITRE_ERREUR" ), JOptionPane.ERROR_MESSAGE);
  42.                     }
  43.                     message.info("Process exitValue: " + exitVal);
  44.                     restore = true;
  45.                 } catch (InterruptedException ex) {
  46.                     message.erreur("Impossible de restaurer le dump"+ex.getMessage(), getClass());
  47.                 }
  48.             }catch(IOException ex){
  49.                 message.erreur("Impossible de restaurer le dump"+ex.getMessage(), getClass());
  50.                 return false;
  51.             }
  52.         }
  53.         return restore;
  54.     }


J'ai pas encore teste sous windows mais sous linux ça marche.
 

Citation :

Sur mon installation, le 'use db' ne fait pas partie du dump avec la commande que tu utilises.  

Code :
  1. # mysqldump --version
  2. mysqldump  Ver 10.11 Distrib 5.0.44, for pc-linux-gnu (i686)




En fait c'etait un fichier fait main désolé pour la confusion.

Message cité 1 fois
Message édité par bastet eneada le 06-10-2007 à 18:04:32
Reply

Marsh Posté le 06-10-2007 à 20:06:07    

bastet eneada a écrit :

Tada, ça marche :p merci.


 
Pas de quoi ;)


---------------
riaStudio - Ecommerce et Applications Internet - Niort
Reply

Sujets relatifs:

Leave a Replay

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