<?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</title>
	<atom:link href="http://www.dbnewz.com/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, 24 Apr 2013 17:27:33 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Jour 1 &#8211; Percona live</title>
		<link>http://www.dbnewz.com/2013/04/24/jour-1-percona-live/</link>
		<comments>http://www.dbnewz.com/2013/04/24/jour-1-percona-live/#comments</comments>
		<pubDate>Wed, 24 Apr 2013 17:27:33 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
				<category><![CDATA[Percona Live - MySQL conference 2013]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=1028</guid>
		<description><![CDATA[Ma premiere journee a ete a la fois courte et longue. Longue car j ai passe la plupart de mon temps derriere le stand de ma nouvelle boite et courte car je n&#8217;ai pas pu assister a beaucoup de presentations. J&#8217;ai assiste au Keynotes: Our Ever-Evolving MySQL Ecosystem &#8211; Peter Zaitsev (Percona) Databases in the [...]]]></description>
				<content:encoded><![CDATA[<p>Ma premiere journee a ete a la fois courte et longue. Longue car j ai passe la plupart de mon temps derriere le <a href="https://twitter.com/twisitor/status/326819416941674497/photo/1" title="twisitor">stand de ma nouvelle boite</a> et courte car je n&rsquo;ai pas pu assister a beaucoup de presentations.</p>
<p>J&rsquo;ai assiste au Keynotes: </p>
<ul>
<li>Our Ever-Evolving MySQL Ecosystem &#8211; Peter Zaitsev (Percona)</li>
<li>Databases in the Cloud: Present and Future &#8211; Simone Brunozzi (Amazon Web Services)</li>
<li>Driving MySQL Innovation &#8211; Tomas Ulin (Oracle)</li>
</ul>
<p>et a 2 presentations dans l&rsquo;apres midi:</p>
<ul>
<li>Scaling MySQL for the Web &#8211; Tamar Bercovici (Box)</li>
<li>High performance replication &#8211; Domas Mituzas (Facebook)</li>
</ul>
<p>Beaucoup d&rsquo;energie, beaucoup d&rsquo;innovation&#8230; il me semble que l&rsquo;eco system autour de MySQL est plus present que jamais. Je suis heureux de voir l&rsquo;investissement d&rsquo;Oracle, non seulement pour MySQL 5.6 mais aussi pour son investissement dans cette conference 2013. Je mentionnerai aussi le discount ( $700 ) pour MySQL Connect en marge d&rsquo;Oracle Open World.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2013/04/24/jour-1-percona-live/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Avril 2007 &#8211; Avril 2013</title>
		<link>http://www.dbnewz.com/2013/04/23/avril-2007-avril-2013/</link>
		<comments>http://www.dbnewz.com/2013/04/23/avril-2007-avril-2013/#comments</comments>
		<pubDate>Tue, 23 Apr 2013 06:56:50 +0000</pubDate>
		<dc:creator>pébé</dc:creator>
				<category><![CDATA[Percona Live - MySQL conference 2013]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=1023</guid>
		<description><![CDATA[6 ans deja! 6 ans plus tot, je discutais avec Jay Pipes et lui demandais pourquoi platnetmysql.com n&#8217;étais pas disponible en Français. Il m&#8217;avait répondu qu&#8217;il n&#8217;y avait pas de blog en Français et donc pas de flux pour planetmysql&#8230; Que cela ne tienne, dbnewz .com était né&#8230; Avec l&#8217;aide de Lenz Grimmer je traduisis [...]]]></description>
				<content:encoded><![CDATA[<p>6 ans deja! 6 ans plus tot, je discutais avec <a href="http://www.joinfu.com/">Jay Pipes</a> et lui demandais pourquoi platnetmysql.com n&rsquo;étais pas disponible en Français. Il m&rsquo;avait répondu qu&rsquo;il n&rsquo;y avait pas de blog en Français et donc pas de flux pour planetmysql&#8230; Que cela ne tienne, dbnewz .com était né&#8230; Avec l&rsquo;aide de <a href="http://www.lenzg.net/">Lenz Grimmer</a> je traduisis le site et le reste suivi&#8230; Arnaud rejoignit l&rsquo;aventure, puis Stephane&#8230; Je tiens a les remercier pour toujours être presents et actifs.<br />
Personnellement, apres 3 ans dans l&rsquo;ombre, me voila de retour dans le monde merveilleux de MySQL. Je serai present a la conference Percona Live a Santa Clara a partir de demain.<br />
Je vous tiendrai au courant des nouveautes de cette annee! La grosse surprise vient pour moi de <a href="http://www.tokutek.com/products/">TokuDB</a> qui devient OpenSource.</p>
<p>PS: Je m&rsquo;excuse apres de ceux qui ont laisse de commentaires. Le niveau de SPAM étant assez eleve, nous filtrons tous les commentaires et un de nous doit les approuver. Chose que nous ne faisons helas pas souvent! En aucun cas, nous voulons vous empêcher de vous exprimer! </p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2013/04/23/avril-2007-avril-2013/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comprendre son fichier de configuration &#8211; 3è partie</title>
		<link>http://www.dbnewz.com/2012/02/17/comprendre-son-fichier-de-configuration-3e-partie/</link>
		<comments>http://www.dbnewz.com/2012/02/17/comprendre-son-fichier-de-configuration-3e-partie/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 16:15:17 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=1014</guid>
		<description><![CDATA[Dernier volet dans notre série sur la configuration de MySQL, cet article va vous donner les clés pour paramétrer correctement et simplement InnoDB. InnoDB est un moteur extrêmement complexe qui mériterait un livre complet pour expliquer son fonctionnement. Selon les versions, il peut exister plus de 80 paramètres pour contrôler son fonctionnement : pas question [...]]]></description>
				<content:encoded><![CDATA[<p>Dernier volet dans notre série sur la configuration de MySQL, cet article va vous donner les clés pour paramétrer correctement et simplement InnoDB.<span id="more-1014"></span></p>
<p>InnoDB est un moteur extrêmement complexe qui mériterait un livre complet pour expliquer son fonctionnement. Selon les versions, il peut exister plus de 80 paramètres pour contrôler son fonctionnement : pas question de les examiner tous ! Je vais me concentrer sur les 2 principaux, qui devraient suffir dans la majorité des cas.</p>
<p>Le 1er, <code>innodb_buffer_pool_size</code>, contrôle la taille du cache mémoire pour les données et les index. Il s&rsquo;agit assurément du paramètre de base pour obtenir de bonnes performances InnoDB puisqu&rsquo;il vous permet de remplacer de nombreuses lectures ou écritures sur disque par des lectures ou écritures en mémoire. Pour le configurer, c&rsquo;est simple, essayez de mettre la valeur la plus élevée possible&#8230; Evidemment, il faut penser à garder un peu de mémoire pour les connexions, les tables temporaires, les éventuelles tables MyISAM&#8230; et l&rsquo;OS !</p>
<p>Le 2nd, <code>innodb_log_file_size</code>, contrôle la taille des redo logs. A quoi servent ces redo logs en quelques mots ? Pour des raisons de performance, quand un client fait une modification dans une table, InnoDB exécute la modification en mémoire instantanément (dans le fameux buffer pool que nous avons appris à configurer ci-dessus) mais garde pour plus tard l&rsquo;exécution de la modification sur le disque.<br />
Que se passe-t-il si le serveur subit un crash entre le moment où la donnée est écrite en mémoire et le moment où la donnée est écrite sur le disque ? La donnée est perdue tout simplement. Il faut donc un mécanisme supplémentaire pour assurer la persistence des données en cas de crash : ce sont les fameux redo logs. En réalité, au moment où on exécute une modification, InnoDB l&rsquo;exécute en mémoire et la note également dans ses redo logs avant de signaler au client que la modification est bien enregistrée. En cas de crash, la lecture des redo logs va permettre de reconstituer les données qui étaient en mémoire mais pas encore sauvegardées sur le disque.</p>
<p>Quel est l&rsquo;intérêt des redo logs par rapport à une écriture directe dans le fichier de données ? En général, les modifications de données successives ont lieu à des endroits radicalement différents, ce qui se traduit pour le disque par de nombreuses écritures aléatoires, extrêmement lentes. Au contraire, écrire des modifications successives dans les redo logs consiste à écrire chaque modification à la fin du fichier : il s&rsquo;agit là d&rsquo;écritures séquentielles, nettement plus rapides. Au moment de retranscrire le contenu des redo logs vers les tables, InnoDB pourra en profiter pour regrouper les écritures pour les rendre les plus séquentielles possibles. Ce mécanisme permet donc d&rsquo;éviter de nombreuses et coûteuses écritures aléatoires.</p>
<p>Et que se passe-t-il quand les redo logs sont pleins ? Il n&rsquo;est tout simplement plus possible de faire de modifications ! InnoDB tente donc de nettoyer régulièrement ces logs pour qu&rsquo;il reste toujours de la place.</p>
<p>Bref, si vous m&rsquo;avez suivi, les redo logs permettent de gagner en performance en écriture, on a donc tout intérêt à configurer une valeur aussi grande que possible. Cependant, il faut également garder à l&rsquo;esprit qu&rsquo;en cas de crash, les redo logs vont être utilisés pour restaurer les données, et cette restauration sera d&rsquo;autant plus longue que la taille des redo logs sera grande&#8230; Il va donc falloir trouver un compromis entre ces 2 exigences contradictoires.</p>
<p>Baron de Percona a écrit un <a href="http://www.mysqlperformanceblog.com/2008/11/21/how-to-calculate-a-good-innodb-log-file-size/">très bon article</a> sur le sujet. Sans reprendre dans le détail ce qu&rsquo;il explique, le principe de son calcul est de déterminer le volume d&rsquo;écriture en période de pleine charge et de faire en sorte que les redo logs puisse contenir 1 heure d&rsquo;écriture à pleine charge.</p>
<p>J&rsquo;en profite au passage pour vous inciter à la méfiance si vous lisez des articles vous parlant de fixer cette variable à 25% de la taille du buffer pool par exemple. C&rsquo;est faux et d&rsquo;ailleurs bien souvent irréalisable : à part en MySQL 5.6 et sur les versions récentes de Percona Server, la taille des redo logs est limitée à 4 Go. Avec un buffer pool de 32 Go ou plus, difficile de respecter cette &laquo;&nbsp;règle&nbsp;&raquo; des 25 %&#8230;</p>
<p>Je fais une petite parenthèse sur le paramètre <code>innodb_file_per_table</code>. Ce paramètre fait en sorte que les données de chaque table soient stockées dans un tablespace spécifique au lieu du tablespace principal. Il ne faut pas attendre de cette option des gains en performance, mais plutôt en flexibilité : si vous avez 200 Go de données, au lieu d&rsquo;avoir un énorme fichier ibdata de 200 Go, vous aurez autant de fichiers que de tables. De plus, si jamais vous supprimez une table, le tablespace spécifique à la table sera supprimé et vous récupérerez l&rsquo;espace disque correspondant, ce qui ne sera jamais le cas si vous stockez toutes vos données dans le tablespace principal.</p>
<p>A noter que Percona a mis en ligne <a href="http://tools.percona.com/wizard">un outil</a> vous permettant d&rsquo;obtenir un fichier de configuration basique (c&rsquo;est-à-dire sans doute pas optimisé au micro-poil près, mais en tout cas sans grossière erreur pouvant coûter très cher).</p>
<p>Et voilà ! En configurant correctement ces 2 paramètres, vous aurez réalisé l&rsquo;essentiel du paramétrage d&rsquo;InnoDB ! Evidemment, ensuite, il est possible d&rsquo;aller un peu plus loin en jouant sur d&rsquo;autres paramètres comme <code>innodb_flush_log_at_trx_commit</code> ou <code>innodb_flush_method</code>. Mais ce sera peut-être pour un prochain article !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2012/02/17/comprendre-son-fichier-de-configuration-3e-partie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meetup MySQL le 1er février à Paris</title>
		<link>http://www.dbnewz.com/2012/01/31/meetup-mysql-le-1er-fevrier-a-paris/</link>
		<comments>http://www.dbnewz.com/2012/01/31/meetup-mysql-le-1er-fevrier-a-paris/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 16:03:38 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[meetings]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=1011</guid>
		<description><![CDATA[A l&#8217;initiative de SkySQL et LeMug.fr, Colin Charles de Monty Program viendra nous parler de MariaDB demain mercredi 1er février au Patricks Irish Pub à Paris à partir de 18h. Si vous souhaitez en connaître un peu plus sur ce fork de MySQL, n&#8217;hésitez pas ! Plus d&#8217;infos sur la page officiellle]]></description>
				<content:encoded><![CDATA[<p>A l&rsquo;initiative de SkySQL et LeMug.fr, Colin Charles de Monty Program viendra nous parler de MariaDB demain mercredi 1er février au Patricks Irish Pub à Paris à partir de 18h. Si vous souhaitez en connaître un peu plus sur ce fork de MySQL, n&rsquo;hésitez pas !<br />
Plus d&rsquo;infos sur <a href="http://www.lemug.fr/2012/01-fevrier-2012-meetup-mariadb/">la page officiellle</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2012/01/31/meetup-mysql-le-1er-fevrier-a-paris/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comprendre son fichier de configuration &#8211; 2ème partie</title>
		<link>http://www.dbnewz.com/2011/12/22/comprendre-son-fichier-de-configuration-2eme-partie/</link>
		<comments>http://www.dbnewz.com/2011/12/22/comprendre-son-fichier-de-configuration-2eme-partie/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 15:33:54 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=1005</guid>
		<description><![CDATA[Pour notre deuxième volet sur les points les plus importants à regarder lors de la configuration d&#8217;un serveur MySQL, nous allons nous occuper du cache de requêtes, de la réplication et de la journalisation. En route ! Cache de requêtes Le cache de requêtes est une excellente idée des années 90 pour accélérer les performances [...]]]></description>
				<content:encoded><![CDATA[<p>Pour notre deuxième volet sur les points les plus importants à regarder lors de la configuration d&rsquo;un serveur MySQL, nous allons nous occuper du cache de requêtes, de la réplication et de la journalisation. En route !<span id="more-1005"></span></p>
<h3>Cache de requêtes</h3>
<p>Le cache de requêtes est une excellente idée des années 90 pour accélérer les performances des SELECT. Malheureusement ce cache n&rsquo;est absolument pas scalable en terme de connexions simultanées, ce qui signifie que dans 99,9% des cas, les performances seront meilleures quand le cache est désactivée.</p>
<p>Par conséquent, le tuning du cache de requêtes est très simple, il vous suffit d&rsquo;indiquer dans votre fichier de configuration :<br />
<code>query_cache = 0</code></p>
<p>Pour les plus curieux, sachez que la désactivation du cache de requêtes n&rsquo;empêche pas le serveur d&rsquo;utiliser la mutex d&rsquo;accès au cache de requêtes : même désactivé, le cache de requêtes peut diminuer vos performances !! Dans Percona Server et MySQL 5.5, <code>query_cache = 0</code> désactive également cette mutex, mais pour les versions antérieures, il vous faudra recompiler le serveur sans support du cache de requêtes pour vous débarasser de cette mutex.</p>
<h3>Réplication</h3>
<p>La réplication est tellement utile qu&rsquo;il est difficile de s&rsquo;en passer : scale-out, haute disponibilité, aide aux backups, slaves dédiés pour les statistiques&#8230; la liste des applications est longue !</p>
<p>Sur toutes les instances impliquées dans un schéma de réplication, il faut absolument que chaque instance ait un <code>server-id</code> unique. Si vous utilisez un système de déploiement de configuration, pensez à faire en sorte que le système de déploiement génère lui-même un id qui soit garanti comme étant unique.</p>
<p>Sur le master, il faut également activer le paramètre <code>log_bin</code> pour mettre en route les logs binaires nécessaires à la réplication (et qui sont aussi utiles pour le Point In Time Recovery), par exemple :<br />
<code>log_bin = /data/mysql-bin</code></p>
<p>Le serveur s&rsquo;occupe tout seul de numéroter les fichiers et d&rsquo;en faire la rotation. A ce propos, il peut être pratique de forcer la rotation quand le fichier atteint une taille plus faible que celle par défaut (1 Go) :<br />
<code>max_binlog_size = 100000000</code><br />
et de purger automatiquement les fichiers au bout d&rsquo;un certain temps :<br />
<code>expire_logs_days        = 7</code></p>
<p>Est également recommandé l&rsquo;option <code>sync_binlog = 1</code> qui assure le flush du log binaire à chaque commit (meilleure assurance contre les pertes de données en cas de crash).</p>
<p>Sur les slaves, il n&rsquo;est en général pas nécessaire d&rsquo;activer les logs binaires, sauf si le slave est lui-même un master. Dans ce cas, il faut penser à ajouter le paramètre <code>log_slave_updates</code>, qui indique au serveur d&rsquo;écrire dans les logs binaires les écritures reçues par la réplication.</p>
<p>La seule autre option vraiment intéressante est <code>read_only = 1</code>, qui empêche tous les utilisateurs n&rsquo;ayant pas le droit <code>SUPER</code> d&rsquo;écrire sur le serveur. Cette option peut éviter des gros problèmes de désynchronisations si accidentellement une application tente d&rsquo;écrire directement sur un slave au lieu d&rsquo;écrire sur le master.</p>
<p>Ne pas oublier également de configurer un compte pour la réplication avec les droits <code>REPLICATION SLAVE</code> et <code>REPLICATION CLIENT</code>.</p>
<h3>Journalisation</h3>
<p>Avoir des traces de ce qui se passe dans le serveur est évidemment une très bonne idée, aussi bien pour résoudre les problèmes que pour prendre des mesures préventives. Il existe avec MySQL 3 types de logs : general log pour l&rsquo;ensemble des connexions et requêtes, slow query log pour les requêtes lentes et error log pour les erreurs et warnings.</p>
<p>Il est préférable d&rsquo;éviter d&rsquo;activer le general log en production, hormis pour des périodes courtes pour investiguer sur un problème précis, car les performances s&rsquo;en ressentent lourdement (et que vous risquez de vous retrouver très vite à court d&rsquo;espace disque). Cela se traduit par :<br />
<code>general_log = OFF</code></p>
<p>Le slow query log est particulièrement utile pour repérer les requêtes les plus coûteuses de votre application. Toutes les requêtes au-delà d&rsquo;un seuil que vous définissez sont écrites et peuvent servir à générer un rapport des requêtes les plus lentes. Une configuration typique est la suivante :<br />
<code>slow_query_log = 1<br />
slow_query_log_file = /var/log/mysql/slow.log<br />
long_query_time = 0.5</code></p>
<p>Enfin le log d&rsquo;erreur devrait être activé, soit par le paramètre <code>log_error</code> soit en écrivant dans syslog, avec le paramètre <code>syslog</code> que vous trouverez généralement dans la section <code>[mysqld_safe]</code>. Sachez que les 2 solutions ont des avantages et des inconvénients, l&rsquo;inconvénient étant toujours que vous risquez de perdre la trace d&rsquo;erreurs à cause de la rotation de votre fichier de log. Vous trouverez plus d&rsquo;informations dans <a href="http://www.dbnewz.com/2010/04/16/le-journal-d-erreurs-de-mysql/">ce billet</a>.</p>
<p>Nous verrons dans le dernier article de cet série les paramètres les plus importants pour InnoDB. D&rsquo;ici là, bonnes fêtes de fin d&rsquo;année !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2011/12/22/comprendre-son-fichier-de-configuration-2eme-partie/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Comprendre son fichier de configuration &#8211; 1ère partie</title>
		<link>http://www.dbnewz.com/2011/12/16/comprendre-son-fichier-de-configuration-1ere-partie/</link>
		<comments>http://www.dbnewz.com/2011/12/16/comprendre-son-fichier-de-configuration-1ere-partie/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 15:26:31 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=993</guid>
		<description><![CDATA[Des outils tels que mysql tuning primer ou mysqltuner proposent de vous aider à configurer correctement votre serveur MySQL. Il est vrai qu&#8217;il est facile de se perdre dans la profusion d&#8217;options disponibles. Pourtant les recommendations de ces outils sont bien souvent complètement absurdes ! Il est bien plus fiable de connaître les grandes lignes [...]]]></description>
				<content:encoded><![CDATA[<p>Des outils tels que mysql tuning primer ou mysqltuner proposent de vous aider à configurer correctement votre serveur MySQL. Il est vrai qu&rsquo;il est facile de se perdre dans la profusion d&rsquo;options disponibles. Pourtant les recommendations de ces outils sont bien souvent complètement absurdes ! Il est bien plus fiable de connaître les grandes lignes de la configuration du serveur pour obtenir rapidement un paramétrage correct. Je vous propose dans cette série d&rsquo;articles de faire le tour des principales variables à regarder.<span id="more-993"></span></p>
<p><code>bind-address</code><br />
Cette variable permet les connexions TCP à l&rsquo;adresse IP indiquée. C&rsquo;est la 1ère variable à regarder si vous constatez un problème d&rsquo;accès et que les droits de l&rsquo;utilisateur sont corrects.<br />
En général, on utilise cette variable de 2 manières :<br />
- <code>bind-address = 127.0.0.1</code> pour n&rsquo;autoriser que les connexions TCP en local<br />
- en commentant la variable pour n&rsquo;avoir aucune restriction</p>
<p>A noter qu&rsquo;il n&rsquo;est (malheureusement) pas possible d&rsquo;indiquer une liste d&rsquo;adresses IP pour restreindre les connexions TCP à plusieurs hôtes, dans ce cas, il faut passer par des règles de firewalls.</p>
<p><code>skip-name-resolve</code><br />
Lorsqu&rsquo;un client se connecte au serveur, celui-ci fait 2 requêtes DNS. Le DNS pouvant être lent, c&rsquo;est souvent une bonne idée d&rsquo;utiliser cette variable pour désactiver complètement les requêtes DNS. Seule conséquence contraignante : le champ host des utilisateurs ne peut plus être un nom de domaine, mais uniquement une adresse IP (vous pouvez continuer à utiliser les wildcards, par exemple 192.168.%).</p>
<p><code>max_connections</code><br />
C&rsquo;est la variable qui contrôle le nombre de connexions simultanées au serveur. Si vous voyez régulièrement des erreurs &lsquo;<code>Too many connections</code>&lsquo; lorsque des clients essaient de se connecter, il s&rsquo;agit de la variable à regarder, la valeur par défaut (100 ou 150 selon les versions) pouvant être trop faible selon le type d&rsquo;applications.</p>
<p>A noter qu&rsquo;il n&rsquo;est pas conseillé de mettre systématiquement cette variable à un nombre très élevé, puisque plus le nombre de connexions simultanées est élevé, plus le serveur risque d&rsquo;être sujet à des problèmes de contentions internes et risque d&rsquo;être peu performant. Parfois un trop grand nombre de connexions simultanées cache un problème de conception dans l&rsquo;application.</p>
<p>A noter également que même quand le nombre de connexions ouvertes a atteint max_connections, il est toujours possible de se connecter au serveur avec un utilisateur qui dispose du droit <code>SUPER</code>. Le but est de pouvoir faire des <code>SHOW PROCESSLIST</code> pour comprendre ce qu&rsquo;il se passe (et éventuellement quelques <code>KILL</code> bien sentis&#8230;).</p>
<p><code>datadir</code><br />
Il s&rsquo;agit de l&rsquo;emplacement du répertoire de données. Vous n&rsquo;avez pas besoin de le changer si votre volumétrie de données reste dans la gamme des centaines de Mo ou moins, mais dès que vous prévoyez d&rsquo;atteindre des tailles conséquentes, il est plus que conseillé d&rsquo;indiquer un répertoire se trouvant dans une partition où l&rsquo;espace disque est suffisant.</p>
<p><code>old_passwords</code><br />
Avant la version 4.1, MySQL utilisait une méthode de cryptage des mots de passe très faible, toujours disponible sur les versions actuelles quand on active ce fameux paramètre (<code>old_passwords = 1</code>).</p>
<p>En général, on trouve ce fameux paramètre sur de vielles applications &laquo;&nbsp;parce qu&rsquo;on ne va pas s&rsquo;amuser à changer tous les mauvais de passe même si on sait que ce serait mieux&nbsp;&raquo;.</p>
<p>En réalité, même quand on désactive ce paramètre, un client est toujours capable de se connecter lorsque son mot de passe est crypté avec l&rsquo;ancienne méthode. Il n&rsquo;y a donc que des avantages à désactiver <code>old_passwords</code>, sauf si bien sûr vous utilisez encore des librairies ne connaissant que l&rsquo;ancien cryptage (ce qui devrait être hautement improbable, le changement dans MySQL datant de 2004 !).</p>
<p>Quelques autres variables intéressantes<br />
Selon les cas, il peut aussi être pertinent de regarder du côté des variables suivantes : <code>thread_cache_size</code>, <code>tmp_table_size</code>, <code>max_heap_table_size</code>, <code>table_definition_cache</code>, <code>table_open_cache</code>.</p>
<p>Je signale également un cas particulier : <code>sort_buffer_size</code>. Vous avez tout intérêt à la laisser à sa valeur par défaut et donc à la commenter si vous la trouvez dans un fichier de configuration. Pour la petite histoire, j&rsquo;ai mis fin aux crashes aléatoires d&rsquo;un serveur en commentant simplement cette petite variable. Le scénario était le suivant avant cette modification : sort_buffer_size = 512M + plusieurs requêtes simultanées avec des gros tris =&gt; la RAM vient à manquer =&gt; OOM killer se met en route et tue mysqld&#8230;</p>
<p>Dans le prochain épisode, nous verrons les variables les plus importantes concernant le cache de requêtes, la réplication et les journaux.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2011/12/16/comprendre-son-fichier-de-configuration-1ere-partie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Meetup Viadeo/LeMug.fr le 16 novembre</title>
		<link>http://www.dbnewz.com/2011/11/03/meetup-viadeolemug-fr-le-16-novembre/</link>
		<comments>http://www.dbnewz.com/2011/11/03/meetup-viadeolemug-fr-le-16-novembre/#comments</comments>
		<pubDate>Thu, 03 Nov 2011 15:59:42 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[lemug.fr]]></category>
		<category><![CDATA[meetings]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=989</guid>
		<description><![CDATA[Notre ami Olivier organise le mercredi 16 novembre 2011 une rencontre autour de MySQL dans les locaux de Viadeo à Paris. Si vous êtes disponible ce jour-là, n&#8217;hésitez pas à vous inscrire et à venir nous dire bonjour ! Le programme de la rencontre est déjà disponible, n&#8217;oubliez pas de vous inscrire si vous comptez [...]]]></description>
				<content:encoded><![CDATA[<p>Notre ami <a href="http://dasini.net/blog">Olivier</a> organise le mercredi 16 novembre 2011 une rencontre autour de MySQL dans les locaux de Viadeo à Paris. Si vous êtes disponible ce jour-là, n&rsquo;hésitez pas à vous inscrire et à venir nous dire bonjour !<span id="more-989"></span></p>
<p>Le programme de la rencontre est déjà <a href="http://www.viadeo.com/fr/event/006201xckh927216/meetup-mysql-viadeo-lemug.fr">disponible</a>, n&rsquo;oubliez pas de vous inscrire si vous comptez venir, le nombre de places étant limité.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2011/11/03/meetup-viadeolemug-fr-le-16-novembre/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Discount code pour Percona Live London</title>
		<link>http://www.dbnewz.com/2011/10/07/discount-code-pour-percona-live-london/</link>
		<comments>http://www.dbnewz.com/2011/10/07/discount-code-pour-percona-live-london/#comments</comments>
		<pubDate>Fri, 07 Oct 2011 13:01:25 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[actu]]></category>
		<category><![CDATA[percona]]></category>
		<category><![CDATA[Percona Live]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=983</guid>
		<description><![CDATA[Percona Live est une série de conférences 100% techniques autour de MySQL, organisées par Percona. La prochaine conférence aura lieu à Londres les 24 et 25 octobre et pour tous ceux qui souhaiteraient y assister, dbnewz vous propose un tarif réduit ! Voici le code magique qui vous donnera droit à une réduction de 40£ [...]]]></description>
				<content:encoded><![CDATA[<p>Percona Live est une série de conférences 100% techniques autour de MySQL, organisées par Percona. La prochaine conférence aura lieu à Londres les 24 et 25 octobre et pour tous ceux qui souhaiteraient y assister, dbnewz vous propose un tarif réduit !<span id="more-983"></span></p>
<p>Voici le code magique qui vous donnera droit à une réduction de 40£ : <strong>come-c-talk</strong>, que vous pourrez saisir en vous <a href="http://www.eventbrite.com/event/1909670877">enregistrant</a>.</p>
<p>Pour plus d&rsquo;informations sur Percona Live, vous pouvez aller voir le <a href="http://www.percona.com/live/london-2011">site</a>, et surtout le <a href="http://www.percona.com/live/london-2011/schedule-conference">programme</a>.<br />
Enfin, vous pouvez vous inscrire au groupe <a href="http://www.linkedin.com/groups/Percona-Live-London-2011-For-4094253">LinkedIn</a> créé pour l&rsquo;occasion par notre ami <a href="http://www.mysqlplus.fr">Cédric</a>.</p>
<p>See you there!</p>
<p>PS : promis, dans le prochain post, vous trouverez plus de technique et moins de liens !!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2011/10/07/discount-code-pour-percona-live-london/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL et ses messages d&#8217;erreur</title>
		<link>http://www.dbnewz.com/2011/09/13/mysql-et-ses-messages-derreur/</link>
		<comments>http://www.dbnewz.com/2011/09/13/mysql-et-ses-messages-derreur/#comments</comments>
		<pubDate>Tue, 13 Sep 2011 14:16:04 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[erreur]]></category>
		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=972</guid>
		<description><![CDATA[Je suis en généralement plutôt content de MySQL : c&#8217;est simple et stable, ça fonctionne bien. Mais il reste encore du travail pour que les messages d&#8217;erreur soient explicites. Petit résumé d&#8217;une frayeur causée par un message d&#8217;erreur approximatif. Une de mes tables a une tendance marquée à la fragmentation, ce qui a pour conséquence [...]]]></description>
				<content:encoded><![CDATA[<p>Je suis en généralement plutôt content de MySQL : c&rsquo;est simple et stable, ça fonctionne bien. Mais il reste encore du travail pour que les messages d&rsquo;erreur soient explicites. Petit résumé d&rsquo;une frayeur causée par un message d&rsquo;erreur approximatif.<br />
<span id="more-972"></span></p>
<p>Une de mes tables a une tendance marquée à la fragmentation, ce qui a pour conséquence de faire gonfler artificiellement sa taille et de faire baisser les performances de certaines requêtes. Je dois donc de temps à autre la défragmenter. Pas de problème : je commence par regarder la taille sur le disque du fichier .ibd (il s&rsquo;agit d&rsquo;une table InnoDB sur un serveur pour lequel innodb_file_per_table est activé). Quand la table est défragmentée, elle fait environ 8 Go :<br />
<code><br />
# cd /data/mysql/main_revshare<br />
# du -sh bris_statistic_video.ibd<br />
11G	bris_statistic_video.ibd<br />
</code><br />
Pas de doute, une séance de défragmentation s&rsquo;impose. Je me connecte donc au serveur MySQL pour exécuter un OPTIMIZE TABLE :<br />
<code><br />
mysql&gt; OPTIMIZE TABLE bris_statistic_video\G<br />
******** 1. row ********<br />
   Table: dailymotion.bris_statistic_video<br />
      Op: optimize<br />
Msg_type: Error<br />
Msg_text: Table 'dailymotion.bris_statistic_video' doesn't exist<br />
******** 2. row ********<br />
   Table: dailymotion.bris_statistic_video<br />
      Op: optimize<br />
Msg_type: error<br />
Msg_text: Corrupt<br />
</code><br />
Et là, c&rsquo;est le drame ! Quoi, ma table est corrompue ? Impossible, l&rsquo;application fonctionne toujours et la table est utilisée partout !</p>
<p>Comment sortir de ce problème : redémarrer le serveur en espérant qu&rsquo;InnoDB répare la table, récupérer un backup ? En fait non, il faut simplement rester calme et bien regarder le message : si à la 2ème ligne, MySQL nous annonce que la table est corrompue, à la 1ère MySQL nous annonce que la table n&rsquo;existe pas &#8230; alors que nous avons vu que le fichier .ibd existe bien. Louche cette histoire !</p>
<p>Un tour dans le journal d&rsquo;erreurs confirme bien qu&rsquo;il n&rsquo;existe aucune erreur : il doit donc y avoir une erreur avec la commande OPTIMIZE. Réfléchissons, réfléchissons &#8230; ça y est : j&rsquo;ai exécuté la commande OPTIMIZE dans la base main alors que ma table se trouve dans la base main_revshare. Il suffit donc de se positionner dans main_revshare et de relancer l&rsquo;OPTIMIZE, avec succès cette fois.</p>
<p>Moralité : Mieux vaut se méfier des messages d&rsquo;erreurs qui ne vous sont pas familiers et bien réfléchir à la cause de l&rsquo;erreur avant de se lancer dans la correction d&rsquo;un problème qui n&rsquo;existe peut-être pas !</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2011/09/13/mysql-et-ses-messages-derreur/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Méthodes de suppression des index inutiles</title>
		<link>http://www.dbnewz.com/2011/09/05/methodes-de-suppression-des-index-inutiles/</link>
		<comments>http://www.dbnewz.com/2011/09/05/methodes-de-suppression-des-index-inutiles/#comments</comments>
		<pubDate>Mon, 05 Sep 2011 15:59:32 +0000</pubDate>
		<dc:creator>stephane</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[log]]></category>
		<category><![CDATA[maatkit]]></category>
		<category><![CDATA[pratique]]></category>

		<guid isPermaLink="false">http://www.dbnewz.com/?p=916</guid>
		<description><![CDATA[Les vacances étant terminées, nous allons boucler notre tour de vue des index inutiles en voyant quels outils vont nous aider à découvrir les index qui peuvent être supprimés. Le dernier article présentait en effet des indications qui fonctionnent généralement bien mais qui ont l&#8217;inconvénient de demander beaucoup de travail manuel et de laisser de [...]]]></description>
				<content:encoded><![CDATA[<p>Les vacances étant terminées, nous allons boucler notre tour de vue des index inutiles en voyant quels outils vont nous aider à découvrir les index qui peuvent être supprimés. Le dernier article présentait en effet des indications qui fonctionnent généralement bien mais qui ont l&rsquo;inconvénient de demander beaucoup de travail manuel et de laisser de côté tout un pan d&rsquo;index qui peuvent être inutiles : ceux qui ne sont pas en doublon ni redondants, qui n&rsquo;ont pas une cardinalité faible mais qui ne sont tout simplement pas utilisés par l&rsquo;application.<br />
<span id="more-916"></span></p>
<h3>Idée générale</h3>
<p>Si vous avez bien lu l&rsquo;article précédent, vous avez probablement remarqué que la principale difficulté est qu&rsquo;il n&rsquo;existe quasiment jamais de règle absolue permettant de savoir à coup sûr qu&rsquo;un index est inutile (exception notable : les index en doublon repérés par mk-duplicate-key-checker et qui peuvent être supprimés dans 99% des cas sans problème). Finalement, la seule méthode qui semble marcher est la suivante :<br />
- Récupérer les requêtes exécutées sur le serveur<br />
- Regarder le plan d&rsquo;exécution de ces requêtes pour voir les index utilisés<br />
- Comparer avec le schéma des tables pour en déduire les index non utilisés<br />
- Supprimer les index repérés<br />
La difficulté se situe surtout dans la 2ème étape (construire la liste des index utilisés à partir du plan d&rsquo;exécution). Heureusement il existe au moins 2 manières, en fonction de votre version de MySQL, pour réussir cette étape.</p>
<h3>Index_statistics</h3>
<p>Les heureux utilisateurs de MariaDB ou Percona Server ont la chance d&rsquo;avoir userstats v2, un patch exceptionnel développé à l&rsquo;origine par Google. Ce patch ajoute un nombre incalculable de statistiques sur les utilisateurs, les tables mais aussi, ce qui nous intéresse ici, les index. Pour activer la fonctionnalité, il suffit de changer une variable :<br />
<code>mysql&gt; SET GLOBAL userstat_running = 1;</code></p>
<p>A partir de ce moment, la table <code>INDEX_STATISTICS</code> de la base <code>INFORMATION_SCHEMA</code> va se remplir. Les colonnes sont très simples à comprendre : <code>TABLE_SCHEMA</code>, <code>TABLE_NAME</code> et <code>INDEX_NAME</code> localisent l&rsquo;index et <code>ROWS_READ</code> donne le nombre de lignes lues dans l&rsquo;index. Evidemment, pour obtenir des statistiques significatives et fiables, il faut attendre suffisamment longtemps avant de consulter le contenu de la table. Une bonne question est de savoir ce que signifie &laquo;&nbsp;suffisamment longtemps&nbsp;&raquo; : disons qu&rsquo;il faut que chaque requête potentielle de l&rsquo;application ait pu être exécutée, en pensant bien aux requêtes rares telles que les requêtes faites dans des cronjobs par exemple.</p>
<p>Un petit exemple sur des données réelles ?<br />
<code><br />
mysql&gt; SELECT * FROM INFORMATION_SCHEMA.INDEX_STATISTICS WHERE TABLE_NAME='main';<br />
+--------------+------------+------------+-----------+<br />
| TABLE_SCHEMA | TABLE_NAME | INDEX_NAME               | ROWS_READ  |<br />
+--------------+------------+------------+-----------+<br />
| biz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      | user_id&nbsp;&nbsp;&nbsp;        |  231751890 |<br />
| biz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      | created&nbsp;&nbsp;&nbsp;                  |    4456658&nbsp;&nbsp; |<br />
| biz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| PRIMARY&nbsp;&nbsp;&nbsp;&nbsp;| 1748023896&nbsp;|<br />
| biz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;| main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      | modified_idx&nbsp;&nbsp;&nbsp; |  266636148 |<br />
| biz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  | main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;      | mobile_idx&nbsp;&nbsp;&nbsp; |        550 |<br />
+--------------+------------+---------------+------------+<br />
</code><br />
et voyons en parallèle le schéma de la table :<br />
<code><br />
mysql&gt; SHOW CREATE TABLE main\G<br />
********* 1. row *********<br />
Table: main<br />
Create Table: CREATE TABLE main (<br />
&nbsp;&nbsp;...<br />
&nbsp;&nbsp;PRIMARY KEY (main_id),<br />
&nbsp;&nbsp;KEY user_id (user_id),<br />
&nbsp;&nbsp;KEY created (created),<br />
&nbsp;&nbsp;KEY language_idx (language),<br />
&nbsp;&nbsp;KEY mobile_idx (mobile,deleted,web,published),<br />
&nbsp;&nbsp;KEY country_mobile_idx (country,mobile),<br />
&nbsp;&nbsp;KEY modified_idx (modified)<br />
) ENGINE=InnoDB;<br />
</code><br />
Qu&rsquo;en déduit-on ? En premier lieu, que les index language_idx et country_mobile_idx ne sont jamais utilisés, ils ne servent donc à rien et peuvent être supprimés. Ensuite, en comparant les chiffres, on voit que le serveur a lu 1,7 milliards de lignes dans la clé primaire, 550 dans l&rsquo;index mobile_idx : aucun doute mobile_idx ne sert à rien lui non plus !</p>
<p>Et voilà, de manière très simple, nous avons trouvé des index qui peuvent être supprimés.<br />
On peut même automatiser la découverte des index non utilisée <a href="http://www.mysqlperformanceblog.com/2008/09/12/unused-indexes-by-single-query/">avec une petite requête qui va bien</a>.</p>
<p>Quelles sont les limitations de cette méthode ? Très simple, autant les index qui ne sont jamais utilisés sont visibles immédiatement, autant on peut se poser la question de la pertinence de certains index. Et malheureusement, les chiffres donnés par la table INDEX_STATISTICS ne sont pas suffisants. Exemple : l&rsquo;index created affiche un nombre de lignes lues environ 500 fois plus faibles que la clé primaire : cela signifie-t-il qu&rsquo;il n&rsquo;est pas très utile ou qu&rsquo;au contraire il est très utile mais seulement sur certaines requêtes ?</p>
<h3>mk-index-usage</h3>
<p>Quand on ne dispose de userstats, la seule solution consiste à collecter toutes les requêtes pendant une période suffisamment longue, par exemple en mettant <code>long_query_time</code> à 0 pour que toutes les requêtes aboutissent dans le slow query log, et à se tourner vers Maatkit en espérant y trouver notre bonheur. Ca tombe bien, <code>mk-index-usage</code> est justement un outil lisant un fichier de log et délivrant de nombreuses informations intéressantes (en déterminant en particulier le plan d&rsquo;exécution des requêtes).</p>
<p>Par défaut, <code>mk-index-usage</code> prend en entrée un fichier de log au format slow query log et affiche une liste de requêtes SQL pour supprimer les index inutiles :<br />
<code><br />
$ mk-index-usage slow.log<br />
slow.log:   5% 08:28 remain<br />
slow.log:  11% 07:20 remain<br />
slow.log:  14% 08:36 remain<br />
...<br />
slow.log:  93% 00:37 remain<br />
slow.log:  97% 00:12 remain<br />
</code><br />
ALTER TABLE `main`.`adfit` DROP KEY `status`; &#8212; type:non-unique<br />
&#8230;<br />
ALTER TABLE `main`.`biz` DROP KEY `created`, DROP KEY `modified_idx`; &#8212; type:non-unique<br />
</code><br />
Surprise ! Le script a bien identifié modified_idx comme inutile, mais pas mobile_idx. Et il a décidé que created pouvait être supprimé alors que nous avons vu que ce n'était pas forcément évident.</p>
<p>Comme d'habitude avec Maatkit, si vous êtes curieux et que vous lisez la documentation, vous verrez qu'il existe une multitude d'options permettant d'obtenir bien plus d'informations sur l'usage des index sur votre plate-forme. De plus, cette méthode est compatible avec toutes les versions de MySQL</p>
<h3>Conclusion</h3>
<p>Les deux méthodes présentées ici peuvent vous faire gagner beaucoup de temps en vous aidant à identifier les index candidats à la suppression. Bien entendu, comme souvent, il ne serait pas très prudent de faire confiance aveuglément à un script pour gérer votre plate-forme : votre travail consistera à vérifier s'il faut effectivement enlever les index qui sont susceptibles d'être supprimés. Normalement, ce type d'index ne devrait représenter qu'une petite portion des index de votre application, le gain de temps sera donc appréciable.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.dbnewz.com/2011/09/05/methodes-de-suppression-des-index-inutiles/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
