<?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; outils</title>
	<atom:link href="http://www.dbnewz.com/tag/outils/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>Securich &#8211; Darren Cassar</title>
		<link>http://www.dbnewz.com/2009/08/23/securich-darren-cassar/</link>
		<comments>http://www.dbnewz.com/2009/08/23/securich-darren-cassar/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 12:36:12 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[5.1]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OpenSQLCamp]]></category>
		<category><![CDATA[outils]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=349</guid>
		<description><![CDATA[Darren s&#8217;est occupé récemment d&#8217;une migration de Sybase vers MySQL. Et il s&#8217;est aperçu à cette occasion que la gestion des utilisateurs sous MySQL n&#8217;est pas sans défaut. Par exemple, il n&#8217;est pas possible de créer des rôles, il n&#8217;est pas possible de donner à un utilisateur des droits sur toutes les tables sauf une, [...]]]></description>
			<content:encoded><![CDATA[<p>Darren s&#8217;est occupé récemment d&#8217;une migration de Sybase vers MySQL. Et il s&#8217;est aperçu à cette occasion que la gestion des utilisateurs sous MySQL n&#8217;est pas sans défaut. Par exemple, il n&#8217;est pas possible de créer des rôles, il n&#8217;est pas possible de donner à un utilisateur des droits sur toutes les tables sauf une, il n&#8217;est pas possible de connaître le degré de complexité d&#8217;un mot de passe&#8230;</p>
<p>Pour essayer de pallier à tous ces défauts, Darren a créé un outil : <a href="http://www.securich.com">Securich,</a> installable sur tout serveur MySQL 5.1. Cet outil permet, à l&#8217;aide d&#8217;appels à des procédures stockées, de manipuler les utilisateurs et leurs droits. Attention tout de même, le développement de Securich a commencé il y a peu de temps et le code est encore expérimental. Il reste pas mal de fonctionnalités que Darren voudrait implémenter et quelques bugs gênants : par exemple, si vous installez Securich sur un serveur contenant des utilisateurs, Securich va effacer tous les utilisateurs sans vous en avertir&#8230;</p>
<p>L&#8217;initiative est en tout cas intéressante car il reste effectivement pas mal de travail pour que MySQL présente autant de fonctionnalités sur les utilisateurs et les droits que d&#8217;autres produits.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2009/08/23/securich-darren-cassar/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>MySQL Sandbox 3 &#8211; Giuseppe Maxia</title>
		<link>http://www.dbnewz.com/2009/08/23/mysql-sandbox-3-giuseppe-maxia/</link>
		<comments>http://www.dbnewz.com/2009/08/23/mysql-sandbox-3-giuseppe-maxia/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 09:43:07 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OpenSQLCamp]]></category>
		<category><![CDATA[outils]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=342</guid>
		<description><![CDATA[Nous avons tous régulièrement besoin de monter rapidement un ou plusieurs serveurs MySQL pour tester telle ou telle fonctionnalité. Et évidemment, c&#8217;est toujours quand on veut aller vite qu&#8217;on fait des erreurs et qu&#8217;on se retrouve avec des serveurs qui ne démarrent pas. MySQL Sandbox a été créée pour nous aider dans cette situation. Giuseppe [...]]]></description>
			<content:encoded><![CDATA[<p>Nous avons tous régulièrement besoin de monter rapidement un ou plusieurs serveurs MySQL pour tester telle ou telle fonctionnalité. Et évidemment, c&#8217;est toujours quand on veut aller vite qu&#8217;on fait des erreurs et qu&#8217;on se retrouve avec des serveurs qui ne démarrent pas. MySQL Sandbox a été créée pour nous aider dans cette situation. Giuseppe s&#8217;est en effet trouvé de nombreuses fois dans la situation où il perdait énormément de temps à monter des environnements jetables et il a imaginé un script permettant d&#8217;automatiser cette création d&#8217;environnements jetables.</p>
<p>Sans entrer dans le détail des commandes (voir pour cela <a href="https://launchpad.net/mysql-sandbox">la page sur Launchpad</a>), MySQL Sandbox permet de créer en une ligne de commande des environnements complets et variés : un serveur, plusieurs serveurs indépendants, un maître-plusieurs esclaves&#8230;Il est même possible de créer, toujours en une seule ligne, une réplication circulaire entre N serveurs ! Le script permet également de démarrer, arrêter, effacer chacun des serveurs ainsi créés ou de faire une opération pour tous les serveurs à la fois.</p>
<p>Ca faisait un moment que je voulais prendre un peu de temps pour voir ce qu&#8217;il était possible de faire avec MySQL Sandbox, maintenant c&#8217;est sûr : je vais m&#8217;y mettre !</p>
<p>A voir également sur le sujet : <a href="http://www.dbnewz.com/2008/10/10/15-secondes-pour-installer-une-replication-mysql-avec-mysql-sandbox-pari-tenu/">un précédent article d&#8217;Arnaud</a>, sur dbnewz bien sûr !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2009/08/23/mysql-sandbox-3-giuseppe-maxia/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>15 secondes pour installer une réplication MySQL avec MySQL Sandbox, pari tenu ?</title>
		<link>http://www.dbnewz.com/2008/10/10/15-secondes-pour-installer-une-replication-mysql-avec-mysql-sandbox-pari-tenu/</link>
		<comments>http://www.dbnewz.com/2008/10/10/15-secondes-pour-installer-une-replication-mysql-avec-mysql-sandbox-pari-tenu/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 07:08:28 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
				<category><![CDATA[4.0]]></category>
		<category><![CDATA[4.1]]></category>
		<category><![CDATA[5.0]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[réplication]]></category>
		<category><![CDATA[outils]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=75</guid>
		<description><![CDATA[&#171;&#160;Installez-moi une configuration MySQL composée d&#8217;un master et deux slaves, vous avez 15 secondes. Top chrono&#160;&#187;&#8230;
Non, ça n&#8217;est pas la dernière énigme à la mode pour rentrer chez Google mais plutôt une question qui pourrait devenir presque banale pour un entretien d&#8217;embauche pour un DBA MySQL à l&#8217;avenir, qui sait ?
Face à un tel défi, [...]]]></description>
			<content:encoded><![CDATA[<p>&laquo;&nbsp;Installez-moi une configuration MySQL composée d&#8217;un master et deux slaves, vous avez 15 secondes. Top chrono&nbsp;&raquo;&#8230;</p>
<p>Non, ça n&#8217;est pas la dernière énigme à la mode pour rentrer chez Google mais plutôt une question qui pourrait devenir presque banale pour un entretien d&#8217;embauche pour un DBA MySQL à l&#8217;avenir, qui sait ?</p>
<p>Face à un tel défi, trois solutions :</p>
<p>- La fuite (mais faites une croix sur la &laquo;&nbsp;recommandation&nbsp;&raquo; Linkedin)<br />
- Le kernel panic<br />
- MySQL Sandbox !</p>
<p>Bien vu, MySQL Sandbox est la réponse la plus stratégique pour la poursuite de votre carrière.</p>
<p>Giuseppe Maxia (dont le blog figure dans notre blogroll, allez y jeter un oeil) est l&#8217;auteur de cet outil vraiment très pratique.  Que propose t-il ?</p>
<p>L&#8217;idée est d&#8217;automatiser l&#8217;installation de plusieurs serveurs MySQL sur une même machine. Rien que nous ne puissions faire manuellement c&#8217;est vrai, cependant la procédure habituelle consistant à ne pas mélanger les répertoires d&#8217;installation, choisir un port différent par serveur, appliquer <a href="http://www.dbnewz.com/2008/07/14/mysql_secure_installation-pratique-mais-non-parametrable/" target="_blank">mysql_secure_installation</a>&#8230; Tout cela gagnerait à être automatisé non ? De plus ces installations manuelles sont potentiellement sources d&#8217;erreurs.</p>
<p>MySQL Sandbox est compatible avec toutes les versions MySQL de la 3.23 à la 6.0. Les différentes installations effectuées sont indépendantes les unes des autres, on peut ainsi faire cohabiter sans risque de conflits plusieurs versions différentes de MySQL sur une même machine (ports, répertoires et sockets indépendants).</p>
<p>En plus d&#8217;automatiser ces processus d&#8217;installation (gain de temps), MySQL Sandbox ne s&#8217;arrête pas là et  propose également des commandes très simples pour gérer les serveurs une fois installés.</p>
<p>Concernant le gain de temps, son auteur promet (notamment en page 2 de cette <a href="http://datacharmer.org/presentations/mysqluniv_2008/sandbox_2_0.html" target="_blank">présentation</a>) l&#8217;installation d&#8217;une réplication MySQL en 15 secondes. Info ou intox ?</p>
<p><span id="more-75"></span></p>
<p><strong>Installation et pré-requis<br />
</strong></p>
<p>Pour fonctionner MySQL Sandbox n&#8217;a besoin que des binaries des versions que vous souhaitez installer.</p>
<p>L&#8217;installation est très rapide :</p>
<p>Après avoir téléchargé <a href="https://launchpad.net/mysql-sandbox" target="_blank">MySQL Sandbox</a>, il suffit de le décompresser dans le répertoire de votre choix :</p>
<p>debian:/opt# tar xzvf mysql_sandbox_2.0.11.tar.gz</p>
<p>On remarque alors que différentes commandes sont à notre disposition, plutôt explicites :</p>
<p><code>-rwxr-xr-x 1 501 staff  6154 2008-10-05 07:42 <strong>make_multiple_custom_sandbox</strong><br />
-rwxr-xr-x 1 501 staff  9062 2008-10-05 07:42 <strong>make_multiple_sandbox</strong><br />
-rwxr-xr-x 1 501 staff 12180 2008-10-05 07:42 <strong>make_replication_sandbox</strong><br />
-rwxr-xr-x 1 501 staff  5786 2008-10-05 07:42 <strong>make_sandbox</strong></code></p>
<p>make_sandbox : installe un serveur MySQL simple<br />
make_replication_sandbox : installe une réplication (par défaut un master, 2 slaves)<br />
make_multiple_sandbox : pour installer plusieurs serveurs identiques<br />
make_multiple_custom_sandbox : permet d&#8217;installer plusieurs serveurs de versions différentes</p>
<p><strong>Installer une réplication</strong></p>
<p>Une fois le <a href="http://dev.mysql.com/downloads/" target="_blank">binary récupéré</a>, nous utilisons la commande <strong>make_replication_sandbox</strong> pour obtenir un master et deux slaves. Elle prend en paramètre le tar.gz du binary (d&#8217;autres raccourcis sont possibles, je vous renvoie au fichier README de l&#8217;outil).</p>
<p><code>debian:/opt/mysql_sandbox_2.0.11# ./make_replication_sandbox /opt/mysql-5.0.67-linux-i686-glibc23.tar.gz</code></p>
<p>La sortie écran donne ceci :<br />
installing and starting master<br />
installing slave 1<br />
installing slave 2<br />
starting slave 1<br />
. sandbox server started<br />
starting slave 2<br />
.. sandbox server started<br />
initializing slave 1<br />
initializing slave 2<br />
replication directory installed on /root/sandboxes/rsandbox_5_0_67</p>
<p>C&#8217;est fait ! L&#8217;installation en elle-même a duré un peu plus de 15 secondes, disons que les lignes de commande à taper tiennent dans ce laps de temps&#8230;</p>
<p>Par défaut les &laquo;&nbsp;bacs à sable&nbsp;&raquo; installés par MySQL Sandbox se placent dans $HOME/sandboxes/. Dans le cadre de notre réplication, celle-ci a été installée ici : debian:~/sandboxes/rsandbox_5_0_67#</p>
<p>Notre réplication est d&#8217;ores et déjà fonctionnelle, on peut le vérifier en se connectant par exemple au slave numero 2 (faites un ps-ef | grep mysql pour afficher rapidement les noms/localisations des sockets par ex)</p>
<p>debian:/home/user# mysql &#8211;socket=/tmp/mysql_sandbox29473.sock -p</p>
<p>Le password par défaut est &laquo;&nbsp;msandbox&nbsp;&raquo;.</p>
<p>mysql&gt; show slave status\G<br />
Slave_IO_State: Waiting for master to send event<br />
Master_Host: 127.0.0.1<br />
Master_User: msandbox<br />
Master_Port: 29472<br />
Connect_Retry: 60<br />
Master_Log_File: mysql-bin.000001<br />
Read_Master_Log_Pos: 628<br />
Relay_Log_File: mysql_sandbox29473-relay-bin.000002<br />
Relay_Log_Pos: 765<br />
Relay_Master_Log_File: mysql-bin.000001<br />
<strong>Slave_IO_Running: Yes<br />
Slave_SQL_Running: Yes</strong></p>
<p>La réplication fonctionne, le pari est tenu !</p>
<p><strong>Les autres commandes disponibles</strong></p>
<p>Evoquées plus haut les commandes make_multiple_custom_sandbox, make_multiple_sandbox, make_sandbox et make_replication_sandbox vous permettent d&#8217;installer différentes topologies de serveurs MySQL, du master-master au groupe de serveurs aux versions identiques ou pas.</p>
<p>Exemple, pour installer la version MySQL 5.1.28 sur la même machine que notre réplication précédente :</p>
<p>debian:/opt/mysql_sandbox_2.0.11# ./make_sandbox /opt/mysql-5.1.28-rc-linux-i686-glibc23.tar.gz</p>
<p>Résultat :</p>
<p>&laquo;&nbsp;Your sandbox server was installed in /root/sandboxes/msb_5_1_28.&nbsp;&raquo;, simple non ?</p>
<p>D&#8217;autres commandes existent pour gérer votre installation :</p>
<p><strong>start, restart, stop, clear</strong>&#8230; un suffixe &laquo;&nbsp;_all&nbsp;&raquo; pour les réplications vient s&#8217;ajouter aux commandes précédentes, ex &laquo;&nbsp;<strong>stop_all</strong>&laquo;&nbsp;.</p>
<p>&laquo;&nbsp;m&nbsp;&raquo; est le raccourci de master, &laquo;&nbsp;s1&#8243;, &laquo;&nbsp;s2&#8243;, etc concernent les slaves.</p>
<p>Ainsi pour arrêter totalement notre configuration de réplication précédente, on effectue :</p>
<p>debian:~/sandboxes/rsandbox_5_0_67# ./stop_all</p>
<p>A l&#8217;écran :</p>
<p>executing &laquo;&nbsp;stop&nbsp;&raquo; on slave 1<br />
executing &laquo;&nbsp;stop&nbsp;&raquo; on slave 2<br />
executing &laquo;&nbsp;stop&nbsp;&raquo; on master</p>
<p>Comme vous le voyez, MySQL Sandbox est très simple d&#8217;emploi.</p>
<p>Pour aller plus loin je vous conseille vivement la lecture (c&#8217;est rapide) du <a href="http://forge.mysql.com/wiki/MySQL_Sandbox" target="_blank">wiki</a> de l&#8217;outil. Il reprend en fait le fichier README. Clair et concis vous y trouverez certainement votre bonheur : grâce à MySQL Sandbox, tester une nouvelle version de MySQL devient un jeu d&#8217;enfant.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/10/10/15-secondes-pour-installer-une-replication-mysql-avec-mysql-sandbox-pari-tenu/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>mysql_secure_installation, utile mais non paramétrable</title>
		<link>http://www.dbnewz.com/2008/07/14/mysql_secure_installation-pratique-mais-non-parametrable/</link>
		<comments>http://www.dbnewz.com/2008/07/14/mysql_secure_installation-pratique-mais-non-parametrable/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 12:39:35 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[outils]]></category>
		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=57</guid>
		<description><![CDATA[Je n&#8217;avais pas prévu d&#8217;écrire un billet sur mysql_secure_installation, c&#8217;est en préparant le prochain article (installation du cluster MySQL) que m&#8217;est venue l&#8217;idée d&#8217;écrire quelques lignes sur le sujet.  Ce script, présent dans le répertoire &#171;&#160;bin&#160;&#187; de votre installation de MySQL, a pour but de &#171;&#160;sécuriser&#160;&#187; votre base une fois celle-ci installée. Il vous [...]]]></description>
			<content:encoded><![CDATA[<p>Je n&#8217;avais pas prévu d&#8217;écrire un billet sur <a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-secure-installation.html" target="_blank">mysql_secure_installation</a>, c&#8217;est en préparant le prochain article (<a href="http://www.dbnewz.com/2008/07/18/installation-du-mysql-cluster/" target="_blank">installation du cluster MySQL</a>) que m&#8217;est venue l&#8217;idée d&#8217;écrire quelques lignes sur le sujet.<br id="cxeg" /> <br id="cxeg0" /> Ce script, présent dans le répertoire &laquo;&nbsp;bin&nbsp;&raquo; de votre installation de MySQL, a pour but de &laquo;&nbsp;sécuriser&nbsp;&raquo; votre base une fois celle-ci installée. Il vous est d&#8217;ailleurs conseillé de l&#8217;exécuter une fois mysql_install_db lancé ou à défaut de passer par mysqladmin pour au moins modifier le mot de passe associé à l&#8217;utilisateur &laquo;&nbsp;root&nbsp;&raquo;.<br id="cxeg1" /> <br id="o49h" /> Lors de l&#8217;installation du cluster, je pars du principe qu&#8217;un autre serveur MySQL est susceptible de tourner sur le SQL node, je choisis donc d&#8217;opter pour un port différent de celui assigné par défaut au serveur MySQL (3306). Je m&#8217;aperçois alors que je n&#8217;ai aucun moyen de faire pointer mysql_secure_installation vers mon serveur MySQL en 3307, le script pointant automatiquement vers le port par défaut&#8230;<br id="lnfv" /> <br id="lnfv0" /> Face à ce problème, au moins deux solutions, taper manuellement les requêtes automatisées de mysql_secure_installation, ou modifier le script.</p>
<p><span id="more-57"></span><strong>Fonctionnement du script</strong><br id="heg51" /> <br id="heg52" /> Rien de plus simple que d&#8217;aller fouiller dans les entrailles de mysql_secure_installation puisque c&#8217;est un script shell.<br id="heg53" /> En quelques mots, le script ne supporte aucune option et construit son propre my.cnf temporaire qu&#8217;il va ensuite passer en paramètre au client mysql :</p>
<p><code>mysql --defaults-file=fichier_my.cnf_temporaire</code><br id="f5s.0" /> <br id="f5s.1" /> Le script utilise donc le client mysql pour passer ses requêtes. Les seules lignes que comptent ce my.cnf temporaire sont les suivantes, elles sont inscrites dans le fichier dès lors que vous fournissez le mot de passe root :<br id="i3jv" /> <br id="i3jv0" /> <code># mysql_secure_installation config file<br id="y:zz" /> [mysql]<br id="y:zz0" /> user=root<br id="y:zz1" /> password=xxxxxxxx</code><br id="y:zz2" /> <br id="i6v9" /> C&#8217;est tout !<br id="l.5h" /> <br id="l.5h0" /> Dans un tel cas, le comportement de mysql par défaut sous unix est tout simplement de chercher à se connecter au port 3306 d&#8217;un serveur localhost au travers d&#8217;une socket. Impossible donc de demander à mysql_secure_installation de se connecter à un serveur distant ou de tenter la connexion sur un autre port&#8230;<br id="r_:i" /> <br id="r_:i0" /> Ce manque d&#8217;options disponibles ne date pas d&#8217;hier et a déjà fait l&#8217;objet <a href="http://bugs.mysql.com/bug.php?id=27671" target="_blank">d&#8217;une remontée de &laquo;&nbsp;bug</a>&laquo;&nbsp;, transformée en &laquo;&nbsp;feature request&nbsp;&raquo; puisqu&#8217;en effet il s&#8217;agit plutôt de cela.</p>
<p><a href="http://lists.mysql.com/commits/27214" target="_blank">Un patch</a> a été proposé par Daniel Fischer, en charge du &laquo;&nbsp;bug&nbsp;&raquo; chez MySQL, il permet de configurer le port et la socket.</p>
<p>A des fins de tests j&#8217;avais pour ma part simplement rajouté quelques lignes dans mysql_secure_installation. D&#8217;abord au tout début du script :</p>
<p><code># Assigne l'ip et le port à partir des 1er et 2nd paramètres, ex :<br />
# mysql_secure_installation 127.0.0.1 3307<br />
cmd_line_ip="$1"<br id="w2cz0" />cmd_line_port="$2"</code></p>
<p>Puis dans la fonction make_config() qui construit le my.cnf temporaire :</p>
<p><code>make_config() {<br />
echo "# mysql_secure_installation config file" &gt;$config<br />
echo "[mysql]" &gt;&gt;$config<br />
echo "user=root" &gt;&gt;$config<br />
echo "password=$rootpass" &gt;&gt;$config<br />
<strong>if [ $# == 2 ]; then<br />
echo "host=$cmd_line_ip" &gt;&gt;$config<br />
echo "port=$cmd_line_port" &gt;&gt;$config<br />
fi</strong><br />
}</code><br />
<br id="i6v90" /> Une fois généré le my.cnf ressemble à ceci :</p>
<p><code># mysql_secure_installation config file<br id="y:zz" /> [mysql]<br id="y:zz0" /> user=root<br id="y:zz1" /> password=xxxxxxxx<br />
host = 127.0.0.1<br />
port = 3307</code><br id="sq9t" /> <br id="sq9t0" /> Grâce à ces deux options supplémentaires, le client mysql se connecte par TCP et le port est pris en compte, j&#8217;ai donc pu faire &laquo;&nbsp;pointer&nbsp;&raquo; mysql_secure_installation vers mon serveur MySQL (3307).</p>
<p>Autre façon de faire, tout simplement taper manuellement les requêtes effectuées quasi automatiquement par mysql_secure_installation.</p>
<p><strong>Les requêtes concernées</strong></p>
<p>Voici les requêtes effectuées par mysql_secure_installation :</p>
<p>// Met à jour le password de l&#8217;utilisateur root :<br />
<code>UPDATE mysql.user SET Password=PASSWORD('xxxxxxxx') WHERE User='root';</code><br id="b6yq" /></p>
<p>// Supprime les utilisateurs anonymes<br id="iu:n" /><code>DELETE FROM mysql.user WHERE User='';</code></p>
<p>// Supprime la possibilité à un utilisateur root de se connecter à partir d&#8217;un serveur distant<br id="b6yq0" /><code>DELETE FROM mysql.user WHERE User='root' AND Host!='localhost'</code><br id="v4vz" /></p>
<p>// Supprime la base de données test<br />
<code>DROP DATABASE test;</code></p>
<p>// Supprime les privilèges associés à la base test<br id="v4vz0" />DELETE FROM mysql.db WHERE Db=&#8217;test&#8217; OR Db=&#8217;test_%&#8217;<br id="i8k2" /></p>
<p>// Applique les changements effectués précedemment concernant la gestion des droits<br />
<code>FLUSH PRIVILEGES</code><br id="tx3h" /></p>
<p>Il existe d&#8217;autres façons de faire, comme par exemple utiliser mysqladmin :</p>
<p><code>mysqladmin -u root password 'new-password'</code></p>
<p>De même, pour modifier le password d&#8217;un utilisateur, plutôt que de mettre à jour directement les tables systèmes de mysql, il est conseillé de passer par <a href="http://dev.mysql.com/doc/refman/4.1/en/passwords.html" target="_blank">les commandes suivantes :</a></p>
<p><code>mysql&gt; SET PASSWORD FOR 'jeffrey'@'%' = PASSWORD('biscuit');<br />
ou<br />
mysql&gt; GRANT USAGE ON *.* TO 'jeffrey'@'%' IDENTIFIED BY 'biscuit';</code></p>
<p>La commande FLUSH PRIVILEGES est alors inutile.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/07/14/mysql_secure_installation-pratique-mais-non-parametrable/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>mysqlslap et supersmack, deux outils de benchmark pour MySQL</title>
		<link>http://www.dbnewz.com/2008/07/07/mysqlslap-et-supersmack-deux-outils-de-benchmark-pour-mysql/</link>
		<comments>http://www.dbnewz.com/2008/07/07/mysqlslap-et-supersmack-deux-outils-de-benchmark-pour-mysql/#comments</comments>
		<pubDate>Sun, 06 Jul 2008 22:34:40 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[outils]]></category>
		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=53</guid>
		<description><![CDATA[Il est parfois reproché au serveur MySQL de ne pas fournir suffisamment d&#8217;outils de benchmark / profiling concernant les requêtes ou le fonctionnement du serveur lui-même. Des commandes telles que SHOW STATUS (affiche l&#8217;état du serveur à un instant t), ou bien encore EXPLAIN (plan d&#8217;exécution de la requête SQL) permettent néanmoins d&#8217;obtenir de précieuses [...]]]></description>
			<content:encoded><![CDATA[<p>Il est parfois reproché au serveur MySQL de ne pas fournir suffisamment d&#8217;outils de benchmark / profiling concernant les requêtes ou le fonctionnement du serveur lui-même. Des commandes telles que SHOW STATUS (affiche l&#8217;état du serveur à un instant t), ou bien encore EXPLAIN (plan d&#8217;exécution de la requête SQL) permettent néanmoins d&#8217;obtenir de précieuses informations.<br id="jh97" /><br id="jh970" />Ceci étant dit, comment s&#8217;assurer que son serveur MySQL tiendra la charge ? 1000 requêtes /s en insertion sont prévues le jour de la sortie de votre prochain service internet : votre serveur sera t-il capable d&#8217;y faire face  ?<br id="yaxj" /><br id="eh-g0" />Les deux outils présentés aujourd&#8217;hui permettent de simuler la charge reçue par le serveur MySQL en fonction de différentes paramètres dont le nombre de connexions simultanées et le nombre de requêtes par utilisateurs. Avec de tels outils, vous pouvez par exemple tester mysqlslap sur une de vos requêtes clé, visualiser comment celle-ci réagit sous différentes configurations, et visualiser un &laquo;&nbsp;score&nbsp;&raquo; à base de temps d&#8217;exécution. Une fois ce &laquo;&nbsp;score&nbsp;&raquo; récupéré, comparez-le avec celui que vous obtiendriez avec la même requête modifiée par vos soins, avez-vous progressé ?<br id="eh-g1" /><span id="more-53"></span><br id="eh-g2" /><strong>mysqlslap</strong><br id="eh-g3" /><br id="eh-g4" /><a href="http://dev.mysql.com/doc/refman/5.1/en/mysqlslap.html" target="_blank">mysqlslap</a> est un &laquo;&nbsp;client&nbsp;&raquo; du serveur MySQL au même titre que &laquo;&nbsp;mysql&nbsp;&raquo; ou &laquo;&nbsp;mysqladmin&nbsp;&raquo; (autre client). Officiellement disponible depuis la version 5.1.4 de MySQL, il est néanmoins possible de faire fonctionner mysqlslap avec des versions moins avancées. Plusieurs astuces pour cela, <a href="http://forums.mysql.com/read.php?117,186878,187070#msg-187070" target="_blank">en voici une</a>, suivie <a href="http://www.jameslittle.me.uk/mysqlslap-for-mysql-50/" target="_blank">d&#8217;une autre</a>. Il y&#8217;a peut-être encore plus simple : sur ma version d&#8217;ubuntu la version 5.0.51 de MySQL est installée, le binaire de mysqlslap est absent mais il m&#8217;a suffit d&#8217;installer les binaires de la 5.1.25 dans un autre répertoire pour exécuter mysqlslap via le serveur MySQL 5.0.51 en fonctionnement.<br id="uva." /><br id="uva.0" />mysqlslap est très simple d&#8217;utilisation, parmi ses options les plus notables on trouve :<br id="nxm3" /><br id="s1to" /><em>&#8211;auto-generate-sql</em> : mysqlslap peut générer pour vous des requêtes SQL aléatoires. Pratique pour des tests rapides, il vaut mieux néanmoins soumettre vos propres requêtes à mysqlslap.<br id="gvc0" /><em>&#8211;query</em> : permet d&#8217;utiliser vos propres requêtes.<br id="w3mp" /><em>&#8211;concurrency</em> : simule un nombre de clients qui se connectent simultanément.<br id="w3mp0" /><em>&#8211;iterations</em> : &#8230; pour répéter votre test n fois.<br id="huwc" />-<em>-number-of-queries</em> : permet d&#8217;attribuer à chaque client un nombre de requêtes approximatifs.<br id="oy.z" /><em>&#8211;engine</em> : spécifie le moteur de stockage à utiliser lorsque vous laissez mysqlslap générer ses propres requêtes.<br id="u431" /><em>&#8211;csv</em> : pour générer les résultats de vos tests au format csv.<br id="u4310" /><br id="ay-9" />Notes :<br id="ay-90" />- Il est possible de spécifier plusieurs tests à la suite en séparant par une virgule vos valeurs pour les paramètres &laquo;&nbsp;concurrency&nbsp;&raquo;, &laquo;&nbsp;iterations&nbsp;&raquo;, &laquo;&nbsp;engines&nbsp;&raquo;.<br id="ncq4" />- mysqlslap recherche par défaut une base du nom de &laquo;&nbsp;mysqlslap&nbsp;&raquo;, créez là. Ma base mysqlslap étant vide, j&#8217;ai utilisé l&#8217;instruction &laquo;&nbsp;USE world&nbsp;&raquo; afin de ne pas avoir à deplacer mes tables de test existant dans la base &laquo;&nbsp;world&nbsp;&raquo;. Pour des benchmarks plus précis, évitez d&#8217;utiliser cette commande et déplacez vos tables dans la base mysqlslap.<br id="ay-91" /><br id="ncq40" /><strong>mysqlslap en pratique</strong><br id="ncq41" /><br id="ncq42" /><code>undercat@u200:/usr/local/mysql5125$ ./bin/<strong>mysqlslap</strong> --user=mysql --concurrency=200 --number-of-queries=1000 --iterations=10 --query="USE world;SELECT SQL_NO_CACHE ci.name, co.name from City ci, Country co where ci.countrycode = co.code and ci.name like 'c%'"<br />
</code></p>
<p>On obtient :</p>
<p>Benchmark<br id="htov1" /> Average number of seconds to run all queries: 1.121 seconds<br id="htov2" /> Minimum number of seconds to run all queries: 1.015 seconds<br id="htov3" /> Maximum number of seconds to run all queries: 1.265 seconds<br id="htov4" /> Number of clients running queries: 200<br id="htov5" /> Average number of queries per client: 5</p>
<p>Nous avons ici 200 clients concurrents dont on limite le nombre de requêtes à 1000 <strong>au total</strong>, ce qui nous donne environ 5 requêtes par client.</p>
<p>En rajoutant la clause <strong>&#8211;csv</strong> et une concurrence variable :</p>
<p style="text-align: left;"><code>undercat@u200:/usr/local/mysql5125$ ./bin/mysqlslap --user=mysql <strong id="trxr">--csv=/tmp/slap.csv --concurrency=1,10,50,100,200</strong> --iterations=10 </code><code>--query="USE world;SELECT SQL_NO_CACHE ci.name, co.name from City ci, Country co where ci.countrycode = co.code and ci.name like 'c%'"</code></p>
<p>J&#8217;utilise ici SQL_NO_CACHE afin de ne pas placer la requête dans le query cache, ce qui fausserait les tests.<br id="mb:a" /><br id="mb:a0" />L&#8217;option &#8211;csv couplé à openoffice / impress par exemple, permet de créer rapidement un graphique issu de nos tests. Ci-dessous le csv généré et le graphique  :<br id="mb:a1" /><br id="mb:a2" /><code>undercat@u200:/tmp$ cat slap.csv <br id="sz2q" />,mixed,0.002,0.000,0.004,1,1<br id="sz2q0" />,mixed,0.015,0.011,0.027,10,1<br id="sz2q1" />,mixed,0.063,0.061,0.068,50,1<br id="sz2q2" />,mixed,0.133,0.122,0.205,100,1<br id="sz2q3" />,mixed,0.245,0.105,0.298,200,1</code><br id="sz2q4" /><br id="mb:a8" /><a href="http://www.dbnewz.com/wp-content/uploads/2008/07/mysqlslap_csv2.jpg"><img class="alignnone size-medium wp-image-56" title="mysqlslap_csv2" src="http://www.dbnewz.com/wp-content/uploads/2008/07/mysqlslap_csv2.jpg" alt="graphique issu d\'un csv mysqlslap" width="283" height="258" /></a><br id="bebh1" /><br id="bebh2" /><strong>supersmack</strong><br id="sonn" /><br id="sonn0" />Disponible sur <a href="http://vegan.net/tony/supersmack/" target="_blank">http://vegan.net/tony/supersmack/</a>, cet outil n&#8217;évolue plus depuis trois ans mais il reste intéressant ! Initialement développé par Sasha Pachev (un ancien de chez MySQL), puis retouché par plusieurs autre contributeurs dont <a href="http://jeremy.zawodny.com/blog/" target="_blank">Jéremy Zawodny</a>, supersmack est moins intuitif que mysqlslap mais il se rattrape par ailleurs puisqu&#8217;il est plus largement disponible (pas seulement sur MySQL 5) et offre des réglages plus fins. Il est notamment possible de construire dynamiquement une requête à partir d&#8217;un &laquo;&nbsp;dictionnaire&nbsp;&raquo;&#8230; supersmack peut en effet &laquo;&nbsp;piocher&nbsp;&raquo; dans un fichier texte une liste d&#8217;identifiants par exemple, nous verrons comment.<br id="ws5j" /></p>
<p>Note : en plus des avantages suscités, supersmack peut également être interfacé avec PostgreSQL et Oracle.<br id="bn6m" /><br id="bn6m0" /><strong>Installation de supersmack</strong><br id="ozyq" /><br id="bzhh" />Le binaire n&#8217;étant pas distribué avec mysql, nos tests sous supersmack vont nécessiter quelques étapes supplémentaires.</p>
<p>Première étape, récupérer les sources :</p>
<p><code>wget http://vegan.net/tony/supersmack/super-smack-1.3.tar.gz</code><br id="nc4q" /><br id="qpu6" />puis <br id="qpu60" /><br id="zeiu" /><code>./configure --with-mysql=/usr/local/mysql5125</code></p>
<p>A ce stade vous devriez voir s&#8217;afficher ceci :</p>
<p>Building with the following options:<br id="fmco2" /><br id="fmco3" />MySQL Support&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; yes<br id="fmco4" />PostgreSQL Support&#8230;&#8230;&#8230;&#8230;&#8230;. no<br id="fmco5" />Oracle Support&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;.. no</p>
<p>Thanks for using super-smack!</p>
<p>Faites suivre d&#8217;un make, et make install : supersmack devait être opérationnel.</p>
<p>Si ça n&#8217;est pas le cas, veillez à avoir installé les paquets suivants (ubuntu) :</p>
<p>apt-get install libmysqlclient15-dev<br id="zeiu1" />apt-get install build-essential<br id="fmco8" /></p>
<p><strong>supersmack : fonctionnement</strong></p>
<p>Le répertoire /smacks contient deux exemples : select-key.smack et update-select.smack.<br id="fab5" />Prenons comme base le premier fichier et voyons comment le configurer.<br id="vwpr" /><br id="vq9s" />Evoquée en introduction, supersmack dispose d&#8217;une fonctionnalité très pratique dans certains cas, il s&#8217;agit du &laquo;&nbsp;dictionnaire&nbsp;&raquo;. Ce dernier permet de construire des requêtes dynamiques, comme si votre requête était directement issue de votre script. Exemple :<br id="qd-j" /><br id="qd-j0" />SELECT Capital FROM Country WHERE Code = &laquo;&nbsp;$code_pays&nbsp;&raquo;<br id="ybsa" /><br id="ybsa0" />Difficile d&#8217;exécuter une telle requête avec mysqlslap&#8230; Il faudrait s&#8217;arranger pour récupérer le code pays via une jointure mais dans certains cas cette information n&#8217;est tout simplement pas disponible. Il se peut que vous souhaitiez exécuter une série de requête construites dynamiquement à partir d&#8217;informations contenues dans un fichier.<br id="x_tr" /></p>
<p>Construisons à titre d&#8217;exemple un tel dictionnaire à partir de l&#8217;une de nos tables (la fameuse base &laquo;&nbsp;<a href="http://dev.mysql.com/doc/" target="_blank">world</a>&nbsp;&raquo; est encore une fois mise à contribution).<br id="x_tr1" /><br id="x_tr2" /><code>mysql&gt; select distinct(countrycode) into outfile '/tmp/code_pays_pop_under_2M.txt' from City where population &lt; 2000000;</code><br id="x_tr3" /><br id="x_tr4" />On a ainsi exporté dans /tmp/code_pays_under_2M.txt la liste des codes pays qui possèdent des villes inférieures à 2 000 000 d&#8217;habitants. Le fichier contient des lignes stockés sous la forme suivante :</p>
<p>AFG<br id="irua" />NLD<br id="irua0" />ANT<br id="x_tr6" />&#8230;<br id="x_tr7" /><br id="x_tr8" />Notre &laquo;&nbsp;dictionnaire&nbsp;&raquo; désormais construit, supersmack pourra y piocher les informations requises et construire dynamiquement nos requêtes.<br id="jiap" /><br id="jiap0" />Voyons maintenant à quoi ressemble un fichier .smack. Nous partons ici du fichier select-key.smack pour construire un dbnewz.smack allégé pour notre exemple :<br id="oxb10" /></p>
<p><code>//define a dictionary<br id="oxb135" />dictionary "code_pays"<br id="oxb136" />{<br id="oxb137" /> <strong>type </strong>"rand"; // autres valeurs possibles : "seq" ou "unique"<br id="oxb138" /> <strong>source_type</strong> "file"; // nous utiliserons le fichier contenant nos codes pays<br id="oxb139" /> <strong>source </strong>"/tmp/code_pays_pop_under_2M.txt"; // emplacement du fichier "dictionnaire"<br id="oxb140" /> <strong>delim </strong>","; // take the part of the line before ,<br id="oxb141" /> <strong>file_size_equiv</strong> "45000"; // if the file is greater than this<br id="oxb142" />//divide the real file size by this value obtaining N and take every Nth<br id="oxb143" />//line skipping others. This is needed to be able to target a wide key<br id="oxb144" />// range without using up too much memory with test keys<br id="oxb145" />}  <br id="oxb146" /><br id="oxb147" />//define a query<br id="oxb148" />query "find_capital"<br id="oxb149" />{<br id="oxb150" /> <strong>query </strong>"SELECT SQL_NO_CACHE ci.Name, ci.Population<br id="vnv3" />FROM City ci<br id="vnv30" />INNER JOIN Country co ON ci.CountryCode = co.Code<br id="oxb152" />WHERE co.Code = '$code_pays'";<br id="i0rf" /> <strong>type </strong>"req_code_pays"; // libellé de votre requete, permet de s'y retrouver dans les resultats<br id="oxb154" /> <strong>has_result_set</strong> "y"; // On attend des resultats (a la difference d'un UPDATE par ex).<br id="oxb156" /> <strong>parsed </strong>"y"; // signale que supersmack doit construire dynamiquement la requete a partir du dictionnaire<br id="oxb159" />}<br id="oxb160" /><br id="oxb161" />// define database client type<br id="oxb162" />client "dbnewz"<br id="oxb163" />{<br id="oxb164" /> <strong>user </strong>"root"; // connect as this user<br id="oxb165" /> <strong>pass </strong>"XXXXXXX"; // use this password<br id="oxb166" /> <strong>host </strong>"localhost"; // connect to this host<br id="oxb167" /> <strong>db </strong>"world"; // switch to this database<br id="oxb168" /> #<strong>socket</strong> " /var/run/mysqld/mysqld.sock";  // j'utilise ici la valeur de SHOW VARIABLES LIKE 'socket';<br id="oxb170" /> <strong>query_barrel</strong> "1 find_capital"; // Execute 1 fois la requete "find_capital" a chaque iteration.</code><code><br id="oxb172" />}<br id="oxb173" /><br id="oxb174" />main<br id="oxb175" /> {<br id="oxb176" /> dbnewz.init(); // initialize the client<br id="oxb177" /> dbnewz.set_num_rounds($2); // le 2eme argument recu par supersmack est le nombre d'iterations.<br id="oxb179" /> dbnewz.create_threads($1); // permet de definir combien de clients simultanés l'on souhaite.<br id="oxb183" /> dbnewz.connect();<br id="oxb185" /> dbnewz.unload_query_barrel(); // for each client fire the query barrel<br id="oxb189" /> dbnewz.collect_threads();<br id="oxb192" /> dbnewz.disconnect()</code>;<br id="oxb194" /> }<br id="oxb195" /><br id="gkar" />Il est également possible pour supersmack de créer automatiquement les tables dans lesquelles se dérouleront les tests, ouvrez le fichier select-key.smack pour davantage d&#8217;informations, il fournit la syntaxe relative à cette fonctionnalité.<br id="gkar0" /><br id="fxo_" />Nous pouvons désormais lancer le test, ici 50 clients concurrents et 1000 itérations :</p>
<p><code>root@u200:/opt/super-smack-1.3/smacks# super-smack dbnewz.smack 50 1000</code><br id="d0gc1" /><br id="d0gc2" />Query Barrel Report for client dbnewz<br id="fik0" />connect: max=888ms  min=7ms avg= 213ms from 50 clients <br id="fik00" />Query_type    num_queries    max_time    min_time    q_per_s<br id="fik01" />req_code_pays    50000    41    1    1327.08</p>
<p>Nous avons ici obtenu en moyenne 1327 requêtes / seconde pour cette requêtes et 50 clients concurrents entre le début et la fin de nos tests.</p>
<p>Connecté sur le serveur MySQL en question, on observe via un SHOW FULL PROCESSLIST des requêtes du type :</p>
<p><code>SELECT SQL_NO_CACHE ci.Name, ci.Population<br id="ttjr1" />FROM City ci<br id="ttjr2" />INNER JOIN Country co ON ci.CountryCode = co.Code<br id="ttjr3" />WHERE co.Code = 'LKA'</code><br id="ttjr4" /><br id="v:8o" />Le code &#8216;LKA&#8217; a été remplacé par supersmack lui-même, le dictionnaire a donc bien fonctionné.</p>
<p>Vous venez de faire connaissance avec ces deux outils de benchmark (si ça n&#8217;était pas déjà fait), pensez à les utiliser lors de vos prochaines évaluations de performance (serveur / requêtes). Il est en effet toujours appréciable de pouvoir qualifier la situation de départ afin de mesurer l&#8217;étendue des progrès effectués par la suite.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/07/07/mysqlslap-et-supersmack-deux-outils-de-benchmark-pour-mysql/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>DBDesigner 4 : générer son MCD par reverse engineering</title>
		<link>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/</link>
		<comments>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/#comments</comments>
		<pubDate>Sun, 22 Jun 2008 10:54:07 +0000</pubDate>
		<dc:creator>arnaud</dc:creator>
				<category><![CDATA[4.0]]></category>
		<category><![CDATA[4.1]]></category>
		<category><![CDATA[5.0]]></category>
		<category><![CDATA[5.1]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[outils]]></category>
		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=46</guid>
		<description><![CDATA[Disposer d&#8217;un MCD (modèle conceptuel de données) lorsqu&#8217;on travaille sur une requête SQL impliquant différentes tables représente un gain de temps.Il est en effet plus rapide de jeter un coup d&#8217;oeil sur un MCD afin de repérer quels sont les champs qui lient une table à une autre plutôt que d&#8217;enchaîner les &#171;&#160;DESC ma_table&#160;&#187;, puis [...]]]></description>
			<content:encoded><![CDATA[<p>Disposer d&#8217;un MCD (modèle conceptuel de données) lorsqu&#8217;on travaille sur une requête SQL impliquant différentes tables représente un <strong id="tqz_">gain de temps</strong>.<br id="d0eo" />Il est en effet plus rapide de jeter un coup d&#8217;oeil sur un MCD afin de repérer quels sont les champs qui lient une table à une autre plutôt que d&#8217;enchaîner les &laquo;&nbsp;DESC ma_table&nbsp;&raquo;, puis repérer la clé primaire et les éventuelles clés étrangères, et rebolote sur la ou les tables de destination&#8230;<br id="ixuk" /><br id="ixuk0" />La prochaine série d&#8217;articles sur les index MySQL va nous amener à enchaîner quelques requêtes sur une des deux bases d&#8217;exemple disponibles sur le site de MySQL : <a href="http://dev.mysql.com/doc/" target="_blank">world et sakila</a>, le prétexte est donc tout trouvé pour évoquer ici la solution que j&#8217;ai retenu pour obtenir le MCD de ces tables : DBDesigner 4.</p>
<p>Cet outil n&#8217;est pas nouveau, son successeur officiel est même déjà connu, il s&#8217;agit de <a href="http://dev.mysql.com/workbench/" target="_blank">MySQL Workbench</a>. Celui-ci n&#8217;étant pas encore disponible sous linux, nous utiliserons son ancêtre et plus particulièrement sa fonctionnalité de &laquo;&nbsp;reverse engineering&nbsp;&raquo; : une fois connecté à votre base, DBDesigner 4 va générer sous forme graphique vos tables, leurs descriptions, et si tout se passe bien, les relations entre vos tables.</p>
<p><span id="more-46"></span><strong>Installation (fastidieuse) sous linux</strong><br id="m-dl0" /><br id="m-dl1" />L&#8217;installation de DBDesigner 4 sous linux (ubuntu 8.04 pour ma part) n&#8217;est pas de tout repos&#8230; J&#8217;ai rencontré toutes les erreurs potentielles croisées sur les différents tutoriels sur le sujet. Résultat des courses : il apparaît plus simple d&#8217;installer DBDesigner 4 en passant par <a href="http://www.winehq.org/" target="_blank">wine</a>, les <strong>problèmes de librairies manquantes</strong> disparaissent et les polices sont plus travaillées.<br id="swio" />Si néanmoins vous souhaitez vous passer de wine, voici quelques pistes : <a href="http://wiki.splitbrain.org/dbdesigner" target="_blank">http://wiki.splitbrain.org/dbdesigner</a> et un <a href="http://ubuntuforums.org/showthread.php?t=125911" target="_blank">how-to</a> tiré des forums ubuntu. Des solutions sont proposées pour ces fameuses libraries manquantes, cela dit j&#8217;avais toujours des problèmes malgré ces manipulations.<br id="tw3i" /><br id="tw3i0" />Une fois wine installé (<code>apt-get install wine</code>), téléchargez simplement <a href="http://www.fabforce.net/downloads.php" target="_blank">le fichier d&#8217;installation de DBDesigner 4</a> pour windows.</p>
<p>L&#8217;installation s&#8217;effectue simplement :</p>
<p><code>root@u200:/opt# wine DBDesigner4.0.5.6_Setup.exe</code> <br id="lq1_" /><br id="vkpd" />Si vous êtes sous MySQL 5, vous devez <strong>modifier le mot de passe</strong> de l&#8217;utilisateur à partir duquel vous vous connectez à DBDesigner de la façon suivante :<br id="vkpd0" /><br id="lq1_0" />mysql&gt; <code>SET PASSWORD FOR 'dbdesign'@'localhost' = OLD_PASSWORD('dbdesign');</code></p>
<p>Depuis sa version 5, MySQL utilise en effet un mécanisme d&#8217;authentification qui est incompatible avec les versions précédentes (&lt; 4.1). Afin d&#8217;assurer une rétro compatibilité, il est néanmoins possible avec MySQL 5 d&#8217;utiliser la commande &laquo;&nbsp;<a href="http://dev.mysql.com/doc/refman/5.1/en/encryption-functions.html#function_old-password" target="_blank">OLD_PASSWORD</a>&laquo;&nbsp;, le format utilisé pour le mot de passe sera alors compatible avec MySQL 4 (short hash contre long hash pour MySQL 5).<br id="fvds" /><br id="rwen" />Lancement de l&#8217;application:</p>
<p><code>root@u200:~/.wine/drive_c/Program Files/fabFORCE# wine DBDesigner4.exe</code></p>
<p><strong>Obtenir le schéma de sa base</strong></p>
<p>Pour générer votre MCD, et selon votre langue d&#8217;installation :</p>
<p>- Choisissez le menu &laquo;&nbsp;Database&nbsp;&raquo;, puis &laquo;&nbsp;Reverse Engineering&nbsp;&raquo;.</p>
<p>- Selectionnez une connexion à la base de données ou créez la vôtre : &laquo;&nbsp;Localhost 127.0.0.1&#8243; par exemple, puis renseignez vos login/pwd et validez, n&#8217;oubliez pas la commande &laquo;&nbsp;OLD_PASSWORD&nbsp;&raquo; si besoin.</p>
<p>- La fenêtre &laquo;&nbsp;Reverse Engineering&nbsp;&raquo; affiche alors la liste des tables de la base, par défaut elles sont toutes cochées. Remarquez un peu plus bas l&#8217;option &laquo;&nbsp;<a href="http://www.fabforce.net/dbdesigner4/doc/db.html#reveng" target="_blank">Build Relations</a>&laquo;&nbsp;, cochez-là puis indiquez &laquo;&nbsp;Build Relations based on primary keys&nbsp;&raquo;. C&#8217;est grâce à cette option que vous indiquez à DBDesigner de relier vos tables entre elles (si possible).</p>
<p>- Si tout s&#8217;est bien passé, l&#8217;étape suivante affiche vos tables, leurs champs, leurs clés&#8230;</p>
<p><strong>Remarques : </strong></p>
<p>- DBDesigner ne parvient pas à joindre les tables de la base &laquo;&nbsp;world&nbsp;&raquo; entre elles, les noms des clés primaires sont différents et les clés étrangères absentes de la définition des tables (MyISAM), vous pouvez néanmoins rajouter vos différentes relations à la main.</p>
<p>- En ce qui concerne la base &laquo;&nbsp;sakila&nbsp;&raquo; les relations entre les tables sont bien présentes :</p>
<p><a href="http://www.dbnewz.com/wp-content/uploads/2008/06/sakila_db_small.png"><img class="alignnone size-full wp-image-47" title="sakila_db_small" src="http://www.dbnewz.com/wp-content/uploads/2008/06/sakila_db_small.png" alt="Vue partielle de la base sakila après reverse engineering" width="400" height="304" /></a></p>
<p>Vous pouvez à présent d&#8217;un seul coup d&#8217;oeil construire vos requêtes, les jointures entre les tables sont ici évidentes.</p>
<p>- La console dans laquelle vous lancez DBDesigner va peut-être contenir quelques messages d&#8217;erreur du type:</p>
<p><code>QPixmap::operator=: Cannot assign to pixmap during painting<br id="yfb50" />QPopupMenu: (unnamed) Popup has invalid menu item</code></p>
<p>Cela n&#8217;a pas bloqué le comportement de l&#8217;application lors de mes tests cependant DBDesigner a la facheuse tendance à <strong>ouvrir des boites de dialogues sous les fenêtres déjà existantes</strong>, n&#8217;hésitez pas notamment lors de votre connexion à la base, à déplacer vos fenêtres (la principale et celle consacrée au reverse engineering) pour faire apparaître la boîte de dialogue vous invitant à renseigner vos identifiants de connexion. A noter qu&#8217;il existe là aussi des solutions pour régler ce problème de pop-up, cf les tutoriels cités en début d&#8217;article.</p>
<p>Pour explorer les autres fonctionnalités de DBDesigner 4, ou bien encore tester (sous windows uniquement pour le moment) son successeur MySQL Workbench, rendez-vous sur <a href="http://www.fabforce.net/dbdesigner4/" target="_blank">fabforce.net</a>, vous y trouverez les fichiers d&#8217;installation, des captures d&#8217;écran et de la documentation.</p>
<p>Si vous connaissez d&#8217;autres outils intéressants disposant d&#8217;un module de &laquo;&nbsp;reverse engineering&nbsp;&raquo;, partagez-les dans les commentaires, ils sont là pour ça.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2008/06/22/dbdesigner-4-generer-son-mcd-par-reverse-engineering/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DorsalSource</title>
		<link>http://www.dbnewz.com/2007/05/03/dorsalsource/</link>
		<comments>http://www.dbnewz.com/2007/05/03/dorsalsource/#comments</comments>
		<pubDate>Thu, 03 May 2007 06:11:06 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[outils]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2007-05/12-dorsalsource.htm</guid>
		<description><![CDATA[Je ne sais pas vous mais moi, si il y a une chose qui m&#8217;ennuie c&#8217;est bien de recompiler les sources de MySQL à chaque fois que je veux tester un patch. D&#8217;une part il va toujours me manquer quelque chose et de l&#8217;autre je perds un temps fou. La solution à ce problème est [...]]]></description>
			<content:encoded><![CDATA[<p>Je ne sais pas vous mais moi, si il y a une chose qui m&#8217;ennuie c&#8217;est bien de recompiler les sources de MySQL à chaque fois que je veux tester un patch. D&#8217;une part il va toujours me manquer quelque chose et de l&#8217;autre je perds un temps fou. La solution à ce problème est enfin là et s&#8217;appelle <a href="http://dorsalsource.org/" target="_blank">DorsalSource </a>, la nouveauté de mon ami <a href="http://jcole.us/blog/archives/2007/04/25/dorsalsource-mysql-community-build-site-launched/" target="_blank">Jérémy Cole</a> et de l&#8217;équipe <a href="http://www.provenscaling.com/" target="_blank">provenscaling</a> en association avec <a href="http://www.solidtech.com/Solid/" target="_blank">solid</a>.</p>
<p>DorsalSource est une idée qui a germée peu après l&#8217;annonce fin 2006 des versions « communauté » et « entreprise », MySQL ne fournissant plus les binaires aussi souvent pour la version communauté, version pour tout utilisateur sans contrat de support.</p>
<p><span id="more-12"></span></p>
<p>A la conférence MySQL, le projet de collaboration pour satisfaire les besoins de la communauté sur les mises à jour, les patches ou bugfix a été officiellement lancé. DorsalSource. Le jour même 40 versions des binaires 40 pour MAC OS X, Linux et Windows étaient déjà disponibles au téléchargement.</p>
<p>Nous attendons impatiemment les évolutions à venir de DorsalSource ( je ne suis pas encore authorisé à en parler ) et attendant je vais pouvoir faire le malin avec mon tshirt DorsalSource .</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2007/05/03/dorsalsource/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Migration</title>
		<link>http://www.dbnewz.com/2007/04/11/migration/</link>
		<comments>http://www.dbnewz.com/2007/04/11/migration/#comments</comments>
		<pubDate>Wed, 11 Apr 2007 21:08:42 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
				<category><![CDATA[IBMDB2]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[outils]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/2007-04/5-migration.htm</guid>
		<description><![CDATA[Dans ma todo list de cette année, je dois m&#8217;occuper de la migration de bases de données IBM DB2 vers Oracle. Je n&#8217;entrerai pas dans la polémique sur le meilleur SGBD. Pour moi tout dépend de votre budget, de vos data mais aussi du niveau de compétence disponible dans votre équipe.
Je vais devoir regarder un [...]]]></description>
			<content:encoded><![CDATA[<p>Dans ma todo list de cette année, je dois m&#8217;occuper de la migration de bases de données IBM DB2 vers Oracle. Je n&#8217;entrerai pas dans la polémique sur le meilleur SGBD. Pour moi tout dépend de votre budget, de vos data mais aussi du niveau de compétence disponible dans votre équipe.<br />
Je vais devoir regarder un peu plus en détail l&#8217;outil fourni par Oracle, je veux bien évidemment parler de <a href="http://www.oracle.com/technology/tech/migration/workbench/index.html" target="_blank">Oracle Migration Workbench</a></p>
<p>Cet outil est sensé me simplifier la vie pour migrer des bases Sybase, Informix et DB2 vers de l&#8217;Oracle. (Oracle9i et Oracle10g). Il s&#8217;occupe du schéma, des triggers, des procédures stockées. Serait ce l&#8217;outil magique? Bon il n&#8217;est pas encore capable de modifier votre application client si vous utiliser du SQL spécifique à votre SGDB mais qui sait. <img src='http://www.dbnewz.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Premier bémol, il ne semble supporter que du DB2 sous Windows. En 8 ans de carrière je n&#8217;ai encore jamais joué avec des serveurs DB2 sous Windows, de l&#8217;AIX du Linux oui. Pour moi Windows s&#8217;arrête avec MSSQL serveur. La suite de cet aventure pour les mois à venir.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2007/04/11/migration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
