IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Exporter les plus anciens enregistrements de plusieurs bases


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut Exporter les plus anciens enregistrements de plusieurs bases
    Bonjour,

    Je travaille actuellement sur un serveur MySQL comprenant une centaine de bases de données contenant chacune plusieurs tables avec différents champs.

    Je dois faire un script sql permettant :
    - de lister les plus anciens enregistrements de toutes les tables (antérieurs à une date donnée)
    - d'exporter le résultat dans un fichier texte
    - une fois l'exportation effectuée avec succès, ce script supprime les enregistrements correspondants sur le serveur

    Pour le premier point, je n'arrive pas à spécifier correctement ce qui est souligné : pour toutes les tables de toutes les bases, exporter tout les enregistrements antérieurs à une date donnée.

    Voici un début de requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM information_schema.TABLES WHERE round(((data_length + index_length) / 1024 / 1024), 3) >= 20 AND table_schema LIKE '%eechange%' AND table_schema.table_name.dattimcrehoro < '20140101';
    dattimcrehoro est le champ date correspondant. Il ne reconnait pas ce champ lors de l'exécution de ma requête. Que faire ?

    Merci d'avance pour vos réponses.

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Gannox.

    Quel est la version de votre MySql ?

    Je suis sous MySql 5.7.12 !

    Citation Envoyé par Gannox
    - de lister les plus anciens enregistrements de toutes les tables (antérieurs à une date donnée)
    Avez-vous dans vos tables, une information qui vous indiques la date et l'heure de la dernière modification de la ligne ?

    Si vous n'avez pas cette information, en effet, il faut se référencer à "information_schema.tables".
    En premier, consultez la documentation mysql : http://dev.mysql.com/doc/refman/5.7/...on-schema.html

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    table_schema.table_name.dattimcrehoro
    D'où sortez-vous ce nom de colonne ?

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    --------------
    select table_schema,
           table_name,
           engine,
           coalesce(update_time, create_time) as tri
    from  tables
     
    where table_type   = 'base table'
      and table_schema = 'mysql'
    order by tri
    --------------
     
    +--------------+---------------------------+--------+---------------------+
    | table_schema | table_name                | engine | tri                 |
    +--------------+---------------------------+--------+---------------------+
    | mysql        | slow_log                  | CSV    | NULL                |
    | mysql        | general_log               | CSV    | NULL                |
    | mysql        | func                      | MyISAM | 2016-04-30 18:11:39 |
    | mysql        | time_zone                 | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | plugin                    | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | event                     | MyISAM | 2016-04-30 18:11:39 |
    | mysql        | ndb_binlog_index          | MyISAM | 2016-04-30 18:11:39 |
    | mysql        | columns_priv              | MyISAM | 2016-04-30 18:11:39 |
    | mysql        | slave_relay_log_info      | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | help_topic                | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | slave_master_info         | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | help_relation             | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | servers                   | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | help_keyword              | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | time_zone_transition_type | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | help_category             | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | time_zone_transition      | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | time_zone_name            | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | procs_priv                | MyISAM | 2016-04-30 18:11:39 |
    | mysql        | time_zone_leap_second     | InnoDB | 2016-04-30 18:11:39 |
    | mysql        | engine_cost               | InnoDB | 2016-04-30 18:11:40 |
    | mysql        | slave_worker_info         | InnoDB | 2016-04-30 18:11:40 |
    | mysql        | server_cost               | InnoDB | 2016-04-30 18:11:40 |
    | mysql        | gtid_executed             | InnoDB | 2016-04-30 18:11:40 |
    | mysql        | tables_priv               | MyISAM | 2016-04-30 18:11:43 |
    | mysql        | proxies_priv              | MyISAM | 2016-04-30 18:11:43 |
    | mysql        | db                        | MyISAM | 2016-04-30 18:15:25 |
    | mysql        | user                      | MyISAM | 2016-04-30 18:20:18 |
    | mysql        | proc                      | MyISAM | 2016-05-11 19:12:28 |
    | mysql        | innodb_table_stats        | InnoDB | 2016-05-26 13:51:34 |
    | mysql        | innodb_index_stats        | InnoDB | 2016-05-26 13:51:34 |
    +--------------+---------------------------+--------+---------------------+
     
    Appuyez sur une touche pour continuer...
    J'ai fusionné la colonne "update_time" avec la colonne "create_time" quand la première est à "NULL".
    Cette colonne porte le nom de "tri" et j'ai tri sur ce critère.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut
    Bonjour,

    J'ai beaucoup avancé depuis deux jours et le script SQL que j'ai généré pour y parvenir est quasi-fonctionnel.

    Au passage, il se peut que sur les 32 000 tables que j'analyse, certaines ne comportent pas de champ "dattimcrehoro". Est-ce que cela va bloquer ma requête à ce moment en pleine exécution ou il va ignorer la table en question ?

  4. #4
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Gannox.

    Vous n'avez pas répondu à mes questions !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 103
    Points : 115
    Points
    115
    Par défaut
    Pour la simple et bonne raison que j'ai trouvé comment faire

    Voici ce que ca donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    DELIMITER $$
    DROP PROCEDURE IF EXISTS test_affiche $$
    CREATE PROCEDURE test_affiche()
    BEGIN
    	DECLARE base_courante varchar(50);
    	DECLARE table_courante varchar(50);
    	DECLARE fin INT DEFAULT 0;
    	DECLARE cur1 cursor for SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA LIKE "echange%"
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = 1;
    	open cur1;
    	boucle:LOOP
    		fetch cur1 into base_courante, table_courante;
    		set @req = CONCAT('SELECT * FROM ', table_courante, ' WHERE dattimcrehoro < ''20121001''');
    		prepare stmt from @req;
    		execute stmt;
    		drop prepare stmt;
    		if fin = 1 then
    			LEAVE boucle;
    		end if;
    	END LOOP;
    	close cur1;
    END $$
    DELIMITER ;
     
    call test_affiche();
    J'ai ce que je veux avec le paramètre dattimcrehoro représentant la date d'enregistrement dans chaque table. Pour avoir les plus anciens, je n'ai pas recours à une information précise, j'utilise ce que j'ai mis dans le WHERE de la seconde requête.

    Un problème persiste : j'ai besoin d'exporter ces résultats mais entre certaines tables se trouvent des liens (clés étrangères). Comment puis-je procéder ?

Discussions similaires

  1. [Batch] déplacer des logs les plus anciens en fonction de la date
    Par aubcia dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 10/07/2014, 16h40
  2. Réponses: 4
    Dernier message: 06/08/2008, 14h52
  3. Réponses: 4
    Dernier message: 13/03/2008, 09h55
  4. [MySQL] Importer/exporter les variables courante d'/dans une base
    Par vovor dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 12/07/2007, 22h43
  5. Supression des doublons les plus anciens
    Par jonkalak dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 30/05/2007, 08h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo