<?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; mysql</title>
	<atom:link href="http://sadko.xskernel.org/archives/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://sadko.xskernel.org</link>
	<description>блог обо всём и ни о чём</description>
	<lastBuildDate>Wed, 14 Dec 2011 20:21:22 +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>Продолжаю развивать проектик.</title>
		<link>http://sadko.xskernel.org/archives/1774</link>
		<comments>http://sadko.xskernel.org/archives/1774#comments</comments>
		<pubDate>Fri, 21 May 2010 20:05:00 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Интернеты]]></category>
		<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[日本語]]></category>
		<category><![CDATA[firebird]]></category>
		<category><![CDATA[kanji]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[perl]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1774</guid>
		<description><![CDATA[Tweet Собственно, как и было сказано ранее, я для упрощения изучения японского языка сделал такой вот сайтец &#8212; http://kanji.xskernel.org/. И обещал обновить его структуру. Сегодня залил свежий движок на пропатченную базу. Теперь осталось выпилить из базы лишние таблицы, которые уже не играют никакой роли. Наконец-то заработал словарь, который по мере изучения мною языка потихоньку пополняется [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1774',
  title: 'Продолжаю развивать проектик.',
  description: 'Собственно, как и было сказано ранее, я для упрощения изучения японского языка сделал такой вот сайтец - http://kanji.xskernel.org/. И обещал обновить его структуру. Сегодня залил свежий движок на пропатч...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1774"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="&ETH;&Ntilde;&ETH;&frac34;&ETH;&acute;&ETH;&frac34;&ETH;&raquo;&ETH;&para;&ETH;&deg;&Ntilde; &Ntilde;&ETH;&deg;&ETH;&middot;&ETH;&sup2;&ETH;&cedil;&ETH;&sup2;&ETH;&deg;&Ntilde;&Ntilde; &ETH;&iquest;&Ntilde;&ETH;&frac34;&ETH;&micro;&ETH;&ordm;&Ntilde;&ETH;&cedil;&ETH;&ordm;." data-url="http://sadko.xskernel.org/archives/1774">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><p>Собственно, как и было сказано ранее, я для упрощения изучения японского языка сделал такой вот сайтец &#8212; <a href="http://kanji.xskernel.org/">http://kanji.xskernel.org/</a>. И обещал обновить его структуру. Сегодня залил свежий движок на пропатченную базу. Теперь осталось выпилить из базы лишние таблицы, которые уже не играют никакой роли. Наконец-то заработал словарь, который по мере изучения мною языка потихоньку пополняется новыми словами. Идею, предложенную товарищем <a href="http://users.livejournal.com/stalkerg/profile/"><img src="http://stat.livejournal.com/img/userinfo.gif" style="border: 0pt none ; vertical-align: bottom;" height="17" width="17"></a><a href="http://users.livejournal.com/stalkerg/"><b>stalkerg</b></a> я постарался воплотить по-максимуму. А именно: сделал возможным поиск слова не только по кандзи, но и по фонетической составляющей (то есть, можно вписать слово каной либо ромадзи, при этом добавлена ещё одна фича: если вы не знаете, является гласный звук долгим или коротким, то словарь выдаст вам оба результата, если все гласные звуки будут введены как короткие).<br />
Соответственно, раньше движок задумывался как запоминалка канзди, теперь же он всё больше и больше становится полноценным словарём, поэтому возможна трансляция как из японского в русский, так и из русского в японский. Единственное, что меня пока смущает, &#8212; это дополнения к слову. Их, скорее, следует переделать (вернее группировать), и я уже примерно представляю как. Но это позже. Сейчас меня больше беспокоит отсутствие админки, ввиду чего данные мне приходится пока по-прежнему вбивать специально написанными консольными скриптами.<br />
Также в самом движке добавил задел на поддержку не только СУБД <a href="http://dev.mysql.com/">MySQL</a>, но и СУБД <a href="http://firebirdsql.org/">Firebird</a>. Если будет время &#8212; обязательно продолжу развитие движка в этом направлении. В общем, планов море, а времени и сил &#8212; чуть.<br />
Опять же, если есть какие замечания/пожелания по поводу сайта, прошу писать отзывы.<br />
И, напоследок. В процессе написания движка сайта (а пишется он на <a href="http://perl.org/">PERL</a>), мне пришлось решить ряд задач, о которых могут выйти вполне интересные статьи. Если аудитории интересно &#8212; то я могу потихоньку выкладывать тут упрощённые кусочки движка с объяснением, как это работает. Заодно и блог оживёт, пожалуй.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1774/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequoia изнутри: заключение</title>
		<link>http://sadko.xskernel.org/archives/1403</link>
		<comments>http://sadko.xskernel.org/archives/1403#comments</comments>
		<pubDate>Fri, 28 Aug 2009 13:51:56 +0000</pubDate>
		<dc:creator>SadKo</dc:creator>
				<category><![CDATA[Кодинг]]></category>
		<category><![CDATA[Одминское]]></category>
		<category><![CDATA[c-jdbc]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[sequoia]]></category>

		<guid isPermaLink="false">http://sadko.xskernel.org/?p=1403</guid>
		<description><![CDATA[Tweet Разбор полётов В общем, сегодня решил, что ну её нафиг, эту Sequoia. Ибо я так и не нашёл в сети реализации класса, выполняющего бэкап данных СУБД ORACLE для Sequoia. Разработчики много чего обещают, пророчат чуть ли не светлое будущее, а на самом деле ничего сверхнового и революционного в ней нет. Изначально я думал, что [...]]]></description>
			<content:encoded><![CDATA[<div style="float: right; margin: 0 0 5px 10px; " class="vk-button">
<!-- vkontakte share button -->
<script type="text/javascript">
<!--
document.write(VK.Share.button(
{
  url: 'http://sadko.xskernel.org/archives/1403',
  title: 'Sequoia изнутри: заключение',
  description: 'Разбор полётов\nВ общем, сегодня решил, что ну её нафиг, эту Sequoia. Ибо я так и не нашёл в сети реализации класса, выполняющего бэкап данных СУБД ORACLE для Sequoia.\nРазработчики много чего обещают, прор...',
  noparse: true 
}, 
{
  type: 'button',
  text: 'Скопировать'
}));
-->
</script>
<!-- / vkontakte share button -->
</div><div style="height:21px; padding-top:2px;" class="really_simple_share"><div style="float:left; " class="really_simple_share_linkedin"> 
				<script type="text/javascript" src="http://platform.linkedin.com/in.js"></script>
				<script type="in/share" data-counter="right" data-url="http://sadko.xskernel.org/archives/1403"></script>
			</div><div style="float:left; padding-left:10px;" class="really_simple_share_twitter"> 
				<a href="http://twitter.com/share" class="twitter-share-button" data-count="horizontal" 
					data-text="Sequoia &ETH;&cedil;&ETH;&middot;&ETH;&frac12;&Ntilde;&Ntilde;&Ntilde;&ETH;&cedil;: &ETH;&middot;&ETH;&deg;&ETH;&ordm;&ETH;&raquo;&Ntilde;&Ntilde;&ETH;&micro;&ETH;&frac12;&ETH;&cedil;&ETH;&micro;" data-url="http://sadko.xskernel.org/archives/1403">Tweet</a> 
				<script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script> 
			</div></div>
	<br style="clear:both;" /><h3>Разбор полётов</h3>
<p>В общем, сегодня решил, что ну её нафиг, эту Sequoia. Ибо я так и не нашёл в сети реализации класса, выполняющего бэкап данных СУБД ORACLE для Sequoia.<br />
Разработчики много чего обещают, пророчат чуть ли не светлое будущее, а на самом деле ничего сверхнового и революционного в ней нет.<br />
Изначально я думал, что разработчики написали свой парсер SQL-выражений под каждый движок, на деле же всё оказалось проще и прозаичнее: SQL-запросы тупо транслировались в базы.<br />
Про атомарность транзакций я вообще молчу: в подобной архитектуре она в принципе не может быть реализована.<br />
<span id="more-1403"></span><br />
Также очень сомнительна предсказуемость работы такой &#171;распределённой&#187; БД: в случае, если будет, например, использоваться СУБД ORACLE, и в нём будут введены Sequences (которые инкрементируются независимо от того, прошла транзакция, или был выполнен rollback), рассинхронизация данных таблиц при частых распараллеленных commit/rollback очевидна.<br />
Качая пакеты и исходники, я думал, что Sequoia &#8212; действительно серьёзный проект, так как архивы весили очень внушительно (21 метр для сорцов &#8212; не хухры-мухры), а на деле оказалось, что большую часть там занимали 3rd-party packages, а из исходников было только 86 файлов самого менеджера и примерно столько же файлов гламурной консоли управления.</p>
<h3>Концепция</h3>
<p>Несмотря на то, что Sequoia оказалось откровенной поделкой, концепция распределённой БД по принципу RAID достаточно интересна. Например, моё представление контроллера такой БД &#8212; это контроллер, который сам работает как БД, то есть имеет свой SQL-синтаксис, который потом адаптируется под синтаксис конкретного движка СУБД.<br />
Пример: на вход контроллера подаётся такое выражение:</p>

<div class="wp_codebox"><table><tr id="p14036"><td class="code" id="p1403code6"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#40;</span>nID<span style="color: #66cc66;">,</span> strMessage<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> Tm_First
<span style="color: #993333; font-weight: bold;">WHERE</span> strMessage <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'%Hello%'</span>
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> nID <span style="color: #993333; font-weight: bold;">DESC</span> <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">2</span>;</pre></td></tr></table></div>

<p>Для MySQL это транслируется в:</p>

<div class="wp_codebox"><table><tr id="p14037"><td class="code" id="p1403code7"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`C_nID`</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`C_strMessage`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`T_Tm_First`</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`C_strMessage`</span> <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'%Hello%'</span>
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">`C_nID`</span> <span style="color: #993333; font-weight: bold;">DESC</span> <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">2</span></pre></td></tr></table></div>

<p>А для Oracle, например, вот так:</p>

<div class="wp_codebox"><table><tr id="p14038"><td class="code" id="p1403code8"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">&quot;C_nID&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;C_strMessage&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span>
	<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">&quot;C_nID&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;C_strMessage&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">&quot;T_Tm_First&quot;</span>
	<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">&quot;C_strMessage&quot;</span> <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">&quot;%Hello%&quot;</span>
	<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">&quot;C_nID&quot;</span> <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> rownum<span style="color: #66cc66;">&lt;=</span><span style="color: #cc66cc;">2</span></pre></td></tr></table></div>

<p>Как видно, в СУБД используется своя нотация, чтобы была возможность ведения системных таблиц для реализации транзакционности в распределённой базе.<br />
Для этого в таблицы, например, при создании можно дописывать поля, такие как transaction_id, а также вести дополнительную таблицу незавершённых транзакций, чтобы обеспечить возможность отката, а также исключить видимость данных до вызова commit.<br />
Таким образом, предыдущий пример усложняется для MySQL:</p>

<div class="wp_codebox"><table><tr id="p14039"><td class="code" id="p1403code9"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`C_nID`</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">`C_strMessage`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`T_Tm_First`</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">`C_strMessage`</span> <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'%Hello%'</span>
<span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">`trID`</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">`nID`</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">`transactions`</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">`C_nID`</span> <span style="color: #993333; font-weight: bold;">DESC</span> <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">2</span></pre></td></tr></table></div>

<p>И для ORACLE:</p>

<div class="wp_codebox"><table><tr id="p140310"><td class="code" id="p1403code10"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">&quot;C_nID&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;C_strMessage&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#40;</span>
	<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">&quot;C_nID&quot;</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">&quot;C_strMessage&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">&quot;T_Tm_First&quot;</span>
	<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #ff0000;">&quot;C_strMessage&quot;</span> <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">&quot;%Hello%&quot;</span>
	<span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">&quot;trID&quot;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #ff0000;">&quot;nID&quot;</span> <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #ff0000;">&quot;transactions&quot;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #ff0000;">&quot;C_nID&quot;</span> <span style="color: #993333; font-weight: bold;">DESC</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> rownum<span style="color: #66cc66;">&lt;=</span><span style="color: #cc66cc;">2</span></pre></td></tr></table></div>

<p>Ну а про Recovery Log я вообще молчу: он должен быть в каждой БД, чтобы в случае отказа по другой БД можно было бы восстановить любую вновь введённую в строй.<br />
Тем не менее, это очень ограничивает реальные рамки использования таких фич СУБД, как:</p>
<ul>
<li>Триггеры (сложно, практически нереально сэмулировать сложные триггеры при batch-операциях без потери производительности);</li>
<li>Sequences (в принципе, можно сэмулировать);</li>
<li>PL/SQL (вообще непонятно как делать);</li>
<li>И т.д., и т.п. вещи, которые есть в одной СУБД, но отсутствуют или по-другому реализованы в другой.</li>
</ul>
<p>Если подобные фичи не нужны, то, в принципе, можно написать адаптер под любую СУБД. Но тогда встаёт вопрос, зачем использовать столь мощную СУБД, если все её возможности не используются по максимуму.</p>
<h3>Противопоставление</h3>
<p>Естественно, ничего из предложенной мною концепции Sequoia не делает. Мало того, усугубляет всю свою &#171;надёжную&#187; схему в RAIDb1 введением дополнительной СУБД для Recovery Log и ведением дампов, которые должны храниться на хосте контроллера.<br />
Да, она обеспечивает обратную совместимость с приложениями, но на этом всё и заканчивается.<br />
Если и делать кластер &#8212; то либо средствами разработчиков СУБД, либо таким костылём, который предложил я. Третье вряд ли дано.</p>
<h3>Резюме</h3>
<p>Проект закрыть, исходники закопать и больше не выкапывать.</p>
]]></content:encoded>
			<wfw:commentRss>http://sadko.xskernel.org/archives/1403/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

