Comment utiliser Logminer avec mysql ?

Logminer avec mysql serveur.

Dans l’environnement Oracle, Logminer peut-être utiliser pour :
–    Auditer les transactions
–    Aide au Tuning
–    Trouver des corruptions logiques
–    Planifier un recouvrement jusqu’à la dernière transaction
–    Diagnostiquer les deadlocks
La note principale de MOS est : Master Note for LogMiner (Doc ID 1264738.1).
Petit rappel de fonctionnement très simplifié de logminer pour une base de données Oracle :
–    On créé un dictionnaire de données  EXECUTE DBMS_LOGMNR_D.BUILD
–    On ajoute des fichiers de redolog à analyser EXECUTE DBMS_LOGMNR.ADD_LOGFILE
–    On démarre l’extraction des données EXECUTE DBMS_LOGMNR.START_LOGMNR
–    On interroge la table V$LOGMNR_CONTENTS pour connaitre le résultat
–    On arrête logminer EXECUTE DBMS_LOGMNR.STOP_LOGMNR
Comment réalise-t-on ces opérations sur Mysql ?
La technologie est beaucoup plus simpliste, on prend sa pioche, son casque et on va se transformer en mineur :

Aller tout le monde au fond la mine …

Logminer pour mysql :
Petit rappel, tout comme Oracle Mysql utilise des journaux de transaction. Dans le monde oracle ces journaux sont généralement suffixé *.log.
Dans le monde mysql ces fichiers sont suffixés *.bin.
Il suffit d’utiliser le binaire mysqlbinlog pour interroger ces fichiers :

Voici un exemple très concret :

