====== Hints ======
* [[http://mysql-mmm.org/mmm2:guide]]
* Manipulation des variables
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)
* Purge des binlogs a la mano et proprement:
mysql> PURGE BINARY LOGS BEFORE '2012-03-12 22:32';
Query OK, 0 rows affected (0.00 sec)
====== Creation de compte Mysql ======
* Création de compte “propre” Mysql
FIXME à completer
mysql> GRANT ALL PRIVILEGES ON table2toto.* TO 'toto'@'localhost' IDENTIFIED BY 'goodsecret';
* Flush : necessaire si on attaque les bases en direct, merci a toi COB
FLUSH PRIVILEGES;
====== Perte d'un mot de passe =====
* [[http://www.authsecu.com/decrypter-dechiffrer-cracker-hash-md5/|Craquage de Md5]]
====== 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:
- Savoir si la base est "morte" ou non (depuis combien de temps on n'y a plus vu d'ecritures)
- Ne pas regenerer de nouvau fichier de dump pour le logiciel qui viendra faire le backup fichier
- 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
* Il attend en parametre la base de travaille, donc une facon drole de le lancer...
mysql -e "show databases\G" | grep "^Database" | sed -s "s/^Database: //g" | while read db; do ./DoDump $db; done
* Il est attendu que la conf du //~/.my.cnf// soit correctement parametre
#!/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
* https://www.lullabot.com/blog/article/mysql-backups-using-lvm-snapshots
* http://www.partage-it.com/backup-lvm/
* http://www.mysqlperformanceblog.com/2006/08/21/using-lvm-for-mysql-backup-and-replication-setup/
* http://dev.mysql.com/doc/refman/5.6/en/mysqlbinlog-backup.html
* http://blog.hbis.fr/2010/06/25/mysql-enable_read_only_mode/
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