MysqlTuner : Optimiser votre serveur MySQL

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search
MySQL Logo

1 Introduction

MySQL est très utilisé en entreprise mais peut être également très complexe quand on a des bases faisant une taille assez conséquente. De plus, il nous faut vérifier le cache, la taille mémoire occupée, voir si on peut pas optimiser à droite ou a gauche.

Bref cette petite documentation ne va pas traiter que de MysqlTuner, mais également de comment optimiser votre serveur MySQL.

2 Installation

Pour l'installation de MysqlTuner, c'est assez simple :

Command apt-get
apt-get install mysqltuner

3 Utilisation

Lancez simplement mysqltuner avec les bons droits de connexion à votre base de données :

Command mysqltuner
 >>  MySQLTuner 1.0.1 - Major Hayden <major@mhtx.net>
 >>  Bug reports, feature requests, and downloads at http://mysqltuner.com/
 >>  Run with '--help' for additional options and output filtering
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: 
 
-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.1.39-log
[OK] Operating on 64-bit architecture
 
-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster 
[--] Data in MyISAM tables: 2G (Tables: 35)
[--] Data in InnoDB tables: 7M (Tables: 41)
[!!] Total fragmented tables: 43
 
-------- Performance Metrics -------------------------------------------------
[--] Up for: 16h 38m 24s (5K q [0.089 qps], 22 conn, TX: 20M, RX: 3M)
[--] Reads / Writes: 65% / 35%
[--] Total buffers: 812.0M global + 1.2M per thread (151 max threads)
[OK] Maximum possible memory usage: 991.3M (1% of installed RAM)
[!!] Slow queries: 29% (1K/5K)
[OK] Highest usage of available connections: 1% (3/151)
[OK] Key buffer size / total MyISAM indexes: 128.0M/167.5M
[OK] Key buffer hit rate: 99.1% (59K cached / 557 reads)
[!!] Query cache efficiency: 0.1% (4 cached / 3K selects)
[OK] Query cache prunes per day: 0
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 6 sorts)
[OK] Temporary tables created on disk: 9% (8 on disk / 87 total)
[OK] Thread cache hit rate: 86% (3 created / 22 connections)
[!!] Table cache hit rate: 17% (64 open / 376 opened)
[OK] Open file limit used: 16% (121/755)
[OK] Table locks acquired immediately: 100% (4K immediate / 4K locks)
[!!] Connections aborted: 13%
[OK] InnoDB data size / buffer pool: 7.9M/512.0M
 
-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Increase table_cache gradually to avoid file descriptor limits
    Your applications are not closing MySQL connections properly
Variables to adjust:
    query_cache_limit (> 1M, or use smaller result sets)
    table_cache (> 64)

Nous voyons ici des recommandations.

4 Auditer et améliorer les performances

4.1 Vérification du global status

Command show global status
mysql> SHOW global STATUS;
| Binlog_cache_disk_use             | 0         |
| Binlog_cache_use                  | 16        |

  • Le cache disk use doit rester à 0 pour être performant (pas d'écriture directe sur disque, on passe d'abord par le cache)
  • Utilisation du cache Binlog_cache_use pour les logs binaires. C'est bien quand ce numéro n'est pas à 0.
Command show global status
| Created_tmp_disk_tables           | 8         |
| Created_tmp_files                 | 5         |
| Created_tmp_tables                | 54        |

  • Created_tmp_disk_tables : devrait être à 0 le plus souvent possible (sauf si on a des champs de type blob ou texte, on ne pourra pas faire grand chose).
  • Created_tmp_files : quand Created_tmp_disk_tables n'est pas suffisant et qu'il faut en plus aller créer d'autres fichiers sur le disque.
  • Created_tmp_tables : nombre de fois que des tables temporaires ont été crées.

Ici, je souhaiterais améliorer un peu ceci, bien que ce ne soit pas vraiment nécessaire vu le peu de disks table créées. Nous allons donc consulter la taille actuelle maximum autorisée :

Command show global variables like 'tmp_table_size';
mysql> SHOW global VARIABLES LIKE 'tmp_table_size';
+----------------+----------+
| Variable_name  | VALUE    |
+----------------+----------+
| tmp_table_size | 16777216 |
+----------------+----------+
1 ROW IN SET (0.00 sec)

La taille maximum d'une table temporaire en mémoire est donc de 16Mo. Pour le passer à 32 Mo à la volée :

