<?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>Мастерская интернет-разработчика &#187; Базы данных</title>
	<atom:link href="http://adw0rd.ru/category/databases/feed/" rel="self" type="application/rss+xml" />
	<link>http://adw0rd.ru</link>
	<description>Блог Михаила Андреева (aka adw0rd)</description>
	<lastBuildDate>Wed, 18 Jan 2012 13:52:48 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>MySQL. Остановка выполнения sql-запроса через триггер</title>
		<link>http://adw0rd.ru/2010/mysql-stop-trigger/</link>
		<comments>http://adw0rd.ru/2010/mysql-stop-trigger/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 12:43:43 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Триггеры]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=5203</guid>
		<description><![CDATA[Как приостановить выполнения SQL после триггера? То есть, при определенных условиях, описанных в триггере надо остановить выполнения SQL который и вызвал этот триггер. Я размышлял и гуглил на эту тему, но единственное что у меня получилось, это выполнять ошибочный SQL-код, тем самым останавливать выполнение SQL кода, который выполнится после триггера. Задача была такая, что у [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="/2010/mysql-stop-trigger/"><img src="http://adw0rd.ru/wp-content/uploads/2009/05/mysql-logo.png"  alt="" title="mysql-logo" width="150" height="76" class="alignright size-full wp-image-2595" /></a></noindex></p>
<p>Как приостановить выполнения SQL после триггера? То есть, при определенных условиях, описанных в триггере надо остановить выполнения SQL который и вызвал этот триггер.<br />
Я размышлял и гуглил на эту тему, но единственное что у меня получилось, это выполнять ошибочный SQL-код, тем самым останавливать выполнение SQL кода, который выполнится после триггера.</p>
<p>Задача была такая, что у кастомеров есть статусы, но если новый статус (который устанавливается) меньше чем текущий, то надо приостановить такой запрос.<br />
Городить проверки на стороне скриптового языка не хотелось, ибо это поведение должно быть глобальным, да и переписывать чудо-код доставшийся мне по наследству совсем не хотелось.</p>
<p>Ну это все слова, а теперь покажу реализацию:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">delimiter <span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`customers_update_status`</span><span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TRIGGER</span> <span style="color: #ff0000;">`customers_update_status`</span> <span style="color: #993333; font-weight: bold;">BEFORE</span> <span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #ff0000;">`customers`</span> <span style="color: #993333; font-weight: bold;">FOR</span> EACH <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NEW</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #993333; font-weight: bold;">OLD</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> <span style="color: #993333; font-weight: bold;">THEN</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`customers`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #993333; font-weight: bold;">OLD</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`status`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;STOP_SQL_QUERY&quot;</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">END</span>;<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">END</span> <span style="color: #993333; font-weight: bold;">IF</span>;<br />
<span style="color: #993333; font-weight: bold;">END</span><span style="color: #66cc66;">//</span><br />
delimiter ;</div></div>
<p>Поле <strong>status</strong> имеет тип <strong>ENUM</strong> и у него нет значения <strong>STOP_SQL_QUERY</strong>, поэтому происходит ошибка и <strong>SQL</strong>-запрос идущий за триггером не выполняется. Это не корректное, но единственное найденное мной решение. Вообще, наверное еще лучше чтобы был не INSERT, а UPDATE. Тогда будет ошибка более корректна с виду.</p>
<p>зы. Кстати на <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html" >официальной страничке CREATE TRIGGER</a></noindex> в камментах приводится именно такой способ по остановке выполнения sql-запроса.</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2010/mysql-stop-trigger/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Sphinx. Для чего нужны дельта-индексы и как их готовить?</title>
		<link>http://adw0rd.ru/2009/sphinx-delta-index/</link>
		<comments>http://adw0rd.ru/2009/sphinx-delta-index/#comments</comments>
		<pubDate>Fri, 31 Jul 2009 07:58:12 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Pyha]]></category>
		<category><![CDATA[SMF]]></category>
		<category><![CDATA[Sphinx]]></category>
		<category><![CDATA[Поисковые системы]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=4061</guid>
		<description><![CDATA[Дельта индексы необходимы для того, чтобы не индексировать базу полностью в течении короткого времени, а использовать маленький индекс. К примеру, мы имеем очень много записей в базе данных, сотни тысяч или несколько миллионов записей, и данные поступают очень часто, нам их необходимо индексировать, однако запускать каждые 5-10 минут индексацию&#160;&#8212; это слишком трудоемко. Поэтому мы делаем [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/sphinx-delta-index/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/07/sphinx-delta.png" alt="sphinx-delta" title="sphinx-delta" width="228" height="121" class="alignright size-full wp-image-4063" /></a></p>
<p><strong>Дельта индексы</strong> необходимы для того, чтобы не индексировать базу полностью в течении короткого времени, а использовать маленький индекс.</p>
<p>К примеру, мы имеем очень много записей в базе данных, сотни тысяч или несколько миллионов записей, и данные поступают очень часто, нам их необходимо индексировать, однако запускать каждые 5-10 минут индексацию&nbsp;&mdash; это слишком трудоемко.</p>
<p><strong>Поэтому мы делаем два индекса:</strong></p>
<ul>
<li><strong>Полный</strong>&nbsp;&mdash; индексируются все данные целиком (запускаем раз в сутки)</li>
<li><strong>Дельта</strong>&nbsp;&mdash; индексируется только малая часть данных, добавленных в течении дня (запускаем каждые 5-10 минут)</li>
</ul>
<h3>Но как определять с какого момента индексировать данные в дельта-индексе?</h3>
<p>Нам необходимо помнить крайний проиндексированный ид-записи из полного-индекса, и начинать индексировать данные только с него, все очень просто :)</p>
<p>Для этого создадим еще одну таблицу в базе данных, чтобы хранить там ид крайней записи из полного-индекса:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`sphinx_delta_counter`</span> <span style="color: #66cc66;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #ff0000;">`index_name`</span> ENUM<span style="color: #66cc66;">&#40;</span> <span style="color: #ff0000;">'pyha_forum'</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #ff0000;">`last_post_id`</span> <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">UNSIGNED</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><br />
<span style="color: #66cc66;">&#41;</span> ENGINE <span style="color: #66cc66;">=</span> InnoDB;</div></td></tr></tbody></table></div>
<p><strong>Где,</strong></p>
<ul>
<li>&laquo;index_name&raquo;&nbsp;&mdash; имя индекса, например если у вас много индексов с разных таблиц (можно опустить, если у вас один индекс);</li>
<li>&laquo;last_post_id&raquo;&nbsp;&mdash; крайний номер записи для конкретного индекса.</li>
</ul>
<p>Вставим для нашего индекса запись, чтобы потом можно было обновлять счетчик:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> <span style="color: #ff0000;">`sphinx_delta_counter`</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`index_name`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'pyha_forum'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`last_post_id`</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">0</span>;</div></td></tr></tbody></table></div>
<p>Вы конечно можете этот запрос и в индексе сфинкса использовать, предварительно переписав его на &laquo;on duplicate key&raquo; и добавив уникальный индекс на связку &laquo;index_name+last_post_id&raquo;, однако я думаю это излишне.<br />
<span id="more-4061"></span></p>
<h3>Строим индексы в Sphinx</h3>
<p>Привожу примерный конфигурационный файл, на примере предыдущей статьи <a href="http://adw0rd.ru/2009/smf-sphinx/" >http://adw0rd.ru/2009/smf-sphinx/</a>.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br />56<br />57<br />58<br />59<br />60<br />61<br />62<br />63<br />64<br />65<br />66<br />67<br />68<br />69<br />70<br />71<br />72<br />73<br />74<br />75<br />76<br />77<br />78<br />79<br />80<br />81<br />82<br />83<br />84<br />85<br />86<br />87<br />88<br />89<br />90<br />91<br />92<br />93<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># сорс для подключения к БД, далее его будем наследовать в других сорсах<br />
source dbconnect<br />
{<br />
&nbsp; &nbsp; type = mysql<br />
&nbsp; &nbsp; sql_host = localhost<br />
&nbsp; &nbsp; sql_user = pyha<br />
&nbsp; &nbsp; sql_pass = <br />
&nbsp; &nbsp; sql_db = pyha<br />
&nbsp; &nbsp; sql_port = 3306<br />
&nbsp; &nbsp; sql_sock = /tmp/mysql.sock<br />
<br />
}<br />
<br />
# сорс полного-индекса<br />
source pyha_forum : dbconnect<br />
{<br />
<br />
&nbsp; &nbsp; sql_query_pre = SET NAMES utf8<br />
&nbsp; &nbsp; sql_query_pre = SET CHARACTER SET utf8<br />
<br />
&nbsp; &nbsp; # обновляем наш счетчик, добавляем туда крайний ид записи для дельта-индекса<br />
&nbsp; &nbsp; sql_query_pre = \<br />
&nbsp; &nbsp; &nbsp; &nbsp; update sphinx_delta_counter \<br />
&nbsp; &nbsp; &nbsp; &nbsp; set last_post_id = (select max(ID_MSG) from smf_messages) \<br />
&nbsp; &nbsp; &nbsp; &nbsp; where index_name = 'pyha_forum';<br />
<br />
&nbsp; &nbsp; # выбираем все данные для полного-индекса<br />
&nbsp; &nbsp; sql_query = \<br />
&nbsp; &nbsp; &nbsp; &nbsp; select ID_MSG, concat('user:',posterName) as posterName, subject, body \<br />
&nbsp; &nbsp; &nbsp; &nbsp; from smf_messages;<br />
<br />
&nbsp; &nbsp; sql_query_info = select ID_MSG, posterName, subject, body from smf_messages where ID_MSG = $id<br />
&nbsp; &nbsp; sql_ranged_throttle = 0<br />
}<br />
<br />
# сорс дельта-индекса<br />
source pyha_forum_delta : dbconnect<br />
{<br />
<br />
&nbsp; &nbsp; sql_query_pre = SET NAMES utf8<br />
&nbsp; &nbsp; sql_query_pre = SET CHARACTER SET utf8<br />
<br />
&nbsp; &nbsp; # выбираем только те данные, которые появились после проиндексации полного-индекса<br />
&nbsp; &nbsp; sql_query = \<br />
&nbsp; &nbsp; &nbsp; &nbsp; select ID_MSG, concat('user:',posterName) as posterName, subject, body \<br />
&nbsp; &nbsp; &nbsp; &nbsp; from smf_messages \<br />
&nbsp; &nbsp; &nbsp; &nbsp; where ID_MSG &gt; (select last_post_id from sphinx_delta_counter where index_name = 'pyha_forum');<br />
<br />
&nbsp; &nbsp; sql_query_info = select ID_MSG, posterName, subject, body from smf_messages where ID_MSG = $id<br />
&nbsp; &nbsp; sql_ranged_throttle = 0<br />
}<br />
<br />
# полный-индекс<br />
index pyha_forum<br />
{<br />
&nbsp; &nbsp; source = pyha_forum<br />
&nbsp; &nbsp; path = /var/sphinxsearch/pyha_forum<br />
<br />
&nbsp; &nbsp; docinfo = extern<br />
&nbsp; &nbsp; mlock = 0<br />
&nbsp; &nbsp; morphology = stem_enru<br />
&nbsp; &nbsp; min_word_len = 2<br />
&nbsp; &nbsp; charset_type = utf-8<br />
&nbsp; &nbsp; charset_table = 0..9, A..Z-&gt;a..z, _, a..z, U+410..U+42F-&gt;U+430..U+44F, U+430..U+44F<br />
&nbsp; &nbsp; min_infix_len = 2<br />
&nbsp; &nbsp; enable_star = 1<br />
}<br />
<br />
# дельта-индекс<br />
index pyha_forum_delta : pyha_forum<br />
{<br />
&nbsp; &nbsp; source = pyha_forum_delta<br />
&nbsp; &nbsp; path = /var/sphinxsearch/pyha_forum_delta<br />
}<br />
<br />
# настройки индексатора<br />
indexer<br />
{<br />
&nbsp; &nbsp; mem_limit = 32M<br />
}<br />
<br />
# настройки поискового демона<br />
searchd<br />
{<br />
&nbsp; &nbsp; address = 127.0.0.1<br />
&nbsp; &nbsp; port = 3312<br />
&nbsp; &nbsp; log = /var/sphinxsearch/log/searchd.log<br />
&nbsp; &nbsp; query_log = /var/sphinxsearch/log/query.log<br />
&nbsp; &nbsp; read_timeout = 5<br />
&nbsp; &nbsp; max_children = 30<br />
&nbsp; &nbsp; #pid_file = /var/sphinxsearch/log/searchd.pid<br />
&nbsp; &nbsp; max_matches = 1000<br />
}</div></td></tr></tbody></table></div>
<p>Ну вот и все, сфинкс настроен, далее поставим переиндексацию в крон.</p>
<h3>Ставим в крон</h3>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">0 1 * * * /usr/local/bin/indexer --config /usr/local/etc/sphinx.conf.sh pyha_forum --rotate &gt; /dev/null<br />
*/5 * * * * /usr/local/bin/indexer --config /usr/local/etc/sphinx.conf.sh pyha_forum_delta --rotate &gt; /dev/null</div></td></tr></tbody></table></div>
<p><strong>Где,</strong></p>
<ol>
<li>Индексировать полный-индекс каждый день в час ночи</li>
<li>Индексировать дельта-индекс каждые пять минут</li>
</ol>
<blockquote class="info">
<p>
Не понятно что за конфиг &laquo;/usr/local/etc/sphinx.conf.sh&raquo;?<br />
Тогда, читаем статью <a href="http://adw0rd.ru/2009/sphinx-include/" >Инклуд конфигов Sphinx</a>.</p>
</blockquote>
<h3>Добавим поиск по дельта-индексу в код</h3>
<p>Так как я использую <strong>SphinxSE</strong>, то добавить надо так:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">`query` = &quot;поисковый запрос;index=pyha_forum,pyha_forum_delta&quot;</div></div>
<p>Тогда будет производится поиск по полному- и дельта-индексам!</p>
<h4>Встраиваем в SMF</h4>
<p>Далее, раз мы разбираем пример на основе статьи <a href="http://adw0rd.ru/2009/smf-sphinx/" >http://adw0rd.ru/2009/smf-sphinx/</a>, то снова найдем код в &laquo;/Source/Search.php&raquo; (строка ~1377):</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> db_query<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp;<span style="color: #0000ff;">&quot;SELECT `sm`.`ID_TOPIC`, `ssm`.`id` AS `ID_MSG`, 1000 AS `relevance`, 0 AS `num_matches`<br />
&nbsp; &nbsp; FROM `sphinx_smf_messages` AS `ssm`<br />
&nbsp; &nbsp; LEFT JOIN `smf_messages` AS `sm`<br />
&nbsp; &nbsp; &nbsp; &nbsp; ON `ssm`.`id` = `sm`.`ID_MSG`<br />
&nbsp; &nbsp; WHERE `ssm`.`query` = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$context</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search_params'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;;weights=1,2,3'<br />
&nbsp; &nbsp; LIMIT &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;, <span style="color: #006699; font-weight: bold;">$modSettings[search_results_per_page]</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>заменим на</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> db_query<span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp;<span style="color: #0000ff;">&quot;SELECT `sm`.`ID_TOPIC`, `ssm`.`id` AS `ID_MSG`, 1000 AS `relevance`, 0 AS `num_matches`<br />
&nbsp; &nbsp; FROM `sphinx_smf_messages` AS `ssm`<br />
&nbsp; &nbsp; LEFT JOIN `smf_messages` AS `sm`<br />
&nbsp; &nbsp; &nbsp; &nbsp; ON `ssm`.`id` = `sm`.`ID_MSG`<br />
&nbsp; &nbsp; WHERE `ssm`.`query` = '&quot;</span><span style="color: #339933;">.</span><span style="color: #000088;">$context</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search_params'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'search'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">&quot;;weights=1,2,3;index=pyha_forum,pyha_forum_delta'<br />
&nbsp; &nbsp; LIMIT &quot;</span> <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span>int<span style="color: #009900;">&#41;</span> <span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'start'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;, <span style="color: #006699; font-weight: bold;">$modSettings[search_results_per_page]</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">__LINE__</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></div></td></tr></tbody></table></div>
<p>Ну вот и все :)</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/sphinx-delta-index/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Не возможно использовать для обновления таблицу, в которой производишь выборку</title>
		<link>http://adw0rd.ru/2009/mysql-update-error/</link>
		<comments>http://adw0rd.ru/2009/mysql-update-error/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 23:04:32 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3988</guid>
		<description><![CDATA[Понадобилось ежесуточно высчитывать размер шрифта для оформления вывода жанров на Кинсбурге. И столкнулся с проблемой, что нельзя выбирать данные из таблицы, которая участвует в обновлении данных. Вот примеры запросов Пробуем в лоб: UPDATE `categories` SET `size` = &#40;`count` / &#40;&#40;MAX&#40;`count`&#41; - MIN&#40;`count`&#41;&#41; / 10&#41;&#41;; ERROR 1111 &#40;HY000&#41;: Invalid USE OF GROUP FUNCTION Попробуем вложенный селект: [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/mysql-update-error/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/mysql-logo.png" alt="mysql-logo" title="mysql-logo" width="200" height="103" class="alignright size-full wp-image-2595" /></a></p>
<p>Понадобилось ежесуточно высчитывать размер шрифта для оформления вывода жанров на <noindex><a rel="nofollow" href="http://kinsburg.ru/" >Кинсбурге</a></noindex>. И столкнулся с проблемой, что нельзя выбирать данные из таблицы, которая участвует в обновлении данных.</p>
<h3>Вот примеры запросов</h3>
<p>Пробуем в лоб:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #ff0000;">`categories`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`size`</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span> <span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #993333; font-weight: bold;">MIN</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
ERROR <span style="color: #cc66cc;">1111</span> <span style="color: #66cc66;">&#40;</span>HY000<span style="color: #66cc66;">&#41;</span>: Invalid <span style="color: #993333; font-weight: bold;">USE</span> <span style="color: #993333; font-weight: bold;">OF</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span></div></div>
<p>Попробуем вложенный селект:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #ff0000;">`categories`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`size`</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span> <span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #993333; font-weight: bold;">MIN</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`categories`</span><span style="color: #66cc66;">&#41;</span>;<br />
ERROR <span style="color: #cc66cc;">1093</span> <span style="color: #66cc66;">&#40;</span>HY000<span style="color: #66cc66;">&#41;</span>: You can<span style="color: #ff0000;">'t specify target table '</span>categories<span style="color: #ff0000;">' for update in FROM clause</span></div></div>
<p>Попробуем жоин:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #ff0000;">`categories`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`c1`</span> <br />
<span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`categories`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`c2`</span> <br />
<span style="color: #993333; font-weight: bold;">USING</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`category_id`</span><span style="color: #66cc66;">&#41;</span> <br />
<span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`c1`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`size`</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`c2`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`count`</span> <span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`c2`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #993333; font-weight: bold;">MIN</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`c2`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
ERROR <span style="color: #cc66cc;">1111</span> <span style="color: #66cc66;">&#40;</span>HY000<span style="color: #66cc66;">&#41;</span>: Invalid <span style="color: #993333; font-weight: bold;">USE</span> <span style="color: #993333; font-weight: bold;">OF</span> <span style="color: #993333; font-weight: bold;">GROUP</span> <span style="color: #993333; font-weight: bold;">FUNCTION</span></div></div>
<p><span id="more-3988"></span></p>
<h3>По отдельности все работает</h3>
<p>Выводим &laquo;размер шрифта&raquo;:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span> <span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #993333; font-weight: bold;">MIN</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`categories`</span>;<br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span> <span style="color: #66cc66;">/</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #993333; font-weight: bold;">MIN</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">10</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">3.47826087</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>Обновляем поле с размером шрифта:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #ff0000;">`categories`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`size`</span> <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">3.47826087</span>;<br />
Query OK<span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">0</span> <span style="color: #993333; font-weight: bold;">ROWS</span> affected <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">ROWS</span> matched: <span style="color: #cc66cc;">21</span> &nbsp;Changed: <span style="color: #cc66cc;">0</span> &nbsp;Warnings: <span style="color: #cc66cc;">0</span></div></div>
<h3>Решение</h3>
<p>Погуглив, и <a href="http://pyha.ru/forum/topic/3095.0" >поломав голову</a> с <a href="http://pyha.ru/forum/profile/7" >disc</a>&#39;ом, я пришел к следующему решению, представленное ниже.</p>
<p>Я решил выделить вычисление процента в переменную @percent, далее создал вьюху для таблицы &laquo;categories&raquo; и жойню таблицу с вьюхой:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">-- создаем коэффициент деления</span><br />
<span style="color: #993333; font-weight: bold;">SET</span> @percent <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #993333; font-weight: bold;">MIN</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">10</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`categories`</span><span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">-- создаем вьюху</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">VIEW</span> <span style="color: #ff0000;">`categories_view`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">`category_id`</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`count`</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`categories`</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">-- жойним таблицу и вьюху, обновляя данные</span><br />
<span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #ff0000;">`categories`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`c`</span><br />
<span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`categories_view`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`cv`</span><br />
<span style="color: #993333; font-weight: bold;">USING</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`category_id`</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`c`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`size`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">`cv`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`count`</span> <span style="color: #66cc66;">/</span> @percent;</div></div>
<p>Вот и все, приятного манокурения :)</p>
<h3>UPD: Создадим процедуру и евент для этого события</h3>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">/* Создаем вьюху и процедуру для установки размеров шрифта */</span><br />
<span style="color: #993333; font-weight: bold;">USE</span> kinsburg;<br />
<br />
<span style="color: #808080; font-style: italic;">/* создаем вьюху */</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">VIEW</span> <span style="color: #ff0000;">`categories_view`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">`category_id`</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`count`</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`categories`</span>;<br />
<br />
<span style="color: #808080; font-style: italic;">/* создаем процедуру */</span><br />
delimiter <span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">DROP</span> <span style="color: #993333; font-weight: bold;">PROCEDURE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`updateCategorySize`</span><span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">PROCEDURE</span> <span style="color: #ff0000;">`updateCategorySize`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #993333; font-weight: bold;">BEGIN</span><br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">/* создаем коэффициент деления */</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">SET</span> @percent <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">MAX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #993333; font-weight: bold;">MIN</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`count`</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">/</span> <span style="color: #cc66cc;">10</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`categories`</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; <span style="color: #808080; font-style: italic;">/* жойним таблицу и вьюху, обновляя данные */</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #ff0000;">`categories`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`c`</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #ff0000;">`categories_view`</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`cv`</span> <span style="color: #993333; font-weight: bold;">USING</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`category_id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`c`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`size`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">`cv`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`count`</span> <span style="color: #66cc66;">/</span> @percent;<br />
<span style="color: #993333; font-weight: bold;">END</span><span style="color: #66cc66;">//</span><br />
delimiter ;<br />
<br />
<span style="color: #808080; font-style: italic;">/* создаем евент для вызова процедуры раз в сутки */</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span><br />
&nbsp; &nbsp; DEFINER <span style="color: #66cc66;">=</span> kinsburg@localhost<br />
&nbsp; &nbsp; EVENT <span style="color: #ff0000;">`updateCategorySizeEvent`</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> SCHEDULE<br />
&nbsp; &nbsp; &nbsp; EVERY <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">DAY</span><br />
&nbsp; &nbsp; DO<br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">CALL</span> updateCategorySize;</div></div>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/mysql-update-error/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Установка и настройка Trac на FreeBSD</title>
		<link>http://adw0rd.ru/2009/trac-freebsd/</link>
		<comments>http://adw0rd.ru/2009/trac-freebsd/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 07:00:27 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[Hooks]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Svn]]></category>
		<category><![CDATA[Trac]]></category>
		<category><![CDATA[Wiki]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3873</guid>
		<description><![CDATA[Trac — это инструмент управления проектами и отслеживания ошибок в программном обеспечении. Он использует минималистичный веб-интерфейс, основанный на технологии wiki, и позволяет организовать перекрёстные гиперссылки между базой данных зарегистрированных ошибок, системой управления версиями и wiki-страницами. Это даёт возможность использовать Trac в том числе и как веб-интерфейс для доступа к системе контроля версий subversion, а так [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/trac-freebsd/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/07/trac.png" alt="trac" title="trac" width="214" height="61" class="alignright size-full wp-image-3876" /></a></p>
<p><strong>Trac</strong> — это инструмент управления проектами и отслеживания ошибок в программном обеспечении. Он использует минималистичный веб-интерфейс, основанный на технологии <a href="/tag/wiki/">wiki</a>, и позволяет организовать перекрёстные гиперссылки между базой данных зарегистрированных ошибок, системой управления версиями и <strong>wiki</strong>-страницами.</p>
<p>Это даёт возможность использовать <strong>Trac</strong> в том числе и как веб-интерфейс для доступа к системе контроля версий <a href="/tag/subversion/">subversion</a>, а так же, через плагины, к <strong>Mercurial</strong>, <strong>git</strong>, <strong>Bazaar</strong> и другим. <strong>Trac</strong> написан на языке программирования <strong>python</strong> и в настоящее время распространяется по модифицированной лицензии <strong>BSD</strong>.</p>
<p><noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/Trac" >http://ru.wikipedia.org/wiki/Trac</a></noindex></p>
<h3>Возможности</h3>
<ul>
<li>Возможность просмотра всех изменений в svn и trac-проекте.</li>
<li>Можно создавать подпроекты, например для портала это будет &laquo;Разработать сервис фотографий&raquo;, &laquo;Разработка форума&raquo; или &laquo;Реконструкция поискового-модуля&raquo;. И для каждого будут отдельные группы тикетов.</li>
<li>Просмотреть изменения кодов проекта в svn-ревизиях и сравнивание их.</li>
<li>Создание, просмотр и закрытие тикетов.</li>
<li>Управление пользователями, участвующие в разработке.</li>
<li>Wiki-движок, с помощью которого можно создавать как справочную информацию, так и документацию по проекту в целом.</li>
</ul>
<p>Так же имеется <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/PluginList" >куча плагинов для Trac</a></noindex>, с помощью которых вы легко расширите функционал!</p>
<h3>Установка</h3>
<p>Для развертывания <strong>Trac</strong> нам понадобится:</p>
<ul>
<li><strong>Apache 2.2</strong>&nbsp;&mdash; но вы можете так же развернуть и на Apache 1.3 или на Nginx, к примеру</li>
<li><strong>mod_python3</strong>&nbsp;&mdash; это для Apache 2, а для 1.3 надо просто &laquo;mod_python&raquo;</li>
<li><strong>Subversion</strong>&nbsp;&mdash; либо другие системы контроля версия, например Mercurial, git или Bazaar</li>
<li><strong>py-subversion</strong>&nbsp;&mdash; для работы из Python с Subversion </li>
<li><strong>MySQL</strong>&nbsp;&mdash; можете также использовать SQLite или PgSQL. Подробнее <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/DatabaseBackend" >http://trac.edgewall.org/wiki/DatabaseBackend</a></noindex></li>
<li>Ну и сам <strong>Trac</strong> разумеется :)</li>
</ul>
<p><span id="more-3873"></span></p>
<h4>Установка mod_python3 на Apache 2.2</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/www/mod_python3/</span><br />
<span style="color: #666666; font-style: italic;"># make install clean</span></div></div>
<p>Зайдите и проверьте установился ли модуль <strong>mod_python.so</strong></p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/local/libexec/apache22/</span><br />
<span style="color: #666666; font-style: italic;"># ll | grep mod_python</span></div></div>
<p>Если он есть, то впишите в конфиг <strong>httpd.conf</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">LoadModule python_module libexec/apache22/mod_python.so</div></div>
<p>Более подробно о mod_python: <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/TracModPython" >http://trac.edgewall.org/wiki/TracModPython</a></noindex></p>
<h4>Установка Trac</h4>
<p><strong>Trac</strong> ставиться очень просто:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/www/trac</span><br />
<span style="color: #666666; font-style: italic;"># make install clean</span></div></div>
<p>Если вы хотите управлять настройками <strong>trac-проекта</strong> и правами пользователей из <strong>web-панели</strong>, то установите плагин ”trac-webadmin”.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/www/trac-webadmin/</span><br />
<span style="color: #666666; font-style: italic;"># make install clean</span></div></div>
<p>Более подробно о WebAdmin: <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/WebAdmin" >http://trac.edgewall.org/wiki/WebAdmin</a></noindex></p>
<h4>Использование MySQL</h4>
<p>Если вы хотите использовать <strong>MySQL</strong> для хранения данных <strong>Trac</strong>, то вам надо установить <strong>MySQL-python</strong> драйвер. Если вам не надо, то можете использовать <strong>SQLite</strong> и пропустить установку <strong>MySQL-python</strong>, которую я опишу далее.</p>
<p>Для этого надо установить драйвер <noindex><a rel="nofollow" href="http://sourceforge.net/projects/mysql-python/" >MySQL-python</a></noindex>.</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /tmp</span><br />
<span style="color: #666666; font-style: italic;"># fetch http://downloads.sourceforge.net/sourceforge/mysql-python/MySQL-python-1.2.2.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># tar -xvf MySQL-python-1.2.2.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># cd MySQL-python-1.2.2</span><br />
<span style="color: #666666; font-style: italic;"># python setup.py build</span><br />
<span style="color: #666666; font-style: italic;"># python setup.py install</span></div></td></tr></tbody></table></div>
<p>Если вы используете <strong>Apache</strong>, то перезагрузите его, дабы достучатся до <strong>mod_python</strong>.</p>
<p>Теперь создадим базу данных и пользователя для <strong>Trac</strong>:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> trac <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">CHARACTER</span> <span style="color: #993333; font-weight: bold;">SET</span> utf8 <span style="color: #993333; font-weight: bold;">COLLATE</span> utf8_bin; <br />
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">USER</span> tracuser <span style="color: #993333; font-weight: bold;">IDENTIFIED</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">'password'</span>;<br />
<span style="color: #993333; font-weight: bold;">GRANT</span> <span style="color: #993333; font-weight: bold;">ALL</span> <span style="color: #993333; font-weight: bold;">ON</span> trac<span style="color: #66cc66;">.*</span> <span style="color: #993333; font-weight: bold;">TO</span> tracuser;<br />
<span style="color: #993333; font-weight: bold;">FLUSH</span> PRIVILEGES;</div></div>
<p>Не забудьте заменить пароль в запросе на придуманный вами.</p>
<h4>Установка Subversion с поддержкой Python</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/devel/subversion </span><br />
<span style="color: #666666; font-style: italic;"># make WITH_PYTHON=true WITH_BERKELEYDB=db42 WITH_MOD_DAV_SVN= install</span></div></div>
<p>Более подробно о ключах: <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/TracFaq#i-am-getting-svn-import-errors-with-trac-what-s-going-on" >http://trac.edgewall.org/wiki/TracFaq</a></noindex></p>
<h4>Установка py-subversion</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /usr/ports/devel/py-subversion </span><br />
<span style="color: #666666; font-style: italic;"># make FORCE_PKG_REGISTER= install clean</span></div></div>
<p>Более подробно о ключе: <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/TracSubversion#unsupported-vcs" >http://trac.edgewall.org/wiki/TracSubversion</a></noindex></p>
<h4>Настройка Apache</h4>
<p>Отредактируем конфиг Apache и добавим новый виртуальный хост:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;VirtualHost *:80&gt;<br />
&nbsp; &nbsp; DocumentRoot &quot;/home/trac&quot;<br />
&nbsp; &nbsp; ServerName trac.example.com<br />
&nbsp; &nbsp; &lt;Location /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHandler mod_python<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonInterpreter main_interpreter<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonHandler trac.web.modpython_frontend<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonOption TracEnv /home/trac/example.com<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonOption TracUriRoot /<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; AuthType Basic<br />
&nbsp; &nbsp; &nbsp; &nbsp; AuthName &quot;Trac Server&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; AuthUserFile /home/trac/example.com/.htpasswd<br />
&nbsp; &nbsp; &nbsp; &nbsp; Require valid-user<br />
&nbsp; &nbsp; &lt;/Location&gt;<br />
&lt;/VirtualHost&gt;</div></td></tr></tbody></table></div>
<p>Я делаю с обязательной авторизацией на <strong>Trac</strong>, дабы сторонние пользователи не заходили. Если вы хотите чтобы <strong>Trac</strong> был открыт на всеобщее обозрение, то можно эту часть:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">AuthType Basic<br />
AuthName &quot;Trac Server&quot;<br />
AuthUserFile /home/trac/example.com/.htpasswd<br />
Require valid-user</div></div>
<p>Вынести в отдельный &lt;Location&gt;, например вот так получится в результате:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;VirtualHost *:80&gt;<br />
&nbsp; &nbsp; DocumentRoot &quot;/home/trac&quot;<br />
&nbsp; &nbsp; ServerName trac.example.com<br />
&nbsp; &nbsp; &lt;Location /&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; SetHandler mod_python<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonInterpreter main_interpreter<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonHandler trac.web.modpython_frontend<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonOption TracEnv /home/trac/example.com<br />
&nbsp; &nbsp; &nbsp; &nbsp; PythonOption TracUriRoot /<br />
&nbsp; &nbsp; &lt;/Location&gt;<br />
&nbsp; &nbsp; &lt;Location /login&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; AuthType Basic<br />
&nbsp; &nbsp; &nbsp; &nbsp; AuthName &quot;Trac Server&quot;<br />
&nbsp; &nbsp; &nbsp; &nbsp; AuthUserFile /home/trac/example.com/.htpasswd<br />
&nbsp; &nbsp; &nbsp; &nbsp; Require valid-user<br />
&nbsp; &nbsp; &lt;/Location&gt;<br />
&lt;/VirtualHost&gt;</div></td></tr></tbody></table></div>
<p>Также, я использую пароли от <strong>Subversion</strong> для авторизации, если посмотрите статью <a href="http://adw0rd.ru/2009/freebsd-subversion/" >FreeBSD. Установка и настройка Subversion</a>, то у нас был путь &laquo;/home/svn/svn-auth-file&raquo;, вот его и будем использовать в качестве <strong>AuthUserFile</strong>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
AuthUserFile /home/svn/svn-auth-file<br />
...</div></div>
<h3>Настройка Trac</h3>
<p>Для начала нам надо создать trac-проект и настроить его.</p>
<h4>Создание trac-проекта</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span>trac-admin <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>trac<span style="color: #000000; font-weight: bold;">/</span>example.com initenv</div></div>
<p><strong>initenv</strong> — создание и использование интерактивного режима</p>
<p>Более подробно о командах trac-admin: <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/TracAdmin" >http://trac.edgewall.org/wiki/TracAdmin</a></noindex></p>
<p>Далее, укажите имя проекта и адрес для соединения с <strong>MySQL</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql://tracuser:password@localhost:3306/trac</div></div>
<p>Тип используемого сервера контроля версия &laquo;svn&raquo; и путь до svn-репозитория вашего проекта</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">/home/svn/repos/example.com</div></div>
<p>Подробнее <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/TracEnvironment" >http://trac.edgewall.org/wiki/TracEnvironment</a></noindex></p>
<h4>Настройка trac-проекта</h4>
<p>Отредактируйте файл &laquo;/home/trac/example.com/conf/trac.ini&raquo; и измените следующие директивы:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">default_charset = utf-8<br />
base_url = http://trac.example.com</div></div>
<p>В конце файла добавляем активацию плагина &laquo;webadmin&raquo;:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[components]<br />
webadmin.* = enabled</div></div>
<p>Подробнее по всем директивам <noindex><a rel="nofollow" href="http://trac.edgewall.org/wiki/TracIni" >http://trac.edgewall.org/wiki/TracIni</a></noindex></p>
<blockquote class="info">
<p>
Если вы заходите на адрес &laquo;trac.example.com&raquo; и видите:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Permission denied: '/home/trac/example.com/.egg-cache'</div></div>
<p>то, настройте права на запись для каталога trac-проекта.
</p>
</blockquote>
<h4>Назначаем права администратора одному из пользователей</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span>trac-admin <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>trac<span style="color: #000000; font-weight: bold;">/</span>example.com permission add имя_пользователя TRAC_ADMIN</div></div>
<h4>Синхронизацию trac-проекта с svn-проектом</h4>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span>trac-admin <span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>trac<span style="color: #000000; font-weight: bold;">/</span>example.com resync</div></div>
<h3>Автоматическое оповещения svn-изменений для trac-тикетов</h3>
<p>И на последок, если вы используете <noindex><a href="/tag/hooks/">svn-хуки</a>, как я уже описывал в статье <a href="http://adw0rd.ru/2009/subversion-hooks/" >Subversion. Автоматическое обновление проекта при помощи хуков</a></noindex>, то добавьте эти строки в <strong>post-commit</strong> для оповещения <strong>trac-тикетов</strong>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">TRAC_ENV=&quot;/home/trac/example.com&quot;<br />
/usr/bin/python /usr/local/bin/trac-post-commit-hook -p &quot;$TRAC_ENV&quot; -r &quot;$REV&quot;</div></div>
<h3>Резюме</h3>
<p>Вот и все, <strong>Trac</strong> установлен и настроен для комфортной работы, в последующих статьях буду рассказывать как настроить <strong>Mylyn</strong>, что бы непосредственно из <strong>IDE</strong> работать с <strong>Trac</strong> и управлять всеми подпроектами и тикетами!</p>
<p>Если есть вопросы, то добро пожаловать в комментарии!</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/trac-freebsd/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>Восстановление структуры таблиц InnoDB</title>
		<link>http://adw0rd.ru/2009/recovery-innodb/</link>
		<comments>http://adw0rd.ru/2009/recovery-innodb/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 09:17:41 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3774</guid>
		<description><![CDATA[Бывает, что при перемещении базы sql-дамп не получается создать и остаются только файлы &#171;*.frm&#187;, вы их заливаете в каталог &#171;/var/db/mysql&#187; и в надежде что заработают innodb-таблицы приходите в отчаянье, потому что они не работают... Например при mysqldump, может выпасть ошибка: Got error: 1146: Table `table_name` doesn&#39;t exist when using LOCK TABLES Вам поможет этот хитрый [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/recovery-innodb-table/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/05/mysql-logo.png" alt="mysql-logo" title="mysql-logo" width="200" height="103" class="alignright size-full wp-image-2595" /></a></p>
<p>Бывает, что при перемещении базы sql-дамп не получается создать и остаются только файлы &laquo;*.frm&raquo;, вы их заливаете в каталог &laquo;/var/db/mysql&raquo; и в надежде что заработают <strong>innodb</strong>-таблицы приходите в отчаянье, потому что они не работают...</p>
<p>Например при <strong>mysqldump</strong>, может выпасть ошибка:</p>
<blockquote>
<p>Got error: 1146: Table `table_name` doesn&#39;t exist when using LOCK TABLES</p>
</blockquote>
<h3>Вам поможет этот хитрый трюк</h3>
<p>Создаёте базу данных &laquo;my_test&raquo;:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">DATABASE</span> my_test;<br />
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">USE</span> my_test;</div></div>
<p>после чего, создаёте там соответствующую названию файлу &laquo;table_name.frm&raquo; пустую таблицу:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`table_name`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span> <span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>Innodb;</div></div>
<p>после, замените созданный вами файл в тестовой таблице &laquo;my_test&raquo; исходным файлом таблицы:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cp <span style="color: #66cc66;">/</span>var<span style="color: #66cc66;">/</span>db<span style="color: #66cc66;">/</span>mysql<span style="color: #66cc66;">/</span>database_name<span style="color: #66cc66;">/</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span><span style="color: #66cc66;">.</span>frm <span style="color: #66cc66;">/</span>var<span style="color: #66cc66;">/</span>db<span style="color: #66cc66;">/</span>mysql<span style="color: #66cc66;">/</span>my_test<span style="color: #66cc66;">/</span><span style="color: #993333; font-weight: bold;">TABLE_NAME</span><span style="color: #66cc66;">.</span>frm</div></div>
<p>А теперь посмотрим структуру нашей таблицы:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">USE</span> my_test;<br />
mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SHOW</span> <span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">TABLE_NAME</span>;</div></div>
<p>и вы увидите структуру, а дальше можете делать дамп или что вы там делали!</p>
<p>Также вы можете перенести все ваши побитые таблицы и переименовать базу в прежнее имя (удалив при этом старую естественно).</p>
<p><strong>З.Ы.</strong> Почитайте полезную статью <noindex><a rel="nofollow" href="http://epsyl.ru/web/innodb-mysql-data-recovery/" >Восстановление данных InnoDB в MySQL</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/recovery-innodb/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sphinx и MySQL. Установка и использование движка SphinxSE</title>
		<link>http://adw0rd.ru/2009/mysql-sphinxse/</link>
		<comments>http://adw0rd.ru/2009/mysql-sphinxse/#comments</comments>
		<pubDate>Fri, 26 Jun 2009 13:27:41 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Операционные системы]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Sphinx]]></category>
		<category><![CDATA[Поисковые системы]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3341</guid>
		<description><![CDATA[В продолжение темы о Sphinx, расскажу о SphinxSE, это движок для MySQL, который будет работать со Sphinx индексами непосредственно из MySQL. Что такое SphinxSE? Движок SphinxSE не хранит данные сам, а является звеном, которое позволяет серверу MySQL общаться с &#171;searchd&#187;, запускать поисковые запросы и получать результаты поиска. Вся индексация и поиск происходит за пределами MySQL. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/mysql-sphinxse/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/mysql-sphinxse.png" alt="mysql-sphinxse" title="mysql-sphinxse" width="320" height="121" class="alignright size-full wp-image-3716" /></a></p>
<p>В <a href="http://adw0rd.ru/2009/sphinxsearch/" >продолжение темы о Sphinx</a>, расскажу о <noindex><a rel="nofollow" href="http://www.sphinxsearch.com/docs/current.html#sphinxse" >SphinxSE</a></noindex>, это движок для <strong>MySQL</strong>, который будет работать со <strong>Sphinx</strong> индексами непосредственно из <strong>MySQL</strong>.</p>
<h3>Что такое SphinxSE?</h3>
<p>Движок SphinxSE не хранит данные сам, а является звеном, которое позволяет серверу MySQL общаться с &laquo;searchd&raquo;, запускать поисковые запросы и получать результаты поиска. Вся индексация и поиск происходит за пределами MySQL.</p>
<p>SphinxSE может быть собран только под <strong>MySQL 5.x</strong> используя архитектуру плагинов, которая не поддерживается в <strong>MySQL 4.x</strong>.</p>
<h4>SphinxSE позволяет:</h4>
<ul>
<li>Легко портировать MySQL FTS (full-text search) приложения в Sphinx;</li>
<li>Использовать Sphinx, где невозможно использовать API, например если нет API для какого-то языка;</li>
<li>Оптимизировать добавленные Sphinx&#39;ом результаты обработки на стороне MySQL, например: JOIN&#39;ить результаты поиска с другими таблицами MySQL, добавлять дополнительную фильтрацию данных на стороне MySQL и т.д.</li>
</ul>
<h3>Установка SphinxSE</h3>
<p>Ставить будем из сорцов и на <strong>FreeBSD 6.3</strong>.</p>
<p>Сначала скачаем дистрибутивы:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># fetch http://www.sphinxsearch.com/downloads/sphinx-0.9.8.1.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># fetch http://downloads.mysql.com/archives/mysql-5.1/mysql-5.1.34.tar.gz</span></div></div>
<blockquote class="download">
<p>
<strong>Скачать MySQL</strong>: <noindex><a rel="nofollow" href="http://downloads.mysql.com/archives.php?p=mysql-5.1&#038;o=other" >http://downloads.mysql.com/archives.php?p=mysql-5.1&#038;o=other</a></noindex><br />
<strong>Скачать Sphinx</strong>: <noindex><a rel="nofollow" href="http://www.sphinxsearch.com/downloads.html" >http://www.sphinxsearch.com/downloads.html</a></noindex>
</p>
</blockquote>
<blockquote class="info">
<p>
Обратите внимание, в download-листе <strong>Sphinx</strong> есть пункт <strong>&laquo;MySQL 5.0.45 with SphinxSE 0.9.8&raquo;</strong> и из ссылки <strong>&laquo;mysql-5.0.45-sphinxse-0.9.8-win32.zip&raquo;</strong> следует что это только для <strong>Win32</strong>.
</p>
</blockquote>
<p>Теперь, разархивируем:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># tar -xzf mysql-5.1.34.tar.gz</span><br />
<span style="color: #666666; font-style: italic;"># tar -xzf sphinx-0.9.8.1.tar.gz</span></div></div>
<p>Скопируем сорцы <strong>SphinxSE</strong> в каталог распакованного нами <strong>MySQL</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span><span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-R</span> sphinx-0.9.8.1<span style="color: #000000; font-weight: bold;">/</span>mysqlse mysql-5.1.34<span style="color: #000000; font-weight: bold;">/</span>storage<span style="color: #000000; font-weight: bold;">/</span>sphinx</div></div>
<p>Запускаем &laquo;autorun.sh&raquo; для пересборки сорцов:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd mysql-5.1.34</span><br />
<span style="color: #666666; font-style: italic;"># sh BUILD/autorun.sh</span></div></div>
<p>Установим дополнительные движки, в том числе и <strong>Sphinx</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># ./configure --with-plugins=sphinx,innobase,archive,blackhole</span><br />
<span style="color: #666666; font-style: italic;"># make &amp;&amp; make install</span></div></div>
<p><span id="more-3341"></span></p>
<p>Запускаем <strong>MySQL</strong>:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666;"># </span><span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>rc.d<span style="color: #000000; font-weight: bold;">/</span>mysql-server start</div></div>
<p>Войдем в <strong>MySQL-консоль</strong> и посмотрим какие есть у нас движки:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SHOW</span> engines;<br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------------+---------+----------------------------------------------------------------+--------------+------+------------+</span><br />
<span style="color: #66cc66;">|</span> Engine &nbsp; &nbsp; <span style="color: #66cc66;">|</span> Support <span style="color: #66cc66;">|</span> Comment &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> Transactions <span style="color: #66cc66;">|</span> XA &nbsp; <span style="color: #66cc66;">|</span> Savepoints <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------------+---------+----------------------------------------------------------------+--------------+------+------------+</span><br />
<span style="color: #66cc66;">|</span> MEMORY &nbsp; &nbsp; <span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; <span style="color: #66cc66;">|</span> Hash based<span style="color: #66cc66;">,</span> stored <span style="color: #993333; font-weight: bold;">IN</span> memory<span style="color: #66cc66;">,</span> useful <span style="color: #993333; font-weight: bold;">FOR</span> <span style="color: #993333; font-weight: bold;">TEMPORARY</span> <span style="color: #993333; font-weight: bold;">TABLES</span> &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> CSV &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; <span style="color: #66cc66;">|</span> CSV storage engine &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> MRG_MYISAM <span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; <span style="color: #66cc66;">|</span> Collection <span style="color: #993333; font-weight: bold;">OF</span> identical MyISAM <span style="color: #993333; font-weight: bold;">TABLES</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> BLACKHOLE &nbsp;<span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; <span style="color: #66cc66;">|</span> <span style="color: #66cc66;">/</span>dev<span style="color: #66cc66;">/</span><span style="color: #993333; font-weight: bold;">NULL</span> storage engine <span style="color: #66cc66;">&#40;</span>anything you <span style="color: #993333; font-weight: bold;">WRITE</span> <span style="color: #993333; font-weight: bold;">TO</span> it disappears<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> InnoDB &nbsp; &nbsp; <span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; <span style="color: #66cc66;">|</span> Supports transactions<span style="color: #66cc66;">,</span> row<span style="color: #66cc66;">-</span>level locking<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEYS</span> &nbsp; &nbsp; <span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> YES &nbsp;<span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> SPHINX &nbsp; &nbsp; <span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; <span style="color: #66cc66;">|</span> Sphinx storage engine 0<span style="color: #66cc66;">.</span>9<span style="color: #66cc66;">.</span>8 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> MyISAM &nbsp; &nbsp; <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> engine <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">OF</span> MySQL <span style="color: #cc66cc;">3.23</span> <span style="color: #993333; font-weight: bold;">WITH</span> great performance &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> ARCHIVE &nbsp; &nbsp;<span style="color: #66cc66;">|</span> YES &nbsp; &nbsp; <span style="color: #66cc66;">|</span> Archive storage engine &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; <span style="color: #66cc66;">|</span> NO &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------------+---------+----------------------------------------------------------------+--------------+------+------------+</span></div></div>
<p>Движок мы установили, теперь попробуем его использовать!</p>
<h3>Использование SphinxSE</h3>
<p>Для примера продолжим работать с индексом &laquo;adw0rd_wp&raquo;, который мы создали в <a href="http://adw0rd.ru/2009/sphinxsearch/" >прошлой статье про Sphinx</a>.</p>
<p>Для начала создадим таблицу:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #ff0000;">`test_sphinx`</span><br />
<span style="color: #66cc66;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #ff0000;">`id`</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #ff0000;">`weight`</span> &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #ff0000;">`query`</span> &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3072</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #ff0000;">`group_id`</span> &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INTEGER</span><span style="color: #66cc66;">,</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">INDEX</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`query`</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span> ENGINE<span style="color: #66cc66;">=</span>SPHINX CONNECTION<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;sphinx://localhost:3312/adw0rd_wp&quot;</span>;</div></div>
<p>Теперь проверим выборку по индексу &laquo;adw0rd_wp&raquo;:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`test_sphinx`</span> <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`query`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'sphinx'</span>;<br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------+--------+--------+----------+</span><br />
<span style="color: #66cc66;">|</span> id &nbsp; <span style="color: #66cc66;">|</span> weight <span style="color: #66cc66;">|</span> query &nbsp;<span style="color: #66cc66;">|</span> group_id <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------+--------+--------+----------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">3366</span> <span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">2</span> <span style="color: #66cc66;">|</span> sphinx <span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">3341</span> <span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> sphinx <span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">3368</span> <span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">1</span> <span style="color: #66cc66;">|</span> sphinx <span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------+--------+--------+----------+</span><br />
<span style="color: #cc66cc;">3</span> <span style="color: #993333; font-weight: bold;">ROWS</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.12</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>Где, в &laquo;query&raquo; можно написать искомую фразу, а так же дополнительные параметры поиска, например &laquo;mode&raquo;, &laquo;sort&raquo; или указать индексы:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">...</span> <span style="color: #993333; font-weight: bold;">WHERE</span> query<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'test;mode=any'</span>;<br />
<span style="color: #66cc66;">...</span> <span style="color: #993333; font-weight: bold;">WHERE</span> query<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'test;sort=attr_asc:group_id'</span>;<br />
<span style="color: #66cc66;">...</span> <span style="color: #993333; font-weight: bold;">WHERE</span> query<span style="color: #66cc66;">=</span><span style="color: #ff0000;">'test;index=test1,test2,test3;'</span>;</div></div>
<p>Результаты сопоставимы с предыдущим поиском через API: <a href="http://demo.adw0rd.ru/sphinxsearch/?s=sphinx" >http://demo.adw0rd.ru/sphinxsearch/?s=sphinx</a>. Более подробно по использованию <strong>SphinxSE</strong> тут: <noindex><a rel="nofollow" href="http://www.sphinxsearch.com/docs/current.html#sphinxse-using" >http://www.sphinxsearch.com/docs/current.html#sphinxse-using</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/mysql-sphinxse/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Subversion. Автоматическое обновление проекта при помощи хуков</title>
		<link>http://adw0rd.ru/2009/subversion-hooks/</link>
		<comments>http://adw0rd.ru/2009/subversion-hooks/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 00:54:04 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[Hooks]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Svn]]></category>
		<category><![CDATA[Триггеры]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3593</guid>
		<description><![CDATA[В большинстве случаев, при разработке веб-проекта требуется автоматически обновлять рабочую версию, на помощь на приходят свн-хуки! Начнем с того, что у нас есть веб-проект и нам необходимо создать для него репозиторий, как это сделать я рассказывал в статье &#171;FreeBSD. Установка и настройка Subversion&#187;. Далее, мы будем обновлять наш проект только через репозиторий! Подготовка проекта Сначала [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/subversion-hooks/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/subversion-hooks.png" alt="subversion-hooks" title="subversion-hooks" width="302" height="76" class="alignright size-full wp-image-3600" /></a></p>
<p>В большинстве случаев, при разработке веб-проекта требуется автоматически обновлять рабочую версию, на помощь на приходят свн-хуки!</p>
<p>Начнем с того, что у нас есть веб-проект и нам необходимо создать для него репозиторий, как это сделать я рассказывал в статье &laquo;<a href="http://adw0rd.ru/2009/freebsd-subversion/" >FreeBSD. Установка и настройка Subversion</a>&raquo;.</p>
<p>Далее, мы будем обновлять наш проект только через репозиторий!</p>
<h3>Подготовка проекта</h3>
<p>Сначала сделаем импорт веб-проекта в репозиторий:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># svn import /_project_ file:///svn/repos/_project_</div></div>
<p>Теперь удалим все файлы проекта (<strong>не забывайте делать бекапы</strong> на всякий случай), и сделаем чекаут:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># cd /_project<br />
# rm -rf *<br />
# svn checkout file:///svn/repos/_project_</div></div>
<h3>Hooks</h3>
<p>Хуки срабатывают на разные события <strong>Subversion</strong>, вот некоторые из них:</p>
<ul>
<li><strong>start-commit</strong>&nbsp;&mdash; запускается до начала транзакции, может быть использован для проверки прав.</li>
<li><strong>pre-commit</strong>&nbsp;&mdash; запускается в конце транзакции, но до commit, часто используется для валидации данных, например для проверки не пустых лог-собщений.</li>
<li><strong>post-commit</strong>&nbsp;&mdash; запускается после транзакции, может быть использовано для отправки e-mail или для резервирования хранилища.</li>
<li><strong>pre-revprop-change</strong>&nbsp;&mdash; запускается до изменений в ревизии, могут быть использованы для проверки доступа.</li>
<li><strong>post-revprop-change</strong>&nbsp;&mdash; запускается после изменений в ревизии, могут быть использованы для отправки e-mail или для резервирования изменений.</li>
</ul>
<p>Есть еще &laquo;post-lock&raquo;, &laquo;post-unlock&raquo;, &laquo;pre-lock&raquo; и &laquo;pre-unlock&raquo;, как видно из названий он срабатывают при блокировке. Я не буду их разбирать, потомучто они у меня интереса пока не вызвали.</p>
<p><span id="more-3593"></span></p>
<h3>Post-Commit Hook</h3>
<p>Этот хук срабатывает после любого <strong>commit&#39;a</strong> репозитория, для его активации надо скопировать шаблон и наделить правами на запуск:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;"># cd /svn/repos/_project_/hooks</span><br />
<span style="color: #666666; font-style: italic;"># cp post-commit.tmpl post-commit</span><br />
<span style="color: #666666; font-style: italic;"># chmod u+x post-commit</span></div></div>
<p>Далее, отредактируем файл <strong>post-commit</strong>, закомментируем все лишнее и добавим наши команды для обновления проекта:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">cd /_project_ &amp;&amp; /usr/local/bin/svn update</div></div>
<p>Примерного такой вид в результате будет иметь содержимое ваше хука:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#!/bin/sh<br />
<br />
#<br />
# ... тут куча комментариев ...<br />
#<br />
<br />
REPOS=&quot;$1&quot;<br />
REV=&quot;$2&quot;<br />
<br />
cd /_project_ &amp;&amp; /usr/local/bin/svn update<br />
<br />
#commit-email.pl &quot;$REPOS&quot; &quot;$REV&quot; commit-watchers@example.org<br />
#log-commit.py --repository &quot;$REPOS&quot; --revision &quot;$REV&quot;</div></div>
<p>далее, проверим работает ли хук от имени под которым запущен <strong>Subversion</strong> и выполним его:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># su www<br />
# ./post-commit</div></div>
<p>Если ответ примерно такой:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">At revision тут_номер_ревизии</div></div>
<p>то все в порядке!</p>
<p>А если нет, то у вас ошибка в хуке, пишите в комментарии&nbsp;&mdash; помогу.</p>
<p>Собственно хук готов, теперь его необходимо проверить, сделайте <strong>commit</strong> и посмотрите, обновился ли ваш проект&nbsp;&mdash; если нет, то скорее всего проблемы с правами на запись файлов вашего проекта.</p>
<p>Необходимо разрешить права на запись файлов веб-проекта пользователю/группе от которой запущен <strong>subversion</strong>, скорее всего это <strong>www</strong>.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># cd /_project<br />
# chown -R www:www *<br />
# chown -R www:www .*<br />
# chmod -R 775 *<br />
# chmod -R 775 .svn</div></div>
<p><strong>P.S.</strong> Спасибо <noindex><a rel="nofollow" href="http://clear.helldude.ru/" >дуду</a></noindex> за помощь в тестировании хук :)</p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/subversion-hooks/feed/</wfw:commentRss>
		<slash:comments>142</slash:comments>
		</item>
		<item>
		<title>MySQL Event Scheduler или встроенный диспетчер событий в MySQL</title>
		<link>http://adw0rd.ru/2009/mysql-event-sheduler/</link>
		<comments>http://adw0rd.ru/2009/mysql-event-sheduler/#comments</comments>
		<pubDate>Fri, 12 Jun 2009 01:15:43 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[cron]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=3038</guid>
		<description><![CDATA[В MySQL 5.1 появился свой планировщик задач! Ранее, мне и многим другим разработчикам приходилось использовать cron для таких целей, как &#171;подчистка устаревшей информации&#187; или &#171;пересчет счетчиков&#187; в базе данных и т.д. Включение планировщика Планировщик по умолчанию выключен, для того чтобы его включить надо добавить в my.ini или в my.cnf [mysqld] event_scheduler = on Так же [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/mysql-event-sheduler/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/mysql-crontab2.png" alt="mysql-crontab" title="mysql-crontab" width="257" height="132" class="alignright size-full wp-image-3252" /></a></p>
<p>В <strong>MySQL 5.1</strong> появился свой <b>планировщик задач</b>! Ранее, мне и многим другим разработчикам приходилось использовать <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/cron" >cron</a></noindex> для таких целей, как &laquo;подчистка устаревшей информации&raquo; или &laquo;пересчет счетчиков&raquo; в базе данных и т.д.</p>
<h3>Включение планировщика</h3>
<p>Планировщик по умолчанию выключен, для того чтобы его включить надо добавить в <strong>my.ini</strong> или в <strong>my.cnf</strong></p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">[mysqld]<br />
event_scheduler = on</div></div>
<p>Так же вы можете для конкретной сессии запустить планировщик в mysql-консоле</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SET</span> global event_scheduler <span style="color: #66cc66;">=</span> <span style="color: #993333; font-weight: bold;">ON</span>;</div></div>
<p>Для проверки, работает ли планировщик, выполните запрос:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql&gt; show variables like 'event_scheduler';<br />
+-----------------+-------+<br />
| Variable_name &nbsp; | Value |<br />
+-----------------+-------+<br />
| event_scheduler | ON &nbsp; &nbsp;|<br />
+-----------------+-------+<br />
1 row in set (0.00 sec)</div></div>
<p>Официальное руководство по <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/events-configuration.html" >настройке</a></noindex>.</p>
<h3>Создание задания</h3>
<p>Синтаксис достаточно прост, при создании задания необходимо обязательно указать:</p>
<ul>
<li>Имя задания (event_name)</li>
<li>Интервал или точное время (schedule и interval)</li>
<li>SQL-запрос для выполнения (sql_statement)</li>
</ul>
<p><span id="more-3038"></span></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>DEFINER <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #993333; font-weight: bold;">USER</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">CURRENT_USER</span> <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; EVENT<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; event_name<br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> SCHEDULE schedule<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">ON</span> COMPLETION <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">NOT</span><span style="color: #66cc66;">&#93;</span> PRESERVE<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>ENABLE <span style="color: #66cc66;">|</span> DISABLE <span style="color: #66cc66;">|</span> DISABLE <span style="color: #993333; font-weight: bold;">ON</span> SLAVE<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>COMMENT <span style="color: #ff0000;">'comment'</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; DO sql_statement;<br />
<br />
schedule:<br />
&nbsp; &nbsp; AT <span style="color: #993333; font-weight: bold;">TIMESTAMP</span> <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">+</span> <span style="color: #993333; font-weight: bold;">INTERVAL</span> <span style="color: #993333; font-weight: bold;">INTERVAL</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">...</span><br />
&nbsp; <span style="color: #66cc66;">|</span> EVERY <span style="color: #993333; font-weight: bold;">INTERVAL</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>STARTS <span style="color: #993333; font-weight: bold;">TIMESTAMP</span> <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">+</span> <span style="color: #993333; font-weight: bold;">INTERVAL</span> <span style="color: #993333; font-weight: bold;">INTERVAL</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>ENDS <span style="color: #993333; font-weight: bold;">TIMESTAMP</span> <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">+</span> <span style="color: #993333; font-weight: bold;">INTERVAL</span> <span style="color: #993333; font-weight: bold;">INTERVAL</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">...</span><span style="color: #66cc66;">&#93;</span><br />
<br />
<span style="color: #993333; font-weight: bold;">INTERVAL</span>:<br />
&nbsp; &nbsp; quantity <span style="color: #66cc66;">&#123;</span><span style="color: #993333; font-weight: bold;">YEAR</span> <span style="color: #66cc66;">|</span> QUARTER <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">MONTH</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">DAY</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">HOUR</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">MINUTE</span> <span style="color: #66cc66;">|</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WEEK <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">SECOND</span> <span style="color: #66cc66;">|</span> YEAR_MONTH <span style="color: #66cc66;">|</span> DAY_HOUR <span style="color: #66cc66;">|</span> DAY_MINUTE <span style="color: #66cc66;">|</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; DAY_SECOND <span style="color: #66cc66;">|</span> HOUR_MINUTE <span style="color: #66cc66;">|</span> HOUR_SECOND <span style="color: #66cc66;">|</span> MINUTE_SECOND<span style="color: #66cc66;">&#125;</span></div></div>
<p>Так же вы можете указать:</p>
<ul>
<li>DEFINER&nbsp;&mdash; имя пользователя, от кого запускать задание (с его правами соответственно)</li>
<li>COMMENT&nbsp;&mdash; комментарий</li>
<li>ON COMPLETION PRESERVE&nbsp;&mdash; задание после выполнения сохраняется</li>
<li>ON COMPLETION NOT PRESERVE&nbsp;&mdash; задание выполняется один раз, после чего уничтожается из списка заданий (по умолчанию)</li>
</ul>
<p><strong>Пример короткой записи:</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> EVENT <span style="color: #ff0000;">`myevent`</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> SCHEDULE<br />
&nbsp; &nbsp; &nbsp; AT <span style="color: #993333; font-weight: bold;">CURRENT_TIMESTAMP</span> <span style="color: #66cc66;">+</span> <span style="color: #993333; font-weight: bold;">INTERVAL</span> <span style="color: #cc66cc;">10</span> <span style="color: #993333; font-weight: bold;">MINUTE</span><br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> COMPLETION PRESERVE<br />
&nbsp; &nbsp; DO<br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">UPDATE</span> <span style="color: #ff0000;">`myschema`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`mytable`</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #ff0000;">`mycol`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">`mycol`</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1</span>;</div></div>
<p>Официальное руководство по <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/create-event.html" >CREATE EVENT</a></noindex></p>
<h3>Изменение задания</h3>
<p>При изменении, вы можете сменить владельца, переименовать название, изменить SQL-запрос и поменять другие свойства задания.</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">ALTER</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>DEFINER <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> <span style="color: #993333; font-weight: bold;">USER</span> <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">CURRENT_USER</span> <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; EVENT event_name<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">ON</span> SCHEDULE schedule<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">ON</span> COMPLETION <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">NOT</span><span style="color: #66cc66;">&#93;</span> PRESERVE<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">RENAME</span> <span style="color: #993333; font-weight: bold;">TO</span> new_event_name<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>ENABLE <span style="color: #66cc66;">|</span> DISABLE <span style="color: #66cc66;">|</span> DISABLE <span style="color: #993333; font-weight: bold;">ON</span> SLAVE<span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>COMMENT <span style="color: #ff0000;">'comment'</span><span style="color: #66cc66;">&#93;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>DO sql_statement<span style="color: #66cc66;">&#93;</span></div></div>
<p>Для отображения всех свойств задания используйте:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`INFORMATION_SCHEMA`</span><span style="color: #66cc66;">.</span><span style="color: #ff0000;">`EVENTS`</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`EVENT_NAME`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'myevent'</span> <span style="color: #993333; font-weight: bold;">AND</span> EVENT_SCHEMA <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'myschema'</span>\G</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">***************************</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">.</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #66cc66;">***************************</span><br />
&nbsp; &nbsp;EVENT_CATALOG: <span style="color: #993333; font-weight: bold;">NULL</span><br />
&nbsp; &nbsp; EVENT_SCHEMA: myschema<br />
&nbsp; &nbsp; &nbsp; EVENT_NAME: myevent<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;DEFINER: john@smith<br />
&nbsp; &nbsp; &nbsp; EVENT_BODY: <span style="color: #993333; font-weight: bold;">SQL</span><br />
EVENT_DEFINITION: <span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> myschema<span style="color: #66cc66;">.</span>mytable <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span>UNIX_TIMESTAMP<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; EVENT_TYPE: RECURRING<br />
&nbsp; &nbsp; &nbsp; EXECUTE_AT: <span style="color: #993333; font-weight: bold;">NULL</span><br />
&nbsp; INTERVAL_VALUE: <span style="color: #cc66cc;">5</span><br />
&nbsp; INTERVAL_FIELD: <span style="color: #993333; font-weight: bold;">SECOND</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; SQL_MODE: <span style="color: #993333; font-weight: bold;">NULL</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; STARTS: 0000<span style="color: #66cc66;">-</span>00<span style="color: #66cc66;">-</span>00 00:00:00<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ENDS: 0000<span style="color: #66cc66;">-</span>00<span style="color: #66cc66;">-</span>00 00:00:00<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">STATUS</span>: ENABLED<br />
&nbsp; &nbsp;ON_COMPLETION: <span style="color: #993333; font-weight: bold;">NOT</span> PRESERVE<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CREATED: <span style="color: #cc66cc;">2006</span><span style="color: #66cc66;">-</span>02<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">22</span>:<span style="color: #cc66cc;">36</span>:06<br />
&nbsp; &nbsp; LAST_ALTERED: <span style="color: #cc66cc;">2006</span><span style="color: #66cc66;">-</span>02<span style="color: #66cc66;">-</span>09 <span style="color: #cc66cc;">22</span>:<span style="color: #cc66cc;">36</span>:06<br />
&nbsp; &nbsp;LAST_EXECUTED: <span style="color: #993333; font-weight: bold;">NULL</span><br />
&nbsp; &nbsp;EVENT_COMMENT:<br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>Либо используйте:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SHOW</span> events <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">&quot;event_name%&quot;</span>\G</div></div>
<p>Официальное руководство по <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/alter-event.html" >ALTER EVENT</a></noindex></p>
<h3>Удаление задания</h3>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">DROP</span> EVENT <span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">EXISTS</span><span style="color: #66cc66;">&#93;</span> event_name</div></div>
<p>Официальное руководство по <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/drop-event.html" >DROP EVENT</a></noindex></p>
<h3>Диспетчер событий и привилегии в MySQL</h3>
<p>Официальное руководство по <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/events-privileges.html" >установке привелегий</a></noindex></p>
<h3>Примеры использования</h3>
<p><strong>Задача:</strong> Удаление не активированных учетных записей пользователей, которые не активировались в течении 3-х дней. Запускать событие необходимо каждый день.</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> EVENT <span style="color: #ff0000;">`not_active_users`</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> SCHEDULE<br />
&nbsp; &nbsp; &nbsp; EVERY <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">DAY</span><br />
&nbsp; &nbsp; DO<br />
&nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">DELETE</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`users`</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`active`</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'not'</span><span style="color: #66cc66;">,</span> UNIX_TIMESTAMP<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`date`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;=</span> UNIX_TIMESTAMP<span style="color: #66cc66;">&#40;</span>NOW<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">-</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">3</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">24</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">3600</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p><strong>Задача:</strong> А теперь сменим для задания <strong>&laquo;not_active_users&raquo;</strong> временной интервал.</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">ALTER</span> EVENT <span style="color: #ff0000;">`not_active_users`</span><br />
&nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> SCHEDULE<br />
&nbsp; &nbsp; &nbsp; EVERY <span style="color: #cc66cc;">12</span> <span style="color: #993333; font-weight: bold;">HOUR</span>;</div></div>
<p><strong>Задача:</strong> Удалить задание.</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">DROP</span> EVENT <span style="color: #ff0000;">`not_active_users`</span>;</div></div>
<p>Официальные страницы руководства: <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/events.html" >Using the Event Scheduler</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/mysql-event-sheduler/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Утилита mysqldump и шпаргалка по параметрам</title>
		<link>http://adw0rd.ru/2009/mysqldump-and-cheat-sheet/</link>
		<comments>http://adw0rd.ru/2009/mysqldump-and-cheat-sheet/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 06:25:48 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Инструменты]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MyISAM]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Бэкап]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=2441</guid>
		<description><![CDATA[Утилита mysqldump позволяет получить дамп содержимого базы данных или совокупности баз для создания резервной копии или пересылки данных на другой SQL-сервер (не обязательно MySQL-сервер). Дамп будет содержать набор команд SQL для создания и/или заполнения таблиц. Так же mysqldump имеет возможность развертывания баз данных из созданного sql-файла. Создание дампа Разберем пример простейшее использования, задампим базу данных [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://adw0rd.ru/2009/cheat-sheet-mysqldump/" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/mysql-dump.png" alt="mysql-dump" title="mysql-dump" width="208" height="155" class="alignright size-full wp-image-3355" /></a></p>
<p>Утилита <strong>mysqldump</strong> позволяет получить дамп содержимого базы данных или совокупности баз для создания резервной копии или пересылки данных на другой SQL-сервер (не обязательно MySQL-сервер). Дамп будет содержать набор команд SQL для создания и/или заполнения таблиц. </p>
<p>Так же <strong>mysqldump</strong> имеет возможность развертывания баз данных из созданного sql-файла.</p>
<h3>Создание дампа</h3>
<p>Разберем пример простейшее использования, задампим базу данных &laquo;database&raquo; при помощи перенаправления потока в файл &laquo;database.sql&raquo;:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysqldump <span style="color: #660033;">-uroot</span> -h82.82.82.82 <span style="color: #660033;">-p</span> database <span style="color: #000000; font-weight: bold;">&gt;</span> database.sql</div></div>
<p>где:</p>
<ul>
<li><strong>-u</strong> или <strong>-–user=...</strong>&nbsp;&mdash; имя пользователя</li>
<li><strong>-h</strong> или <strong>--host=...</strong>&nbsp;&mdash; удаленный хост (для локального хоста можно опустить этот параметр)</li>
<li><strong>-p</strong> или <strong>--password</strong>&nbsp;&mdash; запросить пароль</li>
<li><strong>database</strong>&nbsp;&mdash; имя базы данных</li>
<li><strong>database.sql</strong>&nbsp;&mdash; файл для дампа</li>
</ul>
<p><span id="more-2441"></span><br />
Для того чтобы сделать дамп несколько баз данных, необходимо использовать параметр <strong>--databases</strong> (или сокращенно <strong>-B</strong>), пример:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysqldump <span style="color: #660033;">-uroot</span> -h82.82.82.82 <span style="color: #660033;">-p</span> <span style="color: #660033;">-B</span> database1 database2 database3 <span style="color: #000000; font-weight: bold;">&gt;</span> databases.sql</div></div>
<p>А для того чтобы сделать дамп всех баз данных, необходимо использовать параметр <strong>--all-databases</strong> (или сокращенно <strong>-A</strong>), пример:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysqldump <span style="color: #660033;">-uroot</span> -h82.82.82.82 <span style="color: #660033;">-p</span> <span style="color: #660033;">-A</span> <span style="color: #000000; font-weight: bold;">&gt;</span> all-databases.sql</div></div>
<h3>Развертывание дампа</h3>
<p>Перенаправляем поток в обратную сторону и развертываем базу данных:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql <span style="color: #660033;">-uroot</span> -h82.82.82.82 <span style="color: #660033;">-p</span> database <span style="color: #000000; font-weight: bold;">&lt;</span> database.sql</div></div>
<p>Или через mysql-console:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #000000; font-weight: bold;">&gt;</span> use database;<br />
mysql<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #7a0874; font-weight: bold;">source</span> database.sql</div></div>
<p>Ну, а если у нас gz-архив к примеру, то:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">zcat</span> database.sql.gz <span style="color: #000000; font-weight: bold;">|</span> mysql <span style="color: #660033;">-uroot</span> -h82.82.82.82 <span style="color: #660033;">-p</span> database</div></div>
<h3>Пример использование некоторых параметров</h3>
<p>Например, нам нужны данные с &laquo;продакшен версии базы&raquo; для &laquo;версии разработчика&raquo;, то есть нам нужна &laquo;песочница&raquo;. Выбираем не более 100 записей:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysqldump -uroot -h82.82.82.82 -p --where=&quot;true limit 100&quot; database &gt; database.sql</div></div>
<p>Или нам нужна только структура, без данных:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysqldump -uroot -h82.82.82.82 -p --no-data database &gt; database.sql</div></div>
<p>Примеры навеяны постом Александра Макарова&nbsp;&mdash; <noindex><a rel="nofollow" href="http://rmcreative.ru/blog/post/ljogkiy-damp-mysql" >http://rmcreative.ru/blog/post/ljogkiy-damp-mysql</a></noindex></p>
<h3>Шпаргалка по параметрам</h3>
<p>Приведу некоторые параметры, которые могут понадобится при работе с утилитой <strong>mysqldump</strong>.</p>
<blockquote>
<dl>
<dt><b>--add-drop-database</b></dt>
<dd>Добавляет оператор <b>DROP DATABASE</b> перед каждым оператором <b>CREATE DATABASE</b>.</dd>
<dt><b>--add-drop-table</b></dt>
<dd>Добавляет оператор <b>DROP TABLE</b> перед каждым оператором <b>CREATE TABLE</b>.</dd>
<dt><b>--add-locks</b></dt>
<dd>Добавляет оператор <b>LOCK TABLES</b> перед выполнением и <b>UNLOCK TABLE</b> после выполнения каждого дампа таблицы (для ускорения доступа к MySQL).
</dd>
<dt><b>--all-databases, -A</b></dt>
<dd>Сохраняет все таблицы из всех баз данных, которые находятся под управлением текущего сервера.</dd>
<dt><b>--allow-keywords</b></dt>
<dd>Разрешить создавать имена столбцов, которые совпадают с ключевыми словами. Отсутствие конфликтов обеспечивается прибавлением имени таблицы в качестве префикса к имени каждого столбца.</dd>
<dt><b>--comments, -i</b></dt>
<dd>Данный параметр позволяет добавить в дамп дополнительную информацию, такую, как версия <strong>mysqldump</strong>, версия MySQL, имя хоста, на котором расположен сервер MySQL.</dd>
<dt><b>--compact</b></dt>
<dd>Данный параметр требует от <strong>mysqldump</strong> создать дамп, используя как можно более компактный формат. Параметр является противоположным <strong>--comments</strong>.</dd>
<dt><b>--compatible=name</b></dt>
<dd>Параметр генерирует вывод, который совместим с другими СУБД или более старыми версиями MySQL. Вместо ключевого слова <strong>name</strong> можно использовать: <em>&laquo;ansi&raquo;, &laquo;mysql323&raquo;, &laquo;mysql40&raquo;, &laquo;postgresql&raquo;, &laquo;oracle&raquo;, &laquo;mssql&raquo;, &laquo;db2&raquo;, &laquo;maxdb&raquo;, &laquo;no_key_options&raquo;, &laquo;no_table_options&raquo;, &laquo;no_field_options&raquo;</em>. Можно использовать несколько значений, разделив их запятыми.</dd>
<dt><b>--complete-insert, -c</b></dt>
<dd>Используется полная форма оператора <b>INSERT</b> (с именами столбцов).</dd>
<dt><b>--create-options</b></dt>
<dd>Добавляет дополнительную информацию в операторы <b>CREATE TABLE</b>. Это может быть тип таблицы, начальное значение <b>AUTO_INCREMENT</b> и другие параметры.</dd>
<dt><b>--databases, -B</b></dt>
<dd>Параметр позволяет указать имена нескольких баз данных, для которых необходимо создать дамп.</dd>
<dt><b>--delayed</b></dt>
<dd>Использовать команду <b>INSERT DELAYED</b> при вставке строк.</dd>
<dt><b>--delete-master-logs</b></dt>
<dd>На главном сервере репликации автоматически удаляются бинарные логи (logbin) после того, как дамп был успешно создан при помощи mysqldump. Этот параметр автоматически включает параметр &laquo;--master-data&raquo;.</dd>
<dt><b>--disable-keys, -K</b></dt>
<dd>Для каждой таблицы, окружает оператор <b>INSERT</b> выражениями <b>/*!40000 ALTER TABLE tbl_name DISABLE KEYS */;</b> и <b>/*!40000 ALTER TABLE tbl_name ENABLE KEYS */;</b> в выводе результата дампа. Это ускорит загрузку данных на сервер для таблиц типа <b>MyISAM</b>, так как индексы создаются после внесения всех данных.</dd>
<dt><b>--extended-insert, -e</b></dt>
<dd>Использовать команду <b>INSERT</b> с новым многострочным синтаксисом (повышает компактность и быстродействие операторов ввода).</dd>
<dt><b>--flush-logs, -F</b></dt>
<dd>Записать на диск данные системного журнала из буфера MySQL-сервера перед началом выполнения дампа.</dd>
<dt><b>--force, -f</b></dt>
<dd>Продолжать даже если в процессе создания дампа произошла ошибка.</dd>
<dt><b>--hex-blob</b></dt>
<dd>Параметр позволяет представить бинарные данные в полях типа <b>BINARY, VARBINARY, BLOB и BIT</b> в шестнадцатеричном формате. Так последовательность &laquo;abc&raquo; будет заменена на 0&times;616263.</dd>
<dt><b>--ignore-table=db_name.tbl_name</b></dt>
<dd>Позволяет игнорировать таблицу <b>tbl_name</b> базы данных <b>db_name</b> при создании дампа. Если из дампа необходимо исключить несколько таблиц, необходимо использовать несколько параметров &laquo;--ignore-table&raquo;, указывая по одной таблице в каждом из параметров.</dd>
<dt><b>--insert-ignore</b></dt>
<dd>Добавляет ключевое слово <b>IGNORE</b> в оператор <b>INSERT</b>.</dd>
<dt><b>--lock-all-tables, -x</b></dt>
<dd>Указание этого параметра приводит к блокировке всех таблиц во всех базах данных на время создания полного дампа всех баз данных.</dd>
<dt><b>--lock-tables, -l</b></dt>
<dd>Указание этого параметра приводит к блокировке таблиц базы данных, для которой создается дамп.</dd>
<dt><b>--no-autocommit</b></dt>
<dd>Включает все операторы <b>INSERT</b>, относящиеся к одной таблице, в одну транзакцию, что приводит к увеличению скорости загрузки данных.</dd>
<dt><b>--no-create-db, -n</b></dt>
<dd>Подавляет создание в дампе операторов <b>CREATE DATABASE</b>, которые автоматически добавляются при использовании параметров <b>--databases</b> и <b>--all-databases</b>.</dd>
<dt><b>--no-data, -d</b></dt>
<dd>Подавляет создание операторов <b>INSERT</b> в дампе, что может быть полезно при создании дампа структуры базы данных без самих данных.</dd>
<dt><b>--opt</b></dt>
<dd>Параметр предназначен для оптимизации скорости резервирования данных и является сокращением, включающим следующие опции: <b>--quick --add-drop-table --add-locks --create-options --disable-keys --extended-insert --lock-tables --set-charset</b>. Начиная с MySQL 4.1, параметр <b>--opt</b> используется по умолчанию, т.е. все вышеперечисленные параметры включаются по умолчанию, даже если они не указываются. Для того чтобы исключить такое поведение, необходимо воспользоваться параметров <b>--skip-opt</b></dd>
<dt><b>--order-by-primary</b></dt>
<dd>Указание параметра приводит к тому. что каждая таблица сортируется по первичному ключу или первому уникальному индексу.</dd>
<dt><b>--port, -P</b></dt>
<dd>Номер TCP порта, используемого для подключения к хосту.</dd>
<dt><b>--protocol={TCP|SOCKET|PIPE|MEMORY}</b></dt>
<dd>Параметр позволяет задать протокол подключения к серверу.</dd>
<dt><b>--quick, -q</b></dt>
<dd>Позволяет начать формирование дампа, не дожидаясь полной загрузки данных с сервера и экономя тем самым память.</dd>
<dt><b>--quote-names, -Q</b></dt>
<dd>Помещает имена баз данных, таблиц и столбцов в обратные апострофы <b>`</b>. Начиная с MySQL 4.1, данный параметр включен по умолчанию.</dd>
<dt><b>--replace</b></dt>
<dd>Добавляет ключевое слово <b>REPLACE</b> в оператор <b>INSERT</b>. Данный параметр впервые появился в MySQL 5.1.3.</dd>
<dt><b>--result-file=/path/to/file, -r /path/to/file</b></dt>
<dd>Параметр направляет дамп в файл <b>file</b>. Этот параметр особенно удобен в <b>Windows</b>, без использования командной строки. когда можно перенаправить результат в файл при помощи последовательностей <b>&gt;</b> и <b>&gt;&gt;</b>.</dd>
<dt><b>--routines, -R</b></dt>
<dd>Данный параметр создает дамп хранимых процедур и функций. Доступен с MySQL 5.1.2.</dd>
<dt><b>--single-transaction</b></dt>
<dd>Параметр создает дамп в виде одной транзакции.</dd>
<dt><b>--skip-comments</b></dt>
<dd>Данный параметр позволяет подавить вывод в дамп дополнительной информации.</dd>
<dt><b>--socket=/path/to/socket, -S /path/to/socket</b></dt>
<dd>Файл сокета для подсоединения к <b>localhost</b>.</dd>
<dt><b>--tab=/path/, -T /path/</b></dt>
<dd>При использовании этого параметра в каталоге <b>path</b> для каждой таблицы создаются два отдельных файла: <b>tbl_name.sql</b>, содержащий оператор <b>CREATE TABLE</b>, и <b>tbl_name.txt</b>, который содержит данные таблиц, разделенные символом табуляции. Формат данных может быть переопределен явно с помощью параметров <b>--fields-xxx и --lines-xxx</b>.</dd>
<dt><b>--tables</b></dt>
<dd>Перекрывает действия параметра <b>--databases (-B)</b>. Все аргументы, следующие за этим параметром, трактуются как имена таблиц.</dd>
<dt><b>--triggers</b></dt>
<dd>Создается дамп триггеров. Этот параметр включен по умолчанию. для его отключения следует использовать параметр <b>--skip-triggers</b>.</dd>
<dt><b>--tz-utc</b></dt>
<dd>при использовании данного параметра в дамп будет добавлен оператор вида <b>SET TIME_ZONE=&#39;+00:00&#39;</b>, который позволит обмениваться дампа в различных временных зонах.</dd>
<dt><b>--verbose, -v</b></dt>
<dd>Расширенный режим вывода. Вывод более детальной информации о работе программы.</dd>
<dt><b>--version, -V</b></dt>
<dd>Вывести информацию о версии программы.</dd>
<dt><b>--where=&#39;where-condition&#39;, -w &#39;where-condition&#39;</b></dt>
<dd>Выполнить дамп только выбранных записей. Обратите внимание, что кавычки обязательны.</dd>
<dt><b>--xml, -X</b></dt>
<dd>Представляет дамп базы данных в виде XML.</dd>
<dt><b>--first-slave, -x</b></dt>
<dd>Блокирует все таблицы во всех базах данных.</dd>
<dt><b>--debug=..., -#</b></dt>
<dd>Отслеживать прохождение программы (для отладки).</dd>
<dt><b>--help</b></dt>
<dd>Вывести справочную информацию и выйти из программы.</dd>
</dl>
</blockquote>
<h3>Еще пару слов о бекапе в MySQL</h3>
<h4>mysqlhotcopy для MyISAM</h4>
<p>Для быстрого резервирования БД с типом таблиц <strong>ISAM и MyISAM</strong> можно использовать <strong>&laquo;mysqlhotcopy&raquo;</strong>, которая скопирует файлы <strong>*.frm, *.MYD и *.MYI</strong>:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># mysqlhotcopy db_name /path/to/dir</div></div>
<p>Для <strong>InnoDB</strong> не подойдет данный способ, потомучто при этом типе не обязательно все файлы будут храниться в директории базы данных.</p>
<h4>xtrabackup для InnoDB</h4>
<p>Для <strong>InnoDB</strong> есть <noindex><a rel="nofollow" href="http://www.google.ru/search?q=site%3Amysqlperformanceblog.com+xtrabackup" >xtrabackup</a></noindex>, рекомендую посмотреть!<br />
<strong>UPD:</strong> <noindex><a rel="nofollow" href="http://highload.com.ua/index.php/2009/09/16/xtrabackup-%D1%80%D0%B5%D0%B7%D0%B5%D1%80%D0%B2%D0%BD%D0%BE%D0%B5-%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5-%D0%B4%D0%BB%D1%8F-innodb/" >XtraBackup&nbsp;&mdash; резервное копирование для innoDB</a></noindex></p>
<h4>Бин-лог и репликации</h4>
<p>Для репликации <strong>&laquo;mysqldump&raquo;</strong> не предназначена, для этого есть <strong>бин-лог</strong> (--log-bin):</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># mysqlbinlog binlog.[0-9]* | mysql</div></div>
<p>Для полной репликации необходимо вести бин-лог с самого начала работы БД, то есть еще до создания структур и данных.</p>
<p><a name="online-backup"></a></p>
<h4>Резервирование данныс в MySQL 6.x</h4>
<p>С версии MySQL 6.x доступен online-backup, вот слайд объясняющий нововведения:</p>
<p><a href="http://adw0rd.ru/wp-content/uploads/2009/06/online_backup.jpg" ><img src="http://adw0rd.ru/wp-content/uploads/2009/06/online_backup-300x222.jpg" alt="online_backup" title="online_backup" width="300" height="222" class="alignnone size-medium wp-image-3146" style="padding:3px; border: dotted #c4c4c4 2px;" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/mysqldump-and-cheat-sheet/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Работаем с XML данными и XPath в MySQL</title>
		<link>http://adw0rd.ru/2009/xpath-mysql/</link>
		<comments>http://adw0rd.ru/2009/xpath-mysql/#comments</comments>
		<pubDate>Mon, 13 Apr 2009 14:48:43 +0000</pubDate>
		<dc:creator>adw0rd</dc:creator>
				<category><![CDATA[Базы данных]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[XPath]]></category>

		<guid isPermaLink="false">http://adw0rd.ru/?p=2121</guid>
		<description><![CDATA[Как известно, в MySQL 5.1 внедрили функции для работы с XML, сегодня я расскажу про эти две функции более подробно, а так же вкратце опишу как работать с XPath в MySQL. Для работы с XML есть две функции: ExtractValue () &#8212; Позволяет выбирать записи средствами XPAth; UpdateXML ()&#160;&#8212; Возвращает измененный XML-фрагмент. Функция ExtractValue и XPath [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://adw0rd.ru/wp-content/uploads/2009/04/mysql-xpath.png" alt="mysql-xpath" title="mysql-xpath" width="223" height="167" class="alignright size-full wp-image-2169" /></p>
<p>Как известно, в <strong>MySQL 5.1</strong> внедрили <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html" >функции для работы с XML</a></noindex>, сегодня я расскажу про эти две функции более подробно, а так же вкратце опишу как работать с <strong>XPath в MySQL</strong>.</p>
<p><strong>Для работы с XML есть две функции:</strong></p>
<ol>
<li><strong>ExtractValue () </strong>&mdash; Позволяет выбирать записи средствами <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/XPath" >XPAth</a></noindex>;</li>
<li><strong>UpdateXML ()</strong>&nbsp;&mdash; Возвращает измененный XML-фрагмент.</li>
</ol>
<h3 style="color:#E97100;">Функция ExtractValue и XPath</h3>
<p>Синтаксис следующий:</p>
<blockquote>
<p>ExtractValue (xml_frag, xpath_expr)</p>
</blockquote>
<p>Для примеров, я буду работать с переменной, но с тем же успехом вы можете записать XML-фрагмент в любое поле с текстовым типом данных. XPath поддерживается на любом движке.</p>
<p><noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/set-option.html" >Создадим переменную</a></noindex> <strong>@xml</strong>:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SET</span> @xml <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'&lt;x id=&quot;xx&quot;&gt;&lt;y id=&quot;yy&quot;&gt;&lt;z id=&quot;zz&quot;&gt;test&lt;/z&gt;&lt;/y&gt;&lt;/x&gt;'</span>;</div></div>
<p>Выберем XML-фрагмент с помощью <strong>XPath</strong>:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> @xml<span style="color: #66cc66;">,</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//z'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------+</span><br />
<span style="color: #66cc66;">|</span> @xml &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//z'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>x id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;xx&quot;</span><span style="color: #66cc66;">&gt;&lt;</span>y id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;yy&quot;</span><span style="color: #66cc66;">&gt;&lt;</span>z id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;zz&quot;</span><span style="color: #66cc66;">&gt;</span>test<span style="color: #66cc66;">&lt;/</span>z<span style="color: #66cc66;">&gt;&lt;/</span>y<span style="color: #66cc66;">&gt;&lt;/</span>x<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">|</span> test &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>Как видно, мы выбрали содержимое ноды <strong>&lt;z&gt;</strong> -&gt; &laquo;test&raquo;.<br />
<span id="more-2121"></span></p>
<h4>Примеры:</h4>
<p>Немного ознакомимся с языком запросов <strong>XPath</strong> и приведу несколько примеров.</p>
<p>Создадим для примера такую вот переменную:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SET</span> @xml <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'&lt;z&gt;&lt;x&gt;x1&lt;/x&gt;&lt;x&gt;x2&lt;/x&gt;&lt;y id=&quot;y-id&quot;&gt;y-value&lt;/y&gt;&lt;/z&gt;'</span>;</div></div>
<p><strong>1) Посчитаем количество элементов с нодой &lt;x&gt;:</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> @xml<span style="color: #66cc66;">,</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'count(//x)'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+----------------------------------+</span><br />
<span style="color: #66cc66;">|</span> @xml &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'count(//x)'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+----------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>z<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x1<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x2<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>y id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y-id&quot;</span><span style="color: #66cc66;">&gt;</span>y<span style="color: #66cc66;">-</span>value<span style="color: #66cc66;">&lt;/</span>y<span style="color: #66cc66;">&gt;&lt;/</span>z<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">2</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+----------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p><strong>2) Выведем содержимое первой ноды &lt;x&gt;:</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> @xml<span style="color: #66cc66;">,</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//x[1]'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+------------------------------+</span><br />
<span style="color: #66cc66;">|</span> @xml &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//x[1]'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>z<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x1<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x2<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>y id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y-id&quot;</span><span style="color: #66cc66;">&gt;</span>y<span style="color: #66cc66;">-</span>value<span style="color: #66cc66;">&lt;/</span>y<span style="color: #66cc66;">&gt;&lt;/</span>z<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">|</span> x1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p><strong>3) Выведем содержимое ноды с атрибутом <strong>id</strong> и значением атрибута &laquo;y-id&raquo;:</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> @xml<span style="color: #66cc66;">,</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//y[@id=&quot;y-id&quot;]'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> @xml &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//y[@id=&quot;y-id&quot;]'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>z<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x1<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x2<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>y id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y-id&quot;</span><span style="color: #66cc66;">&gt;</span>y<span style="color: #66cc66;">-</span>value<span style="color: #66cc66;">&lt;/</span>y<span style="color: #66cc66;">&gt;&lt;/</span>z<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">|</span> y<span style="color: #66cc66;">-</span><span style="color: #993333; font-weight: bold;">VALUE</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>В данный момент <strong>MySQL</strong> поддерживает <strong>XPath версии 1.0</strong>, рекомендую посмотреть <noindex><a rel="nofollow" href="http://www.citforum.ru/internet/xpath/xpath.shtml" >переведенную спецификацию</a></noindex> по этой версии языка.</p>
<h3 style="color:#E97100;">Функция UpdateXML</h3>
<p>С помощью функции <strong>UpdateXML</strong> мы можем изменять какие-либо XML-фрагменты. Используется для изменения XML-фрагмента и сохранения в базу данных, например при <strong>UPDATE</strong>.</p>
<p>Синтаксис следующий:</p>
<blockquote>
<p>UpdateXML (xml_target, xpath_expr, new_xml)</p>
</blockquote>
<h4>Пример:</h4>
<p><strong>1) Заменим первую ноду &laquo;&lt;x&gt;&raquo; на &laquo;&lt;c&gt;test&lt;/c&gt;&raquo;:</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> @xml<span style="color: #66cc66;">,</span> UpdateXML<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//x[1]'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'&lt;c&gt;test&lt;/c&gt;'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+-----------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> @xml &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> UpdateXML<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//x[1]'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'&lt;c&gt;test&lt;/c&gt;'</span><span style="color: #66cc66;">&#41;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+-----------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>z<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x1<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x2<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>y id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y-id&quot;</span><span style="color: #66cc66;">&gt;</span>y<span style="color: #66cc66;">-</span>value<span style="color: #66cc66;">&lt;/</span>y<span style="color: #66cc66;">&gt;&lt;/</span>z<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>z<span style="color: #66cc66;">&gt;&lt;</span>c<span style="color: #66cc66;">&gt;</span>test<span style="color: #66cc66;">&lt;/</span>c<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x2<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>y id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y-id&quot;</span><span style="color: #66cc66;">&gt;</span>y<span style="color: #66cc66;">-</span>value<span style="color: #66cc66;">&lt;/</span>y<span style="color: #66cc66;">&gt;&lt;/</span>z<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+-----------------------------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p><strong>2) Заменим содержимое ноды с атрибутом <strong>id</strong> и значением атрибута &laquo;y-id&raquo; на &laquo;&lt;c&gt;test&lt;/c&gt;&raquo;:</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> @xml<span style="color: #66cc66;">,</span> UpdateXML<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//y[@id=&quot;y-id&quot;]'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'&lt;c&gt;test&lt;/c&gt;'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> @xml &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span> UpdateXML<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'//y[@id=&quot;y-id&quot;]'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'&lt;c&gt;test&lt;/c&gt;'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>z<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x1<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x2<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>y id<span style="color: #66cc66;">=</span><span style="color: #ff0000;">&quot;y-id&quot;</span><span style="color: #66cc66;">&gt;</span>y<span style="color: #66cc66;">-</span>value<span style="color: #66cc66;">&lt;/</span>y<span style="color: #66cc66;">&gt;&lt;/</span>z<span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">|</span> <span style="color: #66cc66;">&lt;</span>z<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x1<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>x<span style="color: #66cc66;">&gt;</span>x2<span style="color: #66cc66;">&lt;/</span>x<span style="color: #66cc66;">&gt;&lt;</span>c<span style="color: #66cc66;">&gt;</span>test<span style="color: #66cc66;">&lt;/</span>c<span style="color: #66cc66;">&gt;&lt;/</span>z<span style="color: #66cc66;">&gt;</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------+---------------------------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>Еще больше примеров на <noindex><a rel="nofollow" href="http://dev.mysql.com/doc/refman/5.1/en/xml-functions.html" >странице руководства по XML-функциям</a></noindex>, так же рекомендую почитать о <noindex><a rel="nofollow" href="http://ru.wikipedia.org/wiki/XPath" >XPath в википедии</a></noindex> и ознакомится с <noindex><a rel="nofollow" href="http://www.citforum.ru/internet/xpath/xpath.shtml" >переведенной спецификацией XPath версии 1.0</a></noindex>.</p>
<h3 style="color:#E97100;">Производительность</h3>
<p>Потестим производительность на моей машине для разработки:</p>
<blockquote>
<p>
Microsoft Windows XP [Версия 5.1.2600] SP3<br />
Mysql 5.1.26</p>
<p>Intel Core Duo T2050 1.6 GHz (L2 Cache 2MB, Bus Speed 133 MHZ, Rated FSB 533 MHz)<br />
Memory Type DDR2, Dual Channels, Size 1024 MB (Frequency 266 MHz)
</p>
</blockquote>
<p>Для теста создадим переменную:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SET</span> @xml <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'&lt;a&gt;&lt;b&gt;&lt;/b&gt;&lt;b&gt;&lt;c id=&quot;c-id&quot;&gt;c-value&lt;/c&gt;&lt;/b&gt;&lt;/a&gt;'</span>;</div></div>
<p><strong>Проверим на выборку 1 000 000 раз.</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> benchmark<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1000000</span><span style="color: #66cc66;">,</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/a/b/c'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> benchmark<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1000000</span><span style="color: #66cc66;">,</span> ExtractValue<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/a/b/c'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">--------------------------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4.77</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p><strong>Проверим на изменение XML-фрагмента 1 000 000 раз.</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> benchmark<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1000000</span><span style="color: #66cc66;">,</span> UpdateXML<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/a/b/c'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'&lt;c id=&quot;c-id&quot;&gt;c-value&lt;/c&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:650px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> benchmark<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1000000</span><span style="color: #66cc66;">,</span> UpdateXML<span style="color: #66cc66;">&#40;</span>@xml<span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'/a/b/c'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'&lt;c id=&quot;c-id&quot;&gt;c-value&lt;/c&gt;'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------------------------------+</span><br />
<span style="color: #66cc66;">|</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #cc66cc;">0</span> <span style="color: #66cc66;">|</span><br />
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------------------------------------------------------------+</span><br />
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">4.47</span> sec<span style="color: #66cc66;">&#41;</span></div></div>
<p>Выводы никакие делать не буду, так как тесты слишком приблизительны. Надо тестировать на конкретной машине, желательно не под Windows (на Linux или под OpenSolaris с конкретно собранной для этой ОСи движком MySQL) и надо тестить конкретные XPath-запросы!</p>
<p><strong>UPD:</strong> <noindex><a rel="nofollow" href="http://groups.google.com/group/moscow-mysql-user-group/browse_thread/thread/6a0d550c9540d2df?hl=ru" >Moscow MySQL User Group: Для чего XPath в MySQL?</a></noindex></p>
]]></content:encoded>
			<wfw:commentRss>http://adw0rd.ru/2009/xpath-mysql/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

