<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CkMBRHk4fCp7ImA9WhRaE0U.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980</id><updated>2012-02-16T00:20:55.734-08:00</updated><category term="conf" /><category term="collate" /><category term="sandbox" /><category term="slides" /><category term="postgresql" /><category term="proxy" /><category term="5.5" /><category term="news" /><category term="cache" /><category term="cluster" /><category term="bug" /><category term="udf" /><category term="perl" /><category term="asus" /><category term="5.1" /><category term="regexp" /><category term="template" /><category term="date" /><category term="upgrade" /><category term="mediane" /><category term="partitioning" /><category term="git" /><category term="shell" /><category term="script" /><category term="sun" /><category term="mysqldump" /><category term="performance" /><category term="code" /><category term="InnoDb" /><category term="laptop" /><category term="backup" /><category term="xml" /><category term="unique" /><category term="slony" /><category term="mysql" /><category term="livre" /><category term="engine" /><category term="optimizer" /><category term="more" /><category term="join" /><category term="samples" /><category term="trie" /><category term="null" /><category term="oracle" /><category term="intrepid" /><category term="ndb" /><category term="tags" /><category term="blogger" /><category term="calcul" /><category term="sauvegarde" /><category term="backhole" /><category term="BDB" /><category term="index" /><category term="ddl" /><category term="ubuntu" /><category term="replication" /><title>les databases et plus</title><subtitle type="html">Encore un blog sur les sgbds mais pas que ça!</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://lesdatabases.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>42</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/lesdatabasesetplus" /><feedburner:info uri="lesdatabasesetplus" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;Dk4CQnw-fSp7ImA9WhRaEk4.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-2093662735485442945</id><published>2011-11-02T07:10:00.001-07:00</published><updated>2012-02-14T07:56:03.255-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-14T07:56:03.255-08:00</app:edited><title>Doit-on utiliser le singulier ou le pluriel pour nommer ses tables ?</title><content type="html">&lt;p&gt;C'est une question qui revient souvent quand on d&amp;eacute;cide de cr&amp;eacute;er une nouvelle base de donn&amp;eacute;es. En effet, on peut avoir oubli&amp;eacute; la raison pour laquelle on a fait tel choix lors du design d'une ancienne base.Il se peut par exemple que vous utilisiez un &lt;a href="http://en.wikipedia.org/wiki/Object-relational_mapping"&gt;ORM&lt;/a&gt;&amp;nbsp;et que celui-ci ne supporte par exemple que le singulier sur le nom des tables. Mais dans le cas, o&amp;ugrave; vous vous interrogez simplement sur la bonne marche &amp;agrave; suivre je ne connais pas de r&amp;egrave;gle ISO sur le sujet . Sachez cependant qu'Oracle utilise par exemple le pluriel pour les noms des tables et le singulier pour les noms des colonnes. MySQL en fait tout autant dans sa base de donn&amp;eacute;es information_schema. Cependant, j'ai trouv&amp;eacute; une r&amp;eacute;ponse assez argument&amp;eacute;e que j'ai voulu partager.&lt;/p&gt;&lt;p&gt;Pour en savoir plus, allez lire la r&amp;eacute;ponse sur &lt;a href="http://stackoverflow.com/questions/338156/table-naming-dilemma-singular-vs-plural-names/5841297#5841297"&gt;stackoverflow&lt;/a&gt;. N'oubliez quand m&amp;ecirc;me pas qu'au final vous avez toujours le choix, mais mieux vaut consid&amp;eacute;rer les avantages/inconv&amp;eacute;nients que peuvent vous apportez d'utiliser ou non le pluriel/singulier et je rajouterais aussi que peuvent vous apporter l'utilisations du&amp;nbsp;&lt;a href="http://fr.wikipedia.org/wiki/CamelCase"&gt;CamelCase&lt;/a&gt;&amp;nbsp;(passage de Windows &amp;agrave; Unix par ex), des minuscules ou majuscules.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-2093662735485442945?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/o0IIWwwaOMg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/2093662735485442945/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=2093662735485442945" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2093662735485442945?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2093662735485442945?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/o0IIWwwaOMg/doit-on-utiliser-le-singulier-ou-le.html" title="Doit-on utiliser le singulier ou le pluriel pour nommer ses tables ?" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2011/11/doit-on-utiliser-le-singulier-ou-le.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4HRH87eSp7ImA9WhRTEkk.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-1976286739635789143</id><published>2011-10-17T09:33:00.001-07:00</published><updated>2011-11-02T07:08:55.101-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-02T07:08:55.101-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="index" /><category scheme="http://www.blogger.com/atom/ns#" term="optimizer" /><title>Indexation et booléens</title><content type="html">Voilà encore une raison pour laquelle il faut toujours tester vos requêtes!&lt;br /&gt;
En effet, il s'avère que l'optimiseur de MySQL 5.5 (vérifié aussi en 5.1.60) ne fait pas le même choix selon qu'un filtre sur la valeur d'un booléen indexé utilise l'opérateur = ou IS. Voici un exemple extrait &lt;a href="http://bugs.mysql.com/bug.php?id=62738" target="_blank"&gt;du rapport de Bug&lt;/a&gt; que j'ai posté sur bugs.mysql.com &lt;span class="fullpost"&gt;:&lt;br /&gt;
&lt;br /&gt;&lt;div class="code"&gt;
mysql&amp;gt; CREATE TABLE t(id INT, b BOOLEAN DEFAULT FALSE);&lt;br /&gt;
Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT 1;&lt;br /&gt;
Query OK, 1 row affected (0.01 sec)&lt;br /&gt;
Records: 1  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t;&lt;br /&gt;
Query OK, 1 row affected (0.00 sec)&lt;br /&gt;
Records: 1  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t;&lt;br /&gt;
Query OK, 2 rows affected (0.00 sec)&lt;br /&gt;
Records: 2  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t;&lt;br /&gt;
Query OK, 4 rows affected (0.00 sec)&lt;br /&gt;
Records: 4  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t;&lt;br /&gt;
Query OK, 8 rows affected (0.00 sec)&lt;br /&gt;
Records: 8  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t;&lt;br /&gt;
Query OK, 16 rows affected (0.00 sec)&lt;br /&gt;
Records: 16  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t;&lt;br /&gt;
Query OK, 32 rows affected (0.00 sec)&lt;br /&gt;
Records: 32  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t;&lt;br /&gt;
Query OK, 64 rows affected (0.00 sec)&lt;br /&gt;
Records: 64  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t UNION ALL SELECT id FROM t UNION ALL SELECT id FROM t;&lt;br /&gt;
Query OK, 387 rows affected (0.00 sec)&lt;br /&gt;
Records: 387  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t UNION ALL SELECT id FROM t UNION ALL SELECT id FROM t;&lt;br /&gt;
Query OK, 1548 rows affected (0.02 sec)&lt;br /&gt;
Records: 1548  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t UNION ALL SELECT id FROM t UNION ALL SELECT id FROM t;&lt;br /&gt;
Query OK, 6192 rows affected (0.03 sec)&lt;br /&gt;
Records: 6192  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t UNION ALL SELECT id FROM t UNION ALL SELECT id FROM t;&lt;br /&gt;
Query OK, 24768 rows affected (0.18 sec)&lt;br /&gt;
Records: 24768  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t(id) SELECT id FROM t UNION ALL SELECT id FROM t UNION ALL SELECT id FROM t;&lt;br /&gt;
Query OK, 99072 rows affected (0.43 sec)&lt;br /&gt;
Records: 99072  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; alter table t add index(b);&lt;br /&gt;
Query OK, 0 rows affected (0.22 sec)&lt;br /&gt;
Records: 0  Duplicates: 0  Warnings: 0&lt;br /&gt;
mysql&amp;gt; INSERT INTO t values(10,TRUE);&lt;br /&gt;
Query OK, 1 row affected (0.00 sec)&lt;br /&gt;
&lt;br /&gt;mysql&amp;gt; EXPLAIN SELECT COUNT(*) FROM t WHERE b IS TRUE\G&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; 1. row &lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;*&lt;/strong&gt;&lt;br /&gt;
id: 1&lt;br /&gt;
select_type: SIMPLE&lt;br /&gt;
table: t&lt;br /&gt;
&lt;b&gt;type: index&lt;/b&gt;&lt;br /&gt;
possible_keys: NULL&lt;br /&gt;
key: b&lt;br /&gt;
key_len: 2&lt;br /&gt;
&lt;b&gt;ref: NULL&lt;/b&gt;&lt;br /&gt;
rows: 131783&lt;br /&gt;
&lt;b&gt;Extra: Using where; Using index&lt;/b&gt;&lt;br /&gt;
1 row in set (0.00 sec)&lt;br /&gt;
&lt;br /&gt;mysql&amp;gt; EXPLAIN SELECT COUNT(*) FROM t WHERE b = TRUE\G&lt;br /&gt;
&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;/strong&gt;&lt;em&gt; 1. row &lt;strong&gt; &lt;/strong&gt;&lt;/em&gt;&lt;strong&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;&lt;em&gt;*&lt;/em&gt;*&lt;/strong&gt;&lt;br /&gt;
id: 1&lt;br /&gt;
select_type: SIMPLE&lt;br /&gt;
table: t&lt;br /&gt;
&lt;b&gt;type: ref&lt;/b&gt;&lt;br /&gt;
possible_keys: b&lt;br /&gt;
key: b&lt;br /&gt;
key_len: 2&lt;br /&gt;
&lt;b&gt;ref: const&lt;/b&gt;&lt;br /&gt;
rows: 1&lt;br /&gt;
&lt;b&gt;Extra: Using where; Using index&lt;/b&gt;&lt;br /&gt;
1 row in set (0.00 sec)&lt;/div&gt;
&lt;br /&gt;
Comme vous pouvez le voir, lorsque l'on utilise l'opérateur "=" , MySQL effectue un accès unique dans l'index b, alors qu'avec l'opérateur "IS" il effectue un parcours total de l'index...
Il est donc très important pour l'instant de privilégier l'opérateur d'égalité en attendant la correction du bug.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-1976286739635789143?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/G4oAArF37fA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/1976286739635789143/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=1976286739635789143" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/1976286739635789143?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/1976286739635789143?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/G4oAArF37fA/indexation-et-booleens.html" title="Indexation et booléens" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2011/10/indexation-et-booleens.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MBR3k4cSp7ImA9WhdaFEs.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-3805025880285314056</id><published>2011-10-12T09:11:00.001-07:00</published><updated>2011-10-24T06:04:16.739-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-24T06:04:16.739-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="InnoDb" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="backup" /><title>Sauvegarder physiquement certaines tables InnoDB</title><content type="html">Avec les tables MyISAM, il est possible de sauvegarder directement les fichiers MYD et MYI lorsque le serveur MySQL tourne, en supposant bien sûr que vous avez verrouillé les tables concernées avec la commande LOCK TABLES ou qu'il n'y a aucune requête en cours. Cependant, il n'en est pas de même avec le moteur InnoDB. En effet, à la différence de MyISAM, il y a des threads qui continue à s'exécuter après que les modifications aient été faites et qui modifient les fichiers de données. Seules les journaux de transactions (iblogfiles) sont réellement écrits à chaque fin de transaction (je considère que vous ne jouez pas avec le paramètre &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit"&gt;innodb_flush_log_at_trx_commit&lt;/a&gt;). De plus, il y a un fichier spécial, nommé par défaut ibdata1, qui contient le dictionnaire de données et toutes les tables (et index) InnoDB ayant été créées avec le paramètre &lt;a href="http://dev.mysql.com/doc/refman/5.5/en/innodb-parameters.html#sysvar_innodb_file_per_table"&gt;innodb_file_per_table&lt;/a&gt; désactivé).&lt;br /&gt;
C'est la raison pour laquelle il n'est pas possible de copier un fichier innodb d'un serveur à un autre. Il est par contre tout a fait possible de sauvegarder un fichier innodb et de le restaurer plus tard sur &lt;span class="fullpost"&gt; le même serveur ou sur un serveur hébergeant une sauvegarde physique, sans avoir à restaurer la base dans son ensemble.&lt;br /&gt;
Il faut savoir qu'InnoDB associe un identifiant à chaque fichier innoDB nommé tablespace (oui cela n'a rien à voir avec les tablespaces d'Oracle). Cet id est stocké dans le catalogue InnoDB ainsi que dans le fichier concerné. C'est ce qui empêche de restaurer le fichier sur un autre serveur sur lequel le même tablespace n'existe pas ou a un identifiant différent, ou sur le même serveur sur lequel on aurait fait un TRUNCATE de la table, et donc généré implicitement un nouvel identifiant !&lt;br&gt;&lt;br&gt;
La méthode à suivre est la suivante, détaillée dans la document MySQL :&lt;br /&gt;&lt;br&gt;
&lt;div class="code"&gt;
mysql&amp;gt; USE test&lt;br /&gt;
Reading table information for completion of table and column names&lt;br /&gt;
You can turn off this feature to get a quicker startup with -A&lt;br /&gt;
Database changed&lt;br /&gt;
mysql&amp;gt; CREATE TABLE t1(id int);&lt;br /&gt;
Query OK, 0 rows affected (0.03 sec)&lt;br /&gt;
mysql&amp;gt; SELECT @i:=0;&lt;br /&gt;
+-------+&lt;br /&gt;
| @id:=0 |&lt;br /&gt;
+-------+&lt;br /&gt;
|     0 |&lt;br /&gt;
+-------+&lt;br /&gt;
1 row in set (0.00 sec&lt;br /&gt;
mysql&amp;gt; INSERT INTO t1 SELECT @id:=@id+1 FROM information_schema.TABLES;&lt;br /&gt;
Query OK, 198 rows affected (0.03 sec)&lt;br /&gt;
Records: 198  Duplicates: 0  Warnings: 0&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 SELECT @id:=@id+1 FROM information_schema.TABLES;&lt;br /&gt;Query OK, 198 rows affected (0.00 sec)&lt;br /&gt;Records: 198  Duplicates: 0  Warnings: 0&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 SELECT @id:=@id+1 FROM information_schema.TABLES;&lt;br /&gt;Query OK, 198 rows affected (0.00 sec)&lt;br /&gt;
Records: 198  Duplicates: 0  Warnings: 0&lt;br /&gt;mysql&amp;gt; SELECT COUNT(*) FROM t1; &lt;br /&gt;+----------+&lt;br /&gt;| COUNT(*) |&lt;br /&gt;+----------+&lt;br /&gt;|      594 |&lt;br /&gt;+----------+ &lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;mysql&amp;gt; SHOW ENGINE INNODB STATUS\G ... Main thread process no. 5109, id 140547993949952, &lt;strong&gt;state: waiting for server activity&lt;/strong&gt;&lt;br /&gt;Number of rows inserted 594, updated 0, deleted 0, read 1193&lt;br /&gt;0.00 inserts/s, 0.00 updates/s, 0.00 deletes/s, 12.91 reads/s&lt;br /&gt;----------------------------&lt;br /&gt;END OF INNODB MONITOR OUTPUT&lt;br /&gt;============================&lt;br /&gt;1 row in set (0.00 sec)&lt;/div&gt;
&lt;br /&gt;Une fois que le statut du moteur InnoDB est bien à "&lt;strong&gt;waiting for server activity&lt;/strong&gt;", On sauvegarde le fichier InnoDB&lt;br /&gt;&lt;br /&gt;
&lt;div class="code"&gt;
cp -p /var/lib/mysql/test/t1.ibd /tmp/&lt;/div&gt;
&lt;br /&gt;La sauvegarde effectuée, on simule la perte de données&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;
mysql&amp;gt; DELETE FROM t1 WHERE id&amp;gt;400;&lt;br /&gt;
Query OK, 194 rows affected (0.04 sec)&lt;br /&gt;
mysql&amp;gt; SELECT MAX(id) FROM t1;&lt;br /&gt;
+---------+&lt;br /&gt;
| MAX(id) |&lt;br /&gt;
+---------+&lt;br /&gt;
|     400 |&lt;br /&gt;
+---------+&lt;br /&gt;
1 row in set (0.00 sec)&lt;/div&gt;
&lt;br /&gt;- On tente maintenant de restaurer nos données en prévenant MySQL&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;
mysql&amp;gt; ALTER TABLE t1 DISCARD TABLESPACE;&lt;br /&gt;
Query OK, 0 rows affected (0.00 sec)&lt;/div&gt;
&lt;br /&gt;- On restaure le fichier à sa place d'origine&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;
root@lizzie:~# cp -p /tmp/t1.ibd /var/lib/mysql/test/t1.ibd&lt;/div&gt;
&lt;br /&gt;- On avertit MySQL qu'il peut utiliser à présent le fichier&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;
mysql&amp;gt; ALTER TABLE t1 IMPORT TABLESPACE;&lt;br /&gt;
Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;
mysql&amp;gt; SELECT MAX(id) FROM t1;&lt;br /&gt;
+---------+&lt;br /&gt;
| MAX(id) |&lt;br /&gt;
+---------+&lt;br /&gt;
|     594 |&lt;br /&gt;
+---------+&lt;br /&gt;
1 row in set (0.02 sec)&lt;/div&gt;
&lt;br /&gt;Et voilà !&lt;br /&gt;Par contre, comme je vous l'ai dit ça ne fonctionne plus quand l'id du tablespace a été modifié dans le catalogue :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;
mysql&amp;gt; TRUNCATE TABLE t1;&lt;br /&gt;
Query OK, 0 rows affected (0.01 sec)&lt;br /&gt;
mysql&amp;gt; ALTER TABLE t1 DISCARD TABLESPACE;&lt;br /&gt;
Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;
root@lizzie:~# cp -p /tmp/t1.ibd /var/lib/mysql/test/t1.ibd&lt;br /&gt;
mysql&amp;gt; ALTER TABLE t1 IMPORT TABLESPACE;&lt;br /&gt;
ERROR 1030 (HY000): Got error -1 from storage engine&lt;/div&gt;
&lt;br /&gt;Vous trouverez un message plus explicite dans le fichier d'erreur :&lt;br /&gt;grep -A 10 "InnoDB: Error" /var/lib/mysql/lizzie.err &lt;br /&gt;
111012 18:09:31  InnoDB: Error: tablespace id and flags in file './test/t1.ibd' are 209768 and 0, but in the InnoDB&lt;br /&gt;
InnoDB: data dictionary they are 209769 and 0.&lt;br /&gt;
InnoDB: Have you moved InnoDB .ibd files around without using the&lt;br /&gt;
InnoDB: commands DISCARD TABLESPACE and IMPORT TABLESPACE?&lt;br /&gt;
InnoDB: Please refer to&lt;br /&gt;
InnoDB: http://dev.mysql.com/doc/refman/5.5/en/innodb-troubleshooting-datadict.html&lt;br /&gt;
InnoDB: for how to resolve the issue.&lt;br /&gt;
111012 18:09:31  InnoDB: cannot find or open in the database directory the .ibd file of&lt;br /&gt;
InnoDB: table `test`.`t1`&lt;br /&gt;
InnoDB: in ALTER TABLE ... IMPORT TABLESPACE&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-3805025880285314056?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/2wseun3-Pf4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/3805025880285314056/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=3805025880285314056" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3805025880285314056?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3805025880285314056?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/2wseun3-Pf4/sauvegarder-physiquement-certaines.html" title="Sauvegarder physiquement certaines tables InnoDB" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2011/10/sauvegarder-physiquement-certaines.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkUCRX0_cSp7ImA9WhZUFkQ.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-6443668240578954724</id><published>2011-06-10T02:16:00.001-07:00</published><updated>2011-06-10T02:31:04.349-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-10T02:31:04.349-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="shell" /><category scheme="http://www.blogger.com/atom/ns#" term="proxy" /><title>Proxychains ou l'art de proxifier</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;S'il vous est arrivé de vous retrouver dans l'impossibilité de sortir sur certains ports mais que vous avez su mettre en place un proxy socks ou http, il n'est pas forcément aisé de configurer les différents outils que vous utilisez.&lt;br /&gt;Ce fut mon cas par exemple avec git. En effet, il est possible avec git d'utiliser un proxy socks, mais cela nécessite de créer un script basé sur netcat et d'affecter à la variable d'environnement GIT_PROXY_COMMAND le chemin associé à ce script. Bref, quelles que soient les commandes que vous utilisez vous aurez ou non la possibilité de configurer l'utilisation d'un proxy en modifiant un fichier de configuration, une variable de d'environnement etc...&lt;br /&gt;L'intérêt de proxychains est que la configuration ne se fait qu'une seule fois, dans son propre fichier de configuration. Ensuite vous utilisez la syntaxe proxychains &amp;lt;command&amp;gt; &amp;lt;args&amp;gt; et votre commande utilisera le proxy spécifié dans le fichier de configuration de proxychains !&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;Voyons tout de suite un exemple :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;git pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git master&lt;br /&gt;git.kernel.org[0: 199.6.1.168]: errno=Connection timed out&lt;br /&gt;git.kernel.org[0: 130.239.17.8]: errno=Connection timed out&lt;br /&gt;git.kernel.org[0: 2001:6b0:e:4017:1994:313:1:2]: errno=Network is unreachable&lt;br /&gt;git.kernel.org[0: 2001:500:60:10:1994:313:1:2]: errno=Network is unreachable&lt;br /&gt;fatal: unable to connect a socket (Network is unreachable)&lt;/div&gt;&lt;br /&gt;Maintenant en utilisant un proxy socks.&lt;br /&gt;&lt;br /&gt;- Je mets donc en place mon proxy&lt;br /&gt;&lt;div class="code"&gt;ssh -fND localhost:10123 my_proxy&lt;/div&gt;&lt;br /&gt;- J'installe proxychains et mets en place ma configuration&lt;br /&gt;&lt;div class="code"&gt;sudo apt-get install proxychains&lt;/div&gt;&lt;br /&gt;- Voici mon fichier de configuration /etc/proxychains&lt;br /&gt;&lt;div class="code"&gt;strict_chain&lt;br /&gt;&lt;br /&gt;# Quiet mode (no output from library)&lt;br /&gt;quiet_mode&lt;br /&gt;&lt;br /&gt;# Proxy DNS requests - no leak for DNS data&lt;br /&gt;#proxy_dns&lt;br /&gt;&lt;br /&gt;# Some timeouts in milliseconds&lt;br /&gt;tcp_read_time_out 15000&lt;br /&gt;tcp_connect_time_out 8000&lt;br /&gt;&lt;br /&gt;[ProxyList]&lt;br /&gt;socks5    127.0.0.1    10123&lt;/div&gt;&lt;br /&gt;- Il ne reste plus qu'à tester proxychains pour proxifier le flux de ma commande git. Pour ce test j'ai commenté l'instruction quiet_mode dans le fichier de configuration de proxychains&lt;br /&gt;&lt;div class="code"&gt;proxychains git pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git master&lt;br /&gt;ProxyChains-3.1 (http://proxychains.sf.net)&lt;br /&gt;|S-chain|-&amp;lt;&amp;gt;-127.0.0.1:10123-&amp;lt;&amp;gt;&amp;lt;&amp;gt;-130.239.17.8:9418-&amp;lt;&amp;gt;&amp;lt;&amp;gt;-OK&lt;br /&gt;From git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6&lt;br /&gt;* branch            master     -&amp;gt; FETCH_HEAD&lt;br /&gt;Already up-to-date.&lt;/div&gt;&lt;br /&gt;Comme on peux le voir on passe par le proxy socks local pour atteindre git.eu.kernel.org(130.239.17.8) sur le port git (9418)&lt;br /&gt;&lt;br /&gt;Pour ceux qui veulent en savoir plus, le fonctionnement de proxychains est assez simple ainsi que son code (~ 1000 lignes). Il affecte à la variable d'environnement LD_PRELOAD le chemin de sa bibliothèque dynamique (libproxychains.so) surchargeant les fonctions réseaux de base que sont gethostbyaddr, getnameinfo, gethostbyname, connect&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-6443668240578954724?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/yXJHfAntJkI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6443668240578954724?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6443668240578954724?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/yXJHfAntJkI/proxychains-ou-l-de-proxifier.html" title="Proxychains ou l&amp;#39;art de proxifier" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><feedburner:origLink>http://lesdatabases.blogspot.com/2011/06/proxychains-ou-l-de-proxifier.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYERnc8cCp7ImA9WhZVF0o.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-8620409912892080434</id><published>2011-05-30T09:13:00.001-07:00</published><updated>2011-05-30T09:15:07.978-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-05-30T09:15:07.978-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="script" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Télécharger vos patchs Oracle avec wget</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Vous l'avez peut être remarqué, mais Oracle vous donne à présent la possibilité de télécharger les archives en utilisant wget. Pour cela, il vous suffit de choisir "WGET options" après avoir cliqué sur download et ensuite de choisir download.sh pour récupérer le script. Enregistrer le sous le nom wget-oracle.sh.&lt;br /&gt;&lt;br /&gt;Pour le faire fonctionner il vous reste à :&lt;br /&gt;&lt;br /&gt;- entrer vos informations SSO, par exemple :&lt;br /&gt;SSO_USERNAME=cscetbon@lesdatabases.com&lt;br /&gt;SSO_PASSWORD=Waou000p&lt;br /&gt;- commenter les instructions wget qui ne concernent pas les fichiers que vous désirez télécharger&lt;br /&gt;- remplacer le ligne&lt;br /&gt;WGET=/usr/bin/wget&lt;br /&gt;par&lt;br /&gt;WGET='/usr/bin/wget --user-agent="Mozilla/5.0" '&lt;br /&gt;- ajouter en début de script l'instruction&lt;br /&gt;export LANG=C&lt;br /&gt;- rendre exécutable le script&lt;br /&gt;chmod u+x wget-oracle.sh&lt;br /&gt;&lt;br /&gt;Maintenant rendez vous dans un répertoire disposant d'assez d'espace pour télécharger vos archives et lancez la commande :&lt;br /&gt;/le/chemin/que/vous/aurez/choisi/wget-oracle.sh&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-8620409912892080434?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/2aJVUlvm5Gg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/8620409912892080434/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=8620409912892080434" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/8620409912892080434?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/8620409912892080434?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/2aJVUlvm5Gg/telecharger-vos-patchs-oracle-avec-wget.html" title="Télécharger vos patchs Oracle avec wget" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2011/05/telecharger-vos-patchs-oracle-avec-wget.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4GSXg6cSp7ImA9WhdbFEk.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-4429200749271445036</id><published>2011-05-16T10:00:00.001-07:00</published><updated>2011-10-12T10:35:28.619-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T10:35:28.619-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="join" /><category scheme="http://www.blogger.com/atom/ns#" term="collate" /><title>jointures et collate</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;L'option COLLATE peut être utilisée dans l'ordre de création d'une table pour spécifier le comportement à observer sur les opérations liées à une colonne. Vous pouvez par exemple grâce à ce mot clé effectuer une recherche sur une chaîne de caractères en ne tenant pas compte des accents. Cependant, il est important de savoir que cela peut avoir un impact sur les performances de vos jointures SQL si vous n'utilisez le même COLLATE sur les colonnes servant à effectuer la jointure. Nous allons voir un exemple concret rencontré en production.&lt;br /&gt;Cet exemple fait intervenir 2 tables dont une qui contient plus de 4 millions d'enregistrements : &lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; SELECT count(*) FROM a1;&lt;br /&gt;+----------+&lt;br /&gt;| count(*) |&lt;br /&gt;+----------+&lt;br /&gt;|  4382124 |&lt;br /&gt;+----------+&lt;br /&gt;1 row in set (0.77 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; SELECT count(*) FROM a2;&lt;br /&gt;+----------+&lt;br /&gt;| count(*) |&lt;br /&gt;+----------+&lt;br /&gt;|        1 |&lt;br /&gt;+----------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;La jointure des tables n'est pas très lente mais est exécutée des millions de fois, ce qui fait que le processus global durait une dizaine d'heure.&lt;span class='fullpost'&gt; Voici le plan d'exécution utilisé par MySQL :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt;EXPLAIN SELECT count(*) FROM a1 JOIN a2 ON (a2.pka2=a1.pka1);&lt;br /&gt;+----+-------------+-------+--------+---------------+---------+---------+------+---------+--------------------------+&lt;br /&gt;| id | select_type | table | type   | possible_keys | key     | key_len | ref  | rows    | Extra                    |&lt;br /&gt;+----+-------------+-------+--------+---------------+---------+---------+------+---------+--------------------------+&lt;br /&gt;|  1 | SIMPLE      | a2   | system | PRIMARY       | NULL    | NULL    | NULL |       1 |                          |&lt;br /&gt;|  1 | SIMPLE      | a1   | index  | NULL          | PRIMARY | 27      | &lt;b&gt;NULL&lt;/b&gt; | &lt;b&gt;4387787&lt;/b&gt; | &lt;b&gt;Using where; Using index&lt;/b&gt; |&lt;br /&gt;+----+-------------+-------+--------+---------------+---------+---------+------+---------+--------------------------+&lt;br /&gt;2 rows in set (0.00 sec)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Comme vous pouvez le voir, MySQL effectue un FULL SCAN de l'index (PK) de la table a1 qui contient ~ 4,4 Millions d'enregistrements. L'exécution de la requête dure 130ms.&lt;br /&gt;En fait, ceci est dû au fait que les COLLATE des colonnes a2.pka2 et a1.pka1 sont différents&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; SELECT TABLE_NAME,COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME FROM information_schema.columns WHERE (TABLE_NAME='a1' and COLUMN_NAME='pka1') or (TABLE_NAME='a2' and COLUMN_NAME='pka2')\G&lt;br /&gt;*************************** 1. row ***************************&lt;br /&gt;      TABLE_NAME: a1&lt;br /&gt;     COLUMN_NAME: pka1&lt;br /&gt;CHARACTER_SET_NAME: ascii&lt;br /&gt;  COLLATION_NAME: ascii_bin&lt;br /&gt;*************************** 2. row ***************************&lt;br /&gt;      TABLE_NAME: a2&lt;br /&gt;     COLUMN_NAME: pka2&lt;br /&gt;CHARACTER_SET_NAME: latin1&lt;br /&gt;  COLLATION_NAME: latin1_swedish_ci&lt;br /&gt;2 rows in set (0.00 sec)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Si on modifie le COLLATE de la colonne a2.pka2 pour qu'il soit celui de la colonne a1.pka1, MySQL n'a plus besoin de scanner entièrement l'index de la table a1.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; ALTER TABLE a2 CHANGE COLUMN pka2 pka2 VARCHAR(25) NOT NULL COLLATE ascii_bin;&lt;br /&gt;Query OK, 0 rows affected (0.07 sec)&lt;br /&gt;Records: 0  Duplicates: 0  Warnings: 0&lt;br /&gt;&lt;br /&gt;mysql&amp;gt;EXPLAIN SELECT count(*) FROM a1 JOIN a2 ON (a2.pka2=a1.pka1);&lt;br /&gt;+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+&lt;br /&gt;| id | select_type | table | type   | possible_keys | key     | key_len | ref                        | rows | Extra       |&lt;br /&gt;+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+&lt;br /&gt;|  1 | SIMPLE      | a2    | index  | PRIMARY       | PRIMARY | 27      | NULL                       |    1 | Using index |&lt;br /&gt;|  1 | SIMPLE      | a1   | eq_ref | PRIMARY       | PRIMARY | 27      | &lt;b&gt;a2.pka2&lt;/b&gt;                    |    &lt;b&gt;1&lt;/b&gt; | &lt;b&gt;Using index&lt;/b&gt; |&lt;br /&gt;+----+-------------+-------+--------+---------------+---------+---------+----------------------------+------+-------------+&lt;br /&gt;2 rows in set (0.00 sec)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Ceci a permis de ramener la durée du processus global à une vingtaine de minutes. Prenez donc garde à utiliser soigneusement la clause COLLATE, surtout quand vous effectuez des jointures !&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-4429200749271445036?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/o7vs3SL8nBQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/4429200749271445036/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=4429200749271445036" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/4429200749271445036?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/4429200749271445036?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/o7vs3SL8nBQ/jointures-et-collate.html" title="jointures et collate" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2011/05/jointures-et-collate.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck4CQHg5eCp7ImA9WhdbFEk.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-8067231869914593612</id><published>2011-02-27T02:13:00.001-08:00</published><updated>2011-10-12T10:36:01.620-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-12T10:36:01.620-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unique" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="null" /><title>Contraintes uniques et valeurs nulles</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Vous risquez d'être surpris si vous utiliser une contrainte d'unicité sur un groupe de colonnes qui peuvent être nulles. En effet, il faut savoir que la contrainte d'unicité différencie par défaut les valeurs nulles. Ainsi si vous créez la table suivante :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; CREATE TABLE t1(id1 int,id2 int,id3 int);&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; ALTER TABLE t1 ADD UNIQUE KEY (id1,id2,id3);&lt;br /&gt;Query OK, 0 rows affected (0.00 sec)&lt;br /&gt;Records: 0  Duplicates: 0  Warnings: 0&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Vous pourrez ajouter les triplets (1,1,1), (1,2,1), (2,1,1) une seule fois. Par contre, vous pourrez ajouter autant de fois que vous le voulez les triplets (1,1,NULL), (1,NULL,1), (1,NULL,NULL), (NULL,NULL,NULL) etc...&lt;span class='fullpost'&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; INSERT INTO t1 VALUES(1,1,1);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(1,2,1);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(2,1,1);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(2,1,1);&lt;br /&gt;ERROR 1062 (23000): Duplicate entry '2-1-1' for key 'id1'&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(1,1,NULL);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(1,1,NULL);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(1,NULL,NULL);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(1,NULL,NULL);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(NULL,NULL,NULL);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; INSERT INTO t1 VALUES(NULL,NULL,NULL);&lt;br /&gt;Query OK, 1 row affected (0.00 sec)&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Apparemment, MySQL respecte le SQL 2003 qui spécifie que les contraintes d'unicité ne s'appliquent que sur les valeurs non nulles, ce qui ne semble pas très intuitif quand on choisi ce type de contrainte. Oracle ne prend pas en compte cette considération et vérfie l'unicité sur l'ensemble des valeurs, ce que nombre de personnes auraient certainement voulu retrouver chez MySQL...&lt;br /&gt;&lt;br /&gt;Pour plus d'information, vous pouvez lire le bug report &lt;a href="http://bugs.mysql.com/bug.php?id=25544"&gt;25544&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-8067231869914593612?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/T4CsLv4hxsw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/8067231869914593612/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=8067231869914593612" title="1 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/8067231869914593612?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/8067231869914593612?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/T4CsLv4hxsw/contraintes-uniques-et-valeurs-nulles.html" title="Contraintes uniques et valeurs nulles" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>1</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2011/02/contraintes-uniques-et-valeurs-nulles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8GQno6fSp7ImA9Wx9SFkU.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-2377144195228421721</id><published>2010-12-06T16:59:00.001-08:00</published><updated>2010-12-06T17:03:43.415-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-12-06T17:03:43.415-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="BDB" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Berkeley DB XML</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Berkeley DB XML est une surcouche à Berkeley DB qui permet d'hériter de toutes ses &lt;a href="http://lesdatabases.blogspot.com/2010/08/berkeley-db-5026.html"&gt;fonctionnalités&lt;/a&gt; pour le stockage de documents XML.&lt;br /&gt;&lt;br /&gt;En plus du stockage, BDB XML apporte les fonctionnalités suivantes :&lt;br /&gt;- Indexation des noeuds, des attributs et des metadata&lt;br /&gt;- Indexation au niveau noeud ou document&lt;br /&gt;- QueryPlan&lt;br /&gt;- Xquery 1.0&lt;br /&gt;- Possibilité d'ajouter/requêter des metadata associées aux documents&lt;br /&gt;- Documents modifiables (remplacer un sous ensemble du document peut être plus rapide)&lt;br /&gt;- Validation (Il est possible de fournir un schema xsd qui est vérifié à l'insertion d'un document)&lt;br /&gt;- Compression zlib par défaut (personnalisable)&lt;br /&gt;&lt;br /&gt;XQUERY (XML Query Language) est disponible pour effectuer des recherches/modifications/ajouts de documents XML.&lt;span class="fullpost"&gt;&lt;br /&gt;Il s'appuie sur &lt;a href="http://xqilla.sourceforge.net/"&gt;Xqilla&lt;/a&gt; (bibliothèque C++) pour effectuer le parsing des requêtes Xquery/XPath.&lt;br /&gt;Xqilla utilise &lt;a href="http://xerces.apache.org/xerces-c/"&gt;Xerces&lt;/a&gt; (bibliothèque C++) pour effectuer le parsing et la validation des documents XML.&lt;br /&gt;XQuery supporte les «Expressions FLWOR»  (For/Let/Where/Order/Return) qui permettent d'effectuer toute sorte de traitements sur les données comme les boucles, les tris, le filtrage.&lt;br /&gt;Il n'est pas encore possible de grouper les données avec XQuery 1.0, mais cette fonctionnalité founie par XQuery 1.1 sera certainement supportée dans l'une des prochaines versions de Berkeley DB XML. Pour plus d'information, vous pouvez vous rendre sur &lt;a href="http://www.w3.org/TR/xquery"&gt;http://www.w3.org/TR/xquery&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Voyons quelques exemples simples de traitements qu'il vous est possible d'effectuer avec le language XQuery (dans l'ensemble des exemples qui suivent, vous pouvez utiliser l'interpréteur dbxml) :&lt;br /&gt;&lt;br /&gt;- Pour ajouter un document au container test.dbxml&lt;br /&gt;dbxml -h /var/tmp/&lt;br /&gt;dbxml&amp;gt;createContainer c1.dbxml&lt;br /&gt;dbxml&amp;gt; put p1 '&amp;lt;person name="pignon" age="32" Taille="160" genre="M"&amp;gt;Charles&amp;lt;/person&amp;gt;'&lt;br /&gt;dbxml&amp;gt; put p2 '&amp;lt;person age="31" Taille="190" genre="M"&amp;gt;Cyril Scetbon&amp;lt;/person&amp;gt;'&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;Pour mettre à jour la valeur de l'attribut age du noeud person dont la valeur de l'attribut name vaut pignon&lt;br /&gt;- replace value of node collection('c1.dbxml')/person[@name='pignon']/@age with  '54'&lt;br /&gt;&lt;br /&gt;Pour récupérer à partir du container c1.dbxml la valeur du noeud person dont la valeur de l'attribut Taille est supérieur à 180 et dont la valeur de l'attribut genre vaut M&lt;br /&gt;- collection("c1.dbxml")/person[@Taille&amp;gt;180 and genre="M"]/text()&lt;br /&gt;&lt;b&gt;Cyril Scetbon&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Pour compter le nombre de valeur distinctes de l'attribut Taille de tous les noeuds person contenus dans le container c1.dbxml&lt;br /&gt;- count(distinct-values(collection("cont2.dbxml")/person/@Taille))&lt;br /&gt;&lt;b&gt;3&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Et voici d'autres exemples utilisant des expressions FLWOR :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;Pour afficher les chiffres de 1 à 10&lt;br /&gt;- for $c in 1 to 3 return $c&lt;br /&gt;&lt;b&gt;1&lt;br /&gt;2&lt;br /&gt;3&lt;br /&gt;&lt;br /&gt;&lt;/b&gt;Pour afficher le nom de tous les auteurs (valeur de l'attribut name du noeud author des documents du container authors.dbxml) qui ont écrit le livre dont le titre est 'MySQL 5 Administration et Optimisation' (vérification en faisant une jointure entre les containers books.dbxml et authors.dbxml sur la relation [valeur de l'attribut id du noeud /author = valeur de l'attribut id du noeud /book/author])&lt;br /&gt;-for $book in collection("books.dbxml")/book[title='MySQL 5 Administration et Optimisation']&lt;br /&gt;  for $author in collection("authors.dbxml")/author[@id=$book/author/@id]&lt;br /&gt;    order by $author/name&lt;br /&gt;    return &amp;lt;author&amp;gt;{$author/name/string()}&amp;lt;/author&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;lt;author&amp;gt;Stephane Combaudon&amp;lt;/author&amp;gt;&lt;br /&gt;&amp;lt;author&amp;gt;Olivier Dasini&amp;lt;/author&amp;gt;&lt;br /&gt;&amp;lt;author&amp;gt;Cyril Scetbon&amp;lt;/author&amp;gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Pour afficher l'ensemble des noeuds person du container c2.dbxml pour lesquels la valeur de l'attribut Taille est supérieur à 180 en les insérant entre des balises &amp;lt;response&amp;gt; &amp;lt;/response&amp;gt;&lt;br /&gt;- for $p in collection("c2.dbxml")/person[@Taille&amp;gt;180]&lt;br /&gt;   order by $p/@Taille descending&lt;br /&gt;   return &amp;lt;response&amp;gt;{$p}&amp;lt;/respoonse&amp;gt;&lt;br /&gt;&lt;b&gt;&amp;lt;person genre="F" Taille="185"&amp;gt;Brigitte Nielsen&amp;lt;/person&amp;gt;&lt;br /&gt;&amp;lt;person genre="M" Taille="182"&amp;gt;Cyril Scetbon&amp;lt;/person&amp;gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Dans un prochain article, nous verrons comment créer des index et vérifier que nos requêtes les utilisent bien.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-2377144195228421721?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/q7txZJDcx90" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/2377144195228421721/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=2377144195228421721" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2377144195228421721?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2377144195228421721?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/q7txZJDcx90/berkeley-db-xml.html" title="Berkeley DB XML" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/12/berkeley-db-xml.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0UGQHg9fip7ImA9Wx5UFEw.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-6270766609122202088</id><published>2010-10-18T07:12:00.001-07:00</published><updated>2010-10-18T07:13:41.666-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-10-18T07:13:41.666-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Mais où est mysqld_safe ?</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Vous l'aurez peut être remarqué, mais dans la distribution Lucid d'Ubuntu,  mysqld_safe n'est plus présent. &lt;br/&gt;Pour rappel, mysqld_safe est un script fourni avec MySQL pour lancer mysqld, le monitorer et le relancer s'il vient à mourir. C'est pourquoi lorsque mysqld_safe tourne, si vous arrêtez mysqld il est automatiquement relancé.&lt;br/&gt;Cependant, il a disparu depuis la version mysqld 5.1.37 fournie dans la Lucid (la version actuelle étant la 5.1.41). Ceci ne veut cependant pas dire que le démon mysqld n'est plus monitoré afin d'être redémarré au cas où. En fait, c'est upstart qui est utilisé pour effectuer cette tâche. &lt;br/&gt;Upstart , qui est un remplaçant du système sysvinit, s'occupe de démarrer et gérer les services au démarrage, ainsi que durant l'activité du système Linux. Des évènements sont déclenchés à l'arrêt ou démarrage de tâches et services et peuvent être captés par d'autres processus afin de déclencher des opérations.&lt;br/&gt;&lt;br/&gt;Vous saurez maintenant qu'il n'y a pas à s'inquiéter sur un système Ubuntu où vous ne voyez pas de processus mysqld_safe tourne !&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-6270766609122202088?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/yUhb4B4mwjA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/6270766609122202088/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=6270766609122202088" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6270766609122202088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6270766609122202088?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/yUhb4B4mwjA/mais-ou-est-mysqldsafe.html" title="Mais où est mysqld_safe ?" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/10/mais-ou-est-mysqldsafe.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0QEQ3k4fip7ImA9Wx5RFkg.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-2192449228777847936</id><published>2010-08-23T01:42:00.001-07:00</published><updated>2010-08-24T07:15:02.736-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-24T07:15:02.736-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tags" /><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="code" /><title>Rechercher des motifs dans une arborescence de code source</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;J'ai découvert le soft global disponible dans les dépôt ubuntu et debian. Cet outil permet de tagger du code écrit en C, C++, Yacc, Java et PHP4, ce qui vous servira si vous voulez rechercher un pattern et par exemple modifier directement le fichier concerné.&lt;br/&gt;&lt;br/&gt;Commençons par installer le produit sur un serveur ubuntu :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;sudo apt-get install global&lt;br/&gt;Lecture des listes de paquets... Fait&lt;br/&gt;Construction de l'arbre des dépendances       &lt;br/&gt;Lecture des informations d'état... Fait&lt;br/&gt;Paquets suggérés :&lt;br/&gt;  doxygen apache httpd id-utils&lt;br/&gt;Les NOUVEAUX paquets suivants seront installés :&lt;br/&gt;  global&lt;br/&gt;0 mis à jour, 1 nouvellement installés, 0 à enlever et 0 non mis à jour.&lt;br/&gt;Il est nécessaire de prendre 532ko dans les archives.&lt;br/&gt;Après cette opération, 1 323ko d'espace disque supplémentaires seront utilisés.&lt;br/&gt;Réception de :1 http://mc.archive.ubuntu.com/ubuntu/ lucid/universe global 5.7.1-1 [532kB]&lt;br/&gt;532ko réceptionnés en 0s (1 721ko/s)&lt;br/&gt;Sélection du paquet global précédemment désélectionné.&lt;br/&gt;(Lecture de la base de données... 197595 fichiers et répertoires déjà installés.)&lt;br/&gt;Dépaquetage de global (à partir de .../global_5.7.1-1_amd64.deb) ...&lt;br/&gt;Traitement des actions différées (« triggers ») pour « man-db »...&lt;br/&gt;Traitement des actions différées (« triggers ») pour « install-info »...&lt;br/&gt;Paramétrage de global (5.7.1-1) ...&lt;br/&gt;Ignoring install-info called from maintainer script&lt;br/&gt;The package global should be rebuilt with new debhelper to get trigger support&lt;/div&gt;&lt;br/&gt;Récupérons les sources d'un projet (nous allons avoir besoin de git dans l'exemple)&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;apt-get install git-core&lt;br/&gt;Reading package lists... Done&lt;br/&gt;Building dependency tree       &lt;br/&gt;Reading state information... Done&lt;br/&gt;The following extra packages will be installed:&lt;br/&gt;  libdigest-sha1-perl liberror-perl&lt;br/&gt;Suggested packages:&lt;br/&gt;  git-doc git-arch git-cvs git-svn git-email git-daemon-run git-gui gitk gitweb&lt;br/&gt;The following NEW packages will be installed:&lt;br/&gt;  git-core libdigest-sha1-perl liberror-perl&lt;br/&gt;0 upgraded, 3 newly installed, 0 to remove and 48 not upgraded.&lt;br/&gt;Need to get 5,673kB of archives.&lt;br/&gt;After this operation, 11.9MB of additional disk space will be used.&lt;br/&gt;Do you want to continue [Y/n]? &lt;br/&gt;Get:1 http://us.archive.ubuntu.com/ubuntu/ lucid/main liberror-perl 0.17-1 [23.8kB]&lt;br/&gt;Get:2 http://us.archive.ubuntu.com/ubuntu/ lucid/main libdigest-sha1-perl 2.12-1build1 [26.2kB]&lt;br/&gt;Get:3 http://us.archive.ubuntu.com/ubuntu/ lucid/main git-core 1:1.7.0.4-1 [5,623kB]&lt;br/&gt;Fetched 5,673kB in 1s (4,984kB/s)   &lt;br/&gt;Selecting previously deselected package liberror-perl.&lt;br/&gt;(Reading database ... 32518 files and directories currently installed.)&lt;br/&gt;Unpacking liberror-perl (from .../liberror-perl_0.17-1_all.deb) ...&lt;br/&gt;Selecting previously deselected package libdigest-sha1-perl.&lt;br/&gt;Unpacking libdigest-sha1-perl (from .../libdigest-sha1-perl_2.12-1build1_i386.deb) ...&lt;br/&gt;Selecting previously deselected package git-core.&lt;br/&gt;Unpacking git-core (from .../git-core_1%3a1.7.0.4-1_i386.deb) ...&lt;br/&gt;Processing triggers for man-db ...&lt;br/&gt;Setting up liberror-perl (0.17-1) ...&lt;br/&gt;Setting up libdigest-sha1-perl (2.12-1build1) ...&lt;br/&gt;Setting up git-core (1:1.7.0.4-1) ...&lt;br/&gt;&lt;br/&gt;git clone http://github.com/Intel/wow.git&lt;br/&gt;Initialized empty Git repository in /home/cyril/src-repo/git-repo/wow/.git/&lt;br/&gt;remote: Counting objects: 5170, done.&lt;br/&gt;remote: Compressing objects: 100% (4124/4124), done.&lt;br/&gt;remote: Total 5170 (delta 1184), reused 4963 (delta 1009)&lt;br/&gt;Receiving objects: 100% (5170/5170), 8.88 MiB | 2.89 MiB/s, done.&lt;br/&gt;Resolving deltas: 100% (1184/1184), done.&lt;br/&gt;&lt;br/&gt;cd wow/src&lt;/div&gt;&lt;br/&gt;Pour indexer les fichiers nous utiliserons la commande gtags qui crée les fichiers GTAGS GPATH GRTAGS GSYMS utilisés par global pour nos futures recherches.&lt;span class='fullpost'&gt;Etant donné que le répertoire contient des fichiers autres que des fichiers sources c++ (.cpp et .h), on utilise la commande find pour les filtrer :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;find . -name "*.cpp" -o -name "*.h"|gtags -v -f -&lt;br/&gt;[Mon Aug 22 09:39:52 CEST 2010] Gtags started.&lt;br/&gt; Using default configuration.&lt;br/&gt;[Mon Aug 22 09:39:52 CEST 2010] Creating 'GTAGS'.&lt;br/&gt; [1] extracting tags of tools/git_id/git_id.cpp&lt;br/&gt; [2] extracting tags of tools/map_extractor/wdt.cpp&lt;br/&gt; [3] extracting tags of tools/map_extractor/adt.cpp&lt;br/&gt; [4] extracting tags of tools/map_extractor/loadlib.cpp&lt;br/&gt; [5] extracting tags of tools/map_extractor/mpq_libmpq.cpp&lt;br/&gt; [6] extracting tags of tools/map_extractor/wdt.h&lt;br/&gt; [7] extracting tags of tools/map_extractor/adt.h&lt;br/&gt; [8] extracting tags of tools/map_extractor/dbcfile.cpp&lt;br/&gt; [9] extracting tags of tools/map_extractor/System.cpp&lt;br/&gt;..&lt;br/&gt; [1096/1099] extracting tags of server/shared/Threading/Threading.cpp&lt;br/&gt; [1097/1099] extracting tags of server/shared/Threading/LockedQueue.h&lt;br/&gt; [1098/1099] extracting tags of server/shared/Threading/Threading.h&lt;br/&gt; [1099/1099] extracting tags of server/shared/Threading/DelayExecutor.cpp&lt;br/&gt;[Mon Aug 22 09:40:18 CEST 2010] Done.&lt;/div&gt;&lt;br/&gt;Tous les fichiers sont à présent indexés. On peut vérifier la taille des fichiers générés par gtags :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;du -sh G*&lt;br/&gt;280K    GPATH&lt;br/&gt;3,2M    GRTAGS&lt;br/&gt;6,6M    GSYMS&lt;br/&gt;2,1M    GTAGS&lt;/div&gt;&lt;br/&gt;Vous pouvez aussi choisir de les placer ailleurs, mais je vous laisse le faire en exercice. Ce qui est intéressant dans cet outil c'est qu'il est possible de rechercher la définition d'une fonction aussi simplement que :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;global -x EndQuery&lt;br/&gt;EndQuery           60 server/shared/Database/QueryResult.cpp void QueryResult::EndQuery()&lt;/div&gt;&lt;br/&gt;On peut aussi vouloir rechercher les références à cette fonction dans le code :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;global -rx EndQuery&lt;br/&gt;EndQuery           37 server/shared/Database/QueryResult.cpp     EndQuery();&lt;br/&gt;EndQuery           50 server/shared/Database/QueryResult.cpp         EndQuery();&lt;br/&gt;EndQuery           59 server/shared/Database/QueryResult.h         void EndQuery();&lt;/div&gt;&lt;br/&gt;Comme vous le voyez il est possible de faire des recherches intéressantes. Il est aussi possible d'utiliser des expressions régulières et de rechercher des motifs diverses :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;global -gx mCurrentRow&lt;br/&gt;mCurrentRow        28 server/shared/Database/QueryResult.cpp     mCurrentRow = new Field[mFieldCount];&lt;br/&gt;mCurrentRow        29 server/shared/Database/QueryResult.cpp     ASSERT(mCurrentRow);&lt;br/&gt;mCurrentRow        32 server/shared/Database/QueryResult.cpp          mCurrentRow[i].SetType(ConvertNativeType(fields[i].type));&lt;br/&gt;mCurrentRow        55 server/shared/Database/QueryResult.cpp         mCurrentRow[i].SetValue(row[i]);&lt;br/&gt;mCurrentRow        62 server/shared/Database/QueryResult.cpp     if (mCurrentRow)&lt;br/&gt;mCurrentRow        64 server/shared/Database/QueryResult.cpp         delete [] mCurrentRow;&lt;br/&gt;mCurrentRow        65 server/shared/Database/QueryResult.cpp         mCurrentRow = 0;&lt;br/&gt;mCurrentRow        45 server/shared/Database/QueryResult.h         Field *Fetch() const { return mCurrentRow; }&lt;br/&gt;mCurrentRow        47 server/shared/Database/QueryResult.h         const Field &amp;amp; operator [] (int index) const { return mCurrentRow[index]; }&lt;br/&gt;mCurrentRow        53 server/shared/Database/QueryResult.h         Field *mCurrentRow;&lt;/div&gt;&lt;br/&gt;Reportez vous à la documentation pour en savoir plus. Dernier outil que je trouve très intéressant est le wrapper globash qui permet en plus de se promener directement dans les fichiers à partir des résultats obtenus. Pour cela, lancez la commande globash et acceptez de créer le répertoire .globash lors du premier lancement :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;globash &lt;br/&gt;&lt;br/&gt;GloBash --- Global facility for Bash&lt;br/&gt;&lt;br/&gt;GloBash needs working directory.&lt;br/&gt;&lt;br/&gt;Create '/home/cyril/.globash'? ([y]/n) y&lt;br/&gt;&lt;br/&gt;Created.&lt;br/&gt;&lt;br/&gt;Welcome to Globash! When you need help, please type 'ghelp'.&lt;/div&gt;&lt;br/&gt;Vous pouvez ensuite utiliser les mêmes commandes mais sans l'option x qui est activée par défaut :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;[/home/cyril/src-repo/git-repo/wow/src] &lt;b&gt;g &lt;/b&gt;mCurrentRow&lt;br/&gt;&amp;gt;    1    mCurrentRow        28 server/shared/Database/QueryResult.cpp     mCurrentRow = new Field[mFieldCount];&lt;br/&gt;     2    mCurrentRow        29 server/shared/Database/QueryResult.cpp     ASSERT(mCurrentRow);&lt;br/&gt;     3    mCurrentRow        32 server/shared/Database/QueryResult.cpp          mCurrentRow[i].SetType(ConvertNativeType(fields[i].type));&lt;br/&gt;     4    mCurrentRow        55 server/shared/Database/QueryResult.cpp         mCurrentRow[i].SetValue(row[i]);&lt;br/&gt;     5    mCurrentRow        62 server/shared/Database/QueryResult.cpp     if (mCurrentRow)&lt;br/&gt;     6    mCurrentRow        64 server/shared/Database/QueryResult.cpp         delete [] mCurrentRow;&lt;br/&gt;     7    mCurrentRow        65 server/shared/Database/QueryResult.cpp         mCurrentRow = 0;&lt;br/&gt;     8    mCurrentRow        45 server/shared/Database/QueryResult.h         Field *Fetch() const { return mCurrentRow; }&lt;br/&gt;     9    mCurrentRow        47 server/shared/Database/QueryResult.h         const Field &amp;amp; operator [] (int index) const { return mCurrentRow[index]; }&lt;br/&gt;    10    mCurrentRow        53 server/shared/Database/QueryResult.h         Field *mCurrentRow;&lt;/div&gt;&lt;br/&gt;Vous pouvez lister à nouveau les résultats obtenus :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;[/home/cyril/src-repo/git-repo/wow/src] &lt;b&gt;list&lt;/b&gt;&lt;br/&gt;&amp;gt;    1    mCurrentRow        28 server/shared/Database/QueryResult.cpp     mCurrentRow = new Field[mFieldCount];&lt;br/&gt;     2    mCurrentRow        29 server/shared/Database/QueryResult.cpp     ASSERT(mCurrentRow);&lt;br/&gt;     3    mCurrentRow        32  server/shared/Database/QueryResult.cpp           mCurrentRow[i].SetType(ConvertNativeType(fields[i].type));&lt;br/&gt;     4    mCurrentRow        55 server/shared/Database/QueryResult.cpp         mCurrentRow[i].SetValue(row[i]);&lt;br/&gt;     5    mCurrentRow        62 server/shared/Database/QueryResult.cpp     if (mCurrentRow)&lt;br/&gt;     6    mCurrentRow        64 server/shared/Database/QueryResult.cpp         delete [] mCurrentRow;&lt;br/&gt;     7    mCurrentRow        65 server/shared/Database/QueryResult.cpp         mCurrentRow = 0;&lt;br/&gt;     8    mCurrentRow        45 server/shared/Database/QueryResult.h         Field *Fetch() const { return mCurrentRow; }&lt;br/&gt;     9    mCurrentRow        47  server/shared/Database/QueryResult.h         const Field &amp;amp; operator  [] (int index) const { return mCurrentRow[index]; }&lt;br/&gt;    10    mCurrentRow        53 server/shared/Database/QueryResult.h         Field *mCurrentRow;&lt;/div&gt;&lt;br/&gt;Mieux encore, vous pouvez demander à vous rendre directement à la ligne du fichier concerné (cela s'appuie sur la définition de la variable EDITOR)&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;[/home/cyril/src-repo/git-repo/wow/src] &lt;b&gt;show&lt;/b&gt; 2&lt;br/&gt;[/home/cyril/src-repo/git-repo/wow/src] &lt;b&gt;l&lt;/b&gt;&lt;br/&gt;    1    mCurrentRow        28 server/shared/Database/QueryResult.cpp     mCurrentRow = new Field[mFieldCount];&lt;br/&gt;&amp;gt;     2    mCurrentRow        29 server/shared/Database/QueryResult.cpp     ASSERT(mCurrentRow);&lt;br/&gt;     3    mCurrentRow        32  server/shared/Database/QueryResult.cpp           mCurrentRow[i].SetType(ConvertNativeType(fields[i].type));&lt;br/&gt;     4    mCurrentRow        55 server/shared/Database/QueryResult.cpp         mCurrentRow[i].SetValue(row[i]);&lt;br/&gt;     5    mCurrentRow        62 server/shared/Database/QueryResult.cpp     if (mCurrentRow)&lt;br/&gt;     6    mCurrentRow        64 server/shared/Database/QueryResult.cpp         delete [] mCurrentRow;&lt;br/&gt;     7    mCurrentRow        65 server/shared/Database/QueryResult.cpp         mCurrentRow = 0;&lt;br/&gt;     8    mCurrentRow        45 server/shared/Database/QueryResult.h         Field *Fetch() const { return mCurrentRow; }&lt;br/&gt;     9    mCurrentRow        47  server/shared/Database/QueryResult.h         const Field &amp;amp; operator  [] (int index) const { return mCurrentRow[index]; }&lt;br/&gt;    10    mCurrentRow        53 server/shared/Database/QueryResult.h         Field *mCurrentRow;&lt;/div&gt;&lt;br/&gt;Vous pouvez taper exit pour sortir ou ghelp pour en savoir plus.&lt;br/&gt;&lt;br/&gt;Cet outil est vraiment très rapide pour indexer le contenu et très utile avec son wrapper pour se balader directement dans les fichiers et effectuer des modifications si nécessaire. N'oubliez pas bien sûr de rafraîchir le contenu indexé ensuite en ajoutant -i à la commande initiale pour activer l'indexation incrémentale (Vous pouvez bien sûr retirer l'option -v qui active le mode verbeux) :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;find . -name "*.cpp" -o -name "*.h"|gtags -i -v -f -&lt;br/&gt;checking /home/cyril/src-repo/git-repo/wow/src/GTAGS&lt;br/&gt;GTAGS found at '/home/cyril/src-repo/git-repo/wow/src/GTAGS'.&lt;br/&gt;[Mon Aug 22 10:08:12 CEST 2010] Gtags started.&lt;br/&gt; Using default configuration.&lt;br/&gt; Tag found in '/home/cyril/src-repo/git-repo/wow/src'.&lt;br/&gt; Incremental update.&lt;br/&gt; Global databases are up to date.&lt;br/&gt;[Mon Aug 22 10:08:12 CEST 2010] Done.&lt;/div&gt;&lt;br/&gt;Je m'étais aussi intéressé à l'outil gonzui qui est aussi disponible sous forme de paquet et s'appuie sur &lt;a href='http://lesdatabases.blogspot.com/2010/08/berkeley-db-5026.html'&gt;BerkeleyDB&lt;/a&gt; pour stocker ses tags. Cependant, cet outil est beaucoup plus lent que global à l'indexation puisque que l'on passe de 3 à 130 secondes, et aussi lors des recherches sur des expressions régulières. Il ne dispose pas d'un wrapper semblable à globash qui est sans nul doute très utile lorsqu'il faut débugger, et occupe nécessite beaucoup plus de places que global (167 Mo contre 13 Mo).&lt;br/&gt;&lt;br/&gt;Voilà, j'espère que ce billet vous sera utile dans vos prochaines investigations sur du code concernant les bases de données ou autres, mais comme vous avez pu le remarquer j'ai sciemment cherché un exemple dans la branche database :)&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-2192449228777847936?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/J0MJqSYBa44" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/2192449228777847936/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=2192449228777847936" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2192449228777847936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2192449228777847936?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/J0MJqSYBa44/rechercher-des-motifs-dans-une.html" title="Rechercher des motifs dans une arborescence de code source" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/08/rechercher-des-motifs-dans-une.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MBQH89fyp7ImA9Wx5SEE8.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-2044733854391271223</id><published>2010-08-05T10:23:00.001-07:00</published><updated>2010-08-05T10:30:51.167-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-08-05T10:30:51.167-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="BDB" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Berkeley DB 5.0.26</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Pour ceux qui ne connaissent pas Berkeley DB (BDB), ou qui en ont vaguement entendu parler, sachez que si vous êtes sous un système opensource, vous avez de grande chances d'utiliser BDB sans même le savoir.&lt;br /&gt;&lt;br /&gt;Par exemple, si vous utilisez pidgin ou evolution vous utilisez BDB :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;~$ lsof -n|grep 'libdb-'|awk '{print $1," ",$9}'|sort|uniq&lt;br /&gt;evolution   /usr/lib/libdb-4.8.so&lt;br /&gt;pidgin   /usr/lib/libdb-4.8.so&lt;/div&gt;&lt;br /&gt;Je peux par exemple voir sur mon système le nombre de paquets qui ont déclaré dépendre de BDB :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;~$ apt-cache rdepends libdb4.8| wc -l&lt;br /&gt;96&lt;/div&gt;&lt;br /&gt;On peut aussi en voir un aperçu :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;~$ apt-cache rdepends libdb4.8| head&lt;br /&gt;libdb4.8&lt;br /&gt;Reverse Depends:&lt;br /&gt;  squidguard&lt;br /&gt;  libapache2-mod-php5filter&lt;br /&gt;  php5-cli&lt;br /&gt;  php5-cgi&lt;br /&gt;  openoffice.org-core&lt;br /&gt;  libpam-modules&lt;br /&gt;  libedata-cal1.2-6&lt;br /&gt;  libedata-book1.2-2&lt;/div&gt;&lt;br /&gt;Et encore ce ne sont que les paquets qui l'ont déclaré ! Tout ça pour vous dire que BDB est indispensable à tout système open-source qui se respecte. Mais qu'est-ce que BDB ?&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;BDB est une bibliothèque permettant d'opérer sur des données (stockage, modification, recherche) et que l'on lie à une application pour lui fournir ce type de service. L'application peut être codée en utilisant des languages différents (JAVA, C++, C, Perl, PHP, Python, etc...) et choisi la structure la plus adaptée à ses données parmi les types Btree, Hash, Queue et Recno.  (Vous pouvez consulter &lt;a href="http://www.oracle.com/technology/documentation/berkeley-db/db/programmer_reference/index.html"&gt;la documentation&lt;/a&gt; pour en savoir un peu plus sur ces différents types).&lt;br /&gt;&lt;br /&gt;BDB supporte les transactions &lt;a href="http://en.wikipedia.org/wiki/ACID"&gt;ACID&lt;/a&gt;, le multithreading et le multiprocessing, l'encryptage de l'environnement (répertoire stockant les données), l'indexation, les sauvegardes à chaud et la récupération des données en cas de crash (grâce à la journalisation des transactions), ainsi que la replication maître/esclaves !&lt;br /&gt;&lt;br /&gt;Sachez qu'il est possible de configurer les environnements participant à un groupe de réplication de sorte que les rôles de maître/esclaves soient redistribués (failover) en cas d'erreur sur le maître ou au niveau du canal de communication. Il est à noter que pour utiliser la réplication il est nécessaire de développer du code c, c++ ou java :(&lt;br /&gt;Oracle qui a racheté la société Sleepycat Software propriétaire de BDB en février 2006 annonce une capacité de stockage en teraoctets et des milliards d'enregistrements !!&lt;br /&gt;&lt;br /&gt;Cette bibliothèque est disponible sous 2 licences :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;commerciale&lt;/li&gt;&lt;li&gt;GPL (celle qui vous permet de l'utiliser sur votre système opensource)&lt;/li&gt;&lt;/ul&gt;Il est à noter qu'étant une bibliothèque, il n'y a pas de serveur de données. l'application accède et manipule directement les fichiers physiques grâce au code de la bibliothèque BDB. De même, ce n'est pas un &lt;a href="http://en.wikipedia.org/wiki/Relational_database_management_system"&gt;RDBMS&lt;/a&gt; (relational database management system) ne supportant pas les relations entre les données stockées.&lt;br /&gt;&lt;br /&gt;Dans un prochain article je vous montrerai comment installer et utiliser rapidement un environnement BDB XML. Soyez patients ...&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-2044733854391271223?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/p9qnh_Ybw1Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/2044733854391271223/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=2044733854391271223" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2044733854391271223?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2044733854391271223?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/p9qnh_Ybw1Y/berkeley-db-5026.html" title="Berkeley DB 5.0.26" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/08/berkeley-db-5026.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEIFQX8_fSp7ImA9WxFUE0U.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-2628974079428037270</id><published>2010-06-24T06:34:00.001-07:00</published><updated>2010-06-24T06:35:10.145-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-06-24T06:35:10.145-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="5.5" /><category scheme="http://www.blogger.com/atom/ns#" term="livre" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="5.1" /><title>Un livre MySQL à acquérir</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Après 6 bons mois de rédactions, d'échanges de mails et de relectures, je vous annonce la sortie d'un nouveau livre sur MySQL 5 en français :&lt;br /&gt;&lt;a href="http://www.editions-eni.fr/Livres/MySQL-5-administration-et-optimisation/.5_3a6222cf-b921-41f5-886c-c989f77ba994_cb487b7e-d258-456f-9051-6cc0e5e2b22f_817f0d89-4a9c-49f7-ad91-63e24f3c9941_1_0_d9bd8b5e-f324-473f-b1fc-b41b421c950f.html"&gt;MySQL5, Administration et optimisation&lt;/a&gt;&lt;br /&gt;&lt;div class="entry"&gt;&lt;p&gt;Il reprend et explique tous les points propres à l'administration (configuration, mise à jour, sauvegardes/restaurations, maintenance, sécurité, ..) et à l'optimisation (nouvelles fonctionnalités, systèmes de caches, indexation, tuning, ..) en rendant abordables des concepts complexes.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;En attendant de vous le procurer, vous pouvez consulter la &lt;a href="http://www.dbnewz.com/wp-content/uploads/2010/06/TDM_MySQL5_Admin_Optim.pdf"&gt;TDM_MySQL5_Admin_Optim&lt;/a&gt; et un &lt;a href="http://www.dbnewz.com/wp-content/uploads/2010/06/Extrait_MySQL5_Admin_Optim.pdf"&gt;Extrait_MySQL5_Admin_Optim&lt;/a&gt; consacré aux verrous et transactions.&lt;/p&gt;&lt;p&gt;Inutile de vous dire que le livre est disponible dans toutes les bonnes librairies informatiques (FNAC, Amazon, ...). Pensez donc à vous le procurer pour l'étudier pendant vos vacances !&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-2628974079428037270?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/LXgOdDp0H4E" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/2628974079428037270/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=2628974079428037270" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2628974079428037270?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2628974079428037270?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/LXgOdDp0H4E/un-livre-mysql-acquerir.html" title="Un livre MySQL à acquérir" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/06/un-livre-mysql-acquerir.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkEGQn4zcCp7ImA9WxFRGU0.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-441797225160011176</id><published>2010-05-03T09:33:00.001-07:00</published><updated>2010-05-03T09:37:03.088-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-03T09:37:03.088-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="conf" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="cluster" /><title>MySQL Cluster impose des limites aux méta-données</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Lorsque vous mettez en place une configuration MySQL Cluster, ayez à l'esprit que celui-ci impose par défaut des limites aux méta-données. Vous ne pourrez donc pas créer autant de tables, d'index, de colonnes que vous le désirez sans modifier sa configuration. Il est possible de le faire plus tard, mais cela nécessitera d'effectuer un rolling restart (un redémarrage de l'ensemble des composants du cluster).&lt;br /&gt;Voici les quelques paramètres qu'il faudra modifier selon les besoins de votre cluster (les valeurs par défaut sont indiquées entre parenthèses) :&lt;br /&gt;&lt;br /&gt;- MaxNoOfAttributes fixe le nombre maximum de colonnes pouvant être créées au total dans l'ensemble des tables stockées (1000)&lt;br /&gt;- MaxNoOfOrderedIndexes fixe le nombre maximum d'index ordonnés (128)&lt;br /&gt;- MaxNoOfUniqueHashIndexes, comme le précédent mais pour les index uniques (64)&lt;br /&gt;- MaxNoOfTables fixe le nombre maximum de tables (128)&lt;br /&gt;&lt;br /&gt;Vous pourrez donc modifier la section [NDBD DEFAULT] de votre fichier de configuration ndb_mgmd.cnf et y ajouter la configuration suivante par exemple :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;MaxNoOfAttributes=10000&lt;br /&gt;MaxNoOfOrderedIndexes=3000&lt;br /&gt;MaxNoOfUniqueHashIndexes=1500&lt;br /&gt;MaxNoOfTables=1000&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pour plus d'information, vous pouvez visiter la documentation en ligne à l'adresse &lt;a href="http://dev.mysql.com/doc/mysql-cluster-excerpt/5.1/en/mysql-cluster-mgm-definition.html"&gt;http://dev.mysql.com/doc/mysql-cluster-excerpt/5.1/en/mysql-cluster-mgm-definition.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vous ne pourrez pas dire que vous n'avez pas été prévenu :)&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-441797225160011176?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/9fch85I3v6k" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/441797225160011176/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=441797225160011176" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/441797225160011176?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/441797225160011176?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/9fch85I3v6k/mysql-cluster-impose-des-limites-aux.html" title="MySQL Cluster impose des limites aux méta-données" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/05/mysql-cluster-impose-des-limites-aux.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8NQnczcCp7ImA9WxBaFk8.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-685039522846519323</id><published>2010-03-26T10:17:00.000-07:00</published><updated>2010-03-26T10:18:13.988-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-26T10:18:13.988-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="samples" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><title>2 bases exemple pour MySQL</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Sur le site de MySQL vous pouvez télécharger les bases sakila et world afin de vous familiariser avec le SGBD.&lt;br /&gt;Pour installer ces 2 bases sur votre serveur sous Ubuntu, suivez la procédure suivante :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;sudo wget -c http://downloads.mysql.com/docs/sakila-db.tar.gz&lt;br /&gt;sudo tar Ozvxf sakila-db.tar.gz  sakila-db/sakila-schema.sql|sudo mysql --defaults-file=/etc/mysql/debian.cnf&lt;br /&gt;sudo tar Ozvxf sakila-db.tar.gz  sakila-db/sakila-data.sql|sudo mysql --defaults-file=/etc/mysql/debian.cnf sakila&lt;br /&gt;&lt;br /&gt;sudo wget http://downloads.mysql.com/docs/world.sql.gz&lt;br /&gt;sudo mysql --defaults-file=/etc/mysql/debian.cnf -e 'CREATE DATABASE world'&lt;br /&gt;sudo zcat world.sql.gz|sudo mysql --defaults-file=/etc/mysql/debian.cnf world&lt;/div&gt;&lt;br /&gt;Voila vos 2 bases sont créées et prêtes à être utilisées :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;sudo mysql --defaults-file=/etc/mysql/debian.cnf&lt;br /&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 46&lt;br /&gt;Server version: 5.1.37-1ubuntu5.1 (Ubuntu)&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; SELECT count(*) TABLES, table_schema,                                                                                                                   &lt;br /&gt;   -&amp;gt; concat(round(sum(table_rows)/1000000,2),'M') rows,&lt;br /&gt;   -&amp;gt; concat(round(sum(data_length)/(1024*1024),2),'M') DATA,&lt;br /&gt;   -&amp;gt; concat(round(sum(index_length)/(1024*1024),2),'M') idx,&lt;br /&gt;   -&amp;gt; concat(round(sum(data_length+index_length)/(1024*1024),2),'M') total_size,&lt;br /&gt;   -&amp;gt; round(sum(index_length)/sum(data_length),2) idxfrac&lt;br /&gt;   -&amp;gt; FROM information_schema.TABLES&lt;br /&gt;   -&amp;gt; WHERE table_schema IN ('sakila','world')&lt;br /&gt;   -&amp;gt; GROUP BY table_schema;&lt;br /&gt;+--------+--------------------+-------+--------+-------+------------+---------+&lt;br /&gt;| TABLES | table_schema       | rows  | DATA   | idx   | total_size | idxfrac |&lt;br /&gt;+--------+--------------------+-------+--------+-------+------------+---------+&lt;br /&gt;|     23 | sakila             | 0.05M | 4.10M  | 2.52M | 6.62M      |    0.62 |&lt;br /&gt;|      3 | world              | 0.01M | 0.36M  | 0.07M | 0.43M      |    0.19 |&lt;br /&gt;+--------+--------------------+-------+--------+-------+------------+---------+&lt;br /&gt;2 rows in set (0,03 sec)&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; exit&lt;br /&gt;Bye&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pour en savoir plus sur ces 2 bases vous pouvez vous rendre sur le site web de MySQL aux adresses &lt;a href="http://dev.mysql.com/doc/sakila/en/sakila.html"&gt;http://dev.mysql.com/doc/sakila/en/sakila.html&lt;/a&gt; et &lt;a href="http://dev.mysql.com/doc/world-setup/en/world-setup.html"&gt;http://dev.mysql.com/doc/world-setup/en/world-setup.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A vous de jouer !&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-685039522846519323?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/6TlxOzqqtXQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/685039522846519323/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=685039522846519323" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/685039522846519323?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/685039522846519323?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/6TlxOzqqtXQ/2-bases-exemple-pour-mysql.html" title="2 bases exemple pour MySQL" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/03/2-bases-exemple-pour-mysql.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIHQnc-eCp7ImA9WxBVFEU.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-2824131216318185963</id><published>2010-02-18T01:02:00.003-08:00</published><updated>2010-02-18T01:15:33.950-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-18T01:15:33.950-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="cluster" /><title>MySQL Cluster 7.1</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;La version 7.1 du moteur de stockage NDB n'est pas encore sortie mais on peut déjà savoir quelles seront les prochaines nouveautés non garanties pour le moment :&lt;br /&gt;&lt;br /&gt;- Deux nouveaux connecteurs JAVA&lt;br /&gt;&lt;br /&gt;ClusterJ et ClusterJPA permettent d'accéder au cluster MySQL sans utiliser de serveur MySQL (ni JDBC) ou pour le second de passer ou non par un serveur MySQL si la requête exécutée peut être améliorée par l'optimiseur MySQL.&lt;br /&gt;&lt;br /&gt;Cette base permet d'accéder à des informations tel que la mémoire utilisée (table &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbinfo-memoryusage.html"&gt;memoryusage&lt;/a&gt;), le statut des noeuds (table &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbinfo-nodes.html"&gt;nodes&lt;/a&gt;), etc... nécessitant auparavant l'utilisation des commandes ALL DUMP {CODE}&lt;br /&gt;&lt;br /&gt;- Une nouvelle base de données nommé ndbinfo&lt;br /&gt;&lt;br /&gt;Cette base permet d'accéder à des informations tel que la mémoire utilisée (table &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbinfo-memoryusage.html"&gt;memoryusage&lt;/a&gt;), le statut des noeuds (table &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-ndbinfo-nodes.html"&gt;nodes&lt;/a&gt;), etc... nécessitant auparavant l'utilisation des commandes ALL DUMP {CODE}&lt;br /&gt;&lt;br /&gt;- Le support natif des valeurs par défaut des colonnes&lt;br /&gt;&lt;br /&gt;Les valeurs par défaut des colonnes sont à présent stockées dans le noyau NDB et non par le serveur MySQL. Ceci permet au serveur MySQL de ne plus avoir à transférer ces données aux noeuds et donc potentiellement d'accélérer les requêtes d'insertions&lt;br /&gt;&lt;br /&gt;- Une nouvelle option (--nowait-nodes) pour les managers&lt;br /&gt;&lt;br /&gt;Cette option permet de ne plus avoir besoin de démarrer plus d'un manager pour démarrer un cluster configuré avec plusieurs managers.&lt;br /&gt;&lt;br /&gt;Pour suivre l'évolution de ces fonctionnalités n'hésitez pas à consulter &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-development-5-1-ndb-7-1.html"&gt;la page dédiée&lt;/a&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-2824131216318185963?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/pZRsp7rbOzE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/2824131216318185963/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=2824131216318185963" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2824131216318185963?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2824131216318185963?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/pZRsp7rbOzE/mysql-cluster-71.html" title="MySQL Cluster 7.1" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/02/mysql-cluster-71.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIFQn0_eCp7ImA9WxBVFEU.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-3428480158014110489</id><published>2010-02-18T01:02:00.001-08:00</published><updated>2010-02-18T01:15:13.340-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-02-18T01:15:13.340-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="news" /><category scheme="http://www.blogger.com/atom/ns#" term="cluster" /><title>Récupérez les dernières versions de MySQL Cluster 7.X</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;Nous avons déjà vu dans un &lt;a href="http://lesdatabases.blogspot.com/2008/12/mysql-cluster-64.html"&gt;billet précédent&lt;/a&gt; les nouveautés de la version 7.0 (ancienne 6.4 renommée).&lt;br /&gt;&lt;br /&gt;Il est cependant important de pouvoir vérifier l'arrivée des nouvelles versions sur le dépot officiel, et pourquoi pas de les récupérer pour les tester. Pour cela voici les commandes que j'utilise :&lt;br /&gt;&lt;br /&gt;- Pour vérifier l'arrivée de nouvelles versions, je m'appuie sur les dates de création des répertoires&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;export LANG=C&lt;br /&gt;wget -O - -q ftp://ftp.mysql.com/pub/mysql/download/cluster_telco/|grep Directory|awk -FDirectory '!/old/ {print $1}'|perl -MDate::Manip -lne 'if(Date_Cmp(ParseDate($_),ParseDate("2010 Feb 15 21:27"))&amp;gt;0){print "Nouvelle version disponible !";exit}'&lt;/div&gt;&lt;br /&gt;- Pour récupérer les nouvelles versions disponibles j'utilise l'alias mirror_mysql_cge que j'ai défini ainsi :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;alias mirror_mysql_cge='(cd /var/www &amp;amp;&amp;amp; wget -nH --cut-dirs 3 -rc -R "mysqlcom*" -A "*-7.*.gz" --exclude-directories=/pub/mysql/download/cluster_telco/old,/pub/mysql/download/cluster_telco/newbuilds,/pub/mysql/download/cluster_telco/*-6.*,/pub/mysql/download/cluster_telco/*/*-6.*,/pub/mysql/download/cluster_telco/evaluation* ftp://ftp.mysql.com/pub/mysql/download/cluster_telco/)'&lt;/div&gt;&lt;br /&gt;A chaque récupération de nouvelles archives il est cependant obligatoire de modifier la date utilisée dans la commande wget pour repérer la dernière archive récupérée. Pour obtenir cette date, la commande suivante sera d'un grand secours :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;export LANG=C&lt;br /&gt;wget -O - -q ftp://ftp.mysql.com/pub/mysql/download/cluster_telco/|grep Directory|awk -FDirectory '!/old/ {if(index($1,":")){print $1}}'| tr '\n' , |sed 's/,$//'|perl -MDate::Manip -MMemoize -lne 'sub sortDate {(Date_Cmp(ParseDate($a),ParseDate($b)))} print [reverse sort sortDate split(",",$_)]-&amp;gt;[0]'&lt;/div&gt;&lt;br /&gt;Ainsi je retrouverai toutes les versions 7.X sous l'arborescence /var/www/cluster_telco&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-3428480158014110489?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/t9HOq1EnJIM" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/3428480158014110489/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=3428480158014110489" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3428480158014110489?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3428480158014110489?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/t9HOq1EnJIM/recuperez-les-dernieres-versions-de.html" title="Récupérez les dernières versions de MySQL Cluster 7.X" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/02/recuperez-les-dernieres-versions-de.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8HSHY9fip7ImA9WxBRFkQ.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-6069158008162359716</id><published>2010-01-04T07:11:00.001-08:00</published><updated>2010-01-05T04:17:19.866-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-01-05T04:17:19.866-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="partitioning" /><category scheme="http://www.blogger.com/atom/ns#" term="5.5" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><title>Nouvelles fonctionnalités dans le partitionnement de MySQL 5.5</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Etant donné que cela fait un long moment que je n'ai pas bloggé je vais tenter de me rattrapper un peu :)&lt;br/&gt;&lt;br/&gt;Je me suis penché sur l'une des nouvelles fonctionnalités de MySQL 5.5 concernant le partitionnement multi-colonnes en mode RANGE sur des types qui ne sont plus limités à l'entier.&lt;br/&gt;&lt;br/&gt;En effet, il est possible de partitionner une table t1 sur 2 colonnes comme suit :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;CREATE TABLE t1 (&lt;br/&gt;valeur TINYINT UNSIGNED NOT NULL,&lt;br/&gt;quand DATE NOT NULL,&lt;br/&gt;libelle varchar(120)&lt;br/&gt;)&lt;br/&gt;PARTITION BY RANGE COLUMNS(valeur,quand) (&lt;br/&gt;    PARTITION p0 VALUES LESS THAN (10,'2006-10-02'),&lt;br/&gt;    PARTITION p1 VALUES LESS THAN (10,'2008-04-12'),&lt;br/&gt;    PARTITION p2 VALUES LESS THAN (100,MAXVALUE),&lt;br/&gt;    PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)&lt;br/&gt;);&lt;/div&gt;&lt;br/&gt;Cependant l'algorithme qui répartit les données sur les différentes partitions créées n'est pas si intuitif que cela. Ainsi, j'imaginais dans un premier temps que l'enregistrement (100,'2005-10-02') ne pouvait se retrouver dans la partition p2 car 100 n'est pas inférieur à 100 ! En effet, je pensais que l'opérator LESS THAN sur un couple sous entendait que pour qu'un enregistrement (valeur,quand,libelle) appartienne à la partition p0 il fallait que valeur&amp;lt;10 et quand&amp;lt;'2006-10-02'. &lt;br/&gt;Or ce n'est pas le cas, la preuve :&lt;br/&gt;&lt;br/&gt;&lt;div class='code'&gt;mysql&amp;gt; SELECT IF(10&amp;lt;10,'TRUE','FALSE'),IF('2005-10-02'&amp;lt;'2006-10-02','TRUE','FALSE'),IF((10,'2005-10-02')&amp;lt;(10,'2006-10-02'),'TRUE','FALSE')\G&lt;br/&gt;*************************** 1. row ***************************&lt;br/&gt;                              IF(10&amp;lt;10,'TRUE','FALSE'): FALSE&lt;br/&gt;          IF('2005-10-02'&amp;lt;'2006-10-02','TRUE','FALSE'): TRUE&lt;br/&gt;IF((10,'2005-10-02')&amp;lt;(10,'2006-10-02'),'TRUE','FALSE'): TRUE&lt;/div&gt;&lt;br/&gt;Il faut dire qu'entre la documentation officielle qui a été corrigée (&lt;a href='http://bugs.mysql.com/bug.php?id=49875'&gt;BUG 49875&lt;/a&gt;) suite à mon premier &lt;a href='http://bugs.mysql.com/bug.php?id=49861'&gt;BUG 49861&lt;/a&gt;, et l'&lt;a href='http://dev.mysql.com/tech-resources/articles/mysql_55_partitioning.html'&gt;article de Giuseppe Maxia&lt;/a&gt; qui affirmait que si toutes les premières valeurs des listes de colonnes assignées aux partitions étaient différentes alors le partitionnement était identique au partitionnement sur cette seule colonne (corrigé depuis) j'ai un peu perdu la tête...&lt;br/&gt;&lt;br/&gt;Cependant, cette histoire a bien fait de débuter puisqu'elle a débouché sur la correction de la documentation officielle, la correction d'un article avancé sur les nouveautés de la 5.5 concernant le partitionnement et sur la remise en cause des mots clés LESS THAN dans ce type de partitionnement avec une proposition de remplacement par NO GREATER THAN ou RANGE BOUNDED BY. &lt;br/&gt;&lt;br/&gt;Nous verrons bien ce qu'il se passera dans les semaines à venir.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-6069158008162359716?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/IG5FMonAl5Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/6069158008162359716/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=6069158008162359716" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6069158008162359716?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6069158008162359716?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/IG5FMonAl5Y/nouvelles-fonctionnalites-dans-le.html" title="Nouvelles fonctionnalités dans le partitionnement de MySQL 5.5" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2010/01/nouvelles-fonctionnalites-dans-le.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcGSX44fip7ImA9WxNTFUw.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-1843534934230821019</id><published>2009-08-03T08:59:00.001-07:00</published><updated>2009-08-17T06:50:28.036-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-17T06:50:28.036-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="ndb" /><category scheme="http://www.blogger.com/atom/ns#" term="upgrade" /><title>Upgrade MySQL Cluster 6.3 vers 7.0 pas si online que ça !</title><content type="html">Ne vous fiez pas tout le temps à la documentation MySQL car il se peut que vous rencontriez soit un BUG fonctionnel, soit un BUG documentaire, c'est à dire que le support vous signale qu'en fait le comportement rencontré est normal et que la documentation va tout simplement être mise à jour.&lt;br/&gt;&lt;span class='fullpost'&gt;&lt;br/&gt;C'est pourquoi, préparant un upgrade de MySQL Cluster 6.3 vers MySQL 7.0.6, j'ai préféré tester la procédure, étape qui de toutes les façons est primordiale. Ce fut l'occasion de m'apercevoir que la mise à jour se déroule correctement mais qu'il n'est plus possible d'effectuer des ordres DDL (ALTER TABLE, CREATE TABLE, etc...) ou d'effectuer une sauvegarde binaire en utilisant la console ndb_mgm. Pour information, j'ai ouvert un bug report au support accessible sur &lt;a href='http://bugs.mysql.com/bug.php?id=46494'&gt;http://bugs.mysql.com/bug.php?id=46494&lt;/a&gt;.&lt;br/&gt;En attendant, la seule méthode viable pour mettre à jour le cluster est de démarrer les noeuds en mode "initial", étape qui vide tous les fichiers et recrée les logs de récupération, et recharger les données à partir d'un dump MySQL. Vous l'aurez compris cela demande donc un arrêt de service puisque les données du cluster ne seront plus accessibles avant que le chargement des données ne soit terminé.&lt;br/&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-1843534934230821019?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/ly_NfnhlTV0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/1843534934230821019/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=1843534934230821019" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/1843534934230821019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/1843534934230821019?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/ly_NfnhlTV0/upgrade-mysql-cluster-63-vers-70-pas-si.html" title="Upgrade MySQL Cluster 6.3 vers 7.0 pas si online que ça !" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/08/upgrade-mysql-cluster-63-vers-70-pas-si.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUCRHY4cSp7ImA9WxJQE0k.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-2882717320402219137</id><published>2009-05-26T05:49:00.003-07:00</published><updated>2009-05-26T05:51:05.839-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-26T05:51:05.839-07:00</app:edited><title>2 managers ndb_mgmd dans une config MySQL Cluster</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;Lorsque l'on modifie des paramètres de mémoire ou autres qui ne nécessitent pas de recréer le cluster, contrairement au nombre de noeuds pour les versions du moteur NDB &amp;lt; 7.0, il est nécessaire de faire un &lt;a href='http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-rolling-restart.html'&gt;Rolling Restart&lt;/a&gt;. Cependant, dans le cas d'une configuration à plusieurs managers il est nécessaire de tous les arrêter au même moment.&lt;span class='fullpost'&gt; Ceci est dû au fait que tant qu'un manager est actif c'est sa configuration qui prime. L'impact est que le redémarrage tour à tour des managers entraînera la conservation de l'ancienne configuration de départ, ce qui n'est pas le résultat attendu.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-2882717320402219137?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/YYFlmZFb8iU" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/2882717320402219137/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=2882717320402219137" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2882717320402219137?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/2882717320402219137?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/YYFlmZFb8iU/2-managers-ndbmgmd-dans-une-config.html" title="2 managers ndb_mgmd dans une config MySQL Cluster" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/05/2-managers-ndbmgmd-dans-une-config.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU8GRHY5eSp7ImA9WxJREUk.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-6035534566535686863</id><published>2009-05-12T08:54:00.001-07:00</published><updated>2009-05-12T08:57:05.821-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-12T08:57:05.821-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="index" /><category scheme="http://www.blogger.com/atom/ns#" term="null" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Index et valeurs nulles</title><content type="html">Une différence importante entre MySQL et Oracle est l'indexation. En effet, Oracle n'indexe pas les données entièrement nulles. Par entièrement cela signifie que si vous indexez 2 colonnes, le couple null ne sera pas stocké dans l'index et cela a son importance !&lt;br /&gt;&lt;br /&gt;Par exemple, si nous utilisons le schema SCOTT pour tenter d'utiliser un index sur une colonne pouvant être nulle :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;SQL&amp;gt; select * from emp;&lt;br /&gt;&lt;br /&gt;     EMPNO ENAME      JOB           MGR HIREDATE        SAL       COMM     DEPTNO&lt;br /&gt;---------- ---------- --------- ---------- --------- ---------- ---------- ----------&lt;br /&gt;      7369 SMITH      CLERK          7902 17-DEC-80        800            20&lt;br /&gt;      7499 ALLEN      SALESMAN          7698 20-FEB-81       1600        300       30&lt;br /&gt;      7521 WARD       SALESMAN          7698 22-FEB-81       1250        500       30&lt;br /&gt;      7566 JONES      MANAGER          7839 02-APR-81       2975            20&lt;br /&gt;      7654 MARTIN     SALESMAN          7698 28-SEP-81       1250       1400       30&lt;br /&gt;      7698 BLAKE      MANAGER          7839 01-MAY-81       2850            30&lt;br /&gt;      7782 CLARK      MANAGER          7839 09-JUN-81       2450            10&lt;br /&gt;      7788 SCOTT      ANALYST          7566 19-APR-87       3000            20&lt;br /&gt;      7839 KING       PRESIDENT        17-NOV-81       5000            10&lt;br /&gt;      7844 TURNER     SALESMAN          7698 08-SEP-81       1500      0       30&lt;br /&gt;      7876 ADAMS      CLERK          7788 23-MAY-87       1100            20&lt;br /&gt;      7900 JAMES      CLERK          7698 03-DEC-81        950            30&lt;br /&gt;      7902 FORD       ANALYST          7566 03-DEC-81       3000            20&lt;br /&gt;      7934 MILLER     CLERK          7782 23-JAN-82       1300            10&lt;br /&gt;&lt;br /&gt;14 rows selected.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; create index idx_emp_ename on emp(ename);&lt;br /&gt;&lt;br /&gt;Index created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; set autotrace trace explain&lt;br /&gt;SQL&amp;gt; select 1 from emp where ename is null;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;Plan hash value: 3956160932&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation      | Name | Rows  | Bytes | Cost (%CPU)| Time     |&lt;br /&gt;--------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT  |     |     1 |     7 |     3   (0)| 00:00:01 |&lt;br /&gt;|*  1 |  TABLE ACCESS FULL| EMP  |     1 |     7 |     3   (0)| 00:00:01 |&lt;br /&gt;--------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   1 - filter("ENAME" IS NULL)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Oracle décide donc d'effectuer un FULL SCAN de la table car la donnée nulle ne pouvant être stockée dans un index il est nécessaire de parcourir la table entièrement. Ce qui n'est pas le cas si on index une colonne supplémentaire non nulle (le couple ne sera dans ce cas jamais nul)&lt;span class="fullpost"&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;SQL&amp;gt; create index idx_emp_ename_1 on emp(ename,1);&lt;br /&gt;&lt;br /&gt;Index created.&lt;br /&gt;&lt;br /&gt;SQL&amp;gt; select 1 from emp where ename is null;&lt;br /&gt;&lt;br /&gt;Execution Plan&lt;br /&gt;----------------------------------------------------------&lt;br /&gt;Plan hash value: 2365361045&lt;br /&gt;&lt;br /&gt;------------------------------------------------------------------------------------&lt;br /&gt;| Id  | Operation     | Name        | Rows  | Bytes | Cost (%CPU)| Time       |&lt;br /&gt;------------------------------------------------------------------------------------&lt;br /&gt;|   0 | SELECT STATEMENT |           |     1 |     7 |     1   (0)| 00:00:01 |&lt;br /&gt;|*  1 |  INDEX RANGE SCAN| IDX_EMP_ENAME_1 |     1 |     7 |     1   (0)| 00:00:01 |&lt;br /&gt;------------------------------------------------------------------------------------&lt;br /&gt;&lt;br /&gt;Predicate Information (identified by operation id):&lt;br /&gt;---------------------------------------------------&lt;br /&gt;&lt;br /&gt;   1 - access("ENAME" IS NULL)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;On peut donc en déduire l'importance de rajouter la contrainte not null quand vous savez que ce champ ne peut être null. En effet, un count(*) pourra dans ce cas effectuer un INDEX FULL SCAN sachant qu'aucune donnée ne peut être nulle et donc il n'y a aucune entrée qui manque dans l'index.&lt;br /&gt;&lt;br /&gt;Contrairement à Oracle, MySQL stocke aussi les valeurs nulles dans ses index comme l'indique la colonne NULL dans la sortie de la commande &lt;a href="http://dev.mysql.com/doc/refman/5.1/en/show-index.html"&gt;"SHOW INDEX FROM MATABLE"&lt;/a&gt;. Ainsi si l'on recherche le nombre d'entrée nulles d'une table, MySQL utilisera l'index disponible :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql [localhost] {msandbox} (test) &amp;gt; explain select count(*) from t3 where id is null;&lt;br /&gt;+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+&lt;br /&gt;| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra                    |&lt;br /&gt;+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+&lt;br /&gt;|  1 | SIMPLE      | t3    | ref  | id            | id   | 5       | const |  100 | Using where; &lt;span style="font-weight: bold;"&gt;Using index&lt;/span&gt; |&lt;br /&gt;+----+-------------+-------+------+---------------+------+---------+-------+------+--------------------------+&lt;br /&gt;1 row in set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql [localhost] {msandbox} (test) &amp;gt; show index from t3;&lt;br /&gt;+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+&lt;br /&gt;| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |&lt;br /&gt;+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+&lt;br /&gt;| t3    |          1 | id       |            1 | id          | A         |           1 |     NULL | NULL   | &lt;span style="font-weight: bold;"&gt;YES&lt;/span&gt;  | BTREE      |         |&lt;br /&gt;+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+&lt;br /&gt;1 row in set (0.00 sec)&lt;/div&gt;&lt;br /&gt;De la même manière il est important d'ajouter la contrainte NOT NULL si le champ ne sera jamais nul, ce qui permet à MySQL d'effectuer certaines optimisations et d'économiser un bit par enregistrement.&lt;br /&gt;&lt;/span&gt;&lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-6035534566535686863?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/Tdam_tW6Ktc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/6035534566535686863/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=6035534566535686863" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6035534566535686863?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/6035534566535686863?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/Tdam_tW6Ktc/index-et-valeurs-nulles.html" title="Index et valeurs nulles" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/05/index-et-valeurs-nulles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMBRns9fSp7ImA9WxJTGU4.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-4137140665119700937</id><published>2009-04-28T08:44:00.001-07:00</published><updated>2009-04-28T08:44:17.565-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-28T08:44:17.565-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="conf" /><category scheme="http://www.blogger.com/atom/ns#" term="slides" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><title>MySQL Conference 2009</title><content type="html">La 7ème conférence MySQL co-présentée par SUN, MySQL et Oreilly a eu lieu du 20 avril au 23 avril 2009 à Santa Clara. Pour les heureux participants ils ont eu droit à un ensemble assez impressionnant de &lt;a href="http://www.mysqlconf.com/mysql2009/public/schedule/full"&gt;sessions&lt;/a&gt;. Bien sûr, impossible de toutes les suivre, puisqu'un grand nombre d'entre elles étaient dispensées en parallèle. Cependant, nous avons la chance de pouvoir accéder aux slides de certaines dont les auteurs ont eu l'amabilité de les mettre à disposition sur &lt;a href="http://www.mysqlconf.com/mysql2009/public/schedule/proceedings"&gt;mysqlconf&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Bonne lecture.&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-4137140665119700937?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/YwkX4MdJnoE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/4137140665119700937/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=4137140665119700937" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/4137140665119700937?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/4137140665119700937?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/YwkX4MdJnoE/mysql-conference-2009.html" title="MySQL Conference 2009" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/04/mysql-conference-2009.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AMQHwzeSp7ImA9WxJTEkk.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-5549598645422818077</id><published>2009-04-20T10:49:00.001-07:00</published><updated>2009-04-20T10:49:41.281-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T10:49:41.281-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sun" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="oracle" /><title>Oracle rachète SUN</title><content type="html">En janvier 2008, SUN rachetait MySQL AB pour 1 milliard de $. Eh bien, aujourd'hui Oracle a annoncé sur&amp;nbsp; &lt;a href="http://www.oracle.com/sun/index.html"&gt;son site&lt;/a&gt; avoir accepté de racheter SUN pour 7 milliards de dollars. Il va falloir à nouveau s'interroger sur les conséquences, bonnes comme mauvaises, que cela pourra avoir pour les utilisateurs de MySQL.&lt;br /&gt;  &lt;div class="flockcredit" style="text-align: right; color: #CCC; font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: #999; font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-5549598645422818077?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/Tdkg6uyoIkA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/5549598645422818077/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=5549598645422818077" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/5549598645422818077?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/5549598645422818077?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/Tdkg6uyoIkA/oracle-rachete-sun_20.html" title="Oracle rachète SUN" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/04/oracle-rachete-sun_20.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMMSHw7fSp7ImA9WxJTEkg.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-3625082058018541936</id><published>2009-04-19T05:55:00.001-07:00</published><updated>2009-04-20T12:08:09.205-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-20T12:08:09.205-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="regexp" /><category scheme="http://www.blogger.com/atom/ns#" term="perl" /><category scheme="http://www.blogger.com/atom/ns#" term="trie" /><title>Perl 5.10 optimise le moteur d'expressions régulières</title><content type="html">Une des nouvelles fonctionnalités de la 5.10 est l'utilisation d'algorithmes tels que &lt;a href="http://en.wikipedia.org/wiki/Aho-Corasick_algorithm"&gt;Aho-Corasick&lt;/a&gt; et &lt;a href="http://en.wikipedia.org/wiki/Trie"&gt;Trie&lt;/a&gt; (prefix tree) dans le moteur d'expressions régulières. Ainsi la recherche d'alternatives comme le pattern &lt;span style="font-style: italic;"&gt;alt1|alt2|alt3|alt4|altN&lt;/span&gt; aura une complexité en 0(1) et non plus en 0(N) avec N le nombre d'alternatives. Pour s'en convaincre, rien de mieux qu'un benchmarck entre les versions 5.8 et 5.10. Pour cela j'ai écrit un petit bout de code que vous pouvez récupérer &lt;a href="http://sites.google.com/site/filesrepository01/Home/bench_with_tries.pl"&gt;ici&lt;/a&gt;.&lt;br /&gt;J'utilise le module Regexp::Trie de Dan Kogai qui permet d'optimiser la recherche d'alternatives ayant un suffixe (ou une partie) en commun&lt;br /&gt;&lt;br /&gt;Les résultats obtenus sont les suivants :&lt;br /&gt;&lt;br /&gt;a -&amp;gt; sans utilisation du module Regexp::Trie&lt;br /&gt;b -&amp;gt; avec utilisation du module Regexp::Trie&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;&lt;span style="font-weight: bold;"&gt;Perl 5.8 :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;perl bench_with_tries.pl&lt;br /&gt;   Rate     a     b&lt;br /&gt;a   552/s    --  -98%&lt;br /&gt;b 26050/s 4620%    --&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Perl 5.10 :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;perl bench_with_tries.pl&lt;br /&gt;   Rate    a    b&lt;br /&gt;a 20177/s   -- -65%&lt;br /&gt;b 57777/s 186%   --&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;On voit bien qu'en version 5.8 l'utilisation du module de Dan Kogai permet de multiplier par plus de 40 les performances, contrairement en 5.10 où les performances de base sont déjà satisfaisantes avec plus de 20 000 exécutions par seconde. Cependant, il est toujours utile d'utiliser ce module en 5.10 puisqu'on obtient près de 3 fois plus de performance.&lt;br /&gt;&lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-3625082058018541936?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/X661DE8qLS4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/3625082058018541936/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=3625082058018541936" title="2 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3625082058018541936?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3625082058018541936?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/X661DE8qLS4/perl-510-optimise-le-moteur-d.html" title="Perl 5.10 optimise le moteur d&amp;#39;expressions régulières" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>2</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/04/perl-510-optimise-le-moteur-d.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUIMRns-fCp7ImA9WxVUGUQ.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-3755054733460636019</id><published>2009-03-24T15:22:00.001-07:00</published><updated>2009-03-25T08:06:27.554-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-25T08:06:27.554-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="sandbox" /><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><title>Vive le strip binaire !</title><content type="html">Je pense que nous sommes nombreux à utiliser &lt;a href="http://forge.mysql.com/wiki/MySQL_Sandbox"&gt;MySQL Sandbox&lt;/a&gt; qui est un outil très utile pour pouvoir par exemple tester rapidement une version particulière de MySQL, installer plusieurs versions sur le même serveur, configurer une réplication multi-slaves en quelques commandes etc...&lt;br /&gt;Cependant, cela nécessite de récupérer une archive binaire pour chaque version que vous voulez utiliser, ce qui peut consommer rapidement pas mal d'espace !&lt;br /&gt;&lt;span class="fullpost"&gt;&lt;br /&gt;Par exemple, j'ai récupéré la version 5.0.67 qui, sous forme d'archive, occupe 113Mo et une fois décompressée près de 398Mo ! Il était donc temps que je prenne quelques initiatives :-)&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;du -sh mysql-5.0.67-linux-i686.tar.gz&lt;br /&gt;113M    mysql-5.0.67-linux-i686.tar.gz&lt;br /&gt;&lt;br /&gt;tar xzf mysql-5.0.67-linux-i686.tar.gz&lt;br /&gt;du -sh mysql-5.0.67-linux-i686&lt;br /&gt;398M    mysql-5.0.67-linux-i686&lt;/div&gt;&lt;br /&gt;Je commence par supprimer les répertoires qui me seront inutiles&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;rm -rf docs/ sql-bench/ mysql-test/ tests/ man/&lt;/div&gt;&lt;br /&gt;Ceci me permet d'économiser 45Mo. Ensuite je strippe les binaires et les bibliothèques&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;strip bin/* lib/* 2&amp;gt;/dev/null&lt;/div&gt;&lt;br /&gt;Et encore 242 Mo d'économisé !&lt;br /&gt;&lt;br /&gt;Enfin, je supprime les binaires qui me seront inutiles&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;rm -f *debug* *test* *ndb*&lt;/div&gt;&lt;br /&gt;Cette dernière étape me récupère encore 20Mo. A la fin de cette série d'actions, l'archive décompressée n'occupe plus que 68 Mo soit près de 6 fois moins que la taille de départ.&lt;br /&gt;&lt;br /&gt;La question que vous devez vous poser est la suivante : &lt;span style="font-weight: bold;"&gt;que fait la commande strip ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;elle supprime tous les symbols et numéros de lignes des binaires et bibliothèques, qui peuvent être utiliseés lorsque vous debuggez vos programmes, ce qui n'est pas mon cas.&lt;br /&gt;&lt;/span&gt;&lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-3755054733460636019?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/hmPMknYhzMY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/3755054733460636019/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=3755054733460636019" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3755054733460636019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/3755054733460636019?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/hmPMknYhzMY/vive-le-strip-binaire.html" title="Vive le strip binaire !" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/03/vive-le-strip-binaire.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YARH86fSp7ImA9WxVVGEs.&quot;"><id>tag:blogger.com,1999:blog-8587666026975104980.post-8480061012191577085</id><published>2009-03-12T07:31:00.001-07:00</published><updated>2009-03-12T07:45:45.115-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-12T07:45:45.115-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="more" /><category scheme="http://www.blogger.com/atom/ns#" term="mysql" /><category scheme="http://www.blogger.com/atom/ns#" term="bug" /><category scheme="http://www.blogger.com/atom/ns#" term="cache" /><title>Défaillance du Query Cache de MySQL</title><content type="html">Il arrive que le Query Cache ne fonctionne pas :-(&lt;br /&gt;&lt;br /&gt;J'ai par exemple était confronté à un problème concernant le Query Cache lorsque j'ai voulu optimiser certaines requêtes effectuées sur un serveur. En fait, l'optimiseur de MySQL, en version 4.1.11, ne faisait pas le bon choix d'index selon certains cas, et scinder la requête en 2 sous requêtes unifiées ensuite permettait d'obtenir de meilleurs performances. Attention, ce n'est pas toujours le cas !&lt;span class="fullpost"&gt;&lt;br /&gt;En exécutant plusieurs fois les 2 requêtes unitairement le Query Cache fonctionnait correctement comme vous pouvez le voir au temps d'exécution qui était &amp;gt; 2 s.&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; SELECT idancetre,max(idmess) mxd  FROM messages USE INDEX (idx_tst3) WHERE idancetre not in (1021576,0) AND avalider=0 AND idmess&amp;gt;1021576  GROUP BY idancetre  ORDER BY mxd DESC  LIMIT 5;&lt;br /&gt;+-----------+---------+&lt;br /&gt;| idancetre | mxd     |&lt;br /&gt;+-----------+---------+&lt;br /&gt;|   1993983 | 1995071 |&lt;br /&gt;|   1994149 | 1995069 |&lt;br /&gt;|   1995061 | 1995061 |&lt;br /&gt;|   1994957 | 1995059 |&lt;br /&gt;|   1994250 | 1995058 |&lt;br /&gt;+-----------+---------+&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5 rows in set (0.00 sec)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; SELECT idmess,idmess  FROM messages  WHERE idancetre=0 AND avalider=0 AND idmess&amp;gt;1021576  GROUP BY idmess  ORDER BY idmess DESC  LIMIT 5;&lt;br /&gt;+---------+---------+&lt;br /&gt;| idmess  | idmess  |&lt;br /&gt;+---------+---------+&lt;br /&gt;| 1169825 | 1169825 |&lt;br /&gt;| 1169813 | 1169813 |&lt;br /&gt;| 1169795 | 1169795 |&lt;br /&gt;| 1169758 | 1169758 |&lt;br /&gt;| 1169756 | 1169756 |&lt;br /&gt;+---------+---------+&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;5 rows in set (0.00 sec)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Par contre, la requête UNION composée des 2 requêtes précédentes n'était jamais stockée dans le Query Cache :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; (SELECT idancetre,max(idmess) mxd  FROM messages USE INDEX (idx_tst3) WHERE idancetre not in (1021576,0) AND avalider=0 AND idmess&amp;gt;1021576  GROUP BY idancetre  ORDER BY mxd DESC  LIMIT 5)  UNION   (SELECT idmess,idmess  FROM messages  WHERE idancetre=0 AND avalider=0 AND idmess&amp;gt;1021576  GROUP BY idmess  ORDER BY idmess DESC  LIMIT 5);&lt;br /&gt;+-----------+---------+&lt;br /&gt;| idancetre | mxd     |&lt;br /&gt;+-----------+---------+&lt;br /&gt;|   1993983 | 1995071 |&lt;br /&gt;|   1994149 | 1995069 |&lt;br /&gt;|   1995061 | 1995061 |&lt;br /&gt;|   1994957 | 1995059 |&lt;br /&gt;|   1994250 | 1995058 |&lt;br /&gt;|   1169825 | 1169825 |&lt;br /&gt;|   1169813 | 1169813 |&lt;br /&gt;|   1169795 | 1169795 |&lt;br /&gt;|   1169758 | 1169758 |&lt;br /&gt;|   1169756 | 1169756 |&lt;br /&gt;+-----------+---------+&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10 rows in set (2.55 sec)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Vous le comprendrez bien, dans ce cas là, il est préférable d'exécuter les 2 requêtes de façon distincte et d'effectuer l'UNION côté applicatif plutôt qu'en une seule et même requête. En fait, dans cette version c'était dû à un BUG référencé chez MySQL et corrigé en 4.1.17, 5.0.17 et 5.1.4&lt;br /&gt;&lt;br /&gt;&lt;div class=code&gt;SELECT queries that began with an        opening parenthesis were not being placed in the query cache.       (&lt;a href="http://bugs.mysql.com/14652" target="_top"&gt;Bug#14652&lt;/a&gt;)&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;En 5.0.67, qui contient le bugfix, ce n'est pas la même chose :&lt;br /&gt;&lt;br /&gt;&lt;div class="code"&gt;mysql&amp;gt; (SELECT idancetre,max(idmess) mxd  FROM messages USE INDEX (idx_tst3) WHERE idancetre not in (1021576,0) AND avalider=0 AND idmess&amp;gt;1021576  GROUP BY idancetre  ORDER BY mxd DESC  LIMIT 5)  UNION ALL  (SELECT idmess,idmess  FROM messages  WHERE idancetre=0 AND avalider=0 AND idmess&amp;gt;1021576  GROUP BY idmess  ORDER BY idmess DESC  LIMIT 5);&lt;br /&gt;+-----------+---------+&lt;br /&gt;| idancetre | mxd     |&lt;br /&gt;+-----------+---------+&lt;br /&gt;|   1993983 | 1995071 |&lt;br /&gt;|   1994149 | 1995069 |&lt;br /&gt;|   1995061 | 1995061 |&lt;br /&gt;|   1994957 | 1995059 |&lt;br /&gt;|   1994250 | 1995058 |&lt;br /&gt;|   1169825 | 1169825 |&lt;br /&gt;|   1169813 | 1169813 |&lt;br /&gt;|   1169795 | 1169795 |&lt;br /&gt;|   1169758 | 1169758 |&lt;br /&gt;|   1169756 | 1169756 |&lt;br /&gt;+-----------+---------+&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;10 rows in set (0.00 sec)&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Il est donc très important de vérifier les changement apportés par les versions mineures qui suivent la version que vous utilisez pour savoir quels bugs ont été corrigés, et lesquels peuvent vous concerner.&lt;/span&gt;&lt;br /&gt;&lt;div class="flockcredit" style="text-align: right; color: rgb(204, 204, 204); font-size: x-small;"&gt;Blogged with the &lt;a href="http://www.flock.com/blogged-with-flock" style="color: rgb(153, 153, 153); font-weight: bold;" target="_new" title="Flock Browser"&gt;Flock Browser&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8587666026975104980-8480061012191577085?l=lesdatabases.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/lesdatabasesetplus/~4/6MEygtsYr8A" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://lesdatabases.blogspot.com/feeds/8480061012191577085/comments/default" title="Publier les commentaires" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=8587666026975104980&amp;postID=8480061012191577085" title="0 commentaires" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/8480061012191577085?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/8587666026975104980/posts/default/8480061012191577085?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/lesdatabasesetplus/~3/6MEygtsYr8A/defaillance-du-query-cache-de-mysql.html" title="Défaillance du Query Cache de MySQL" /><author><name>Cyril Scetbon</name><uri>http://www.blogger.com/profile/05787792882719474833</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="31" height="22" src="http://4.bp.blogspot.com/_VrhSoALKWuA/SJlebwI5HBI/AAAAAAAABRM/L_u8660bk24/s1600-R/database.gif" /></author><thr:total>0</thr:total><feedburner:origLink>http://lesdatabases.blogspot.com/2009/03/defaillance-du-query-cache-de-mysql.html</feedburner:origLink></entry></feed>

