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

<channel>
	<title>dasini.net - Journal d'un expert MySQL &#187; event scheduler</title>
	<atom:link href="http://dasini.net/blog/tag/event-scheduler/feed/" rel="self" type="application/rss+xml" />
	<link>http://dasini.net/blog</link>
	<description>Repousser les frontières de la connaissance</description>
	<lastBuildDate>Thu, 02 Feb 2012 09:06:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Le programmateur d’événements ( Event Scheduler ) (part 6/6)</title>
		<link>http://dasini.net/blog/2009/06/29/le-programmateur-d%e2%80%99evenements-event-scheduler-part-66/</link>
		<comments>http://dasini.net/blog/2009/06/29/le-programmateur-d%e2%80%99evenements-event-scheduler-part-66/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 14:21:05 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[event scheduler]]></category>
		<category><![CDATA[programmateur d'événements]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=641</guid>
		<description><![CDATA[Limitations et restrictions

 

Certaines commandes MySQL ne sont pas permises dans un événement.

Verrouiller une table est interdit: LOCK TABLES, UNLOCK TABLES.

Il n'est malheureusement pas possible de charger des données avec la commande LOAD DATA INFILE.

Les requêtes préparées (PREPARED STATEMENT) ne peuvent être créées dans un événement.]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --></p>
<address>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 5/6)" href="http://dasini.net/blog/2009/06/24/le-programmateur-devenements-event-scheduler-part-56/">&lt;- précédent</a>)</address>
<p><!-- 	 	 --></p>
<p><!-- 		@page { margin: 2cm } 		H4.western { font-family: "Arial", sans-serif; font-size: 11pt; font-style: italic } 		H4.cjk { font-family: "Lucida Sans Unicode"; font-size: 11pt; font-style: italic } 		H4.ctl { font-family: "Tahoma"; font-size: 11pt; font-style: italic } 		CODE { font-family: "Courier New", monospace } --></p>
<h4 style="margin-bottom: 0.21cm; page-break-after: avoid;" lang="fr-FR">Limitations et restrictions</h4>
<p style="margin-bottom: 0cm;" lang="fr-FR">
<p style="margin-bottom: 0cm;" lang="fr-FR">Certaines commandes MySQL ne sont pas permises dans un événement.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">Verrouiller une table est interdit: <em>LOCK TABLES</em>, <em>UNLOCK TABLES</em>.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">Il n&#8217;est malheureusement pas possible de charger des données avec la commande <em>LOAD DATA INFILE.</em></p>
<p style="margin-bottom: 0cm;" lang="fr-FR">Les requêtes préparées (<em>PREPARED STATEMENT)</em> ne peuvent être créées dans un événement.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">La récursivité.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">Un événement ne peut être créé, modifié ou supprimé par un déclencheur, une procédure stockée ou un autre événement.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">De plus, on ne peut pas créer, modifier ou supprimer un déclencheur ou une procédure stockée dans un événement.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">
<p style="margin-bottom: 0cm;" lang="fr-FR">La suppression d&#8217;une base de données (<em>DROP DATABASE</em>) entraine la suppression de tous les objets qu&#8217;elle contient, donc les évènements aussi.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">
<p style="margin-bottom: 0cm;" lang="fr-FR">Un événement désactivé (<em>DISABLE</em>, <em>DISABLE ON SLAVE</em>) est supprimé en cas d&#8217;arrêt du serveur.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">
<p style="margin-bottom: 0cm;" lang="fr-FR">Le <em>DEFINER</em> doit avoir les droits nécessaires pour l&#8217;exécution de l&#8217;évènement, cet utilisateur doit bien entendu exister. S&#8217;il est supprimé, renommé ou si ses privilèges ne sont plus adaptés, l&#8217;exécution de l&#8217;évènement échoue.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">
<address style="margin-bottom: 0cm;" lang="fr-FR">mysql&gt; DROP  USER daz@localhost;</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">Query OK, 0 rows affected (0.00 sec)</address>
<p style="margin-bottom: 0cm;" lang="fr-FR">
<p><!-- 	 	 --><br />
<!-- 	 	 --></p>
<p style="margin-bottom: 0cm;" lang="fr-FR">En éditant le journal des erreurs:</p>
<p><!-- 	 	 --></p>
<address style="margin-bottom: 0cm;" lang="fr-FR">080527 23:09:05 [Note] Event Scheduler: [daz@localhost].[_event.second_event] started in thread 46.</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">080527 23:09:05 [ERROR] Event Scheduler: [daz@localhost].[_event.second_event] execution failed, failed to authenticate the user.</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">080527 23:09:05 [ERROR] Event Scheduler: [daz@localhost][_event.second_event] There is no &#8216;daz&#8217;@'localhost&#8217; registered</address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">080527 23:09:05 [Note] Event Scheduler: [daz@localhost].[_event.second_event] event execution failed.</span></address>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<p style="margin-bottom: 0.21cm;" lang="fr-FR"><span style="font-family: Arial,sans-serif;"><span style="font-size: small;"><em><strong>Conclusion</strong></em></span></span></p>
<p style="margin-bottom: 0cm;" lang="fr-FR">Comme vous avez pu le constater tout au long de cet article, le programmateur d&#8217;évènements est bien plus qu&#8217;un simple gadget,  un véritable outil qui s&#8217;ajoute à la palette de l&#8217;administrateur de base de données MySQL.</p>
<p style="margin-bottom: 0cm;" lang="fr-FR">Malgré certaines limitations, comme l&#8217;impossibilité de lancer des commandes systèmes ou des scripts externes, ce planificateur facilitera la vie du DBA en lui donnant la possibilité d&#8217;automatiser certaines tâches de maintenance.</p>
<p><!-- 	 	 --><br />
<!-- 	 	 --><br />
<!-- 	 	 --></p>
<p style="margin-bottom: 0cm;" lang="fr-FR"><em>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 1/6)" href="http://dasini.net/blog/2009/04/20/le-programmateur-devenements-event-scheduler-part-16-2/">Début de l&#8217;article</a>)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/06/29/le-programmateur-d%e2%80%99evenements-event-scheduler-part-66/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le programmateur d&#8217;événements ( Event Scheduler ) (part 5/6)</title>
		<link>http://dasini.net/blog/2009/06/24/le-programmateur-devenements-event-scheduler-part-56/</link>
		<comments>http://dasini.net/blog/2009/06/24/le-programmateur-devenements-event-scheduler-part-56/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 11:51:56 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[event scheduler]]></category>
		<category><![CDATA[programmateur d'événements]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=634</guid>
		<description><![CDATA[Appel d'une procédure stockée

Il est possible d'appeler des procédures stockées dans un événement.

mysql> CREATE EVENT `_event`.`appel_ps`
ON SCHEDULE AT CURRENT_TIMESTAMP
DO
/*Appel de la procédure stockée*/
CALL pro_stock.insert_profil('Olivier', 'DASINI', 'Orange');]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --></p>
<address>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 4/6)" href="http://dasini.net/blog/2009/06/16/le-programmateur-devenements-event-scheduler-part-46/">&lt;- précédent</a>)</address>
<p><!-- 	 	 --></p>
<p><!-- 		@page { margin: 2cm } --></p>
<h2 style="margin-bottom: 0.21cm;" lang="fr-FR">Appel d&#8217;une procédure stockée</h2>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Il est possible d&#8217;appeler des procédures stockées dans un événement. </span></p>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; CREATE EVENT `_event`.`appel_ps`</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> ON SCHEDULE AT CURRENT_TIMESTAMP</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> DO</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> /*Appel de la procédure stockée*/</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> CALL pro_stock.insert_profil(&#8216;Olivier&#8217;, &#8216;DASINI&#8217;, &#8216;Orange&#8217;);</span></address>
<p style="margin-bottom: 0.21cm;" lang="fr-FR">
<p style="margin-bottom: 0.21cm;" lang="fr-FR">
<p style="margin-bottom: 0.21cm;" lang="fr-FR">
<h2 style="margin-bottom: 0.21cm;" lang="fr-FR"><span style="text-decoration: underline;">Archivage périodique des données</span></h2>
<p style="margin-bottom: 0.21cm;" lang="fr-FR">Beaucoup d&#8217;entreprises sont obligées de conserver d&#8217;énormes volumes de données historiques sur leurs serveurs de bases de données. Un moyen de réduire l&#8217;espace occupé est d&#8217;utiliser le moteur de stockage ARCHIVE. Ce moteur de table, compresse automatiquement les données qui n&#8217;occupent alors plus que 30% de leur taille originale.</p>
<p style="margin-bottom: 0.21cm;" lang="fr-FR">
<address style="margin-bottom: 0.21cm;" lang="fr-FR">mysql&gt; CREATE TABLE _event.archive_event (</address>
<address style="margin-bottom: 0.21cm;" lang="fr-FR">moment timestamp,</address>
<address style="margin-bottom: 0.21cm;" lang="fr-FR">fois tinyint unsigned,</address>
<address style="margin-bottom: 0.21cm;" lang="fr-FR">action char(50)</address>
<address style="margin-bottom: 0.21cm;" lang="fr-FR">) ENGINE = ARCHIVE;</address>
<address style="margin-bottom: 0cm;" lang="fr-FR"> </address>
<address style="margin-bottom: 0cm;" lang="fr-FR">mysql&gt; DELIMITER €€</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">mysql&gt; CREATE EVENT _event.archive_base</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">ON SCHEDULE EVERY 1 DAY</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">DO</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">BEGIN</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">/*Insertion des données à archiver*/</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">INSERT INTO _event.archive_event</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">SELECT moment, fois, action</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">FROM _event.insert_event</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">WHERE moment  &lt; SUBDATE(now(), INTERVAL 1 DAY);</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">/*Suppressions des données archivées dans la table originale*/</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">DELETE FROM _event.insert_event WHERE moment  &lt; SUBDATE(now(), INTERVAL 1 DAY);</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">END €€</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">mysql&gt; DELIMITER ;</address>
<address style="margin-bottom: 0cm;" lang="fr-FR">
</address>
<p><!-- 	 	 --><br />
<!-- 	 	 --><br />
<!-- 	 	 --></p>
<address style="margin-bottom: 0cm;" lang="fr-FR"><em>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 6/6)" href="http://dasini.net/blog/2009/06/29/le-programmateur-d%E2%80%99evenements-event-scheduler-part-66/">à suivre&#8230; event scheduler: </a></em><a title="Le programmateur d’événements ( Event Scheduler ) (part 6/6)" href="http://dasini.net/blog/2009/06/29/le-programmateur-d%E2%80%99evenements-event-scheduler-part-66/">Limitations et restrictions</a><em>)</em></address>
<p style="margin-bottom: 0cm;" lang="fr-FR">
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/06/24/le-programmateur-devenements-event-scheduler-part-56/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Le programmateur d&#8217;événements ( Event Scheduler ) (part 4/6)</title>
		<link>http://dasini.net/blog/2009/06/16/le-programmateur-devenements-event-scheduler-part-46/</link>
		<comments>http://dasini.net/blog/2009/06/16/le-programmateur-devenements-event-scheduler-part-46/#comments</comments>
		<pubDate>Tue, 16 Jun 2009 09:58:03 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[event scheduler]]></category>
		<category><![CDATA[programmateur d'événements]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=622</guid>
		<description><![CDATA[Insertions de données dans une table, toutes les 30 secondes


mysql> SELECT * FROM _event.insert_event ;
mysql> DELIMITER €€
mysql> CREATE EVENT `_event`.`second_event`
ON SCHEDULE EVERY 30 SECOND
DO
BEGIN
/*selectionne la val maximale de la colonne fois. Si elle vaut NULL alors retourne la valeur 0 dans la variable @fois*/
SELECT if(max(fois),max(fois)+1,1) INTO @fois FROM _event.insert_event;
/*Insertion des données dans la table*/
INSERT INTO _event.insert_event (moment, fois, action) VALUES (now(), @fois, concat('Execution ', @fois, " de l'event"));
END €€
mysql> DELIMITER ;]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --></p>
<address>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 3/6)" href="http://dasini.net/blog/2009/05/06/le-programmateur-devenements-event-scheduler-part-36/">&lt;- précédent</a>)</address>
<p><!-- 	 	 --><br />
<!-- 		@page { margin: 2cm } 		H4.western { font-family: "Arial", sans-serif; font-size: 11pt; font-style: italic } 		H4.cjk { font-family: "Lucida Sans Unicode"; font-size: 11pt; font-style: italic } 		H4.ctl { font-family: "Tahoma"; font-size: 11pt; font-style: italic } --></p>
<h4 style="margin-bottom: 0.21cm; page-break-after: avoid;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Quelques exemples d&#8217;évènements</span></h4>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><span style="text-decoration: underline;">Insertions de données dans une table,  toutes les 30 secondes</span> </span></p>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; SELECT  *  FROM  _event.insert_event ;</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"> </address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; DELIMITER €€</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; CREATE EVENT `_event`.`second_event`</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> ON SCHEDULE EVERY 30 SECOND</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> DO</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> BEGIN</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> /*selectionne la val maximale de la colonne fois. Si elle vaut NULL alors retourne la valeur 0 dans la variable @fois*/</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> SELECT if(max(fois),max(fois)+1,1) INTO @fois FROM  _event.insert_event;</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> </span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> /*Insertion des données dans la table*/</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> INSERT INTO _event.insert_event (moment, fois, action) VALUES (now(), @fois, concat(&#8216;Execution &#8216;, @fois, &nbsp;&raquo; de l&#8217;event&nbsp;&raquo;));</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">END €€</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; DELIMITER ;</span></address>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="text-decoration: underline;"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Créer une vue matérialisée</span></span></p>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">Le concept de vue matérialisée n&#8217;est pas implémenté dans MySQL. Une vue matérialisée est un « snapshot ». Ce type de vue permet de stocker le résultat d&#8217;une requête, contrairement aux vues classiques qui elles, ne stockent que la définition de la requête. Les vues matérialisées ne réexecutent donc pas la requête à chaque interrogation. Par contre la gestion de la fraîcheur des données est  à la charge de la vue.</span></p>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; DELIMITER €€</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; CREATE EVENT `_event`.`vue_materialisee`</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> ON SCHEDULE EVERY 10 SECOND</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> STARTS &#8217;2008-03-11 16:32:34&#8242;</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> ON COMPLETION NOT PRESERVE ENABLE</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> DO</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> BEGIN</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> /*Effacement de la table _event.City_fra */</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> TRUNCATE TABLE _event.City_fra;</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> /*Remplassiage de la table _event.City_fra à partir de la table _event.City*/</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> INSERT INTO _event.City_fra</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> SELECT * FROM _event.City  WHERE CountryCode=&#8217;FRA&#8217;</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"> ORDER BY name;</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">END €€</span></address>
<address style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;">mysql&gt; DELIMITER ;</span></address>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR">
<p style="margin-bottom: 0.21cm;" lang="fr-FR">A noter que les commandes TRUNCATE  et INSERT ne sont pas atomiques. Il est donc possible qu&#8217;une interrogation sur la table _event.City_fra ne renvoie pas de résultat.</p>
<p style="margin-bottom: 0.21cm;" lang="fr-FR"><em>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 5/6)" href="http://dasini.net/blog/2009/06/24/le-programmateur-devenements-event-scheduler-part-56/">à suivre&#8230; event scheduler: Appel d&#8217;une procédure stockée</a>)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/06/16/le-programmateur-devenements-event-scheduler-part-46/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le programmateur d&#8217;événements ( Event Scheduler ) (part 3/6)</title>
		<link>http://dasini.net/blog/2009/05/06/le-programmateur-devenements-event-scheduler-part-36/</link>
		<comments>http://dasini.net/blog/2009/05/06/le-programmateur-devenements-event-scheduler-part-36/#comments</comments>
		<pubDate>Wed, 06 May 2009 16:58:41 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[event scheduler]]></category>
		<category><![CDATA[programmateur d'événements]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=614</guid>
		<description><![CDATA[Gérer les évènements

MySQL propose plusieurs méthodes pour visualiser les évènements. La méthode la plus pratique consiste à aller chercher l'information dans la table event de la base de données des méta-données information_schema:
mysql> SELECT * FROM information_schema.EVENTS;]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --></p>
<address>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 2/6)" href="http://dasini.net/blog/2009/04/30/le-programmateur-devenements-event-scheduler-part-26/">&lt;- précédent</a>)</address>
<p><!-- 	 	 --></p>
<h4>Gérer les évènements</h4>
<p>MySQL propose plusieurs méthodes pour visualiser les évènements. La méthode la plus pratique consiste à aller chercher l&#8217;information dans la table <em>event</em> de la base de données des méta-données  <em>information_schema</em>:</p>
<address>mysql&gt; SELECT * FROM information_schema.EVENTS;</address>
<address>Empty set (0.00 sec)</address>
<p>L&#8217;évènement <em>premier_event</em> créé précédemment n&#8217;y apparaît pas. C&#8217;est tout à fait normal, un événement à exécution unique n&#8217;est par défaut pas conservé par MySQL. Modifions notre événement pour qu&#8217;il puisse en rester une trace après son exécution:<br />
<!-- 	 	 --></p>
<address>mysql&gt;  CREATE EVENT _event.premier_event_persistant</address>
<address>ON SCHEDULE AT CURRENT_TIMESTAMP</address>
<address>ON COMPLETION PRESERVE</address>
<address>COMMENT &#8216;Insertion des données dans la table&#8217;</address>
<address>DO</address>
<address>INSERT INTO _event.insert_event ( moment, fois, action ) VALUES (now(), 0, &#8216;Mon premier event persistant&#8217;);</address>
<address> </address>
<address> </address>
<address>mysql&gt; SELECT * FROM information_schema.EVENTS \G</address>
<address>*************************** 1. row ***************************</address>
<address>EVENT_CATALOG: NULL</address>
<address>EVENT_SCHEMA: _event</address>
<address>EVENT_NAME: premier_event_persistant</address>
<address>DEFINER: daz@localhost</address>
<address>TIME_ZONE: SYSTEM</address>
<address>EVENT_BODY: SQL</address>
<address>EVENT_DEFINITION: INSERT INTO _event.insert_event ( moment, fois, action ) VALUES (now(), 0, &#8216;Mon premier event persistant&#8217;)</address>
<address>EVENT_TYPE: ONE TIME</address>
<address>EXECUTE_AT: 2008-05-29 21:10:04</address>
<address>INTERVAL_VALUE: NULL</address>
<address>INTERVAL_FIELD: NULL</address>
<address>SQL_MODE:</address>
<address>STARTS: NULL</address>
<address>ENDS: NULL</address>
<address>STATUS: ENABLED</address>
<address>ON_COMPLETION: PRESERVE</address>
<address>CREATED: 2008-05-29 21:10:04</address>
<address>LAST_ALTERED: 2008-05-29 21:10:04</address>
<address>LAST_EXECUTED: NULL</address>
<address>EVENT_COMMENT: Insertion des données dans la table</address>
<address>ORIGINATOR: 3307</address>
<address>CHARACTER_SET_CLIENT: utf8</address>
<address>COLLATION_CONNECTION: utf8_general_ci</address>
<address>DATABASE_COLLATION: latin1_swedish_ci</address>
<p><!-- 	 	 --><br />
MySQL propose également deux autres commandes pour avoir des informations sur les évènements:</p>
<p>SHOW EVENTS et SHOW CREATE EVENT:<br />
<!-- 	 	 --></p>
<address>mysql&gt; SHOW  EVENTS  IN  _event;</address>
<address>*************************** 1. row ***************************</address>
<address>Db: _event</address>
<address>Name: premier_event_persistant</address>
<address>Definer: daz@localhost</address>
<address>Time zone: SYSTEM</address>
<address>Type: ONE TIME</address>
<address>Execute at: 2008-05-29 21:10:04</address>
<address>Interval value: NULL</address>
<address>Interval field: NULL</address>
<address>Starts: NULL</address>
<address>Ends: NULL</address>
<address>Status: ENABLED</address>
<address>Originator: 3307</address>
<address>character_set_client: utf8</address>
<address>collation_connection: utf8_general_ci</address>
<address>Database Collation: latin1_swedish_ci</address>
<address> </address>
<address> </address>
<address> </address>
<address>mysql&gt; SHOW CREATE EVENT _event.premier_event_persistant;</address>
<address>*************************** 1. row ***************************</address>
<address>Event: premier_event_persistant</address>
<address>sql_mode:</address>
<address>time_zone: SYSTEM</address>
<address>Create Event: CREATE EVENT &#8216;premier_event_persistant&#8217; ON SCHEDULE AT &#8217;2008-</address>
<address>05-29 21:10:04&#8242; ON COMPLETION PRESERVE ENABLE COMMENT &#8216;Insertion des données dans la table DO INSERT INTO _event.insert_event ( moment,</address>
<address>fois, action ) VALUES (now(), 0, &#8216;Mon premier event persistant&#8217;)</address>
<address>character_set_client: utf8</address>
<address>collation_connection: utf8_general_ci</address>
<address>Database Collation: latin1_swedish_ci</address>
<p><!-- 	 	 --><br />
A noter, qu&#8217;il est également possible de lire l&#8217;information dans la table <em>event</em> de la base de données <em>mysql</em> avec la requête suivante: SELECT * FROM event .</p>
<p>Vous avez  aussi la possibilité de modifier la structure d&#8217;un événement, le renommer, ou encore changer son code avec la commande: <em>ALTER EVENT</em><br />
<!-- 	 	 --></p>
<address>ALTER EVENT</address>
<address>[DEFINER = { user | CURRENT_USER }]</address>
<address>event_name</address>
<address>[ON SCHEDULE schedule]</address>
<address>[RENAME TO new_event_name]</address>
<address>[ON COMPLETION [NOT] PRESERVE]</address>
<address>[ENABLE | DISABLE | DISABLE ON SLAVE]</address>
<address>[COMMENT 'comment']</address>
<address>[DO sql_statement]</address>
<p><!-- 	 	 --><br />
On retrouve les clauses de la commande <em>CREATE EVENT</em>, que l&#8217;on peut donc modifier aisément avec <em>ALTER EVENT</em>. Le dernier utilisateur qui modifie un événement devient son DEFINER. Par exemple si un évènement à pour <em>DEFINER</em> <strong>daz@localhost</strong>. Une modification de cet événement, par exemple le désactiver (<em>DISABLE</em>), avec l&#8217;utilisateur <strong>root@localhost</strong> mettra le <em>DEFINER</em> de l&#8217;évènement à la valeur  <em>root@localhost</em>.</p>
<p><span style="text-decoration: underline;">Désactiver un évènement</span><br />
<!-- 	 	 --></p>
<address>mysql&gt; ALTER EVENT _event.vue_materialisee DISABLE;</address>
<p><!-- 	 	 --><br />
Il est bien entendu possible d&#8217;effacer un événement. Ceci se fait avec la commande <em>DROP EVENT</em>.<br />
<!-- 	 	 --></p>
<address>DROP EVENT [IF EXISTS] nom_évènement</address>
<p><!-- 	 	 --><br />
<span style="text-decoration: underline;">Effacer un évènement</span><br />
<!-- 	 	 --></p>
<address>mysql&gt; DROP EVENT _event.vue_materialisee;</address>
<p><!-- 	 	 --><br />
<em>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 4/6)" href="http://dasini.net/blog/2009/06/16/le-programmateur-devenements-event-scheduler-part-46/">à suivre&#8230; event scheduler: Quelques exemples d&#8217;évènements</a>)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/05/06/le-programmateur-devenements-event-scheduler-part-36/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Le programmateur d&#8217;événements ( Event Scheduler ) (part 2/6)</title>
		<link>http://dasini.net/blog/2009/04/30/le-programmateur-devenements-event-scheduler-part-26/</link>
		<comments>http://dasini.net/blog/2009/04/30/le-programmateur-devenements-event-scheduler-part-26/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 09:23:52 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[event scheduler]]></category>
		<category><![CDATA[programmateur d'événements]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=606</guid>
		<description><![CDATA[Créer un événement

Pour créer notre premier événement, un coup d'oeil dans la documentation de MySQL nous donne les informations suivantes:]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --></p>
<address>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 1/6)" href="http://dasini.net/blog/2009/04/20/le-programmateur-devenements-event-scheduler-part-16-2/">&lt;- précédent</a>)</address>
<p><!-- 	 	 --></p>
<h4>Créer un événement</h4>
<p>Pour créer notre premier événement, un coup d&#8217;oeil dans la documentation de MySQL nous donne les informations suivantes:</p>
<pre>CREATE</pre>
<pre>[DEFINER = { user | CURRENT_USER }]</pre>
<pre>EVENT</pre>
<pre>[IF NOT EXISTS]</pre>
<pre><em>nom_évènement</em></pre>
<pre>ON SCHEDULE <em>moment</em></pre>
<pre>[ON COMPLETION [NOT] PRESERVE]</pre>
<pre>[ENABLE | DISABLE | DISABLE ON SLAVE]</pre>
<pre>[COMMENT '<em>commentaire</em>']</pre>
<pre>DO <em>requêtes_sql</em>;</pre>
<pre><em>moment</em>:</pre>
<pre>AT timestamp [+ INTERVAL intervalle] ...</pre>
<pre>| EVERY interval</pre>
<pre>[STARTS timestamp [+ INTERVAL intervalle] ...]</pre>
<pre>[ENDS timestamp [+ INTERVAL intervalle] ...]</pre>
<p>Les clauses entre crochets sont optionnelles, pour nous faciliter la tâche, ignorons les pour le moment. Comme tous les objets de la base de données, notre événement a un nom:  <em>nom_évènement </em><em>.</em> Il se lance à un moment: <em>moment</em>, pour  exécuter des requêtes:  <em>requêtes_sql</em>.</p>
<p>Le lancement de l&#8217;évènement est soit ponctuel (<strong><em>AT</em></strong>), soit récurrent (<strong><em>EVERY</em></strong>).</p>
<p>Armé de ces quelques éléments, empressons-nous de créer notre premier événement.</p>
<p>Commençons par créer et nous connecter à la base de données dans laquelle se dérouleront nos tests, la base de données <em>_event</em>, et ensuite créons la table <em>insert_event</em>, qui accueillera les données insérées grâce à notre événement.</p>
<address>mysql&gt; CREATE DATABASE _event;</address>
<address>mysql&gt; USE _event;</address>
<address>mysql&gt; CREATE TABLE _event.insert_event (</address>
<address>moment timestamp,</address>
<address>fois tinyint unsigned,</address>
<address>action char(50)</address>
<address>)  ENGINE = MyISAM;</address>
<address>enfin, créons notre événement:</address>
<address> </address>
<address>mysql&gt; CREATE EVENT _event.premier_event</address>
<address>ON SCHEDULE AT CURRENT_TIMESTAMP</address>
<address>COMMENT &#8216;<em>Insertion des données dans la table</em>&#8216;</address>
<address>DO</address>
<address>INSERT INTO _event.insert_event ( moment, fois, action ) VALUES (now(), 0, &#8216;Mon premier event&#8217;);</address>
<p>Quelques explications s&#8217;imposent. L&#8217;évènement <em>premier_event</em> s&#8217;exécute dès sa création, car le moment choisi est <em>CURRENT_TIMESTAMP</em>,de plus il ne s&#8217;exécute qu&#8217;un fois à cause de la clause <em>AT</em>. Le comportement programmé est ici très simple, il s&#8217;agit simplement d&#8217;insérer un enregistrement dans la table <em>insert_event</em>. Pour le vérifier il suffit de taper la requête suivante:</p>
<pre>mysql&gt; SELECT  *  FROM  insert_event;</pre>
<pre>+---------------------+------+-------------------+</pre>
<pre>| moment              | fois | action            |</pre>
<pre>+---------------------+------+-------------------+</pre>
<pre>| 2008-05-29 20:46:25 |    0 | Mon premier event |</pre>
<pre>+---------------------+------+-------------------+</pre>
<p>Notre événement à également laissé des traces dans le fichier de journalisation des erreurs (error log):</p>
<address><em>080529 20:46:25 [Note] Event Scheduler: scheduler thread started with id 2</em></address>
<address><em>080529 20:46:25 [Note] Event Scheduler: Last execution of _event.premier_event. Dropping.</em></address>
<address><em>080529 20:46:25 [Note] Event Scheduler: [root@localhost].[_event.premier_event] started in thread 3.</em></address>
<address><em>080529 20:46:25 [Note] Event Scheduler: Dropping _event.premier_event</em></address>
<address><em>080529 20:46:25 [Note] Event Scheduler: [root@localhost].[_event.premier_event] executed successfully in thread 3.</em></address>
<p>Ce fichier d&#8217;erreurs nous apprend essentiellement deux choses: premièrement que l&#8217;évènement s&#8217;est déroulé correctement (c&#8217;est pour ainsi dire une bonne nouvelle) et  deuxièmement que l&#8217;évènement à été effacé. En effet, un événement qui ne s&#8217;exécute qu&#8217;une seule fois n&#8217;est par défaut pas préservé (<em>ON COMPLETION NOT PRESERVE</em>) après son exécution.</p>
<p>Pour nous remettre de toutes ces émotions, explicitons les clauses optionnelles de la syntaxe du CREATE EVENT:</p>
<p><strong>DEFINER</strong>: le créateur de l&#8217;évènement.</p>
<p><strong>IF NOT EXIST</strong>S: clause permettant de ne pas générer de messages d&#8217;erreurs si un évènement du même nom existe au moment de la création.</p>
<p><strong>ON COMPLETION [NOT] PRESERVE</strong>:  permet de rendre un événement à exécution unique, persistant dans la table système <em>mysql.event</em> après son exécution.</p>
<p><strong>ENABLE | DISABLE | DISABLE ON SLAVE</strong>: active / désactive un événement. Attention un événement désactivé est effacé au redémarrage du serveur MySQL.</p>
<p><strong>COMMENT</strong> :  Ajouter un commentaire. (ce qui est, du reste, une excellente idée)</p>
<p><em>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 3/6)" href="http://dasini.net/blog/2009/05/06/le-programmateur-devenements-event-scheduler-part-36/">à suivre&#8230; event scheduler: Gérer les évènements</a>)</em></p>
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/04/30/le-programmateur-devenements-event-scheduler-part-26/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Le programmateur d&#8217;événements ( Event Scheduler ) (part 1/6)</title>
		<link>http://dasini.net/blog/2009/04/20/le-programmateur-devenements-event-scheduler-part-16-2/</link>
		<comments>http://dasini.net/blog/2009/04/20/le-programmateur-devenements-event-scheduler-part-16-2/#comments</comments>
		<pubDate>Mon, 20 Apr 2009 13:34:37 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[event scheduler]]></category>
		<category><![CDATA[programmateur d'événements]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=595</guid>
		<description><![CDATA[Poursuivons l'exploration des fonctionnalités phares de MySQL 5.1, et penchons-nous sur le programmateur d'évènements (Event Scheduler) présent depuis MySQL 5.1.6 . Cet article est rédigé avec la version 5.1.22 de MySQL.

Qu'est-ce qu'un programmateur d'évènements ?

Le programmateur d'événements ou « event scheduler » offre la possibilité, à l'administrateur de base de données, de déclencher l'exécution de requêtes programmées directement dans le serveur MySQL.]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%;">Poursuivons l&#8217;exploration des fonctionnalités phares de MySQL 5.1,  et penchons-nous sur le programmateur d&#8217;évènements (Event Scheduler) présent depuis MySQL 5.1.6 . Cet article est rédigé avec la version 5.1.22 de MySQL.</span></p>
<p style="margin-bottom: 0.21cm; font-weight: normal;" lang="fr-FR"><span style="background: transparent none repeat scroll 0% 0%;"> <!-- 	 	 --></span></p>
<h4><em><strong>Qu&#8217;est-ce qu&#8217;un programmateur d&#8217;évènements ?</strong></em></h4>
<p>Le programmateur d&#8217;événements ou « event scheduler » offre la possibilité, à l&#8217;administrateur de base de données, de déclencher l&#8217;exécution de requêtes programmées directement dans le serveur MySQL. Ce planificateur de tâches (CRON-like) interne permet donc d&#8217;automatiser très simplement des tâches à des intervalles réguliers, ou à heure fixe, sans avoir besoin de configurer le système sur lequel la base de données fonctionne.</p>
<h4>Comment fonctionne le programmateur d&#8217;évènements ?</h4>
<p>La première chose à faire est de vérifier si le programmateur d&#8217;évènements est activé. Pour ce faire regardez la valeur du paramètre <em>event_scheduler</em>:</p>
<pre>mysql&gt; SHOW VARIABLES LIKE 'event_scheduler';</pre>
<pre>+-----------------+-------+</pre>
<pre>| Variable_name   | Value |</pre>
<pre>+-----------------+-------+</pre>
<pre>| event_scheduler | OFF   |</pre>
<pre>+-----------------+-------+</pre>
<p>Par défaut le programmateur n&#8217;est pas activé, event_scheduler vaut donc OFF. Activez le avec la commande SET GLOBAL (le droit SUPER est nécessaire).</p>
<address>mysql&gt; SET GLOBAL event_scheduler = 1;</address>
<pre>mysql&gt; SHOW GLOBAL VARIABLES LIKE 'event_scheduler';</pre>
<pre>+-----------------+-------+</pre>
<pre>| Variable_name   | Value |</pre>
<pre>+-----------------+-------+</pre>
<pre>| event_scheduler | ON    |</pre>
<pre>+-----------------+-------+</pre>
<p>Un fois activé, le programmateur d&#8217;évènements créé un processus léger (thread) qui tourne en tâche de fond. Ce processus est chargé d&#8217;exécuter les événements lorsque le moment est venu. On peut le voir avec la commande <em>SHOW PROCESSLIT</em>. Cependant, il faut avoir le privilège <em>SUPER</em> pour pouvoir la lancer.</p>
<address>mysql&gt; SHOW  PROCESSLIST \G</address>
<address>*************************** 2. row ***************************</address>
<address>Id: 4</address>
<address>User: event_scheduler</address>
<address>Host: localhost</address>
<address>db: NULL</address>
<address>Command: Daemon</address>
<address>Time: 0</address>
<address>State: Waiting for next activation</address>
<address>Info: NULL</address>
<p><em>(<a title="Le programmateur d’événements ( Event Scheduler ) (part 2/6)" href="http://dasini.net/blog/2009/04/30/le-programmateur-devenements-event-scheduler-part-26/">à suivre&#8230; event scheduler: Créer un évènement</a>)</em></p>
<p align="left">
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2009/04/20/le-programmateur-devenements-event-scheduler-part-16-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les nouveautés de MySQL 5.1 &#8212; (part 2/5)</title>
		<link>http://dasini.net/blog/2008/12/03/les-nouveautes-de-mysql-51-part-25/</link>
		<comments>http://dasini.net/blog/2008/12/03/les-nouveautes-de-mysql-51-part-25/#comments</comments>
		<pubDate>Wed, 03 Dec 2008 00:37:25 +0000</pubDate>
		<dc:creator>freshdaz</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[event scheduler]]></category>
		<category><![CDATA[MySQL 5.1]]></category>
		<category><![CDATA[replication]]></category>
		<category><![CDATA[row based]]></category>
		<category><![CDATA[statement based]]></category>

		<guid isPermaLink="false">http://dasini.net/blog/?p=275</guid>
		<description><![CDATA[Pouvoir automatiser ses tâches de manière fiable et simple est le rêve de tout administrateur de base de données. Le programmateur d'évènements (Event Scheduler) est un planificateur de tâches (CRON-like) embarqué dans MySQL 5.1.]]></description>
			<content:encoded><![CDATA[<p><!-- 	 	 --><br />
<em>(<a title="Les nouveautés de MySQL 5.1 -- (part 1/5)" href="http://dasini.net/blog/2008/11/28/les-nouveautes-de-mysql-51-part-15/">&lt;- précédent</a>)</em><br />
<!-- 	 	 --></p>
<h2>Le programmateur d&#8217;évènements</h2>
<p>Pouvoir automatiser ses tâches de manière fiable et simple est le rêve de tout administrateur de base de données. Le programmateur d&#8217;évènements (<em><strong>Event Scheduler</strong></em>) est un planificateur de tâches (<strong>CRON-like</strong>) embarqué dans MySQL 5.1.</p>
<p>Il est alors possible d&#8217;exécuter, de façon récurrente ou <em>unique</em>, des <em>requêtes</em>, en fonction de la date et de l&#8217;heure.</p>
<p>L&#8217;évènement se crée avec la commande <strong>CREATE EVENT</strong>.</p>
<pre>CREATE EVENT nom_evenement ON SCHEDULE
      &lt;moment&gt; DO &lt;code_sql&gt;</pre>
<p>L&#8217;évènement peut être lancé une seule fois (<strong>AT</strong>) ou de manière répétitive (<strong>EVERY</strong>)</p>
<p><strong>&lt;moment&gt; = AT | EVERY</strong></p>
<p>L&#8217;évènement est constitué d&#8217;un ensemble de requêtes.</p>
<p><strong>&lt;code_sql&gt; = requêtes sql</strong></p>
<p>Créer une vue matérialisée rafraîchie toutes les 10 minutes :</p>
<pre>DELIMITER //
CREATE EVENT vue_materialisee
ON SCHEDULE EVERY 10 MINUTE
DO
BEGIN
   TRUNCATE TABLE _event.City_fra;
   INSERT INTO _event.City_fra
      SELECT * FROM world.City WHERE CountryCode='FRA'
      ORDER BY name;
END//
DELIMITER ;</pre>
<p align="left">
<h2>La réplication par les données (row based)</h2>
<p>MySQL permet de journaliser dans un fichier les requêtes d&#8217;écriture effectuées sur le serveur. Ce fichier, le <em>binary log</em>, stocke ces requêtes en un format binaire (d&#8217;où son nom). Il est indispensable à la réplication, et est également utilisé pour la restauration du serveur.</p>
<p>A partir de MySQL 5.1, le serveur permet de stocker cette information, non plus seulement sous forme de requêtes (<em><strong>statement</strong></em><strong> </strong><em><strong>based</strong></em>) mais également sous forme de lignes (<em><strong>row</strong></em><strong> </strong><em><strong>based</strong></em>). Cette nouvelle fonctionnalité est intéressante, en particulier en cas de réplication de requêtes non déterministes.</p>
<p>La commande <strong>SHOW VARIABLES LIKE &#8216;binlog_format&#8217;</strong> permet de connaître le format du journal binaire</p>
<pre>mysql&gt; SHOW VARIABLES LIKE 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.00 sec)</pre>
<p align="left">
<p align="left">
<p align="left">Trois options de journalisation sont disponibles :</p>
<ul>
<li><em><strong>Statement</strong></em><strong> </strong><em><strong>based</strong></em> (mode par défaut) : On journalise la requête <em>telle-quelle</em> (pas son résultat),</li>
<li><em><strong>Row</strong></em><strong> </strong><em><strong>based</strong></em> : On journalise le résultat de la requête,</li>
<li><em><strong>Mixed</strong></em> : MySQL 	choisit entre <em>statement</em> et <em>row</em> en fonction du 	contexte.</li>
</ul>
<p>Le mode de journalisation peut être changé dynamiquement avec la commande <strong>SET</strong></p>
<pre>mysql&gt; SET SESSION binlog_format='ROW';
Query OK, 0 rows affected (0.00 sec)

mysql&gt; SHOW VARIABLES LIKE 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | ROW   |
+---------------+-------+
1 row in set (0.01 sec)

mysql&gt; SET SESSION binlog_format='STATEMENT';
Query OK, 0 rows affected (0.00 sec)

mysql&gt; SHOW VARIABLES LIKE 'binlog_format';
+---------------+-----------+
| Variable_name | Value     |
+---------------+-----------+
| binlog_format | STATEMENT |
+---------------+-----------+
1 row in set (0.01 sec)

mysql&gt; SET SESSION binlog_format='MIXED';
Query OK, 0 rows affected (0.00 sec)

mysql&gt; SHOW VARIABLES LIKE 'binlog_format';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| binlog_format | MIXED |
+---------------+-------+
1 row in set (0.01 sec)</pre>
<p><em>(<a title="Les nouveautés de MySQL 5.1 -- (part 3/5)" href="http://dasini.net/blog/2008/12/06/les-nouveautes-de-mysql-51-part-35/">à suivre&#8230; MySQL Cluster &amp; general log, slow query log dans une table</a>)</em></p>
<p align="left">
]]></content:encoded>
			<wfw:commentRss>http://dasini.net/blog/2008/12/03/les-nouveautes-de-mysql-51-part-25/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

