Forum Programmation.shell Faire une maintenance SQL via Shell et cron ?

Posté par  .
Étiquettes : aucune
0
9
nov.
2006
Bonjour,

j'y connais rien en shell mais il va falloir que je fasse un fichier de maintenance pour un script de stats car en php je saturerais mon serveur plusieurs milliers d'entrées SQL à traiter) :(

Pour infos je suis sous Mysql 3.23.xx

Voici ce que je dois faire :

>je selectionne toutes les entrées de ma table "logs" :
SELECT * FROM logs

et j'envoi le tout dans la table archive_logs avec un INSERT...

ensuite je fais les calculs des logs brut à l'aide de
SELECT count(visites)...
SELECT count(page_vue)...

et j'insère ces résultats dans la table "statisitques"
INSERT visites, page_vue....

Et je vide ma table "logs" une fois que l'envoi des logs brut et les calculs sont fais.

Pour des requêtes en PHP ça passe mais comment faire ça avec un fichier shell exécuté tous les jours par une tache cron ?

Si quelqu'un pourrait me donner un exemple svp pour que je comprenne le principe de mise en oeuvre de cette maintenance que j'ai à faire.

Merci à tous de m'avoir lu et pour vos réponses (j'espère j'ai plus de cheveux à force de cogiter)
  • # .

    Posté par  . Évalué à 2.

    y'a un outil en ligne de commande qui permet de passer des requetes.

    Exemple :
    $ mysql -u root -e 'create database toto ;'

    man mysql pour plus d'infos.

    Sinon je sais pas quel volume de données tu as, mais si c'est des milliers et pas des centaines de milliers, ca ne devrait pas mettre à genoux ton serveur.
    - les tables sont correctement indexees ?
    - les traitements sont fait sur le serveur de sgbd et pas par php ? ( tu fais bien "insert into toto select * from tata" et non pas "select * from toto" puis "insert into tata" pour chaque enregistrement ? "
    - tu peux peut etre passer par une vue
    - tu peux peut etre passer par une procedure stockée : ca t'evitera des aller-retour reseau
  • # ben avec la ligne de commande mysql

    Posté par  . Évalué à 1.

    tu mets toutes tes requetes les une en dessous des autres séarées par des ; dans un fichier requetes.sql
    et dans cron tu lances le script suivant :


    #!/bin/sh
    mysql -u login -p password -D base < requetes.sql


    Dam
  • # php-cli

    Posté par  (site web personnel) . Évalué à 3.

    Si ton code de maintenance est déjà fait en php, tu pourrais envisager d'utiliser l'interpréteur php en ligne de commande (package php4-cli pour Debian).
    • [^] # Re: php-cli

      Posté par  . Évalué à 1.

      >>y'a un outil en ligne de commande qui permet de passer des requetes.
      - Non je compte l'automatiser manuellement via un script de maintenance.

      >> les tables sont correctement indexees ?
      - oui

      >> les traitements sont fait sur le serveur de sgbd et pas par php ? ( tu fais bien "insert into toto select * from tata" et non pas "select * from toto" puis "insert into tata" pour chaque enregistrement ? "
      - bein le script de maintenance sera surement fais en php, voir en shell ou les 2 je sais pas encore vue qu'en PHP je vais tout plomber et en shell je sais pas faire... Donc j'attends les retours sur les forums avant de faire une bêtise.

      >> tu peux peut etre passer par une vue
      - cet à dire stp ?


      ----

      >>"tu mets toutes tes requetes les une en dessous des autres séarées par des ; dans un fichier requetes.sql
      et dans cron tu lances le script suivant :
      #!/bin/sh
      mysql -u login -p password -D base < requetes.sql "

      - Ca me semble une bonne idée mais il faut que je génère le fichier requete.sql automatiquement donc je me demande si ça reviens pas au même question consommation de ressource lors de l'extraction de mes logs brut > le calcul des données et la création de ces lignes dans le fichier requete.sql

      Le but est pour moi que ça soit le plus rapide possible et optimisé pour éviter un mauvais traitement voir une coupure pendant la maintenance ce qui aurait pour incidence de fausser mon système de stats.

      ----

      >> Si ton code de maintenance est déjà fait en php, tu pourrais envisager d'utiliser l'interpréteur php en ligne de commande (package php4-cli pour Debian).
      - Cet à dire stp
      Sinon non je ne l'ai pas encore fais, je cherche encore le meilleur moyen de faire ça car la seule solution que j'ai trouvé c'est de générer les requêtes et calcul avec en boucle avec un while en php (aïe, aïe...)

      Désolé si je percute pas au quart de tour, j'y connais pas grand chose en shell ou ce style de requête gourmande et automatisé.
      • [^] # Re: oublie

        Posté par  . Évalué à 1.

        j'ai oublie à la question :

        >> les traitements sont fait sur le serveur de sgbd et pas par php ? ( tu fais bien "insert into toto select * from tata" et non pas "select * from toto" puis "insert into tata" pour chaque enregistrement ? "

        - Oui je compte faire "insert into toto select * from tata"
        • [^] # Re: oublie

          Posté par  . Évalué à 1.

          (Désolé pour le triple posts d'affilié.)

          Sinon je pensais faire par tranche de 200 entrèes avec PHP :

          Je m'explique, je traite les 200 premiers logs brut qui sont dans ma table "logs" puis avec la fonction sleep() j'attends 2 secondes avant de rediriger avec la fonction redirect() vers le même fichier avec $_GET pour reprendre les 200 suivantes etc

          La maintenance devrait se faire en 20 minutes pour 100 000 entrées à traiter.

          C'est pas la meilleure solution en terme de rapidité de la maintenance mais ça me semble fiable et léger non ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.