<?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>dasini.net - Journal d'un expert MySQL &#187; Astuce</title>
	<atom:link href="http://dasini.net/blog/category/astuce/feed/" rel="self" type="application/rss+xml" />
	<link>http://dasini.net/blog</link>
	<description>Repousser les frontières de la connaissance</description>
	<lastBuildDate>Thu, 02 Feb 2012 09:06:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Duplicate key causé par un SELECT</title>
		<link>http://dasini.net/blog/2011/08/29/duplicate-key-cause-par-un-select/</link>
		<comments>http://dasini.net/blog/2011/08/29/duplicate-key-cause-par-un-select/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 14:51:32 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Duplicate key]]></category>
		<category><![CDATA[ERROR 1022]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=1102</guid>
		<description><![CDATA[Parmi les erreurs courantes en MySQL, ont trouve la fameuse ERROR 1062 (23000): Duplicate entry '2984' for key 'PRIMARY' causée par la tentative d'insertion d'une données, déjà présente, dans un colonne ayant une contrainte d'unicité.

Dans la même famille il y a aussi l'erreur 1022...]]></description>
			<content:encoded><![CDATA[<p>Parmi les erreurs courantes en MySQL, ont trouve la fameuse ERROR 1062 (23000): Duplicate entry &#8217;2984&#8242; for key &#8216;PRIMARY&#8217; causée par la tentative d&#8217;insertion d&#8217;une données, déjà présente, dans un colonne ayant une contrainte d&#8217;unicité.</p>
<p>Dans la même famille il y a aussi l&#8217;erreur 1022&#8230;</p>
<p>Une banale requête de lecture avec un GROUP BY:</p>
<address>mysql&gt; SELECT DISTINCT(name), COUNT(name) FROM membre WHERE name &lt;&gt; &nbsp;&raquo; GROUP BY name</address>
<address><strong>ERROR 1022 (23000): Can&#8217;t write; duplicate key in table &#8216;/tmp/#sql_29lm_0&#8242;</strong></address>
<address> </address>
<p>C&#8217;est assez surprenant de trouver une telle erreur sur une requête aussi triviale !</p>
<p>En regardant le plan d&#8217;exécution, on remarque que outre le fait qu&#8217; un index est plus que recommandé, MySQL créé une table temporaire (/tmp/#sql_29lm_0) et c&#8217;est en insérant les données dans cette dernière que le &laquo;&nbsp;duplicate key&nbsp;&raquo; se déclenche.</p>
<address> </address>
<address>mysql&gt; explain  SELECT DISTINCT(name), COUNT(name) FROM membre WHERE name &lt;&gt; &nbsp;&raquo; GROUP BY name\G<br />
*************************** 1. row ***************************<br />
id: 1<br />
select_type: SIMPLE<br />
table: membre<br />
type: ALL<br />
possible_keys: NULL<br />
key: NULL<br />
key_len: NULL<br />
ref: NULL<br />
rows: 92633696<br />
Extra: Using where;<strong> Using temporary</strong>; Using filesort</address>
<address> </address>
<address>Alors ça à tout l&#8217;air d&#8217;un bug, d&#8217;ailleurs 3 sont ouverts à ce sujet, pour les version 5.1 et 5.5 (le 1er depuis le 9 Nov 2010&#8230;):</address>
<p><a title="http://bugs.mysql.com/bug.php?id=58081" href="http://bugs.mysql.com/bug.php?id=58081" target="_blank">http://bugs.mysql.com/bug.php?id=58081</a><br />
<a title="http://bugs.mysql.com/bug.php?id=60808" href="http://bugs.mysql.com/bug.php?id=60808" target="_blank">http://bugs.mysql.com/bug.php?id=60808</a><br />
<a title="http://bugs.mysql.com/bug.php?id=62097" href="http://bugs.mysql.com/bug.php?id=62097" target="_blank">http://bugs.mysql.com/bug.php?id=62097</a></p>
<p>Le contournement que j&#8217;ai trouvé à été d&#8217;augmenter pour la session, les caches utilisés par la requêtes, à savoir le <strong>max_heap_table_size</strong> et le <strong>tmp_table_size</strong>:</p>
<address>mysql&gt; SET SESSION max_heap_table_size=536870912; SET SESSION tmp_table_size=536870912;</address>
<address>mysql&gt; SELECT DISTINCT(name), COUNT(name) FROM membre WHERE name &lt;&gt; &nbsp;&raquo; GROUP BY name</address>
<address>+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;-+</address>
<address>| name          | COUNT(name) |</address>
<address>+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;-+</address>
<address>|     Abano     |           3 |</address>
<address>&#8230;</address>
<address> </address>
<p>Cela dit, ça serait quand même pas mal, qu&#8217; Oracle fasse le nécessaire pour enfin corriger ce bug&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2011/08/29/duplicate-key-cause-par-un-select/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MariaDB 5.3, Progress reporting</title>
		<link>http://dasini.net/blog/2011/08/01/mariadb-5-3-progress-reporting/</link>
		<comments>http://dasini.net/blog/2011/08/01/mariadb-5-3-progress-reporting/#comments</comments>
		<pubDate>Mon, 01 Aug 2011 10:09:53 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[MariaDB]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=1093</guid>
		<description><![CDATA[Parmi les nouveautés de MariaDB 5.3, l'une bien pratique est le "progress reporting", qui permet de savoir où le serveur en est dans l'exécution d'une commande.

Le principe est simple, j'exécute une commande et MariaDB m'indique à le pourcentage effectué pour une étape donnée. Un exemple:

MariaDB-5.3> ALTER TABLE client ENGINE=InnoDB;
Stage: 1 of 2 'copy to tmp table'   44.5% of stage done]]></description>
			<content:encoded><![CDATA[<p>Parmi les nouveautés de MariaDB 5.3, l&#8217;une d&#8217;entre elle, bien pratique est le &laquo;&nbsp;progress reporting&nbsp;&raquo;, qui permet de savoir où le serveur en est dans l&#8217;exécution d&#8217;une commande.</p>
<p>Le principe est simple, j&#8217;exécute une commande et MariaDB m&#8217;indique le pourcentage effectué pour une étape donnée. Un exemple:</p>
<pre>MariaDB-5.3&gt; ALTER TABLE client ENGINE=InnoDB;
Stage: 1 of 2 'copy to tmp table'   44.5% of stage done

MariaDB-5.3&gt; ALTER TABLE client ENGINE=InnoDB;
Stage: 2 of 2 'Enabling keys'      0% of stage done    

MariaDB-5.3&gt; ALTER TABLE client ENGINE=InnoDB;
Query OK, 3000000 rows affected (5 min 15.24 sec)      
Records: 3000000  Duplicates: 0  Warnings: 0</pre>
<p>Les commandes implémentant le &laquo;&nbsp;progress reporting&nbsp;&raquo; sont pour le moment: ALTER TABLE, ADD INDEX, DROP INDEX, LOAD DATA INFILE.</p>
<p>Le moteur Aria supporte également les commandes suivantes: CHECK TABLE, REPAIR TABLE, ANALYZE TABLE, OPTIMIZE TABLE</p>
<pre>MariaDB-5.3&gt; &gt; CHECK TABLE aria_table;
Stage: 3 of 3 'Checking data'      0% of stage done</pre>
<p>Plus d&#8217;informations sur <a title="progress reporting" href="http://kb.askmonty.org/en/progress-reporting" target="_blank">AskMonty.org</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2011/08/01/mariadb-5-3-progress-reporting/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Audit MySQL &#8211; tmp_table_size &amp; max_heap_table_size</title>
		<link>http://dasini.net/blog/2010/05/28/audit-mysql-tmp_table_size-max_heap_table_size/</link>
		<comments>http://dasini.net/blog/2010/05/28/audit-mysql-tmp_table_size-max_heap_table_size/#comments</comments>
		<pubDate>Fri, 28 May 2010 12:05:16 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[audit]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Audit MySQL]]></category>
		<category><![CDATA[max_heap_table_size]]></category>
		<category><![CDATA[tmp_table_size]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=912</guid>
		<description><![CDATA[Je suis amené à réaliser régulièrement des audits de serveurs MySQL.Voici le premier volet d'une série d'articles où je vais essayer de vous donner quelques points clés pour mieux comprendre le fonctionnement de MySQL.

La configuration du serveur est un des points que je regarde, et l'une des erreurs les plus courantes concerne le paramétrage des options tmp_table_size et max_heap_table_size.

tmp_table_size permet de fixer la taille maximale au-delà de laquelle les tables temporaires en mémoire créées par MySQL (avec le moteur Memory) se transforment en table MyISAM en migrant les données sur le disque. max_heap_table_size permet de fixer la taille maximale des tables avec pour moteur de stockage Memory (Heap est l'ancien nom de Memory).
Extraits du livre "Audit et optimisation - MySQL 5; Bonnes pratiques pour l'administrateur"]]></description>
			<content:encoded><![CDATA[<p>Je suis amené à réaliser régulièrement des audits de serveurs MySQL.Voici le premier volet d&#8217;une série d&#8217;articles où je vais essayer de vous donner quelques points clés pour mieux comprendre le fonctionnement de MySQL.</p>
<p>La configuration du serveur est un des points que je regarde, et l&#8217;une des erreurs les plus courantes concerne le paramétrage des options <a title="tmp_table_size" href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_tmp_table_size" target="_blank">tmp_table_size</a> et <a title="max_heap_table_size" href="http://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_heap_table_size" target="_blank">max_heap_table_size</a>.</p>
<address><strong><span style="color: #0000ff;">tmp_table_size</span></strong><span style="color: #0000ff;"> permet de fixer la taille maximale au-delà de laquelle les tables temporaires en mémoire créées par MySQL (avec le moteur Memory) se transforment en table MyISAM en migrant les données sur le disque. </span><strong><span style="color: #0000ff;">max_heap_table_size</span></strong><span style="color: #0000ff;"> permet de fixer la taille maximale des tables avec pour moteur de stockage Memory (Heap est l&#8217;ancien nom de Memory).</span></address>
<div><a title="Audit et optimisation - MySQL 5; Bonnes pratiques pour l'administrateur" href="http://dasini.net/blog/bibliotheque/#audit_optimisation_mysql5" target="_blank"><em><strong>Extraits du livre &laquo;&nbsp;Audit et optimisation &#8211; MySQL 5; Bonnes pratiques pour l&#8217;administrateur&nbsp;&raquo;</strong></em></a></div>
<div></div>
<div><em><br />
</em></div>
<div>Ce qui est important de savoir c&#8217;est que <strong>la limite des tables temporaires en mémoire créées par MySQL est la plus petite de ces deux valeurs</strong>. Ce que je vois souvent dans les fichier de configurations, c&#8217;est un tmp_table_size à 64 Mo (par exemple) et un max_heap_table_size qui lui n&#8217;y figure pas et qui par conséquent prend ça valeur par défaut, c&#8217;est à dire <strong>16Mo</strong>. Votre table temporaire créée par le serveur (lors de votre GROUP BY par exemple) sera sur disque dès 16Mo de données et non 64 Mo comme vous le pensiez.</div>
<div>Alors pourquoi faut il limiter le nombre de tables temporaires créées sur le disque ? Tous simplement car <strong>sur disque, le temps d&#8217;exécution de la requête sera beaucoup, beaucoup plus long, de l&#8217;ordre de fois 10 voir fois 100</strong> !</div>
<div></div>
<div>Lorsque vous renseignez l&#8217;option tmp_table_size, pensez également à donner la même valeur à l&#8217;option max_heap_table_size.</div>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2010/05/28/audit-mysql-tmp_table_size-max_heap_table_size/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>!include</title>
		<link>http://dasini.net/blog/2009/08/13/include/</link>
		<comments>http://dasini.net/blog/2009/08/13/include/#comments</comments>
		<pubDate>Thu, 13 Aug 2009 00:07:05 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[!include]]></category>
		<category><![CDATA[my.cnf]]></category>
		<category><![CDATA[my.ini]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=721</guid>
		<description><![CDATA[my.cnf, comme vous le savez certainement est le nom du fichier de configuration de MySQL. Vous pouvez également le retrouver sous le nom de my.ini en environnement MS Windows. Il permet comme son nom l'indique de configurer votre serveur MySQL en y centralisant les options de ... configuration. Le but ici n'est pas de détailler la longue liste des paramètres de MySQL, la documentation officielle est (presque) bien faite, mais de mettre le "focus" sur la directive !include (avec un "!" devant).
Cette dernière permet d'inclure un fichier de configuration dans un autre (sic). Autant je suis un adèpte de la non duplication du code en dévellopement (des require_once en PHP utilisés avec modération ça vous simplifie bien votre code), autant je ne suis pas un grand fan pour éclater la configuration de mon serveur MySQL en plusiseurs endroits. Cependant :) il faut avouerque parfois cela peut servir !
Alors comment ça marche ?
C'est (apparemment) très simple. Mon client mysql va chercher sa configuration dans différents endroits (définit à la compilation):

daz@daz-laptop:~$ mysql --help
...
Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

Mon fichier de configuration se nomme  /etc/mysql/my.cnf et il contient simplement la directive !include suivit du "vraie" fichier de configuration:

daz@daz-laptop:~$ cat /etc/mysql/my.cnf
!include /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf

Et au final dans mon fichier de configuration (au passage j'utilise le très pratique soft développé par Giuseppe Maxia : MySQL Sandbox):

daz@daz-laptop:~$ cat /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf
[mysql]
prompt='mysql [\h] {\u} (\d) > '
[client]
port            		= 5135
socket          		= /tmp/mysql_sandbox5135.sock
...


Simple non ?
C'est (presque) tout, et ça marche...pas :(

daz@daz-laptop:~$ mysql

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)

Une petite vérification s'impose:


daz@daz-laptop:~$ mysql --help
mysql  Ver 14.14 Distrib 5.1.35, for pc-linux-gnu (i686) using readline 5.1
...

port                              0
socket                            (No default value)


Les paramètres ne sont pas prit en compte. (commentaire de l'expert: ça ne peut donc pas fonctionner)


(30 minutes et beaucoups d'insultes plus tard...)


En fait, la subtilité,  c'est de rajouter un saut à la ligne, à la fin de la commande !include /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf


daz@daz-laptop:~$ mysql --help
mysql  Ver 14.14 Distrib 5.1.35, for pc-linux-gnu (i686) using readline 5.1
...

port                              5135
socket                            /tmp/mysql_sandbox5135.sock

daz@daz-laptop:~$ mysql

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 5

Server version: 5.1.35-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql [localhost] {daz} ((none)) > 


(commentaire de l'expert: ça fonctionne !)



Giuseppe Maxia]]></description>
			<content:encoded><![CDATA[<p><a title="MySQL ::   MySQL 5.1 Reference Manual :: 4.2.3.3 Using Option Files" href="http://dev.mysql.com/doc/refman/5.1/en/option-files.html" target="_blank"><strong>my.cnf</strong></a>, comme vous le savez certainement est le nom du fichier de configuration de MySQL. Vous pouvez également le retrouver sous le nom de <strong>my.ini</strong> en environnement MS Windows. Il permet comme son nom l&#8217;indique de configurer votre serveur MySQL en y centralisant les options de &#8230; configuration. Le but ici n&#8217;est pas de détailler la longue liste des paramètres de MySQL, la documentation officielle est (presque) bien faite, mais de mettre le &laquo;&nbsp;<em>focus</em>&nbsp;&raquo; sur la directive <strong>!include</strong> (avec un &laquo;&nbsp;<strong>!</strong>&nbsp;&raquo; devant).</p>
<p>Cette dernière permet d&#8217;inclure un fichier de configuration dans un autre (<em>sic</em>). Autant je suis un adèpte de la non duplication du code en dévellopement (des <em>require_once</em> en PHP utilisés avec modération ça vous simplifie bien votre code), autant je ne suis pas un grand fan pour éclater la configuration de mon serveur MySQL en plusiseurs endroits. Cependant <img src='http://dasini.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  il faut avouer que parfois cela peut servir !</p>
<h4>Alors comment ça marche ?</h4>
<p>C&#8217;est (<em>apparemment</em>) très simple. Mon client mysql va chercher sa configuration dans différents endroits (définit à la compilation):</p>
<address><span style="color: #0000ff;">daz@daz-laptop:~$ mysql &#8211;help</span></address>
<address><span style="color: #0000ff;">&#8230;</span></address>
<address><span style="color: #0000ff;">Default options are read from the following files in the given order:<br />
<strong>/etc/my.cnf</strong> <strong>/etc/mysql/my.cnf</strong> <strong>/usr/local/mysql/etc/my.cnf</strong> <strong>~/.my.cnf</strong></span> </address>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
Mon fichier de configuration se nomme  /etc/mysql/my.cnf et il contient simplement la directive !include suivit du &laquo;&nbsp;vraie&nbsp;&raquo; fichier de configuration:</p>
<address><span style="color: #0000ff;">daz@daz-laptop:~$ cat /etc/mysql/my.cnf<br />
<strong>!include /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf</strong></span> </address>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
Et au final dans mon fichier de configuration (au passage j&#8217;utilise le très pratique soft développé par <a title="Giuseppe Maxia - Data Charmer" href="http://datacharmer.blogspot.com/" target="_blank">Giuseppe Maxia</a> : <a title="MySQL Sandbox" href="http://mysqlsandbox.net/" target="_blank">MySQL Sandbox</a>):</p>
<address><span style="color: #0000ff;">daz@daz-laptop:~$ cat /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf</span></address>
<address><span style="color: #0000ff;">[mysql]<br />
prompt=&#8217;mysql [\h] {\u} (\d) &gt; &#8216;</span> </address>
<address><span style="color: #0000ff;">[client]<br />
port            		= 5135<br />
socket          		= /tmp/mysql_sandbox5135.sock<br />
&#8230;</span></address>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
Simple non ?</p>
<p>C&#8217;est (presque) tout, et ça marche&#8230;pas <img src='http://dasini.net/blog/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<address><span style="color: #0000ff;">daz@daz-laptop:~$ mysql</span></address>
<address><span style="color: #0000ff;">ERROR 2002 (HY000): Can&#8217;t connect to local MySQL server through socket &#8216;/tmp/mysql.sock&#8217; (2)</span></address>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
Une petite vérification s&#8217;impose:</p>
<address><span style="color: #0000ff;">daz@daz-laptop:~$ mysql &#8211;help<br />
mysql  Ver 14.14 Distrib 5.1.35, for pc-linux-gnu (i686) using readline 5.1<br />
&#8230;</span></address>
<address><span style="color: #0000ff;">port                              <span style="color: #ff0000;">0</span><br />
socket </span> <span style="color: #ff0000;">(No default value)</span></address>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
Les paramètres ne sont pas prit en compte. <em>(<span style="text-decoration: underline;">commentaire de l&#8217;expert</span>: ça ne peut donc pas fonctionner)</em></p>
<p><em><br />
</em></p>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
(30 minutes <span style="text-decoration: line-through;"><em>et quelques insultes</em></span> plus tard&#8230;)</p>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
En fait, la subtilité,  c&#8217;est de rajouter <strong><span style="text-decoration: underline;">un saut à la ligne</span></strong>, à la fin de la commande<strong> !include /home/daz/sandboxes/msb_5_1_35/my.sandbox.cnf</strong></p>
<address><span style="color: #0000ff;">daz@daz-laptop:~$ mysql &#8211;help<br />
mysql  Ver 14.14 Distrib 5.1.35, for pc-linux-gnu (i686) using readline 5.1<br />
&#8230;</span></address>
<address><span style="color: #0000ff;">port </span> <span style="color: #ff0000;"> 5135</span></address>
<address><span style="color: #0000ff;">socket </span> <span style="color: #ff0000;">/tmp/mysql_sandbox5135.sock</span></address>
<address><span style="color: #ff0000;"> </span></address>
<address> </address>
<address></address>
<p><!-- 		!--></p>
<p><!-- 		!--><br />
Vérification (au cas où):</p>
<address><span style="color: #0000ff;">daz@daz-laptop:~$ mysql</p>
<p>Welcome to the MySQL monitor. Commands end with ; or \g.<br />
Your MySQL connection id is 5<br />
Server version: 5.1.35-log MySQL Community Server (GPL)<br />
Type &#8216;help;&#8217; or &#8216;\h&#8217; for help. Type &#8216;\c&#8217; to clear the current input statement.<br />
mysql [localhost] {daz} ((none)) &gt;</p>
<p></span><br />
</address>
<p>(<span style="text-decoration: underline;">commentaire de l&#8217;expert</span>: ça fonctionne !)</p>
<p> <img src='http://dasini.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;">
<h2>Giuseppe <span class="__mozilla-findbar-search" style="padding: 0pt; background-color: yellow; color: black; display: inline; font-size: inherit;">Maxia</span></h2>
</div>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/08/13/include/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Numéro de semaine calendaire MySQL</title>
		<link>http://dasini.net/blog/2009/04/08/numero-de-semaine/</link>
		<comments>http://dasini.net/blog/2009/04/08/numero-de-semaine/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 23:53:06 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[semaine calendaire]]></category>
		<category><![CDATA[week]]></category>
		<category><![CDATA[weekofday]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=562</guid>
		<description><![CDATA[MySQL possède un grand nombre de fonctions pour gérer les dates et le temps. Il est possible de récupérer le numéro calendaire d'une semaine avec la fonction week. Dimanche 5 avril nous étions semaine 14. La fonction week nous le confirme:

mysql> SELECT week('2009-04-05');
]]></description>
			<content:encoded><![CDATA[<p>MySQL possède un grand nombre de fonctions pour gérer <a title="MySQL Dates &amp; times functions" href="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html" target="_blank">les dates et le temps</a>. Il est possible de récupérer le numéro calendaire d&#8217;une semaine avec la fonction <a title="Fonction MySQL WEEK" href="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_week" target="_blank">week</a>. Dimanche 5 avril nous étions semaine 14. La fonction week nous le confirme:</p>
<pre>mysql&gt; SELECT week('2009-04-05');
+--------------------+
| week('2009-04-05') |
+--------------------+
|                 <span style="color: #ff0000;">14</span> |
+--------------------+</pre>
<p>Lundi 6 avril, nouvelle semaine, on passe donc à la semaine 15:</p>
<pre>mysql&gt; SELECT week('2009-04-06');</pre>
<pre>+--------------------+</pre>
<pre>| week('2009-04-06') |</pre>
<pre>+--------------------+</pre>
<pre>|                 <span style="color: #ff0000;">14</span> |</pre>
<pre>+--------------------+</pre>
<p>Souci !!! Le résultat n&#8217;est pas celui espéré (14 au lieu de 15). En fait la fonction <em>week</em> prend un deuxième paramètre optionnel, qui permet de &laquo;&nbsp;<em>régler la précision</em>&nbsp;&raquo; (compter sur 53 ou 54 semaines, commencer la semaine un dimanche ou un lundi&#8230;) bref elle est complète et complexe&#8230;</p>
<p>Le réglage usuel est de mettre le deuxième paramètre à<span style="color: #000000;"> <strong>3</strong></span> ! ou alors d&#8217;utiliser la fonction <a title="Fonction MySQL WEEKOFYEAR" href="http://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_weekofyear" target="_blank"><strong><span style="color: #ff0000;">WEEKOFYEAR</span></strong></a>.</p>
<pre>mysql&gt; SELECT weekofyear('2009-04-05');
+--------------------------+
| weekofyear('2009-04-05') |
+--------------------------+
|                       <span style="color: #ff0000;">14</span> |
+--------------------------+</pre>
<pre>mysql&gt; SELECT weekofyear('2009-04-06');
+--------------------------+
| weekofyear('2009-04-06') |
+--------------------------+
|                       <strong><span style="color: #ff0000;">15</span></strong> |
+--------------------------+</pre>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/04/08/numero-de-semaine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Restaurer une sauvegarde en désactivant le log binaire</title>
		<link>http://dasini.net/blog/2009/02/09/restaurer-une-sauvegarde-en-desactivant-le-log-binaire/</link>
		<comments>http://dasini.net/blog/2009/02/09/restaurer-une-sauvegarde-en-desactivant-le-log-binaire/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 10:45:19 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mysqldump]]></category>
		<category><![CDATA[set]]></category>
		<category><![CDATA[source]]></category>
		<category><![CDATA[sql_log_bin]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=448</guid>
		<description><![CDATA[Il est pafois utile de désactiver le log binaire lors d'une restauration. MySQL permet de le désactiver pour une session avec la commande SQL_LOG_BIN:]]></description>
			<content:encoded><![CDATA[<p>Il est pafois utile de désactiver le log binaire lors d&#8217;une restauration. MySQL permet de le désactiver pour une session avec la commande <strong>SQL_LOG_BIN</strong>:</p>
<address>mysql&gt; SET SESSION sql_log_bin = 0;</address>
<p>Lors de la restauration avec le client mysql on peut donc utiliser la ligne de commande suivante:</p>
<address>shell&gt; mysql <strong>&#8211;execute=</strong>&laquo;&nbsp;SET SESSION sql_log_bin=0;  <strong>SOURCE </strong>mon_fichier_dump.sql;&nbsp;&raquo;</address>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/02/09/restaurer-une-sauvegarde-en-desactivant-le-log-binaire/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J&#8217;ai perdu mon mot de passe root&#8230;</title>
		<link>http://dasini.net/blog/2009/01/16/jai-perdu-mon-mot-de-passe-root/</link>
		<comments>http://dasini.net/blog/2009/01/16/jai-perdu-mon-mot-de-passe-root/#comments</comments>
		<pubDate>Fri, 16 Jan 2009 15:17:22 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[Astuce]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[mot de passe root]]></category>
		<category><![CDATA[passowrd]]></category>
		<category><![CDATA[SET PASSWORD]]></category>
		<category><![CDATA[skip-grant-tables]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=418</guid>
		<description><![CDATA[En cas de perte du mot de passe root surtout si c'est votre seul compte (super) administrateur, vous vous trouvez dans une situation pour le moins embarrassante.
MySQL propose un moyen de s'en sortir.]]></description>
			<content:encoded><![CDATA[<p>En cas de perte du mot de passe root surtout si c&#8217;est votre seul compte (super) administrateur, vous vous trouvez dans une situation pour le moins embarrassante.<br />
MySQL propose un moyen de s&#8217;en sortir. Certes, si le mot de passe est perdu vous ne pourrai pas le récupérer, car il est stocké haché dans la base:</p>
<pre>mysql&gt; SELECT user, password FROM mysql.user;
 +---------+-------------------------------------------+
 | user    | password                                  |
 +---------+-------------------------------------------+
 | root    | <strong>*81F5E21E35407D884A6CD4A731AEBFB6AF209E1B</strong> |
 +---------+-------------------------------------------+
 1 rows in set (0.39 sec)</pre>
<p>Néanmoins il est possible de le changer. Voici les étapes à suivre:</p>
<h2>1/ Arrêter le serveur MySQL</h2>
<p>Cela ne devrait pas poser trop de problèmes:<br />
mysql stop (sous linux)<br />
NET STOP MySQL (sous windows)<br />
&#8230;<br />
ou dans le pire des cas, débranchez la machine <img src='http://dasini.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>2/ Démarrer le serveur en désactivant la vérifications des droits</h2>
<pre><strong>shell&gt; mysqld --skip-grant-tables</strong></pre>
<p>Il important de noter qu&#8217;une fois démarré avec skip-grant-table, n&#8217;importe qui peut se connecter au serveur MySQL et avec tout les droits&#8230; Inutile de préciser que le serveur est à ce moment particulièrement vulnérable.</p>
<h2>3/ Connexion au serveur MySQL</h2>
<p>Connectez vous au serveur mysql, comme à l&#8217;accoutumée.</p>
<pre>shell&gt; mysql --user=UtilisateurExistantPas --password=MotDePasse</pre>
<pre>Welcome to the MySQL monitor.  Commands end with ; or \g.
 Your MySQL connection id is 2
 Server version: 5.1.30-community-log MySQL Community Server (GPL)</pre>
<pre>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.</pre>
<pre>mysql&gt;</pre>
<h2>4/ Protéger le serveur</h2>
<p>La première chose à faire, une fois connecté est de sécuriser le serveur en remettant en place la vérification des droits:</p>
<pre>mysql&gt; FLUSH PRIVILEGES;</pre>
<pre>shell&gt; mysql --user=UtilisateurExistantPas --password=MotDePasse
 ERROR 1045 (28000): Access denied for user 'UtilisateurExistantPas'@'localhost'
(using password: YES)</pre>
<h2>5/ Changer le mot de passe</h2>
<p>L&#8217;heure est enfin venue de se créer un nouveau mot de passe root</p>
<pre>mysql&gt; SET PASSWORD FOR root@localhost=PASSWORD('m0T2pA55e');
 Query OK, 0 rows affected (0.06 sec)</pre>
<h2>6/ Arrêter le serveur</h2>
<p>Pour sortir de la configuration <strong>skip-grant-tables</strong>, il faut arrêter le serveur, pour mieux le redémarrer&#8230;</p>
<h2>7/ Redémarrer le serveur normalement</h2>
<p>et le tour est joué <img src='http://dasini.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<pre>shell&gt; mysql --user=root --password=m0T2pA55e
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.30-community-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql&gt;</pre>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/01/16/jai-perdu-mon-mot-de-passe-root/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

