Outils pour utilisateurs

Outils du site


linux:scripts_awk:split_mysqlbinlog

Un script pour découper un binlog par base (utile quand on veut les requetes sur une seule base entre tel et tel moment)

#!/bin/bash
 
# prévu pour avoir un n° de log binaire (6 chiffres) ou un fichier sql issu d’un binlog en param
 
LOGDIR=/var/log/mysql
LOGPREFIX=mysql-bin.
DUMP="$LOGPREFIX$1".sql
 
[ ! -f $1 ] && [ ! -f $LOGDIR/$LOGPREFIX$1 ] && echo "Il faut donner un fichier ou le n° du log à 6 chiffres en param, $LOGDIR/$LOGPREFIX$1 n’existe pas" && exit 1
 
# Pour éviter tout pb d’encodage
alias awk='env LANGUAGE=C LANG=C LC_ALL=C LC_NUMERIC=C awk'
 
if [ -f $1 ]
then
  commande="cat $1" # tant pis pour le UUOC
else
  commande="mysqlbinlog $LOGDIR/$LOGPREFIX$1"
fi
 
$commande | awk '
  BEGIN {
    l=0;
    head="";
    suf="'$1'" ".sql";
    out="/dev/null" # pour les lignes avant 1er init
  }
  {l+=1} 
  l==3 {delim = substr($0, 11, length($0)-11); } # DELIMITER
  l<4 { head = head $0 "\n"} # format du dump
  /^use / {
    db = substr($2, 1, length($2)-length(delim)-1)
    out = db suf
    print "requetes pour " db " dans " out
    if (db in logs) ; else {
      # init du dump
      logs[db] = 1
      print head > out
    }
  }
  l>3 {
    print $0 >> out
  }
  END {
    for (db in logs) {
      out = db suf; print $0 >> out; 
      # close(out); # plus très utile...
    }
  }
'
linux/scripts_awk/split_mysqlbinlog.txt · Dernière modification: 26/10/2010 18:05 par daniel