<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dbnewz &#187; MySQL</title>
	<atom:link href="http://www.dbnewz.com/category/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.dbnewz.com</link>
	<description>le blog français sur les SGBD - MySQL, Oracle et plus...</description>
	<lastBuildDate>Wed, 28 Jul 2010 14:01:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Outils d’analyse de requêtes lentes – mysqlsla</title>
		<link>http://www.dbnewz.com/2010/07/28/outils-d%e2%80%99analyse-de-requetes-lentes-%e2%80%93-mysqlsla/</link>
		<comments>http://www.dbnewz.com/2010/07/28/outils-d%e2%80%99analyse-de-requetes-lentes-%e2%80%93-mysqlsla/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 14:01:15 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[outils]]></category>
		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=622</guid>
		<description><![CDATA[Pour ce second volet de notre série consacrée aux outils d&#8217;analyse de requêtes lentes, nous allons nous pencher aujourd&#8217;hui sur mysqlsla, qui est un script Perl disposant de nombreuses options d&#8217;agrégation et de filtrage.
Commençons par l&#8217;installation du script. Rien de plus simple, il vous suffit pour commencer de télécharger et de décompresser une archive de [...]]]></description>
			<content:encoded><![CDATA[<p>Pour ce second volet de notre série consacrée aux outils d&#8217;analyse de requêtes lentes, nous allons nous pencher aujourd&#8217;hui sur <code>mysqlsla</code>, qui est un script Perl disposant de nombreuses options d&#8217;agrégation et de filtrage.<span id="more-622"></span></p>
<p>Commençons par l&#8217;installation du script. Rien de plus simple, il vous suffit pour commencer de télécharger et de décompresser une archive de l&#8217;outil, disponible <a href="http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz">ici</a>. Ensuite, des classiques<br />
<code><br />
$ perl Makefile.PL<br />
$ make<br />
# make install<br />
</code><br />
vous permettent d&#8217;installer le script. Notez, point agréable, qu&#8217;une page de <code>man</code> est intégrée. Si vous cherchez la syntaxe d&#8217;une option, un <code>man mysqlsla</code> vous dispensera donc bien souvent d&#8217;aller faire un tour sur le site du projet.</p>
<p><code>mysqlsla</code> est plus généraliste que <code>mysqldumpslow</code> dans le sens où il est capable de traiter tout type de journal (requêtes lentes, mais aussi journal binaire ou journal général, ou encore journal défini par l&#8217;utilisateur). Les principes que nous allons voir dans cet article pour les requêtes lentes sont aussi valables pour les autres types de journaux.</p>
<p>L&#8217;idée de base de <code>mysqlsla</code> est de pouvoir analyser des fichiers journaux en leur appliquant éventuellement des filtres afin de ne garder que certains événements et d&#8217;émettre un rapport personnalisable présentant les résultats de cette analyse. Dans cet article nous allons seulement regarder les capacités de filtrage de <code>mysqlsla</code> et pas la manière de produire un rapport personnalisé, puisque le rapport par défaut nous convient très bien.</p>
<p>Pour un premier essai, lançons <code>mysqlsla</code> sans paramètre particulier à part l&#8217;option <code>lt</code> (comme log type) qui indique au script que le fichier passé est un journal de requêtes lentes. Cette option n&#8217;est en réalité pas indispensable car <code>mysqlsla</code> sait détecter automatiquement le type de journal :<br />
<code><br />
$ mysqlsla -lt slow msandbox-slow.log<br />
Report for slow logs: msandbox-slow.log<br />
4 queries total, 2 unique<br />
Sorted by 't_sum'<br />
Grand Totals: Time 1 s, Lock 0 s, Rows sent 1.80k, Rows Examined 64.18k<br />
</code><code><br />
________________________________________________ 001 ___<br />
Count         : 1  (25.00%)<br />
Time          : 718.344 ms total, 718.344 ms avg, 718.344 ms to 718.344 ms max  (79.40%)<br />
Lock Time (s) : 259 s total, 259 s avg, 259 s to 259 s max  (52.11%)<br />
Rows sent     : 0 avg, 0 to 0 max  (0.00%)<br />
Rows examined : 16.04k avg, 16.04k to 16.04k max  (25.00%)<br />
Database      : sakila<br />
Users         :<br />
	msandbox@localhost  : 100.00% (1) of query, 100.00% (4) of all users<br />
</code><code><br />
Query abstract:<br />
SET timestamp=N; INSERT INTO rental2 SELECT * FROM rental;<br />
</code><code><br />
Query sample:<br />
SET timestamp=1278504762;<br />
INSERT INTO rental2 SELECT * FROM rental;<br />
</code><code><br />
________________________________________________ 002 ___<br />
Count         : 3  (75.00%)<br />
Time          : 186.368 ms total, 62.123 ms avg, 52.575 ms to 74.232 ms max  (20.60%)<br />
Lock Time (s) : 238 s total, 79 s avg, 60 s to 117 s max  (47.89%)<br />
Rows sent     : 599 avg, 599 to 599 max  (100.00%)<br />
Rows examined : 16.04k avg, 16.04k to 16.04k max  (75.00%)<br />
Database      : sakila<br />
Users         :<br />
	msandbox@localhost  : 100.00% (3) of query, 100.00% (4) of all users<br />
</code><code><br />
Query abstract:<br />
SET timestamp=N; SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'S' GROUP BY customer_id;<br />
</code><code><br />
Query sample:<br />
SET timestamp=1278504711;<br />
SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'2005-01-01' GROUP BY customer_id;<br />
</code><br />
A première vue, ce rapport ressemble à celui de <code>mysqldumpslow</code> avec un regroupement des requêtes similaires. Le rapport est cependant plus complet car pour chaque groupe, nous avons les valeurs minimales, moyennes et maximales ainsi qu&#8217;une information très intéressante sur le poids relatif de chaque groupe, ce qui permet de cibler facilement les requêtes qui ont le plus contribué au temps de réponse ou qui ont examiné le plus de lignes.</p>
<p>Autre point à noter : pour chaque groupe de requêtes, <code>mysqlsla</code> nous présente une vue abstraite de la requête, c&#8217;est-à-dire une requête générique où les paramètres qui varient entre les requêtes du groupe sont remplacés par N pour un nombre ou S pour une chaîne de caractères, mais aussi un exemple de requête avec des vrais paramètres. C&#8217;est un bon point par rapport à <code>mysqldumpslow</code> puisqu&#8217;il est facile avec l&#8217;exemple de regarder le plan d&#8217;exécution donné par la commande <code>EXPLAIN</code>.</p>
<p>Intéressons-nous aux 4 questions que nous nous étions posées lors de l&#8217;<a href="http://www.dbnewz.com/2010/07/08/outils-danalyse-de-requetes-lentes-mysqldumpslow">article précédent</a>, qui vont nous permettre de voir comment utiliser les méta-données des requêtes pour trier ou filtrer.</p>
<p>Chaque requête dans le journal possède un certain nombre de méta-données, comme le temps d&#8217;exécution ou le nombre de lignes examinées. Il existe également des méta-données dérivées, comme la moyenne des temps d&#8217;exécution pour un groupe de requêtes. Les méta-données disponibles dépendent du type de journal considéré, et tout est détaillé dans la <a href="http://hackmysql.com/mysqlsla_filters">page de la documentation</a> consacrée aux filtres.</p>
<p><code>mysqlsla</code> nous permet de trier les résultats du rapport selon n&#8217;importe quelle méta-donnée avec l&#8217;option <code>--sort</code>.</p>
<p>Ceci va nous permettre de répondre aux 2 premières questions :</p>
<p>Quel est le groupe de requêtes ayant le plus long temps de réponse ?<br />
<code><br />
$ mysqlsla -lt slow --sort t_sum msandbox-slow.log<br />
</code><br />
Ici l&#8217;affichage est exactement celui que nous avions sans l&#8217;option <code>--sort</code>. C&#8217;est normal car pour les journaux de requêtes lentes, <code>mysqlsla</code> applique par défaut l&#8217;option <code>--sort t_sum</code> !</p>
<p>Quel est le groupe de requêtes ayant le plus grand nombre d&#8217;occurrences ?<br />
<code><br />
$ mysqlsla -lt slow --sort c_sum msandbox-slow.log<br />
Report for slow logs: msandbox-slow.log<br />
4 queries total, 2 unique<br />
Sorted by 'c_sum'<br />
Grand Totals: Time 1 s, Lock 0 s, Rows sent 1.80k, Rows Examined 64.18k<br />
</code><code><br />
_______________________________________________ 001 ___<br />
Count         : 3  (75.00%)<br />
Time          : 186.368 ms total, 62.123 ms avg, 52.575 ms to 74.232 ms max  (20.60%)<br />
Lock Time (s) : 238 s total, 79 s avg, 60 s to 117 s max  (47.89%)<br />
Rows sent     : 599 avg, 599 to 599 max  (100.00%)<br />
Rows examined : 16.04k avg, 16.04k to 16.04k max  (75.00%)<br />
Database      : sakila<br />
Users         :<br />
	msandbox@localhost  : 100.00% (3) of query, 100.00% (4) of all users<br />
</code><code><br />
Query abstract:<br />
SET timestamp=N; SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'S' GROUP BY customer_id;<br />
</code><code><br />
Query sample:<br />
SET timestamp=1278504711;<br />
SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'2005-01-01' GROUP BY customer_id;<br />
</code><code><br />
________________________________________________ 002 ___<br />
Count         : 1  (25.00%)<br />
Time          : 718.344 ms total, 718.344 ms avg, 718.344 ms to 718.344 ms max  (79.40%)<br />
Lock Time (s) : 259 s total, 259 s avg, 259 s to 259 s max  (52.11%)<br />
Rows sent     : 0 avg, 0 to 0 max  (0.00%)<br />
Rows examined : 16.04k avg, 16.04k to 16.04k max  (25.00%)<br />
Database      :<br />
Users         :<br />
	msandbox@localhost  : 100.00% (1) of query, 100.00% (4) of all users<br />
</code><code><br />
Query abstract:<br />
SET timestamp=N; INSERT INTO rental2 SELECT * FROM rental;<br />
</code><code><br />
Query sample:<br />
SET timestamp=1278504762;<br />
INSERT INTO rental2 SELECT * FROM rental;<br />
</code><br />
L&#8217;utilisation des filtres va nous permettre de répondre aux 2 dernières questions. Il faut savoir que <code>mysqlsla</code> dispose de deux types de filtres : le premier type permet de filtrer sur les méta-données des entrées du journal alors que le second permettre de sélectionner ou d&#8217;exclure un ou plusieurs types de requêtes. Ces deux types de filtres peuvent bien sûr être combinés afin de répondre à des questions complexes.</p>
<p>Les filtres sur les méta-données s&#8217;écrivent avec l&#8217;option <code>--meta-filter</code> (ou <code>-mf</code> en abrégé), comme par exemple <code>-mf "db=sakila"</code> pour ne conserver que les requêtes sur la base sakila ou <code>-mf "db=sakila,c_sum&gt;5"</code> pour ne conserver que les requêtes sur la base sakila qui apparaissent au moins 6 fois.</p>
<p>Il est facile avec cette option de répondre à la 3è question :<br />
Quelles sont les requêtes qui prennent plus de x secondes ?<br />
En positionnant x à 0.1s, on obtient le résultat suivant :<br />
<code><br />
$ mysqlsla -lt slow -mf "t&gt;0.1" msandbox-slow.log<br />
Report for slow logs: msandbox-slow.log<br />
1 queries total, 1 unique<br />
Sorted by 't_sum'<br />
Grand Totals: Time 1 s, Lock 0 s, Rows sent 0, Rows Examined 16.04k<br />
</code><code><br />
________________________________________________ 001 ___<br />
Count         : 1  (100.00%)<br />
Time          : 718.344 ms total, 718.344 ms avg, 718.344 ms to 718.344 ms max  (100.00%)<br />
Lock Time (s) : 259 s total, 259 s avg, 259 s to 259 s max  (100.00%)<br />
Rows sent     : 0 avg, 0 to 0 max  (0.00%)<br />
Rows examined : 16.04k avg, 16.04k to 16.04k max  (100.00%)<br />
Database      :<br />
Users         :<br />
	msandbox@localhost  : 100.00% (1) of query, 100.00% (1) of all users<br />
</code><code><br />
Query abstract:<br />
SET timestamp=N; INSERT INTO rental2 SELECT * FROM rental;<br />
</code><code><br />
Query sample:<br />
SET timestamp=1278504762;<br />
INSERT INTO rental2 SELECT * FROM rental;<br />
</code></p>
<p>Enfin nous allons nous servir des filtres sur les requêtes (option <code>--statement-filter</code> ou <code>-sf</code>) pour répondre à la 4è question :<br />
Comment ne conserver que les requêtes <code>SELECT</code> ?<br />
<code><br />
$ mysqlsla -lt slow -sf "+SELECT" msandbox-slow.log<br />
Report for slow logs: msandbox-slow.log<br />
3 queries total, 1 unique<br />
Sorted by 't_sum'<br />
Grand Totals: Time 0 s, Lock 0 s, Rows sent 1.80k, Rows Examined 48.13k<br />
</code><code><br />
________________________________________________ 001 ___<br />
Count         : 3  (100.00%)<br />
Time          : 186.368 ms total, 62.123 ms avg, 52.575 ms to 74.232 ms max  (100.00%)<br />
Lock Time (s) : 238 s total, 79 s avg, 60 s to 117 s max  (100.00%)<br />
Rows sent     : 599 avg, 599 to 599 max  (100.00%)<br />
Rows examined : 16.04k avg, 16.04k to 16.04k max  (100.00%)<br />
Database      : sakila<br />
Users         :<br />
	msandbox@localhost  : 100.00% (3) of query, 100.00% (3) of all users<br />
</code><code><br />
Query abstract:<br />
SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'S' GROUP BY customer_id;<br />
</code><code><br />
Query sample:<br />
SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'2005-01-01' GROUP BY customer_id;<br />
</code><br />
Et voilà, notre (courte) exploration de <code>mysqlsla</code> est terminée ! Ces quelques exemples ont montré que <code>mysqlsla</code> est extrêmement flexible comparé à <code>mysqldumpslow</code>, ce qui en fait un très bon choix en tant outil d&#8217;analyse de journaux MySQL. Quels sont les inconvénients de <code>mysqlsla</code> ? En fait, je n&#8217;en vois qu&#8217;un seul : Daniel, le développeur de <code>mysqlsla</code>, a annoncé au printemps que l&#8217;outil ne serait plus maintenu. La raison est simple : Daniel fait maitenant partie de l&#8217;équipe de développement de Maatkit, qui propose un outil remplaçant <code>mysqlsla</code>. Mais assez dit, ce sera l&#8217;objet du prochain article de cette série.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/07/28/outils-d%e2%80%99analyse-de-requetes-lentes-%e2%80%93-mysqlsla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Outils d&#8217;analyse de requêtes lentes &#8211; mysqldumpslow</title>
		<link>http://www.dbnewz.com/2010/07/08/outils-danalyse-de-requetes-lentes-mysqldumpslow/</link>
		<comments>http://www.dbnewz.com/2010/07/08/outils-danalyse-de-requetes-lentes-mysqldumpslow/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 15:15:22 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[5.1]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[outils]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=601</guid>
		<description><![CDATA[Nous avons vu dans un précédent article comment tracer les requêtes lentes avec MySQL et quelles sont les possibilités selon la version du serveur. Si vous avez activé le journal des requêtes lentes, vous avez sans doute recueilli un certain nombre de requêtes qu&#8217;il faut maintenant analyser afin de pouvoir les optimiser ou afin de [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons vu dans un précédent article comment tracer les requêtes lentes avec MySQL et quelles sont les possibilités selon la version du serveur. Si vous avez activé le journal des requêtes lentes, vous avez sans doute recueilli un certain nombre de requêtes qu&#8217;il faut maintenant analyser afin de pouvoir les optimiser ou afin de revoir le paramétrage du serveur. Cet article est le premier d&#8217;une série de trois, qui va vous montrer quelques outils qui vont vous aider dans cette analyse.<span id="more-601"></span></p>
<p>Avant toute chose, montons une petite configuration qui va nous être utile pour illustrer le fonctionnement et les limitations de chaque outil.</p>
<p>Prenons un serveur MySQL en version 5.1 avec la table exemple sakila et choisissons une valeur de <code>long_query_time</code> de 0.05s. Pourquoi une valeur aussi faible ? Tout simplement parce qu&#8217;avec une telle valeur, il n&#8217;est vraiment pas difficile des requêtes qui seront considérées comme lentes, ce qui nous permettra d&#8217;obtenir facilement un journal de requêtes lentes.</p>
<p>Effectuons les requêtes suivantes :</p>
<p>(1) <code>mysql&gt; SELECT customer_id,COUNT(*) FROM rental WHERE return_date &gt; '2005-01-01' GROUP BY customer_id;</code><br />
(2) <code>mysql&gt; SELECT customer_id,COUNT(*) FROM rental WHERE return_date &gt; '2005-01-02' GROUP BY customer_id;</code><br />
(3) <code>mysql&gt; SELECT customer_id,COUNT(*) FROM rental WHERE return_date &gt; '2005-01-03' GROUP BY customer_id;</code><br />
(4) <code>mysql&gt; CREATE TABLE rental2 LIKE rental;</code><br />
(5) <code>mysql&gt; INSERT INTO rental2 SELECT * FROM rental;</code></p>
<p>Toutes les requêtes, sauf (4), sont lentes (si ce n&#8217;est pas le cas pour vous, il vous suffit de baisser la valeur de <code>long_query_time</code>).</p>
<p>Le journal des requêtes lentes a maintenant l&#8217;allure suivante :<br />
<code><br />
# Time: 100707 14:11:51<br />
# User@Host: msandbox[msandbox] @ localhost []<br />
# Query_time: 0.074232  Lock_time: 0.000061 Rows_sent: 599  Rows_examined: 16044<br />
use sakila;<br />
SET timestamp=1278504711;<br />
SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'2005-01-01' GROUP BY customer_id;<br />
# Time: 100707 14:12:10<br />
# User@Host: msandbox[msandbox] @ localhost []<br />
# Query_time: 0.052575  Lock_time: 0.000117 Rows_sent: 599  Rows_examined: 16044<br />
SET timestamp=1278504730;<br />
SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'2005-01-02' GROUP BY customer_id;<br />
# Time: 100707 14:12:15<br />
# User@Host: msandbox[msandbox] @ localhost []<br />
# Query_time: 0.059561  Lock_time: 0.000060 Rows_sent: 599  Rows_examined: 16044<br />
SET timestamp=1278504735;<br />
SELECT customer_id,COUNT(*) FROM rental WHERE return_date&gt;'2005-01-03' GROUP BY customer_id;<br />
# Time: 100707 14:12:42<br />
# User@Host: msandbox[msandbox] @ localhost []<br />
# Query_time: 0.718344  Lock_time: 0.000259 Rows_sent: 0  Rows_examined: 16044<br />
SET timestamp=1278504762;<br />
INSERT INTO rental2 SELECT * FROM rental;<br />
</code></p>
<p>Plutôt que de montrer toutes les possibilités des outils que nous allons regarder, je vous propose de nous concentrer sur quelques questions clés que l&#8217;on se pose souvent et de voir si les outils examinés permettent de répondre à ces questions :</p>
<p>- Comment ne garder que les groupes de requêtes qui ont entraîné le plus long temps de réponse ?<br />
- Comment ne garder que les groupes de requêtes qui ont le plus d&#8217;occurences ?<br />
- Comment ne garder que les requêtes qui prennent plus de x secondes ?<br />
- Comment ne garder que les SELECT ?</p>
<p>La deux premières questions demandent quelques éclaircissements : qu&#8217;est-ce qu&#8217;un groupe de requêtes et pourquoi une même requête, pas trop lente mais s&#8217;exécutant plusieurs fois, serait-elle plus intéressante à analyser qu&#8217;une requête très lente ?</p>
<p>Premièrement, il suffit de regarder les 4 premières requêtes du listing ci-dessus pour s&#8217;apercevoir que les requêtes sont identiques à une constante près. Un appel à EXPLAIN donnera le même résultat pour toutes les requêtes, et l&#8217;amélioration de l&#8217;une d&#8217;elles les améliorera toutes.<br />
Et deuxièmement, il faut garder à l&#8217;esprit qu&#8217;une requête exécutée 1000 fois par seconde en 1 ms chargera plus le serveur qu&#8217;une requête exécuté 1 fois par seconde en 0.5s. La recherche des requêtes qui provoquent le plus de charge est un travail aussi important que la recherche des requêtes les plus lentes.</p>
<p>Nous allons regarder dans cet article <code>mysqldumpslow</code>, qui est un script Perl que vous trouverez dans toute distribution MySQL. Ce script est assez rustique (il a été écrit en 2000 !) mais comme c&#8217;est le seul outil d&#8217;analyse fourni en standard, nous allons y jeter un oeil.</p>
<p>L&#8217;utilisation est très simple : il suffit de passer le chemin du journal au script, avec éventuellement des options que nous allons examiner un peu plus loin.</p>
<p>Voici ce que nous obtenons dans notre cas :<br />
<code><br />
$ mysqldumpslow msandbox-slow.log </code><br />
<code><br />
Reading mysql slow query log from msandbox-slow.log<br />
Count: 1  Time=0.72s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), msandbox[msandbox]@localhost<br />
  insert into rental2 select * from rental<br />
</code><code><br />
Count: 3  Time=0.06s (0s)  Lock=0.00s (0s)  Rows=599.0 (1797), msandbox[msandbox]@localhost<br />
  select customer_id,count(*) from rental where return_date&gt;'S' group by customer_id<br />
</code></p>
<p>Quelques commentaires sur le rapport obtenu :</p>
<p>- Les requêtes sont rassemblées au sein de groupes comme nous l&#8217;avons expliqué. Les constantes qui changent entre chaque requête d&#8217;un même groupe sont remplacées par un S, ce qui indique que les valeurs réelles sont des chaines de caractères ou par un N, ce qui indique que les valeurs réelles sont des nombres. Cette présentation concise est bien pratique car très souvent vous retrouverez le même type de requêtes exécuté des dizaines ou des centaines de fois, mais elle a pour inconvénient de ne pas fournir de requête directement exploitable : si vous voulez utiliser EXPLAIN, il vous faudra d&#8217;abord remplacer le S par une &#8216;vraie&#8217; valeur, ce qui peut s&#8217;avérer désagréable à l&#8217;usage. Il est possible de demander à mysqldumpslow de ne pas rendre abstraites les constantes, mais dans ce cas, chaque requête d&#8217;un groupe est considérée comme unique si bien que le regroupement est perdu.</p>
<p>- Les champs Time, Lock et Rows reprennent les informations du journal, en mentionnant la valeur moyenne et la valeur totale (entre parenthèses) de chaque champ pour le groupe. Notez que pour les valeurs totales de Time et Lock, l&#8217;unité est la seconde, ce qui était bien adapté en 2000 quand la résolution du journal était la seconde, mais ne l&#8217;est plus du tout dans notre cas. Ces valeurs ne sont donc pas toujours exploitables.</p>
<p>Pouvons-nous répondre aux questions que nous nous étions posées avec mysqldumpslow ?</p>
<p>Pour les 2 premières (groupe de requêtes ayant le plus d&#8217;occurences et ayant entrainé le plus long temps de réponse), la réponse est oui. mysqldumpslow dispose en effet d&#8217;une option pour trier les entrées du rapport selon différents critères. Ainsi :<br />
<code>mysqldumpslow -s c msandbox-slow.log</code><br />
trie les groupes de requêtes par nombre d&#8217;occurences. Et </p>
<p><code>mysqldumpslow -s t msandbox-slow.log</code><br />
trie les groupes de requêtes par temps d&#8217;exécution. Notez que le tri se fait sur le temps total, ie le chiffre entre parenthèses. Si vous préférez que le tri se fasse sur le temps moyen il faut utiliser l&#8217;option -s at.</p>
<p>Pour la troisième question, portant sur les requêtes prenant plus de x secondes, nous ne pouvons pas directement obtenir le résultat. Mais nous pouvons nous en approcher en triant par temps de réponse et en utilisant l&#8217;option -t qui n&#8217;affiche que les N premiers résultats :<br />
<code>mysqldumpslow -s t -t 1 msandbox-slow.log</code><br />
 donne le groupe de requêtes ayant le temps total d&#8217;exécution le plus long. Il suffit alors de trouver, par tâtonnements successifs par exemple, la bonne valeur de l&#8217;option -t qui va nous permettre d&#8217;obtenir le résultat voulu.</p>
<p>Quant à la dernière question, à savoir filtrer l&#8217;affichage sur les SELECT, il existe bien une option -g qui permet de fournir un motif de filtrage, mais il ne m&#8217;a pas semblé possible dans notre cas de trouver un motif qui filtre le INSERT &#8230; SELECT sans filtrer les SELECT.</p>
<p>Résumons donc : <code>mysqldumpslow</code> est un outil très simple, toujours disponible, qui permet de produire un rapport concis mais peu précis en regroupant les requêtes similaires. Les possibilités de filtrage sont réduites au minimum, ce qui n&#8217;en fait pas un outil très pratique quand le journal contient beaucoup d&#8217;entrées. On l&#8217;utilisera donc surtout quand aucun autre outil n&#8217;est disponible, ce qui devrait être finalement assez rare, puisque rien ne vous empêche de rapatrier le journal de requêtes lentes sur votre PC pour l&#8217;analyser avec un autre outil.</p>
<p>Rendez-vous très bientôt pour la seconde partie de notre découverte des outils d&#8217;analyse de journaux de requêtes lentes avec </code>mysqlsla</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/07/08/outils-danalyse-de-requetes-lentes-mysqldumpslow/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Encore un nouveau livre sur MySQL !</title>
		<link>http://www.dbnewz.com/2010/06/18/encore-un-nouveau-livre-sur-mysql/</link>
		<comments>http://www.dbnewz.com/2010/06/18/encore-un-nouveau-livre-sur-mysql/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 14:18:57 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[5.0]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[DBNewz]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[livres]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=597</guid>
		<description><![CDATA[Après l&#8217;excellent &#171;&#160;MySQL5, Audit et optimisation&#160;&#187; sorti fin mars, voici un nouveau livre pour vous occuper sur la plage cet été : MySQL5, Administration et optimisation.
Pour vous mettre l&#8217;eau à la bouche, la TDM_MySQL5_Admin_Optim et un Extrait_MySQL5_Admin_Optim consacré aux verrous et transactions sont disponibles
Le livre est bien sûr disponible dans toutes les bonnes librairies informatiques [...]]]></description>
			<content:encoded><![CDATA[<p>Après l&#8217;excellent &laquo;&nbsp;MySQL5, Audit et optimisation&nbsp;&raquo; sorti fin mars, voici un nouveau livre pour vous occuper sur la plage cet été : <a href="http://www.editions-eni.fr/Livres/MySQL-5-administration-et-optimisation/.5_3a6222cf-b921-41f5-886c-c989f77ba994_cb487b7e-d258-456f-9051-6cc0e5e2b22f_817f0d89-4a9c-49f7-ad91-63e24f3c9941_1_0_d9bd8b5e-f324-473f-b1fc-b41b421c950f.html">MySQL5, Administration et optimisation</a>.<br />
Pour vous mettre l&#8217;eau à la bouche, la <a href='http://www.dbnewz.com/wp-content/uploads/2010/06/TDM_MySQL5_Admin_Optim.pdf'>TDM_MySQL5_Admin_Optim</a> et un <a href='http://www.dbnewz.com/wp-content/uploads/2010/06/Extrait_MySQL5_Admin_Optim.pdf'>Extrait_MySQL5_Admin_Optim</a> consacré aux verrous et transactions sont disponibles</p>
<p>Le livre est bien sûr disponible dans toutes les bonnes librairies informatiques et autres FNAC, Amazon &#8230;</p>
<p>Bonne lecture !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/06/18/encore-un-nouveau-livre-sur-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tracer les requêtes lentes</title>
		<link>http://www.dbnewz.com/2010/05/28/tracer-requetes-lentes/</link>
		<comments>http://www.dbnewz.com/2010/05/28/tracer-requetes-lentes/#comments</comments>
		<pubDate>Fri, 28 May 2010 14:36:10 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=558</guid>
		<description><![CDATA[Dans la grande majorité des applications, améliorer les requêtes qui mettent le plus de temps à s&#8217;exécuter s&#8217;avère en payant à tous les points de vue : les utilisateurs ont un meilleur ressenti de l&#8217;application grâce au gain en rapidité, la charge du serveur baisse car les requêtes lentes ont souvent pour origine un plan [...]]]></description>
			<content:encoded><![CDATA[<p>Dans la grande majorité des applications, améliorer les requêtes qui mettent le plus de temps à s&#8217;exécuter s&#8217;avère en payant à tous les points de vue : les utilisateurs ont un meilleur ressenti de l&#8217;application grâce au gain en rapidité, la charge du serveur baisse car les requêtes lentes ont souvent pour origine un plan d&#8217;exécution coûteux et finalement le serveur est capable d&#8217;accepter plus de connexions qu&#8217;auparavant. Mais avant de pouvoir corriger ces requêtes lentes, encore faut-il les repérer afin de les analyser. C&#8217;est pourquoi je vous propose dans cet article de faire le point sur le slow query log, soit en français plus correct le journal des requêtes lentes.<span id="more-558"></span></p>
<p>Tout d&#8217;abord, il faut savoir que la version 5.1 a apporté pas mal de changements par rapport aux possibilités offertes jusqu&#8217;alors. Mais pour que les choses restent claires, nous allons commencer par présenter les options disponibles en 5.0.</p>
<p>Le but du journal des requêtes lentes, quelle que soit la version de MySQL, est de tracer l&#8217;ensemble des requêtes qui sont jugées lentes, c&#8217;est-à-dire dont le temps d&#8217;exécution est supérieur à une certaine limite. Ce qui est intéressant dans ce journal, c&#8217;est que le serveur écrit les requêtes après leur exécution, ce qui permet de disposer de pas mal d&#8217;informations intéressantes. Remarquez que c&#8217;est logique : on ne peut bien sûr pas savoir avant de l&#8217;avoir exécutée si une requête est lente ou pas &#8230;</p>
<p>L&#8217;activation/désactivation du journal se fait avec la variable <code>log_slow_queries</code>. Par défaut, celle-ci est à <code>OFF</code> :</p>
<p><code>mysql&gt; SHOW VARIABLES LIKE 'log_slow_queries';<br />
+------------------+-------+<br />
| Variable_name          | Value |<br />
+------------------+-------+<br />
| log_slow_queries | OFF      |<br />
+------------------+-------+<br />
</code></p>
<p>La variable ne peut pas être modifiée dynamiquement, le mieux est donc d&#8217;aller éditer le fichier my.cnf :<br />
<code><br />
[mysqld]<br />
log_slow_queries<br />
</code><br />
puis de redémarrer le serveur.</p>
<p>Notez que si vous ne précisez aucun chemin, le journal est créé dans le répertoire de données (ce qui n&#8217;est pas idéal) et porte le nom <em>hostname</em>-slow.log. Le mieux est donc de préciser un chemin absolu, par exemple :<br />
<code><br />
[mysqld]<br />
log_slow_queries = /var/log/mysql/mysql-slow.log<br />
</code></p>
<p>La seconde option importante à configurer est la durée à partir de laquelle une requête est considérée comme lente. Ce réglage se fait avec la variable <code>long_query_time</code>, qui peut être modifiée dynamiquement :<br />
<code><br />
mysql&gt; SHOW GLOBAL VARIABLES LIKE 'long_query_time';<br />
+-----------------+-------+<br />
| Variable_name    | Value |<br />
+-----------------+-------+<br />
| long_query_time | 10       |<br />
+-----------------+-------+<br />
1 row in set (0.00 sec)<br />
</code><br />
<code><br />
mysql&gt; SET @@global.long_query_time = 5;<br />
Query OK, 0 rows affected (0.00 sec)</code></p>
<p><code><br />
mysql&gt; SHOW GLOBAL VARIABLES LIKE 'long_query_time';<br />
+-----------------+-------+<br />
| Variable_name    | Value |<br />
+-----------------+-------+<br />
| long_query_time | 5        |<br />
+-----------------+-------+<br />
1 row in set (0.00 sec)</code></p>
<p>Munis de ces informations, nous pouvons maintenant écrire une requête lente :<br />
<code><br />
mysql&gt; SELECT SLEEP(15);<br />
</code></p>
<p>et voir ce qui se trouve dans le journal :<br />
<code><br />
# Time: 100528 11:48:13<br />
# User@Host: msandbox[msandbox] @ localhost []<br />
# Query_time: 15  Lock_time: 0  Rows_sent: 1  Rows_examined: 0<br />
SELECT SLEEP(15);<br />
</code></p>
<p>Les informations des 2 premières lignes (date et utilisateur) permettent, en utilisant des outils existants ou avec son propre script, de regrouper les événements pour déterminer s&#8217;il y a plus de requêtes lentes certains jours ou à certains moments de la journée, ou encore si un utilisateur provoque plus de requêtes lentes que les autres.</p>
<p>La 3è ligne est particulièrement intéressante puisqu&#8217;en plus du temps d&#8217;exécution de la requête, nous avons le temps perdu à cause des verrous et nous pouvons comparer le nombre de lignes renvoyées au nombre de lignes examinées. Un examen rapide de ces informations nous permet donc rapidement de savoir si la requête est lente à cause d&#8217;une contention sur les ressources (<code>Lock_time</code> élevé) ou si l&#8217;exécution est loin d&#8217;être optimale (<code>Rows_examined</code> élevé par rapport à <code>Rows_sent</code>).</p>
<p>Un exemple réel plus parlant ? En voici un :<br />
<code><br />
# Time: 100401  6:30:14<br />
# User@Host: xxx[xxx] @ backoffice.xxx [10.xxx.xxx.xxx]<br />
# Query_time: 12.012118  Lock_time: 0.000660 Rows_sent: 0  Rows_examined: 359462<br />
</code></p>
<p>Ici, on voit tout de suite que le plan d&#8217;exécution mériterait d&#8217;être revue : le serveur lit 360 000 lignes pour en retourner &#8230; 0 !</p>
<p>Du côté des limitations en 5.0, 3 points sont à noter : outre le fait de ne pas pouvoir activer/désactiver le journal sans devoir redémarrer le serveur, les requêtes exécutées sur un slave par le thread de réplication ne sont jamais tracées dans le journal et la valeur de la variable <code>long_query_time</code> est nécessairement un entier.</p>
<p>Ces deux derniers points ont des conséquences gênantes :</p>
<ul>
<li>si vous activez le journal sur un slave mais pas sur le master, vous risquez de passer à côté de requêtes de mises à jour qui sont lentes, les mises à jour étant toutes exécutées par le thread de réplication</li>
<li>si votre application est déjà bien optimisée, votre journal sera probablement vide car vous n&#8217;aurez plus aucune requête s&#8217;exécutant en plus d&#8217;une seconde : si vous souhaitez malgré tout repérer les requêtes les plus longues à exécuter, il faudra trouver un autre moyen pour les tracer</li>
</ul>
<p>Il existe encore 2 autres options disponibles : la possibilité de tracer les requêtes &laquo;&nbsp;administratives&nbsp;&raquo; (par exemple, <code>REPAIR TABLE</code>) qui sont lentes ou encore la possibilité de tracer les requêtes n&#8217;utilisant pas d&#8217;index, quel que soit leur temps d&#8217;exécution. Il suffit pour cela de renseigner l&#8217;une ou l&#8217;autre des variables dans le fichier my.cnf :</p>
<p><code><br />
[mysqld]<br />
log-slow-admin-statements<br />
log-queries-not-using-indexes<br />
</code></p>
<p>L&#8217;option <code>log-queries-not-using-indexes</code> mérite quand même qu&#8217;on s&#8217;y attarde un peu&#8230; En effet, cette option va en réalité tracer les requêtes qui parcourent toutes les lignes d&#8217;une table, peu importe si ce parcours se fait ou non avec un index. Pas très clair ? Prenons un exemple.</p>
<p>Voici 2 structures de table, identiques sauf que l&#8217;une a pour moteur InnoDB et l&#8217;autre MyISAM :<br />
<code><br />
CREATE TABLE t1 (<br />
id int(11) NOT NULL auto_increment,<br />
PRIMARY KEY  (id)<br />
) ENGINE=InnoDB<br />
</code></p>
<p><code><br />
CREATE TABLE t2 (<br />
id int(11) NOT NULL auto_increment,<br />
PRIMARY KEY  (id)<br />
) ENGINE=MyISAM</code></p>
<p>Remplissons les tables avec quelques lignes en répétant plusieurs fois les insertions suivantes :<br />
<code><br />
mysql&gt; INSERT INTO t1 (id) VALUES (NULL);<br />
mysql&gt; INSERT INTO t2 (id) VALUES (NULL);<br />
</code></p>
<p>Maintenant la requête suivante va se retrouver dans le journal des requêtes lentes :<br />
<code><br />
mysql&gt; SELECT COUNT(*) FROM t1;<br />
</code></p>
<p>alors que celle-ci n&#8217;y sera pas :<br />
<code><br />
mysql&gt; SELECT COUNT(*) FROM t2;<br />
</code></p>
<p>Quelle est l&#8217;explication ? Il suffit de regarder le plan d&#8217;exécution donné par EXPLAIN. Pour la table t1, EXPLAIN indique que le plan est de faire un full index scan alors que pour t2, aucune opération n&#8217;est nécessaire (donc en particulier aucun index n&#8217;est utilisé), le moteur MyISAM gardant toujours parmi ses méta-données le nombre d&#8217;enregistrements de la table.</p>
<p>Dans notre cas, MySQL a donc tracé la requête utilisant un index et ignoré celle n&#8217;en utilisant pas&#8230; Quand je disais que cette option méritait qu&#8217;on s&#8217;y attarde un peu !</p>
<p>Maintenant que nous avons fait le tour de ce qui est possible en 5.0, voyons ce que la 5.1 a apporté de neuf. C&#8217;est simple : que du bon ! Ainsi, il est désormais possible d&#8217;activer/désactiver le journal dynamiquement, de tracer les requêtes lentes dans un fichier ou dans une table, d&#8217;indiquer un seuil non plus en secondes mais en microsecondes et enfin de tracer les requêtes exécutées par le thread de réplication !</p>
<p>Dans le détail, c&#8217;est un peu plus compliqué&#8230;</p>
<p>La variable <code>log_slow_queries</code> a été remplacée par <code>slow_query_log</code> : c&#8217;est grâce à elle que vous activez/désactivez le journal.</p>
<p>Par défaut, le journal est écrit dans un fichier, dont vous pouvez préciser le nom avec la variable <code>slow_query_log_file</code>.</p>
<p>Pour écrire dans une table, il faut modifier la variable <code>log_output</code> en précisant <code>TABLE</code>. Vous pouvez aussi choisir d&#8217;écrire à la fois dans un fichier et dans une table avec <code>log_output = FILE, TABLE</code>. Attention, la variable log_output s&#8217;applique également au journal général (general log) si celui-ci est activé.</p>
<p>Le seuil décrit par <code>long_query_time</code> s&#8217;écrit toujours en secondes, mais avec une précision pouvant aller jusqu&#8217;à la microseconde. Vous pouvez donc maintenant définir un seuil de 0.05s : <code>long_query_time = 0.05</code>. Attention, si vous écrivez dans une table, la granularité redevient la seconde comme en 5.0 !</p>
<p>Une petite nouveauté aussi, vous avez la possibilité de ne tracer que les requêtes qui examinent au moins un certain nombre de lignes avec la variables <code>min_examined_row_limit</code>.</p>
<p>Enfin, dernier point, la variable <code>log-slow-slave-statements</code>, disponible à partir de la 5.1.45 permet de tracer les requêtes lentes exécutées par le thread de réplication.</p>
<p>Ca y est, vous savez tout sur le journal des requêtes lentes de MySQL ! Enfin, presque, car si vous utilisez la version de MySQL patchée par Percona, vous trouverez des informations supplémentaires. Ceci fera sans doute l&#8217;objet d&#8217;un nouvel article. En attendant, nous examinerons prochainement quels sont les outils disponibles pour analyser les requêtes lentes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/05/28/tracer-requetes-lentes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le journal d&#8217;erreurs de MySQL</title>
		<link>http://www.dbnewz.com/2010/04/16/le-journal-d-erreurs-de-mysql/</link>
		<comments>http://www.dbnewz.com/2010/04/16/le-journal-d-erreurs-de-mysql/#comments</comments>
		<pubDate>Fri, 16 Apr 2010 16:16:53 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[log]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=546</guid>
		<description><![CDATA[Les informations recueillies dans le journal d&#8217;erreurs sont très intéressantes à examiner, non seulement en cas de crash, mais aussi de façon périodique pour détecter d&#8217;éventuels problèmes. Ce billet va vous rappeler le rôle de ce journal, vous indiquer quelles sont les options de configuration et vous donner quelques bonnes pratiques pour éviter les pièges [...]]]></description>
			<content:encoded><![CDATA[<p>Les informations recueillies dans le journal d&#8217;erreurs sont très intéressantes à examiner, non seulement en cas de crash, mais aussi de façon périodique pour détecter d&#8217;éventuels problèmes. Ce billet va vous rappeler le rôle de ce journal, vous indiquer quelles sont les options de configuration et vous donner quelques bonnes pratiques pour éviter les pièges les plus fréquents.<span id="more-546"></span></p>
<p>Commençons par le plus simple : que contient ce journal ? Facile : toutes les erreurs rencontrées par le serveur. Mais vous y trouverez également d&#8217;autres informations, comme par exemple les arrêts et démarrages du serveur. Par défaut, l&#8217;option <code>log_warnings</code> est activée (valeur à 1), ce qui signifie que les messages d&#8217;avertissement sont également présents. Si vous ne souhaitez pas avoir les message d&#8217;avertissement, il vous suffit de positionner cette variable à 0. A l&#8217;inverse, si vous voulez avoir des informations supplémentaires, telles que les problèmes réseaux, vous pouvez positionner cette variable à 2.<br />
Pour les utilisateurs de Windows, sachez que certaines données sont reprises dans le journal des événements.</p>
<p>Voilà pour la partie facile. Les choses se compliquent déjà un peu plus quand on cherche à savoir où se trouve le fichier d&#8217;erreur&#8230; A priori pourtant, ce n&#8217;est pas difficile, il suffit de regarder du côté de la variable<code> log_error</code>. Celle-ci peut prendre 3 valeurs :</p>
<ul>
<li>chaîne vide (par défaut), le journal d&#8217;erreurs s&#8217;appelle alors [hostname].err et se trouve dans le répertoire de données</li>
<li>un nom d&#8217;un fichier, dans ce cas, le journal se trouve dans le répertoire de données et porte le nom indiqué</li>
<li>le chemin absolu d&#8217;un fichier, alors le journal se trouve à l&#8217;emplacement indiqué</li>
</ul>
<p>Cela signifie que dans les deux premiers cas, il faut également regarder la variable datadir pour connaître l&#8217;emplacement du répertoire de données.</p>
<p>Deux petites remarques au passage :</p>
<ul>
<li>il n&#8217;est pas possible de désactiver le journal d&#8217;erreurs</li>
<li>le journal est toujours écrit dans un fichier et jamais dans une table comme vous pouvez le faire pour la general log et la slow log à partir de la version 5.1</li>
</ul>
<p>En réalité, c&#8217;est encore un peu plus compliqué. Dans certaines distributions Linux, comme Debian ou Ubuntu par exemple, le journal passe par syslog. Les événements ont alors un tag mysqld_safe ou mysqld selon leur origine. La raison en est une petite variable bien cachée dans un fichier &#8230; lui aussi bien caché : si vous regardez dans le répertoire /etc/mysql/conf.d/, vous y trouverez un fichier mysld_safe_syslog.cnf qui contient simplement la directive suivante :<br />
<code>[mysqld_safe]<br />
syslog</code></p>
<p>A partir de la version 5.1, la variable <code>syslog</code> est disponible en standard (mais pas pour Windows bien sûr !).</p>
<p>Est-ce un bon choix d&#8217;utiliser cette variable <code>syslog</code> ? La réponse va sans doute dépendre de votre manière de surveiller les logs : si vous ne vous intéressez qu&#8217;à MySQL, devoir retrouver les événements liés à MySQL parmi tous les autres événements va être laborieux, mais au contraire, si MySQL n&#8217;est qu&#8217;une application parmi tant d&#8217;autres, il vous sera bien agréable d&#8217;avoir un journal d&#8217;erreurs dans un format standard.</p>
<p>Subtilité ou complication supplémentaire, vous pouvez même avoir votre journal d&#8217;erreur en double, une première fois via syslog et une deuxième fois dans le fichier d&#8217;erreur classique. Comment faire ? Il vous faut activer en même temps la variable <code>syslog</code> et la variable <code>log_error</code> :<br />
<code>[mysqld_safe]<br />
syslog</code><br />
<code><br />
[mysqld]<br />
log_error = error.log</code></p>
<p>Quel est l&#8217;intérêt ? A vrai dire, je n&#8217;en vois pas vraiment &#8230; <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Voyons maintenant quelques bonnes pratiques.</p>
<p>La première question à vous poser, en supposant que vous êtes sous Linux et que votre version ou votre distribution vous en donne la possibilité, est de savoir si vous souhaitez utiliser syslog ou pas.</p>
<p>Si oui, il vous suffit de positionner la variable syslog dans la section [mysqld_safe] du fichier my.cnf et la configuration est terminée.</p>
<p>Sinon, si vous laissez la variable à vide ou si vous mettez un nom de fichier, votre journal d&#8217;erreurs va se trouver dans le répertoire de données, ce qui n&#8217;est pas souhaitable. Même s&#8217;il existe peu de chances que le journal d&#8217;erreurs remplisse tout l&#8217;espace disque disponible dans le répertoire de données (c&#8217;est plus plausible avec les logs bins), il est en effet toujours mieux de ne pas mélanger les torchons et les serviettes : les données avec les données et les logs avec les logs ! De plus, vous risquez d&#8217;avoir des problèmes de droit : dans le répertoire de données, seul les utilisateurs du groupe mysql ont le droit d&#8217;accéder à ce fichier, alors que vous aurez peut-être besoin de donner des accès à d&#8217;autres utilisateurs sans pour autant leur laisser un accès aux données. Il est donc conseillé de saisir un chemin absolu vers un fichier, par exemple :<br />
<code>[mysqld]<br />
log_error = /var/log/mysql/error.log</code></p>
<p>Un autre aspect à prendre en compte est celui de la rotation. En effet, si vous n&#8217;y faites pas attention, la rotation des logs risque de vous faire perdre une grande partie des informations du journal d&#8217;erreurs !<br />
Le premier point à constater est que la rotation du journal d&#8217;erreurs ne se fait pas automatiquement au démarrage du serveur ou lorsque la taille du fichier dépasse une certaine limite. La seule possibilité consiste à exécuter la commande <code>FLUSH LOGS</code> (qui affecte également les autres logs).</p>
<p>Quand vous utilisez syslog, par défaut, votre système fait une rotation tous les jours, et les logs sont purgées après 7 jours. Sauf si vous prenez des mesures pour sauvegarder les logs après leur rotation, vous avez donc seulement le journal des erreurs des 7 derniers jours à votre disposition.</p>
<p>Mais quand vous utilisez un journal d&#8217;erreurs classique, la situation est beaucoup plus dangereuse ! En effet, l&#8217;appel de la commande <code>FLUSH LOGS</code> créé un nouveau journal d&#8217;erreurs et sauvegarde l&#8217;ancien dans un fichier avec le suffixe -old. Et si vous aviez déjà un fichier -old, celui-ci est purement et simplement supprimé !</p>
<p>Petite démo :<br />
<code>stephane@cilaos:/var/lib/mysql$ ll | grep error<br />
-rw-rw---- 1 ...     2817 2010-04-16 10:46 error.log<br />
-rw-rw---- 1 ...      939 2010-04-16 10:45 error.log-old</code></p>
<p>J&#8217;ai bien un journal d&#8217;erreurs ainsi qu&#8217;un journal en -old. J&#8217;exécute FLUSH LOGS pour voir l&#8217;effet :</p>
<p><code>stephane@cilaos:/var/lib/mysql$ mysql -uroot -p -e "FLUSH LOGS"<br />
Enter password:<br />
stephane@cilaos:/var/lib/mysql$ ll | grep error<br />
-rw-rw---- 1 ...        0 2010-04-16 10:47 error.log<br />
-rw-rw---- 1 ...     2817 2010-04-16 10:46 error.log-old</code></p>
<p>Et voilà, mes anciennes erreurs sont perdues à tout jamais&#8230;</p>
<p>Conclusion : mieux vaut sauvegarder régulièrement son journal d&#8217;erreurs car nul n&#8217;est à l&#8217;abri d&#8217;un <code>FLUSH LOGS</code> non prévu.</p>
<p>Notre exploration du journal d&#8217;erreurs est terminée, et nous reviendrons bientôt sur un autre journal extrêmement important : le journal des requêtes lentes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/04/16/le-journal-d-erreurs-de-mysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tutorial et jour 1</title>
		<link>http://www.dbnewz.com/2010/04/14/tutorial-et-jour-1/</link>
		<comments>http://www.dbnewz.com/2010/04/14/tutorial-et-jour-1/#comments</comments>
		<pubDate>Wed, 14 Apr 2010 06:46:05 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
				<category><![CDATA[User Conference 2010]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=543</guid>
		<description><![CDATA[2 jours se sont ecoules a la conference et comme d habitude je n ai pas vu le temps passer.
J ai passe le 1er jour a approfondir mes connaissances sur MySQL Cluster. 7.1 a ete annonce GA aujourd&#8217;hui. J ai pu voir beaucoup d amelioration en terme de performance mais surtout au niveau de l [...]]]></description>
			<content:encoded><![CDATA[<p>2 jours se sont ecoules a la conference et comme d habitude je n ai pas vu le temps passer.<br />
J ai passe le 1er jour a approfondir mes connaissances sur <a href="http://en.oreilly.com/mysql2010/public/schedule/detail/12438">MySQL Cluster</a>. 7.1 a ete annonce GA aujourd&#8217;hui. J ai pu voir beaucoup d amelioration en terme de performance mais surtout au niveau de l operabilite. Ceci etant dit Cluster a encore beaucoup de limitation et votre application doit s adapter au cluster et non l inverse si vous voulez eviter les problemes de performances.<br />
Mon <a href="http://en.oreilly.com/mysql2010/public/schedule/grid/2010-04-13">programme</a> de la journee:</p>
<p>Les keynotes:</p>
<ul>
<li>State of the Dolphin Edward Screven (Oracle Corporation)</li>
<li>O&#8217;Reilly Radar Tim O&#8217;Reilly (O&#8217;Reilly Media, Inc.)</li>
<li>MySQL at Facebook Mark Callaghan (Facebook)</li>
</ul>
<p>Les sessions:</p>
<ul>
<li>MySQL in the Cloud &#8211; Endless Possibilities   Grant McAlister (Amazon.com)</li>
<li>Parallel MySQL Import and Export to Hadoop   Aaron Kimball (Cloudera)</li>
<li>Nokia VShards in the Cloud: Voldemort Key-Value Database With MySQL High Performance Persistent Store (Alex Esterkin) </li>
<li>Introduction to InnoDB Monitoring System and Resource &#038; Performance Tuning  ( Jimmy Yang)</li>
<li>Optimizing MySQL Stored Routines   Roland Bouman (XCDSQL Solutions)</li>
<li>Linux Performance Tuning and Stabilization Tips (Yoshinori)</li>
</ul>
<p>Je reviendrai plus en details sur ces sessions par la suite. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/04/14/tutorial-et-jour-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>dbnewz: 2007 &#8211; 2010</title>
		<link>http://www.dbnewz.com/2010/03/25/dbnewz-2007-2010/</link>
		<comments>http://www.dbnewz.com/2010/03/25/dbnewz-2007-2010/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 18:01:12 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
				<category><![CDATA[DBNewz]]></category>
		<category><![CDATA[User Conference 2010]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=538</guid>
		<description><![CDATA[Le premier billet poste sur DBNewz fut pour ma premiere conference MySQL en Californie en 2007. Je me souviens avoir achete le nom de domaine en 2006 a cette intention. Et depuis que de rencontres, &#8230;  Un grand merci a Arnaud et Stephane rencontres aussi a la conference pour m avoir aide a continuer [...]]]></description>
			<content:encoded><![CDATA[<p>Le premier billet poste sur DBNewz fut pour ma premiere<a href="http://en.oreilly.com/mysql2010/"> conference MySQL</a> en Californie en 2007. Je me souviens avoir achete le nom de domaine en 2006 a cette intention. Et depuis que de rencontres, &#8230;  Un grand merci a Arnaud et Stephane rencontres aussi a la conference pour m avoir aide a continuer cette aventure&#8230;<br />
Tout cela pour dire que la conference MySQL s approche a grand pas et que cette annee va avoir une saveur un peu speciale&#8230;</p>
<ul>
<li>2007: la decouverte, l aventure MySQL</li>
<li>2008: SUN achete MySQL</li>
<li>2009: Oracle annonce le rachat de SUN et donc de MySQL, l&#8217;ogre a mange le petit?</li>
<li>2010: La premiere conference sous l ere Oracle.</li>
</ul>
<p>Je ne sais pas encore quel va etre mon programme de la semaine, mais le lundi je vais suivre &laquo;&nbsp;MySQL Cluster Tutorial&nbsp;&raquo;&#8230; il serait temps <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Comme d&#8217;habitude depuis 2007, DBNewz sera present pour vous faire suivre les actualites de la conference. Restez branches !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/03/25/dbnewz-2007-2010/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Trois pdf de &#171;&#160;MySQL 5, Audit et optimisation&#160;&#187; à télécharger</title>
		<link>http://www.dbnewz.com/2010/03/24/trois-pdf-de-mysql-5-audit-et-optimisation-a-telecharger/</link>
		<comments>http://www.dbnewz.com/2010/03/24/trois-pdf-de-mysql-5-audit-et-optimisation-a-telecharger/#comments</comments>
		<pubDate>Wed, 24 Mar 2010 17:02:48 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
				<category><![CDATA[5.0]]></category>
		<category><![CDATA[DBNewz]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=521</guid>
		<description><![CDATA[Comme promis, voici quelques fichiers pdf du livre &#171;&#160;MySQL 5, Audit et optimisation&#160;&#187;.
Vous trouverez ici-même le sommaire et l&#8217;avant-propos. Le premier chapitre (&#171;&#160;Gérer une situation d&#8217;urgence avec MySQL&#160;&#187;), est disponible sur le blog d&#8217;Olivier.
Le livre sort ce jeudi en librairie, fnac.com, eyrolles.com, amazon.fr&#8230;
Bonne lecture !
]]></description>
			<content:encoded><![CDATA[<p>Comme <a href="http://www.dbnewz.com/2010/03/23/sortie-imminente-de-mysql-5-audit-et-optimisation/" target="_blank">promis</a>, voici quelques fichiers pdf du livre &laquo;&nbsp;MySQL 5, Audit et optimisation&nbsp;&raquo;.</p>
<p>Vous trouverez ici-même le <a href="http://www.dbnewz.com/wp-content/uploads/2010/03/tdm_mysql5_audit_optimisation.pdf">sommaire </a>et <a href="http://www.dbnewz.com/wp-content/uploads/2010/03/avant_propos_mysql5_audit_optimisation.pdf">l&#8217;avant-propos</a>. Le <a href="http://dasini.net/blog/2010/03/24/extraits-du-livre-audit-et-optimisation-%E2%80%93-mysql-5/" target="_blank">premier chapitre</a> (&laquo;&nbsp;Gérer une situation d&#8217;urgence avec MySQL&nbsp;&raquo;), est disponible sur le blog d&#8217;Olivier.</p>
<p>Le livre sort ce jeudi en librairie, <a href="http://livre.fnac.com/a2766870/Pascal-Borghino-Audit-et-optimisation-MySQL-5" target="_blank">fnac.com</a>, <a href="http://www.eyrolles.com/Informatique/Livre/audit-et-optimisation-mysql-5-9782212126341" target="_blank">eyrolles.com</a>, <a href="http://www.amazon.fr/Audit-optimisation-MySQL-pratiques-ladministrateur/dp/2212126344/" target="_blank">amazon.fr</a>&#8230;</p>
<p>Bonne lecture !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/03/24/trois-pdf-de-mysql-5-audit-et-optimisation-a-telecharger/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sortie imminente de &#171;&#160;MySQL 5, Audit et optimisation&#160;&#187;</title>
		<link>http://www.dbnewz.com/2010/03/23/sortie-imminente-de-mysql-5-audit-et-optimisation/</link>
		<comments>http://www.dbnewz.com/2010/03/23/sortie-imminente-de-mysql-5-audit-et-optimisation/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 22:09:55 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
				<category><![CDATA[5.0]]></category>
		<category><![CDATA[DBNewz]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=508</guid>
		<description><![CDATA[Vous l&#8217;avez remarqué, depuis quelques mois dbnewz n&#8217;est plus aussi régulièrement mis à jour. A qui la faute ? Probablement à l&#8217;ouvrage que nous (Pascal Borghino, Olivier Dasini, Arnaud Gadal) avons rédigé récemment. La charge de travail nécessaire à la rédaction de &#171;&#160;MySQL 5, audit et optimisation&#160;&#187;, un ouvrage rédigé en plus de nos activités [...]]]></description>
			<content:encoded><![CDATA[<p>Vous l&#8217;avez remarqué, depuis quelques mois dbnewz n&#8217;est plus aussi régulièrement mis à jour. A qui la faute ? Probablement à l&#8217;ouvrage que nous (Pascal Borghino, <a href="http://dasini.net/blog/" target="_blank">Olivier Dasini</a>, Arnaud Gadal) avons rédigé récemment. La charge de travail nécessaire à la rédaction de &laquo;&nbsp;MySQL 5, audit et optimisation&nbsp;&raquo;, un ouvrage rédigé en plus de nos activités professionnelles, a temporairement pris le dessus sur le temps que nous consacrions habituellement au blog.</p>
<div id="attachment_512" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.dbnewz.com/wp-content/uploads/2010/03/couv_audit_optimisation_mysql5.png" target="_blank"><img class="size-medium wp-image-512" title="couv_audit_optimisation_mysql5" src="http://www.dbnewz.com/wp-content/uploads/2010/03/couv_audit_optimisation_mysql5-300x178.png" alt="" width="300" height="178" /></a><p class="wp-caption-text">MySQL 5 Audit et optimisation</p></div>
<p>La rédaction de l&#8217;ouvrage étant maintenant dernière nous, les billets vont pouvoir reprendre à une allure plus digne de ce blog ! Je tiens d&#8217;ailleurs à remercier Stéphane qui a enrichi le site pendant que Pascal et moi étions à 100% sur le livre : l&#8217;intérêt de blogger en équipe&#8230; <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>La date officielle de sortie est le 25 mars. D&#8217;ici là <a href="http://www.dbnewz.com/wp-content/uploads/2010/03/MySQL5_audit_optimisation.pdf">voici le pdf</a> du communiqué de presse concernant l&#8217;ouvrage. Celui-ci était présent en quantité limitée lors du dernier salon Solutions Linux.</p>
<p>Il est d&#8217;ores et déjà disponible en <a href="http://livre.fnac.com/a2766870/Pascal-Borghino-Audit-et-optimisation-MySQL-5" target="_blank">précommande</a>.</p>
<p>Nous posterons ici même d&#8217;ici peu quelques morceaux choisis en pdf issus du livre dès que nous les aurons reçus de notre éditeur, c&#8217;est imminent.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/03/23/sortie-imminente-de-mysql-5-audit-et-optimisation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Modifier le prompt du client mysql</title>
		<link>http://www.dbnewz.com/2010/02/23/modifier-le-prompt-du-client-mysql/</link>
		<comments>http://www.dbnewz.com/2010/02/23/modifier-le-prompt-du-client-mysql/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 10:20:48 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[prompt]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=491</guid>
		<description><![CDATA[Quand on doit intervenir sur plusieurs serveurs simultanément (par exemple pour réparer une réplication qui s&#8217;est plantée), il est pratique d&#8217;avoir une console ouverte sur chaque serveur. Personnellement, j&#8217;aime bien utiliser Terminator, qui évite les problèmes de chevauchement de fenêtres quand plusieurs sessions sont ouvertes en parallèle. Seul petit hic : toutes les consoles affichent [...]]]></description>
			<content:encoded><![CDATA[<p>Quand on doit intervenir sur plusieurs serveurs simultanément (par exemple pour réparer une réplication qui s&#8217;est plantée), il est pratique d&#8217;avoir une console ouverte sur chaque serveur. Personnellement, j&#8217;aime bien utiliser Terminator, qui évite les problèmes de chevauchement de fenêtres quand plusieurs sessions sont ouvertes en parallèle. Seul petit hic : toutes les consoles affichent la même invite (mysql&gt; ), il n&#8217;est donc pas toujours évident de savoir sur quel serveur on se trouve, ce qui augmente le risque de fâcheuse mauvaise manip. Heureusement il est possible de modifier facilement le prompt du client en ligne de commande mysql, c&#8217;est ce que je vous propose de découvrir aujourd&#8217;hui.</p>
<p><span id="more-491"></span></p>
<p>Quand vous ouvrez une console, le prompt est par défaut :<br />
<code><br />
mysql&gt;<br />
</code></p>
<p>Pour le modifier, une première possibilité consiste à utiliser la commande prompt (ou son équivalent \R) suivie d&#8217;une ou plusieurs options. Exemple :<br />
<code><br />
mysql&gt; prompt \u\h<br />
PROMPT set to '\u\h'<br />
rootlocalhost<br />
</code><br />
Ce premier exemple permet d&#8217;indiquer l&#8217;utilisateur connecté ainsi que la machine. C&#8217;est déjà intéressant, mais pas très lisible, puisque tout est collé. Heureusement vous pouvez ajouter n&#8217;importe quels caractères pour séparer les différents champs du prompt. Il sera donc plus lisible de saisir le prompt suivant :<br />
<code><br />
rootlocalhostprompt \u@\h&gt;<br />
PROMPT set to '\u@\h&gt; '<br />
root@localhost&gt;<br />
</code><br />
Notez l&#8217;espace après le &gt;, bien pratique pour séparer le prompt des commandes que vous allez saisir.<br />
Parmi les options très utiles du prompt, en plus de \u et \h, vous avez \v (version du serveur) et \d (base sélectionnée). Les options disponibles sont nombreuses et si vous souhaitez en avoir la liste complète, le mieux est de regarder dans la page de man consacrée à mysql ou de consulter la <a href="http://dev.mysql.com/doc/refman/5.0/fr/mysql-commands.html">documentation en ligne</a>.</p>
<p>Est-il possible de faire en sorte qu&#8217;une telle modification du prompt soit permanente ? Oui ! Et pour cela, il existe plusieurs solutions. La première consiste à enregistrer le prompt dans la variable MYSQL_PS1 :<br />
<code><br />
$ export MYSQL_PS1="\u@\h \d &gt; "<br />
$ mysql -uroot -p<br />
root@localhost (none) &gt;<br />
</code></p>
<p>La seconde solution consiste à saisir le prompt dans la section [mysql] du fichier my.cnf ou my.ini. Dans ce cas, vous devrez penser à doubler les backslash :<br />
<code><br />
[mysql]<br />
prompt = "\\u@\\h \\d &gt; "<br />
</code><br />
Si vous êtes sous Linux, vous pouvez également placer ce même code dans le fichier .my.cnf (dans le HOME de votre utilisateur). Cette solution est intéressante car elle permet d&#8217;obtenir le résultat voulu sans avoir à modifier le fichier global my.cnf, pour lequel vous n&#8217;aurez pas nécessairement les droits de modification.</p>
<p>Notez que si vous êtes un utilisateur de <a href="http://www.dbnewz.com/2008/10/10/15-secondes-pour-installer-une-replication-mysql-avec-mysql-sandbox-pari-tenu/">MySQL Sandbox</a>, le prompt sera automatiquement et intelligemment modifié pour que vous ne soyez pas perdu parmi toutes vos instances. Par exemple, j&#8217;obtiens le prompt suivant en me connectant sur un des nœuds d&#8217;une paire master-master :<br />
<code><br />
$ ./n1<br />
node1 [localhost] {msandbox} ((none)) &gt;<br />
</code></p>
<p>Maintenant, vous n&#8217;aurez plus d&#8217;excuse si vous vous trompez de console &#8230; !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2010/02/23/modifier-le-prompt-du-client-mysql/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
