
{"id":275,"date":"2008-12-03T01:37:25","date_gmt":"2008-12-03T00:37:25","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=275"},"modified":"2008-12-06T00:29:11","modified_gmt":"2008-12-05T23:29:11","slug":"les-nouveautes-de-mysql-51-part-25","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2008\/12\/03\/les-nouveautes-de-mysql-51-part-25\/","title":{"rendered":"Les nouveaut\u00e9s de MySQL 5.1 &#8212; (part 2\/5)"},"content":{"rendered":"<p><!-- \t \t --><br \/>\n<em>(<a title=\"Les nouveaut\u00e9s de MySQL 5.1 -- (part 1\/5)\" href=\"http:\/\/dasini.net\/blog\/2008\/11\/28\/les-nouveautes-de-mysql-51-part-15\/\">&lt;- pr\u00e9c\u00e9dent<\/a>)<\/em><br \/>\n<!-- \t \t --><\/p>\n<h2>Le programmateur d&rsquo;\u00e9v\u00e8nements<\/h2>\n<p>Pouvoir automatiser ses t\u00e2ches de mani\u00e8re fiable et simple est le r\u00eave de tout administrateur de base de donn\u00e9es. Le programmateur d&rsquo;\u00e9v\u00e8nements (<em><strong>Event Scheduler<\/strong><\/em>) est un planificateur de t\u00e2ches (<strong>CRON-like<\/strong>) embarqu\u00e9 dans MySQL 5.1.<\/p>\n<p>Il est alors possible d&rsquo;ex\u00e9cuter, de fa\u00e7on r\u00e9currente ou <em>unique<\/em>, des <em>requ\u00eates<\/em>, en fonction de la date et de l&rsquo;heure.<\/p>\n<p>L&rsquo;\u00e9v\u00e8nement se cr\u00e9e avec la commande <strong>CREATE EVENT<\/strong>.<\/p>\n<pre>CREATE EVENT nom_evenement ON SCHEDULE\r\n      &lt;moment&gt; DO &lt;code_sql&gt;<\/pre>\n<p>L&rsquo;\u00e9v\u00e8nement peut \u00eatre lanc\u00e9 une seule fois (<strong>AT<\/strong>) ou de mani\u00e8re r\u00e9p\u00e9titive (<strong>EVERY<\/strong>)<\/p>\n<p><strong>&lt;moment&gt; = AT | EVERY<\/strong><\/p>\n<p>L&rsquo;\u00e9v\u00e8nement est constitu\u00e9 d&rsquo;un ensemble de requ\u00eates.<\/p>\n<p><strong>&lt;code_sql&gt; = requ\u00eates sql<\/strong><\/p>\n<p>Cr\u00e9er une vue mat\u00e9rialis\u00e9e rafra\u00eechie toutes les 10 minutes :<\/p>\n<pre>DELIMITER \/\/\r\nCREATE EVENT vue_materialisee\r\nON SCHEDULE EVERY 10 MINUTE\r\nDO\r\nBEGIN\r\n   TRUNCATE TABLE _event.City_fra;\r\n   INSERT INTO _event.City_fra\r\n      SELECT * FROM world.City WHERE CountryCode='FRA'\r\n      ORDER BY name;\r\nEND\/\/\r\nDELIMITER ;<\/pre>\n<p align=\"left\">\n<h2>La r\u00e9plication par les donn\u00e9es (row based)<\/h2>\n<p>MySQL permet de journaliser dans un fichier les requ\u00eates d&rsquo;\u00e9criture effectu\u00e9es sur le serveur. Ce fichier, le <em>binary log<\/em>, stocke ces requ\u00eates en un format binaire (d&rsquo;o\u00f9 son nom). Il est indispensable \u00e0 la r\u00e9plication, et est \u00e9galement utilis\u00e9 pour la restauration du serveur.<\/p>\n<p>A partir de MySQL 5.1, le serveur permet de stocker cette information, non plus seulement sous forme de requ\u00eates (<em><strong>statement<\/strong><\/em><strong> <\/strong><em><strong>based<\/strong><\/em>) mais \u00e9galement sous forme de lignes (<em><strong>row<\/strong><\/em><strong> <\/strong><em><strong>based<\/strong><\/em>). Cette nouvelle fonctionnalit\u00e9 est int\u00e9ressante, en particulier en cas de r\u00e9plication de requ\u00eates non d\u00e9terministes.<\/p>\n<p>La commande <strong>SHOW VARIABLES LIKE &lsquo;binlog_format&rsquo;<\/strong> permet de conna\u00eetre le format du journal binaire<\/p>\n<pre>mysql&gt; SHOW VARIABLES LIKE 'binlog_format';\r\n+---------------+-------+\r\n| Variable_name | Value |\r\n+---------------+-------+\r\n| binlog_format | MIXED |\r\n+---------------+-------+\r\n1 row in set (0.00 sec)<\/pre>\n<p align=\"left\">\n<p align=\"left\">\n<p align=\"left\">Trois options de journalisation sont disponibles :<\/p>\n<ul>\n<li><em><strong>Statement<\/strong><\/em><strong> <\/strong><em><strong>based<\/strong><\/em> (mode par d\u00e9faut) : On journalise la requ\u00eate <em>telle-quelle<\/em> (pas son r\u00e9sultat),<\/li>\n<li><em><strong>Row<\/strong><\/em><strong> <\/strong><em><strong>based<\/strong><\/em> : On journalise le r\u00e9sultat de la requ\u00eate,<\/li>\n<li><em><strong>Mixed<\/strong><\/em> : MySQL \tchoisit entre <em>statement<\/em> et <em>row<\/em> en fonction du \tcontexte.<\/li>\n<\/ul>\n<p>Le mode de journalisation peut \u00eatre chang\u00e9 dynamiquement avec la commande <strong>SET<\/strong><\/p>\n<pre>mysql&gt; SET SESSION binlog_format='ROW';\r\nQuery OK, 0 rows affected (0.00 sec)\r\n\r\nmysql&gt; SHOW VARIABLES LIKE 'binlog_format';\r\n+---------------+-------+\r\n| Variable_name | Value |\r\n+---------------+-------+\r\n| binlog_format | ROW   |\r\n+---------------+-------+\r\n1 row in set (0.01 sec)\r\n\r\nmysql&gt; SET SESSION binlog_format='STATEMENT';\r\nQuery OK, 0 rows affected (0.00 sec)\r\n\r\nmysql&gt; SHOW VARIABLES LIKE 'binlog_format';\r\n+---------------+-----------+\r\n| Variable_name | Value     |\r\n+---------------+-----------+\r\n| binlog_format | STATEMENT |\r\n+---------------+-----------+\r\n1 row in set (0.01 sec)\r\n\r\nmysql&gt; SET SESSION binlog_format='MIXED';\r\nQuery OK, 0 rows affected (0.00 sec)\r\n\r\nmysql&gt; SHOW VARIABLES LIKE 'binlog_format';\r\n+---------------+-------+\r\n| Variable_name | Value |\r\n+---------------+-------+\r\n| binlog_format | MIXED |\r\n+---------------+-------+\r\n1 row in set (0.01 sec)<\/pre>\n<p><em>(<a title=\"Les nouveaut\u00e9s de MySQL 5.1 -- (part 3\/5)\" href=\"http:\/\/dasini.net\/blog\/2008\/12\/06\/les-nouveautes-de-mysql-51-part-35\/\">\u00e0 suivre&#8230; MySQL Cluster &amp; general log, slow query log dans une table<\/a>)<\/em><\/p>\n<p align=\"left\">\n","protected":false},"excerpt":{"rendered":"<p>Pouvoir automatiser ses t\u00e2ches de mani\u00e8re fiable et simple est le r\u00eave de tout administrateur de base de donn\u00e9es. Le programmateur d&rsquo;\u00e9v\u00e8nements (Event Scheduler) est un planificateur de t\u00e2ches (CRON-like) embarqu\u00e9 dans MySQL 5.1.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[8],"tags":[65,241,59,66,67,68],"class_list":["post-275","post","type-post","status-publish","format-standard","hentry","category-mysql","tag-event-scheduler","tag-mysql","tag-mysql-51","tag-replication","tag-row-based","tag-statement-based"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-4r","jetpack-related-posts":[{"id":595,"url":"https:\/\/dasini.net\/blog\/2009\/04\/20\/le-programmateur-devenements-event-scheduler-part-16-2\/","url_meta":{"origin":275,"position":0},"title":"Le programmateur d&rsquo;\u00e9v\u00e9nements ( Event Scheduler ) (part 1\/6)","author":"Olivier DASINI","date":"20 avril 2009","format":false,"excerpt":"Poursuivons l'exploration des fonctionnalit\u00e9s phares de MySQL 5.1, et penchons-nous sur le programmateur d'\u00e9v\u00e8nements (Event Scheduler) pr\u00e9sent depuis MySQL 5.1.6 . Cet article est r\u00e9dig\u00e9 avec la version 5.1.22 de MySQL. Qu'est-ce qu'un programmateur d'\u00e9v\u00e8nements ? Le programmateur d'\u00e9v\u00e9nements ou \u00ab event scheduler \u00bb offre la possibilit\u00e9, \u00e0 l'administrateur de\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":606,"url":"https:\/\/dasini.net\/blog\/2009\/04\/30\/le-programmateur-devenements-event-scheduler-part-26\/","url_meta":{"origin":275,"position":1},"title":"Le programmateur d&rsquo;\u00e9v\u00e9nements ( Event Scheduler ) (part 2\/6)","author":"Olivier DASINI","date":"30 avril 2009","format":false,"excerpt":"Cr\u00e9er un \u00e9v\u00e9nement Pour cr\u00e9er notre premier \u00e9v\u00e9nement, un coup d'oeil dans la documentation de MySQL nous donne les informations suivantes:","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":622,"url":"https:\/\/dasini.net\/blog\/2009\/06\/16\/le-programmateur-devenements-event-scheduler-part-46\/","url_meta":{"origin":275,"position":2},"title":"Le programmateur d&rsquo;\u00e9v\u00e9nements ( Event Scheduler ) (part 4\/6)","author":"Olivier DASINI","date":"16 juin 2009","format":false,"excerpt":"Insertions de donn\u00e9es dans une table, toutes les 30 secondes mysql> SELECT * FROM _event.insert_event ; mysql> DELIMITER \u20ac\u20ac 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\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":634,"url":"https:\/\/dasini.net\/blog\/2009\/06\/24\/le-programmateur-devenements-event-scheduler-part-56\/","url_meta":{"origin":275,"position":3},"title":"Le programmateur d&rsquo;\u00e9v\u00e9nements ( Event Scheduler ) (part 5\/6)","author":"Olivier DASINI","date":"24 juin 2009","format":false,"excerpt":"Appel d'une proc\u00e9dure stock\u00e9e Il est possible d'appeler des proc\u00e9dures stock\u00e9es dans un \u00e9v\u00e9nement. mysql> CREATE EVENT `_event`.`appel_ps` ON SCHEDULE AT CURRENT_TIMESTAMP DO \/*Appel de la proc\u00e9dure stock\u00e9e*\/ CALL pro_stock.insert_profil('Olivier', 'DASINI', 'Orange');","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":641,"url":"https:\/\/dasini.net\/blog\/2009\/06\/29\/le-programmateur-d%e2%80%99evenements-event-scheduler-part-66\/","url_meta":{"origin":275,"position":4},"title":"Le programmateur d\u2019\u00e9v\u00e9nements ( Event Scheduler ) (part 6\/6)","author":"Olivier DASINI","date":"29 juin 2009","format":false,"excerpt":"Limitations et restrictions Certaines commandes MySQL ne sont pas permises dans un \u00e9v\u00e9nement. Verrouiller une table est interdit: LOCK TABLES, UNLOCK TABLES. Il n'est malheureusement pas possible de charger des donn\u00e9es avec la commande LOAD DATA INFILE. Les requ\u00eates pr\u00e9par\u00e9es (PREPARED STATEMENT) ne peuvent \u00eatre cr\u00e9\u00e9es dans un \u00e9v\u00e9nement.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":614,"url":"https:\/\/dasini.net\/blog\/2009\/05\/06\/le-programmateur-devenements-event-scheduler-part-36\/","url_meta":{"origin":275,"position":5},"title":"Le programmateur d&rsquo;\u00e9v\u00e9nements ( Event Scheduler ) (part 3\/6)","author":"Olivier DASINI","date":"6 mai 2009","format":false,"excerpt":"G\u00e9rer les \u00e9v\u00e8nements MySQL propose plusieurs m\u00e9thodes pour visualiser les \u00e9v\u00e8nements. La m\u00e9thode la plus pratique consiste \u00e0 aller chercher l'information dans la table event de la base de donn\u00e9es des m\u00e9ta-donn\u00e9es information_schema: mysql> SELECT * FROM information_schema.EVENTS;","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/275","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=275"}],"version-history":[{"count":7,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/275\/revisions"}],"predecessor-version":[{"id":296,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/275\/revisions\/296"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=275"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=275"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=275"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}