Table des matières

Hints

Afin d'eviter de redemarrer le MySQL voici ce que l'on peut faire (apres avoir modifier les fichiers de configurations)

mysql> SET GLOBAL expire_logs_days=2;
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW GLOBAL VARIABLES LIKE "%EXPIRE%";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 2     |
+------------------+-------+
1 row in set (0.00 sec)

mysql> PURGE BINARY LOGS BEFORE '2012-03-12 22:32';
Query OK, 0 rows affected (0.00 sec)

Creation de compte Mysql

FIXME à completer

mysql> GRANT ALL PRIVILEGES ON table2toto.* TO 'toto'@'localhost' IDENTIFIED BY 'goodsecret';

FLUSH PRIVILEGES;

Perte d'un mot de passe

Dumpage a la sauvage d'un MySQL

#!/bin/bash
 
REP=/var/log/mysql-dump
IPPROD=192.168.251.210/32
 
#### ATTENTION LES LOGROTATE PLANTERONT SI ON NE FAIT PAS CA LORS DE L'INSTALL
# mkdir -p /var/log/mysql-dump
# touch /var/log/mysql-dump/null.sql.gz
 
# on considere que les info des cnx sont correctement renseignes ds ~/.my.cnf
 
# On est bourrin : on fait un dump global puis des dump moins globaux
# et en sus, on compress a la volée
 
# On est faineant : on consigne la rotation de ces dump a logrorate
 
# Et pour finir (ou plutot commencer) : on ne dump pas si on a l'ip de prod mysql
ip addr ls | grep -q $IPPROD
if [ $? == 0 ]; then
                echo Dump non fait : nous avons l IP de prod aka $IPPROD
                exit 2
        fi
echo Lancement du DUMP
mkdir -p $REP
 
echo Traitement global
time mysqldump --master-data --all-databases | gzip -c -9 > $REP/_bigdump.sql.gz
 
echo Traitement unitaire
mysql -e "show databases\G" | grep "^Database: " | cut -f2 -d" " | while read db
do
        echo === $db
        time mysqldump --master-data --databases $db | gzip -c -9 > $REP/$db.sql.gz
        done

/var/log/mysql-dump/*sql.gz {
        daily
        rotate 7
        missingok
        create 640 mysql adm
        sharedscripts
        postrotate
              /opt/mysql/bkp-mysql-adlp
        endscript
}

Dump differentiel

L'idee est de savoir si un Dump est un nouveau dump ou non…. les avantages:

  1. Savoir si la base est “morte” ou non (depuis combien de temps on n'y a plus vu d'ecritures)
  2. Ne pas regenerer de nouvau fichier de dump pour le logiciel qui viendra faire le backup fichier
  3. Signaler si le dump n'a pas abouti

Attention, ce code est a adapter au besoin, ici c'est un POC, codé une nuit d'Ô rage

mysql -e "show databases\G" | grep "^Database" | sed -s "s/^Database: //g" | while read db; do ./DoDump $db; done

#!/usr/bin/perl
# License
#   GPLv2 (http://www.gnu.org/licenses/gpl-2.0.txt)
# Authors
#   DELAPORTE Antoine
# Versions
#   1.0 adlp : poc, it's work just fine ;)
 
 
use strict;
use warnings;
use Digest::MD5;
 
 
my $db=$ARGV[0];
 
sub md5dump {
    my ($in,$out)=@_;
 
    my $md5 = Digest::MD5->new;
    my $eod = 0;
    my $ll  = "";
 
    while(<$in>) {
        if(/^-- Dump completed on /) {
            # -- Dump completed on 2013-10-02 23:02:52
            chomp($ll=$_);
            $ll=~s/^-- Dump completed on //g;
            $ll=~tr/ :-/-/s;
            $eod=1;
            }
        elsif(!/^CHANGE MASTER TO /) {
            $md5->add($_);
            }
        if(defined($out)) { print $out $_;}
        }
    if($eod) { $eod=$md5->clone->hexdigest; }
    return(($eod,$ll));
    }
 
 
 
my ($omd,$date)=(0,undef);
my ($omd,$date)=(0,undef);
 
if(open(PD,"zcat $db.sql |")) {
    ($omd,$date)=md5dump(\*PD,undef);
    close(PD);
    }
 
open(CD,"mysqldump --master-data --database $db |") or die "Impossible d'ouvrir la db $db";
open(ND,"| gzip -9 -c >$db.sql.new") or die "Impossible d'ouvirir le fichier de sortie";
my ($cmd,$null)=md5dump(\*CD,\*ND);
close(CD);
close(ND);
 
# conserve bakup si dump courant pas null, et md5 different
# on ne s'appuie pas sur la notion de l'evolution du binlog car entre 2 bkp cette db n'a pas changé
 
if($cmd and $omd ne $cmd) {
    print "Dump necessaires et differents $db\n";
    if($omd) { rename("$db.sql.gz","$db.sql.gz-$date"); }
    rename("$db.sql.new","$db.sql.gz");
    }
else {
    unlink("$db.sql.new");
    }

Purge des Fichiers BinLog

Cf https://dev.mysql.com/doc/refman/5.0/en/purge-binary-logs.html

PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';

Variable Globales

Show

mysql> show global variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 10    |
+------------------+-------+
1 row in set (0.00 sec)

Set

mysql> set global expire_logs_days=2;
Query OK, 0 rows affected (0.03 sec)


Fast backups

Attention, dangereux

mysql> set GLOBAL read_only=true;
mysql> exit;
wurzel:~> [...]
wurzel:~> mysql
mysql> set GLOBAL read_only=false;
[...]
mysql> FLUSH TABLES WITH READ LOCK;
mysql> [...]
mysql> UNLOCK TABLES