Command set global tmp_table_size
mysql> SET global tmp_table_size=32*1024*1024;

Et ne pas oublier de le mettre dans le fichier de conf pour que ce soit permanent :

Configuration File /etc/mysql/mysql.cnf
...
tmp_table_size = 32M
...

Ensuite, pour que ca prenne également effet, il va falloir augmenter la taille de la max_heap_table_size. D'abord, regardons la taille actuelle :

Command set global tmp_table_size
mysql> SHOW global VARIABLES LIKE 'max_heap_table_size';
+---------------------+----------+
| Variable_name       | VALUE    |
+---------------------+----------+
| max_heap_table_size | 16777216 |
+---------------------+----------+
1 ROW IN SET (0.00 sec)

Et augmenter le max_heap_table_size à au moins la taille du tmp_table_size (allouer plus de mémoire en cas d'utilisation de tables du type memorytable). Pareil, pour augmenter cette taille à la volée :

Command set global max_heap_table_size
mysql> SET global max_heap_table_size=32*1024*1024;

Et pour finir et le rendre ceci permanent, on rajoute ceci dans la config :

Configuration File /etc/mysql/mysql.cnf
...
max_heap_table_size = 32M
...

4.2 Activer les slow_query

Pour monitorer les requêtes lentes, il faut activer les slow_query et mettre une valeur maximum avant que les requêtes soient loguées (ici 1 seconde). Pour le moment, nous allons voir si c'est activé ou non :

Command show global
mysql> SHOW global VARIABLES LIKE '%log%';
+---------------------------------+------------+
| Variable_name                   | VALUE      |
+---------------------------------+------------+
...
| log_slow_queries                | OFF        | 
...
+---------------------------------+------------+
26 ROWS IN SET (0.00 sec)

Nous voyons ici que c'est désactivé. A partir de la version 5.1 de MySQL, on peut les activer a chaud, voici la procédure à suivre :

Command set global
mysql> SET global slow_query_log=1;
Query OK, 0 ROWS affected (0.02 sec)
 
mysql> SET global long_query_time=1;
Query OK, 0 ROWS affected (0.00 sec)

Et ensuite rendre ceci persistant :

Configuration File /etc/mysql/my.cnf
...
slow_query_log=1
long_query_time=1
...

4.3 Statut générale

Command mysqladmin
> mysqladmin -uroot -p status
Enter password: 
Uptime: 57774  Threads: 3  Questions: 5029  Slow queries: 1411  Opens: 373  Flush tables: 1  Open tables: 63  Queries per second avg: 0.87

  • Questions : nombre de requêtes
  • Slow queries : requêtes lentes
  • Opens : ouvertures de fichers
  • Queries per second avg : requêtes par secondes (moyenne depuis le démarrage du serveur)

4.4 Gestion du cache

Command show global status like 'Qc%';
mysql> SHOW global STATUS LIKE 'Qc%';
+-------------------------+-----------+
| Variable_name           | VALUE     |
+-------------------------+-----------+
| Qcache_free_blocks      | 1         |
| Qcache_free_memory      | 134208784 |
| Qcache_hits             | 0         |
| Qcache_inserts          | 207       |
| Qcache_lowmem_prunes    | 0         |
| Qcache_not_cached       | 2825      |
| Qcache_queries_in_cache | 0         |
| Qcache_total_blocks     | 1         |
+-------------------------+-----------+
8 ROWS IN SET (0.00 sec)

  • Qcache_free_memory : Mémoire libre pour ajouter des requêtes dans le query cache (enregistrement de la requête + résultat (130 Mo ici)).
  • Qcache_hits : le nombre de fois que le cache a été atteint
  • Qcache_inserts : il faut que le Qcache_hits soit suppérieur au Qcache_inserts pour un bon fonctionnement du cache (ici vu qu'il n'y a pas beaucoup de traffic, ceci n'augmente pas).

Pour gagner en performances, on doit voir s'il est nécessaire de garder ou non le query cache. Donc si :

  • Qcache_hits < Qcache_inserts : on désactive le cache.
  • Qcache_not_cached < ( Qcache_hits + Qcache_inserts ) : On va essayer d'augmenter la taille du cache et la limite de la taille d'une requête en cache. Si Qcache_not_cached ne cesse d'augmenter, alors on désactive le cache.
  • Qcache_lowmem_prunes : si plus de place dans le cache, alors les anciennes requêtes seront remplacées par des nouvelles. Augmentez le cache si vous en avez trop de Qcache_lowmem_prunes.

4.4.1 Désactiver le Query cache

Pour désactiver le Query cache :

Command set global
 SET global query_cache_type = 0

Et comme d'habitude, pour le mettre en permanent, on va mettre ceci dans le fichier de conf :

Configuration File /etc/mysql/my.cnf
query_cache_type = 0

4.4.2 Changer la taille du Query cache

On va récupérer la taille actuelle du cache pour une requête et son résultat :

Command show global
mysql> SHOW global VARIABLES LIKE 'query%';
+------------------------------+----------+
| Variable_name                | VALUE    |
+------------------------------+----------+
| query_alloc_block_size       | 8192     | 
| query_cache_limit            | 1048576  | 
| query_cache_min_res_unit     | 4096     | 
| query_cache_size             | 16777216 | 
| query_cache_type             | ON       | 
| query_cache_wlock_invalidate | OFF      | 
| query_prealloc_size          | 8192     | 
+------------------------------+----------+
7 ROWS IN SET (0.00 sec)

Ici, la taille maximum pour une requête du cache est de 1 Mo, on peut l'augmenter à 2Mo :

Command set global
 SET global query_cache_limit=2*1024*1024;

On change également la taille complète du cache. Exemple, on le passe à 32 Mo :

Command set global
 SET global query_cache_size = 32*1024*1024;

Et pour finir, on va tout écrire dans la conf :

Configuration File /etc/mysql/my.cnf
 query_cache_limit = 2M
 query_cache_size = 32M

4.5 Auditer la performance d'une requête

On va déjà prendre une requête qui passe et qui est intéressante :

Pour voir le temps d'exécution d'une requête :

Command
mysql> SET profiling =1;
mysql> SELECT  * FROM ma_table;                                                                                                          
+---+-------------------------------------------+
| a | b                                         |
+---+-------------------------------------------+
| 1 | *0F105C1BB64CDADBA3E0AB29141550D4EDBDADCD |
| 2 | *B552D2C3751A26A345932AA1196C0D04BC9DC909 |
| 3 | *6F23566A5409E9809512C079C8D4EC7EF82AB8A1 |
| 4 | *65109C8FC01571CB9897AD479FF605F73DCD4752 |
| 5 | *7B9EBEED26AA52ED10C0F549FA863F13C39E0209 |
+---+-------------------------------------------+
5 ROWS IN SET (0.00 sec)

Lorsque le query cache est utilisé (tres bon :)

Command
mysql> SHOW profile;                                                                                                                                                                      
+--------------------------------+----------+
| STATUS                         | Duration |
+--------------------------------+----------+
| starting                       | 0.000035 |
| checking query cache FOR query | 0.000008 |
| checking privileges ON cached  | 0.000006 |
| sending cached RESULT TO clien | 0.000028 |
| logging slow query             | 0.000003 |
| cleaning up                    | 0.000003 |
+--------------------------------+----------+
6 ROWS IN SET (0.01 sec)

Lorsqu'il n'est pas utilisé :

Command
mysql> SHOW profile;               
+--------------------+----------+
| STATUS             | Duration |
+--------------------+----------+
| starting           | 0.000084 |
| Opening TABLES     | 0.000015 |
| System LOCK        | 0.000006 |
| TABLE LOCK         | 0.000010 |
| init               | 0.000019 |
| optimizing         | 0.000006 |
| statistics         | 0.000015 |
| preparing          | 0.000010 |
| executing          | 0.000004 |
| Sending DATA       | 0.000067 |
| END                | 0.000005 |
| query END          | 0.000003 |
| freeing items      | 0.000026 |
| logging slow query | 0.000003 |
| cleaning up        | 0.000003 |
+--------------------+----------+
15 ROWS IN SET (0.00 sec)

Différence de temps d'execution :

Command
mysql> SHOW profiles;
+----------+------------+---------------------------------------------------+
| Query_ID | Duration   | Query                                             |
+----------+------------+---------------------------------------------------+
(...)
|       27 | 0.00008200 | SELECT  * FROM query_cache                        |
|       28 | 0.00027475 | SELECT SQL_NO_CACHE * FROM query_cache            |
+----------+------------+---------------------------------------------------+

Pour voir le nombre de fois que les requetes ont du attendre qu'une autre se termine avant de s'exécuter :

Command
mysql> SHOW global STATUS LIKE 'Table%';
+-----------------------+-------+
| Variable_name         | VALUE |
+-----------------------+-------+
| Table_locks_immediate | 4549  |
| Table_locks_waited    | 0     |
+-----------------------+-------+
2 ROWS IN SET (0.00 sec)

Ici Table_locks_waited est à 0, c'est parfait. Ce nombre augmente généralement lorsque l'on a une forte charge et que l'on utilises pas la bon moteur associé (typiquement utilisation de MyISAm à la place d'InnoDB)

4.6 Améliorer le moteur selon l'utilisation

Nous allons déjà regarder ce que nous possédons :

Command select
mysql> SELECT TABLE_SCHEMA,ENGINE,SUM(TABLE_ROWS),ENGINE,SUM(DATA_LENGTH),SUM(INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES GROUP BY ENGINE,TABLE_SCHEMA ORDER BY TABLE_SCHEMA;
+--------------------+--------+-----------------+--------+------------------+-------------------+
| TABLE_SCHEMA       | ENGINE | SUM(TABLE_ROWS) | ENGINE | SUM(DATA_LENGTH) | SUM(INDEX_LENGTH) |
+--------------------+--------+-----------------+--------+------------------+-------------------+
| information_schema | MEMORY |            NULL | MEMORY |                0 |                 0 | 
| information_schema | MyISAM |            NULL | MyISAM |                0 |              4096 | 
| jahia              | InnoDB |              10 | InnoDB |           311296 |             98304 | 
| jahia              | MyISAM |            4268 | MyISAM |           661004 |            661504 | 
| jira               | MyISAM |         1726671 | MyISAM |        167178929 |          73067520 | 
| mysql              | MyISAM |            1774 | MyISAM |           465108 |             68608 | 
| sugarcrm           | MyISAM |               4 | MyISAM |              719 |              7168 | 
| sugarcrm           | InnoDB |          351405 | InnoDB |         89718784 |         131317760 | 
+--------------------+--------+-----------------+--------+------------------+-------------------+
8 ROWS IN SET (2.60 sec)

Nous voyons ici principalement des tables en MyISA et InnoDB.

Pour vérifier la taille du cache des index pour MyISAM :

Command show
mysql> SHOW global STATUS LIKE 'KEY%';
+------------------------+---------+
| Variable_name          | VALUE   |
+------------------------+---------+
| Key_blocks_not_flushed | 0       | 
| Key_blocks_unused      | 14497   | 
| Key_blocks_used        | 12268   | 
| Key_read_requests      | 2413795 | 
| Key_reads              | 67366   | 
| Key_write_requests     | 106173  | 
| Key_writes             | 104947  | 
+------------------------+---------+
7 ROWS IN SET (0.00 sec)

Il reste de la place (en Ko) pour Key_blocks_unused correspondant à l'espace inutilisé.

Pour vérifier la taille du cache des index pour InnoDB :

Command select
mysql> SHOW engine innodb STATUS\G;
...
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 18804332; IN additional pool allocated 1048576
Buffer pool SIZE   512
Free buffers       0
DATABASE pages     511
Modified db pages  33
Pending reads 0
Pending writes: LRU 0, FLUSH list 0, single page 0
Pages READ 41821, created 371, written 102582
0.18 reads/s, 0.00 creates/s, 0.00 writes/s
Buffer pool hit rate 1000 / 1000
...

Ici le buffer est à (512*16) 8Mo et il n'y a plus de place libre (Free buffers). Donc pour remédier au problème, il va falloir augmenter le buffer pool. Rappel :

Command select
mysql> SELECT TABLE_SCHEMA,ENGINE,SUM(TABLE_ROWS),ENGINE,SUM(DATA_LENGTH),SUM(INDEX_LENGTH) FROM INFORMATION_SCHEMA.TABLES GROUP BY ENGINE,TABLE_SCHEMA ORDER BY TABLE_SCHEMA;
+--------------------+--------+-----------------+--------+------------------+-------------------+
| TABLE_SCHEMA       | ENGINE | SUM(TABLE_ROWS) | ENGINE | SUM(DATA_LENGTH) | SUM(INDEX_LENGTH) |
+--------------------+--------+-----------------+--------+------------------+-------------------+
...
| sugarcrm           | InnoDB |          351405 | InnoDB |         89718784 |         131317760 | 
...

  • SUM(DATA_LENGTH) : Taille des données sans les index
  • SUM(INDEX_LENGTH) : Taille des index sans les données

Soit : ( 89718784 + 131317760 ) =~ 100Mo
Donc nous allons passer le buffer du pool à 128Mo (prévoir plus que nécessaire) :

Configuration File /etc/mysql/my.cnf
 ...
 innodb_buffer_pool_size = 128M
 ..

On en profite pour changer les paramétrer par défaut avec les bonnes pratiques. Attention au changement de la taille des logs, il va falloir faire quelques modifications avant de redémarrer. Modifiez votre configuration MySQL comme ceci :

Configuration File /etc/mysql/my.cnf
...
default-storage-engine = innodb
innodb_buffer_pool_size = 128M
innodb_data_file_path=ibdata1:10M:autoextend
innodb_additional_mem_pool_size = 20M
innodb_file_per_table
# Warning : changing this needs stop of mysql, removal (backup of ib_log* files), and mysql startup
innodb_log_file_size = 256M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
...

Ensuite, la marche à suivre doit ressembler à ceci :

  • Faites un backup des fichiers 'ib_log*'
  • Arrêtez le serveur MySQL
  • Supprimez les fichiers 'ib_logs*'
  • Relancer le serveur

Note : sur Debian, il se peut que vous tapiez le timeout du service, mais peut importe il va quand même se lancer (un petit pgrep -f mysql permettra de voir ou il en est, ainsi que les logs)

4.7 Vérifier les fichiers ouverts

Il peut être important de voir les tables qui ne peuvent pas être cachées (et donc des fichiers sur le disque) :

Command show global
mysql> SHOW global STATUS LIKE 'Open%';
+---------------+-------+
| Variable_name | VALUE |
+---------------+-------+
| Open_files    | 130   | 
| Open_streams  | 0     | 
| Open_tables   | 64    | 
| Opened_tables | 14581 | 
+---------------+-------+
4 ROWS IN SET (0.00 sec)

Ici on voit que j'ai quelques tables ouvertes et un paquet de tables qui ont été ouverte.

Pour remédier à ce problème, on va changer la taille du cache des tables qui est actuellement à 64Mo :

Command show global
mysql> SHOW global VARIABLES LIKE 'table%';
+-------------------------+--------+
| Variable_name           | VALUE  |
+-------------------------+--------+
| table_cache             | 64     | 
| table_lock_wait_timeout | 50     | 
| table_type              | MyISAM | 
+-------------------------+--------+
3 ROWS IN SET (0.00 sec)

Et on va le passer à 128 Mo. Parcontre, nous n'allons pas le faire à la volée (effets de bords quasi garanti) et il n'est pas du tout recommandé de dépasser 4Go (ici on a de quoi voir venir).

Nous allons donc modifier la configuration :

Configuration File /etc/mysql/my.cnf
 ...
 table_cache = 128M
 ...

4.8 Reseter les statistiques

To reset global status, you need to launch this command :

Command
flush status;

Now you can see it :

Command
show global status;

If you restart your mysql server, it does the same thing.

4.9 Augmenter les performances pour les accès fichiers temporaires

L'idée est de faire pointer les fichiers temporaires sur un filesystem en RAM pour y stocker les fichiers temporaires. Ca va augmenter sensiblement les performances. Tout d'abord, construisez votre filesystem temporaire :

Ensuite, vous devez modifier dans votre fichier de configuration de MySQL, la variable tmpdir et la faire pointer sur votre nouvel espace temporaire :

Configuration File /etc/my.cnf
...
# The MySQL server
[mysqld]
tmpdir = /mnt/mysql_tmpfs...

Relancez MySQL et vérifiez que le nouveau paramètre est bien pris en compte :

Command show
mysql> show variables like 'tmpdir';
+---------------+------------------+
| Variable_name | Value            |
+---------------+------------------+
| tmpdir        | /mnt/mysql_tmpfs |+---------------+------------------+
1 row in set (0.00 sec)

Et voilà, maintenant...ça trace :-)

4.10 Analysez les colonnes

Il est important de pouvoir savoir ce qu'il est possible d'optimiser sur sa structure de table pour toutes les tables de la base de données. Pour cela, il existe une commande permettant de faire l'analyse d'une base de données et de donner des indications d'optimisation par colonne :

Command
SELECT * FROM my_table PROCEDURE ANALYSE();

Vous pouvez ensuite comparer avec la structure actuelle de la table :

Command
DESCRIBE my_table;

5 Optimisation des tables

J'ai créer un petit script perl qui permet d'automatiser l'optimisation de bases de données. Pour l'utiliser, rien de plus simple, il suffit d'utiliser un utilisateur qui a les droits select et insert sur toutes les bases de données. Vous pouvez également exclure certaines bases de données. Si vous souhaitez être sur d'avoir la dernière version de ce script, je vous laisse le soin d'aller sur mon git. Je vous laisse le soin de regarder le début du code :

Configuration File optimizer.pl
#!/usr/bin/perl 
#===============================================================================
#
#         FILE:  optimizer.pl
#
#        USAGE:  ./optimizer.pl  
#
#  DESCRIPTION:  MySQL Automatic Tables Optimizer
#
#      OPTIONS:  ---
# REQUIREMENTS:  ---
#         BUGS:  ---
#        NOTES:  ---
#       AUTHOR:  Pierre Mavro (), pierre@mavro.fr
#      COMPANY:  
#      VERSION:  0.1
#      CREATED:  08/04/2010 17:50:23
#     REVISION:  ---
#===============================================================================
 
use strict;
use warnings;
use DBI;
 
# MySQL configuration
# This user should have insert and select rights
my $host = 'localhost';
my $database = 'mysql';
my $user = 'optimizer';
my $pw = 'optimizer';
my @exclude_databases = qw/information_schema database1 database2/;
 
########## DO NOT TOUCH NOW ##########
 
# Vars
my (@all_databases,@all_tables);
my ($aref, $cur_database, $cur_table);
 
# Connect to the BDD
my $dbdetails = "DBI:mysql:$database;host=$host";
my $dbh = DBI->connect($dbdetails, $user, $pw) or die "Could not connect to database: $DBI::errstr\n";
 
# Get all databases
my $sth=$dbh->prepare(q{SHOW DATABASES}) or die "Unable to prepare show databases: ". $dbh->errstr."\n";
$sth->execute or die "Unable to exec show databases: ". $dbh->errstr."\n";
while ($aref = $sth->fetchrow_arrayref)
{
    push(@all_databases,$aref->[0]);
} 
$sth->finish;
# Disconnect the BDD
$dbh->disconnect();
 
# Optimize all tables of all databases
my $unwanted_found=0;
foreach $cur_database (@all_databases)
{
    # Exclude optimization on unwanted databases
    foreach (@exclude_databases)
    {
        if ($cur_database eq $_)
        {
            $unwanted_found=1;
            last;
        }
    }
    if ($unwanted_found == 1)
    {
        $unwanted_found=0;
        next;
    }
    # Connect on database
    my $dbdetails = "DBI:mysql:$cur_database;host=$host";
    my $dbh = DBI->connect($dbdetails, $user, $pw) or die "Could not connect to database: $DBI::errstr\n";
    # Get the List of tables
    @all_tables = $dbh->tables;
    # Optimize all tables
    foreach $cur_table (@all_tables)
    {
        $dbh->do("optimize table $cur_table");
    }
    $dbh->disconnect();
}

6 Patch mysqltuner

Voici un petit patch que j'ai écrit permettant de régler un bug lorsque l'on essaye de se connecter sur un port différent que celui par défaut :

Configuration File mysqltuner.pl
*** mysqltuner.pl.old   mar. avr  10 09:26:01 2012
--- mysqltuner.pl       mar. avr  10 09:28:14 2012
***************
*** 274,280 ****
        }
        # Did we already get a username and password passed on the command line?
        if ($opt{user} ne 0 and $opt{pass} ne 0) {
!               $mysqllogin = "-u $opt{user} -p'$opt{pass}'".$remotestring;
                my $loginstatus = `mysqladmin ping $mysqllogin 2>&1`;
                if ($loginstatus =~ /mysqld is alive/) {
                        goodprint "Logged in using credentials passed on the command line\n";
--- 274,280 ----
        }
        # Did we already get a username and password passed on the command line?
        if ($opt{user} ne 0 and $opt{pass} ne 0) {
!               $mysqllogin = "-u $opt{user} -p'$opt{pass}' -P $opt{port}".$remotestring;
                my $loginstatus = `mysqladmin ping $mysqllogin 2>&1`;
                if ($loginstatus =~ /mysqld is alive/) {
                        goodprint "Logged in using credentials passed on the command line\n";

Je l'ai soumit, mais vu qu'il n'y a plus de mainteneur...

7 Ressources

http://dev.mysql.com/doc/refman/5.0/en/temporary-files.html