
Bonjour, Je me suis écrit la petite fonction suivante (en bash) pour découper un dump mysql par tables (je rajoute ici des retours chariot pour la lisibilité). split_sqldump() { if [ $# -lt 1 ] ; then echo "Il faut passer le fichier de sqldump en argument (et éventuellement un préfixe en 2nd arg)"; elif [ ! -f "$1" ] ; then echo "Le fichier '$1' n'existe pas"; else prefix="$2"; file="$1"; awk -F '`' ' BEGIN {l=0;lastl=1; tb=""; prefix="'"$prefix"'"; file="'"$file"'"} {l=l+1} /DROP TABLE IF EXISTS/ { lasttb=tb; tb=$2; if (lasttb != "") { print "echo \"[`date '"'+%T'"'`] " lasttb " (" lastl "," l-1 ")\""; print "sed -ne '"'"'" lastl "," l-1 " p; " l " q;'"'"' < \"'"$file"'\" > " prefix lasttb ".sql"; } lastl=l; } END { print "echo \"[`date '"'+%T'"'`] " tb " (" lastl ",fin)\""; print "sed -ne '"'"'" lastl ",$ p;'"'"' < \"'"$file"'\" > " prefix tb ".sql"; } ' < $file; fi; }; Ça marche bien mais c'est assez lent. Même si c'est pas très grave ici (sur un desktop, et pas lancé très souvent) je me dis qu'il doit y avoir une façon de faire plus intelligente qui m'a échappée. Avec un fichier test.sql de 16Mo et 100 tables, j'ai $ time split_sqldump_ok test.sql prefix_ > todo real 0m2.182s (donc c'est pas awk qui patauge tant que ça) Ça donne du $head todo echo "[`date '+%T'`] access (22,50)" sed -ne '22,50 p; 51 q;' < "test.sql" > prefix_access.sql echo "[`date '+%T'`] accesslog (51,704)" sed -ne '51,704 p; 705 q;' < "test.sql" > prefix_accesslog.sql echo "[`date '+%T'`] actions (705,742)" sed -ne '705,742 p; 743 q;' < "test.sql" > prefix_actions.sql echo "[`date '+%T'`] actions_aid (743,766)" sed -ne '743,766 p; 767 q;' < "test.sql" > prefix_actions_aid.sql echo "[`date '+%T'`] adodb_logsql (767,798)" sed -ne '767,798 p; 799 q;' < "test.sql" > prefix_adodb_logsql.sql Jusque là tout va bien, mais à l'éxécution ça donne [02:53:20] access (22,50) [02:53:20] accesslog (51,704) [02:53:20] actions (705,742) [02:53:20] actions_aid (743,766) [02:53:20] adodb_logsql (767,798) ... [02:53:49] flood (2868,2896) [02:53:50] forum (2897,2924) [02:53:51] history (2925,2973) [02:53:52] languages (2974,3009) ... [02:55:00] vocabulary_node_types (32599,32640) [02:55:02] votingapi_cache (32641,32704) [02:55:04] votingapi_vote (32705,32764) [02:55:06] watchdog (32765,41897) Soit presque 3min pour parser partiellement (de moins en moins certes) test.sql 100 fois. J'ai essayé d'ajouter du sed -i '1,X d' test.sql après chaque "sed -e" mais c'est pire (pas très étonnant, ça réduit le fichier au fur et à mesure mais l'écriture est coûteuse). Avec l'ajout de if (l>5000) { print "sed -i '"'"'1," l-1 " d;'"'"' \"'"$file"'\"";l=1} ça efface le début du fichier dès que le point de départ dépasse la 5000e ligne, et on tombe à 45s. Avec 1000 à la place de 5000, j'arrive à 30s mais je trouve ça élevé. Y'a qqchose d'évident qui m'a échappé (vu l'heure c'est possible) ? Merci pour les suggestions. -- Daniel Vous ne croyez tout de même pas sérieusement que l'on ne peut inclure dans une théorie physique que des grandeurs observables. Albert Enstein.