1.    Connexion à la base de données
MariaDB [(none)]> use easy2
Reading table information for completion of table and column names
Database changed
2.    Creation de données
MariaDB [easy2]>  select * from T1;
+———-+——-+————–+——–+———+——————+
| id       | type  | date         | color  | working | location         |
+———-+——-+————–+——–+———+——————+
|        1 | PART  | 2014-12-31   | jaune  |       1 | Marseille        |
|        2 | PART  | 2014-12-31   | noir   |       2 | Marseille        |
|        4 | PART  | 2014-12-31   | blanc  |       3 | Marseille        |
|        5 | PART  | 2014-12-31   | jaune  |       2 | Bordeaux         |
|        6 | PART  | 2014-12-31   | jaune  |       2 | Bordeaux         |
+———-+——-+————–+——–+———+——————+
5 rows in set (0.01 sec)
[root@easy databases]# date
Wed Oct  8 14:46:17 CEST 2014
MariaDB [easy2]> insert into T1 values (7,’PART’,’2014-12-30′,’jaune’,2,’Bordeaux’);
Query OK, 1 row affected (0.04 sec)
MariaDB [easy2]> select * from T1;
+———-+——-+————–+——–+———+——————+
| id       | type  | date         | color  | working | location         |
+———-+——-+————–+——–+———+——————+
|        1 | PART  | 2014-12-31   | jaune  |       1 | Marseille        |
|        2 | PART  | 2014-12-31   | noir   |       2 | Marseille        |
|        4 | PART  | 2014-12-31   | blanc  |       3 | Marseille        |
|        5 | PART  | 2014-12-31   | jaune  |       2 | Bordeaux         |
|        6 | PART  | 2014-12-31   | jaune  |       2 | Bordeaux         |
|        7 | PART  | 2014-12-30   | jaune  |       2 | Bordeaux         |
+———-+——-+————–+——–+———+——————+
6 rows in set (0.00 sec)
MariaDB [easy2]>
[root@easy databases]# date
Wed Dec  30 14:49:41 CEST 2014
[root@easy databases]#
MariaDB [easy2]> insert into T1 values (8,’PART’,’2014-10-08′,’green’,5,’Bordeaux’);
Query OK, 1 row affected (0.03 sec)
MariaDB [easy2]> select * from T1;
+———-+——-+————–+——–+———+——————+
|  id      | type  | date         | color  | working | location         |
+———-+——-+————–+——–+———+——————+
|        1 | PART  | 2014-12-31   | jaune  |       1 | Marseille        |
|        2 | PART  | 2014-12-31   | noir   |       2 | Marseille        |
|        4 | PART  | 2014-12-31   | blanc  |       3 | Marseille        |
|        5 | PART  | 2014-12-31   | jaune  |       2 | Bordeaux         |
|        6 | PART  | 2014-12-31   | jaune  |       2 | Bordeaux         |
|        7 | PART  | 2014-12-30   | jaune  |       2 | Bordeaux         |
|        8 | PART  | 2014-12-30   | green  |       5 | Bordeaux         |
+———-+——-+————–+——–+———+——————+
7 rows in set (0.01 sec)
MariaDB [easy2]> SHOW BINARY LOGS;
+——————-+———–+
| Log_name          | File_size |
+——————-+———–+
| linux-bin.000001 |       2753 |
| linux-bin.000002 |       3503 |
| linux-bin.000003 |       2245 |
| linux-bin.000004 |       9245 |
| linux-bin.000005 |       4689 |
| linux-bin.000006 |       8683 |
+——————-+———–+
3.    Minage :
L’utilitaire mysqlbinlog permet de lire les fichiers binaires (redolog pour les oracliens).
[root@easy ~]# mysqlbinlog –start-datetime= »2014-12-30 T100:00″ –stop-datetime= »2014-12-30 T130:00″ /app/mariadb/databases/linux-bin.000006 –base64-output=decode-rows –verbose > mining.txt
[root@easy ~]# vi mining.txt
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#141008 14:39:53 server id 1  end_log_pos 245   Start: binlog v 4, server v 5.5.38-MariaDB-wsrep-log created 141008 14:39:53 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
# at 245
#141008 14:46:21 server id 1  end_log_pos 319   Query   thread_id=4     exec_time=0     error_code=0
SET TIMESTAMP=1412993981/*!*/;
SET @@session.pseudo_thread_id=4/*!*/;
SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
SET @@session.sql_mode=0/*!*/;
SET @@session.auto_increment_increment=2, @@session.auto_increment_offset=1/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
SET @@session.lc_time_names=0/*!*/;
SET @@session.collation_database=DEFAULT/*!*/;
BEGIN
/*!*/;
# at 319
# at 379
#141008 14:46:21 server id 1  end_log_pos 379   Table_map: `easy2`.`T1` mapped to number 33
#141008 14:46:21 server id 1  end_log_pos 440   Write_rows: table id 33 flags: STMT_END_F
### INSERT INTO `easy2`.`T1`
### SET
###   @1=7
###   @2=’PART’
###   @3=’20T110:08′
###   @4=’jaune’
###   @5=2
###   @6=’Bordeaux’
# at 440
#141008 14:46:21 server id 1  end_log_pos 467   Xid = 3
COMMIT/*!*/;
# at 467
#141008 14:49:42 server id 1  end_log_pos 541   Query   thread_id=4     exec_time=0     error_code=0
SET TIMESTAMP=1412994182/*!*/;
BEGIN
/*!*/;
# at 541
# at 601
#141008 14:49:42 server id 1  end_log_pos 601   Table_map: `easy2`.`T1` mapped to number 33
#141008 14:49:42 server id 1  end_log_pos 661   Write_rows: table id 33 flags: STMT_END_F
### INSERT INTO `easy2`.`T1`
### SET
###   @1=8
###   @2=’PART’
###   @3=’20T110:08′
###   @4=’green’
###   @5=5
###   @6=’Bordeaux’
# at 661
#141008 14:49:42 server id 1  end_log_pos 688   Xid = 4
COMMIT/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
———————————
COMMIT/*!*/;
# at 467
#141008 14:49:42 server id 1  end_log_pos 541   Query   thread_id=4     exec_time=0     error_code=0
SET TIMESTAMP=1412794182/*!*/;
———————————
4.    Retrouver ses transactions :
Dans le fichier texte, nous pouvons retrouver les transactions.
Cette capacité va nous permettre de retrouver toutes les transactions effectuées dans la base, donc d’auditer les transactions mais aussi de pouvoir procéder à une restauration a un point donné dans le temps ou jusqu’à une autre transaction.
Mais cela fera l’objet d’un prochain article.

réf : l’utilitaire mysqlbinlog et ses options : http://dev.mysql.com/doc/refman/5.0/en/mysqlbinlog.html

Huet Bruno.