<?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://wp.serpere.info/archives/tag/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://wp.serpere.info</link>
	<description>樹上で暮らすヘビのように生きたい</description>
	<lastBuildDate>Sat, 04 Feb 2012 13:25:38 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>InnoDBの意外な制約: Got error 139 from storage engine</title>
		<link>http://wp.serpere.info/archives/1979</link>
		<comments>http://wp.serpere.info/archives/1979#comments</comments>
		<pubDate>Mon, 13 Dec 2010 13:18:41 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[サーバ管理]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=1979</guid>
		<description><![CDATA[環境: MySQL 5.0 （追記） 某CMSにて、1つのテーブルにTEXT型のフィールドをたくさん（10前後）作ったところ、次のようなエラーが出てデータを保存できなくなった。 Got error 139 from storage engine このエラーメッセージで検索すればいろいろと情報が出てくるが、こういうことらしい： InnoDBの行サイズの上限はページサイズの約半分で、デフォルトでは約8000バイト 可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)のデータは行の外部に保存されるが、先頭の768バイトだけは行の内部に保存される よって例えば一つのテーブルに11個のTEXT型フィールドを作り、それぞれに768バイト以上のデータを入れようとすると、768*11=8448 > 8000 なので保存できない ページサイズは8〜64KBまで設定できるが、変更するためにはMySQL本体をコンパイルし直した上でテーブルスペースとログファイルを再作成する必要があるらしく、運用途中での変更は難しい。よってどうしてもInnoDBでなければならない場合は、テーブルを分割するなどして対処するしかない。 件のCMSの場合は特にInnoDBでなくても良かったので、テーブルをMyISAMに変換することで回避できた。 ALTER TABLE TABLE_NAME ENGINE=MyISAM; MyISAMの場合、行サイズの上限は64KBで、かつTEXTやBLOBの保存に要するのは9〜12バイトなので、同じ問題はまず起こらない。最近は特に何も考えずにInnoDBを使っていたので、ヒヤリとさせられた。 参考にしたサイト： 13.2.11.2. File Space Management &#8211; MySQL 5.0 Reference Manual 10.5. Data Type Storage Requirements &#8211; MySQL 5.0 Reference Manual 限界までMySQLを使い尽くす!! &#8211; 漢(オトコ)のコンピュータ道 Nix::WebLab : Got error [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F1979%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FhH0A5Y%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22InnoDB%E3%81%AE%E6%84%8F%E5%A4%96%E3%81%AA%E5%88%B6%E7%B4%84%3A%20Got%20error%20139%20from%20storage%20engine%22%20%7D);"></div>
<p>
環境: MySQL 5.0 （<strong><a href="#innodb-plugin-fix-the-problem">追記</a></strong>）
</p>
<p>
某CMSにて、1つのテーブルにTEXT型のフィールドをたくさん（10前後）作ったところ、次のようなエラーが出てデータを保存できなくなった。
</p>
<pre>Got error 139 from storage engine</pre>
<p>
このエラーメッセージで検索すればいろいろと情報が出てくるが、こういうことらしい：
</p>
<ul>
<li>InnoDBの行サイズの上限はページサイズの約半分で、デフォルトでは約8000バイト</li>
<li>可変長カラム(VARBINARY, VARCHAR, BLOB, TEXT)のデータは行の外部に保存されるが、先頭の768バイトだけは行の内部に保存される</li>
<li>よって例えば一つのテーブルに11個のTEXT型フィールドを作り、それぞれに768バイト以上のデータを入れようとすると、768*11=8448 > 8000 なので保存できない</li>
</ul>
<p>
ページサイズは8〜64KBまで設定できるが、変更するためにはMySQL本体をコンパイルし直した上でテーブルスペースとログファイルを再作成する必要があるらしく、運用途中での変更は難しい。よってどうしてもInnoDBでなければならない場合は、テーブルを分割するなどして対処するしかない。
</p>
<p>
件のCMSの場合は特にInnoDBでなくても良かったので、テーブルをMyISAMに変換することで回避できた。
</p>


<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">TABLE_NAME</span> ENGINE<span style="color: #66cc66;">=</span>MyISAM;</pre></div></div>



<p>
MyISAMの場合、行サイズの上限は64KBで、かつTEXTやBLOBの保存に要するのは9〜12バイトなので、同じ問題はまず起こらない。最近は特に何も考えずにInnoDBを使っていたので、ヒヤリとさせられた。
</p>
<p>
参考にしたサイト：
</p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/innodb-file-space.html">13.2.11.2. File Space Management</a> &#8211; MySQL 5.0 Reference Manual</li>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html">10.5. Data Type Storage Requirements</a> &#8211; MySQL 5.0 Reference Manual</li>
<li><a href="http://nippondanji.blogspot.com/2009/05/mysql.html">限界までMySQLを使い尽くす!!</a> &#8211; 漢(オトコ)のコンピュータ道</li>
<li><a href="http://blog.livedoor.jp/nix_kobayashi/archives/51775930.html">Nix::WebLab : Got error 139 from storage engine</a>
</li>
</ul>
<h3 id="innodb-plugin-fix-the-problem">追記</h3>
<p>
SH2さんからのコメントで、MySQL 5.1＋InnoDB Plugin/MySQL 5.5以降で新たなファイルフォーマット（Barracuda）を使用すれば状況は改善される、と教えていただきました。どうやら<a href="http://dev.mysql.com/doc/innodb/1.1/en/innodb-compression-internals-storage-blobs.html">TEXT/BLOB一つあたり20バイトだけ</a>になるようです。詳細は以下のリンクなどを参照してください（私もまだ読んでいる途中ですが）。
</p>
<ul>
<li><a href="http://dev.mysql.com/doc/innodb/1.1/en/innodb-compression.html">MySQL :: InnoDB 1.1 for MySQL 5.5 User’s Guide :: 3 InnoDB Data Compression</a></li>
<li><a href="http://nippondanji.blogspot.com/2010/03/innodb-plugin.html">漢(オトコ)のコンピュータ道: InnoDB Pluginことはじめ。快適ストレージエンジン生活はじまる！ </a></li>
<li><a href="http://d.hatena.ne.jp/sh2/20090628">MySQL InnoDB Pluginのデータ圧縮機能 &#8211; SH2の日記</a>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/1979/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>CakePHPのデータベース情報を使ってmysqlコマンドで接続する</title>
		<link>http://wp.serpere.info/archives/1745</link>
		<comments>http://wp.serpere.info/archives/1745#comments</comments>
		<pubDate>Fri, 03 Sep 2010 08:36:50 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[CakePHP]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=1745</guid>
		<description><![CDATA[環境: CakePHP 1.3 CakePHPでの開発中、コマンドラインから直接SQLを実行したいことがままあるので、CakePHPのdatabase.phpから情報を取得してmysqlコマンドで接続するためのシェルスクリプトを作った（要CLI版php）。 connect_db.sh 何もオプションを指定しなければそのままmysqlのインタラクティブシェルに入る。 ./connect_db.sh コマンドライン引数はそのままmysqlコマンドに渡されるので、例えば -e オプションを使うとそのままSQLを実行できる。 ./connect_db.sh -e 'select * from users' 標準では default 接続が使われる。その他の接続設定を使いたい場合は connect_db.sh に対して connect_db_{接続名} という名前でシンボリックリンクを作る。 # DATABASE_CONFIG-&#62;test に接続 ln -s connect_db.sh connect_db_test ./connect_db_test 私の場合 app と同じ階層に bin というディレクトリを作ってそこにシェルスクリプトを置いているので、パスもそれに合わせてある。異なるディレクトリ構成で使う場合は最初のAPPの定義を適宜書き換える。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F1745%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F9wndsM%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22CakePHP%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E6%83%85%E5%A0%B1%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6mysql%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>
環境: CakePHP 1.3
</p>
<p>
CakePHPでの開発中、コマンドラインから直接SQLを実行したいことがままあるので、CakePHPのdatabase.phpから情報を取得してmysqlコマンドで接続するためのシェルスクリプトを作った（要CLI版php）。
</p>
<p><a href="http://gist.github.com/563613">connect_db.sh</a></p>
<p>
何もオプションを指定しなければそのままmysqlのインタラクティブシェルに入る。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>connect_db.sh</pre></div></div>



<p>
コマンドライン引数はそのままmysqlコマンドに渡されるので、例えば -e オプションを使うとそのままSQLを実行できる。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>connect_db.sh <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'select * from users'</span></pre></div></div>



<p>
標準では default 接続が使われる。その他の接続設定を使いたい場合は connect_db.sh に対して connect_db_{接続名} という名前でシンボリックリンクを作る。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># DATABASE_CONFIG-&gt;test に接続</span>
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> connect_db.sh connect_db_test
.<span style="color: #000000; font-weight: bold;">/</span>connect_db_test</pre></div></div>



<p>
私の場合 app と同じ階層に bin というディレクトリを作ってそこにシェルスクリプトを置いているので、パスもそれに合わせてある。異なるディレクトリ構成で使う場合は最初のAPPの定義を適宜書き換える。
</p>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/1745/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL MEMORYテーブルのサイズをmuninで監視する</title>
		<link>http://wp.serpere.info/archives/1109</link>
		<comments>http://wp.serpere.info/archives/1109#comments</comments>
		<pubDate>Mon, 25 Jan 2010 14:49:47 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[munin]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[サーバ管理]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=1109</guid>
		<description><![CDATA[DB内のMEMORYテーブルのサイズを、テーブルごとにグラフ化するための munin プラグインを作ってみました。 mysql_memory_tables_ インストール munin-node 本体のプラグインディレクトリ（/usr/share/munin/plugins など）にコピーしてください。 設定 ワイルドカードプラグインなので、mysql_memory_tables_{チェック対象となるDB名} という名前でシンボリックリンクを張ってください。 ln -s /usr/share/munin/plugins/mysql_memory_tables_ /etc/munin/plugins/mysql_memory_tables_db1 データを取得するには対象DBの INFORMATION_SCHEMA にアクセスする権限が必要です。プラグイン設定ファイル（/etc/munin/plugin-conf.d/munin-node など）で mysql コマンドに渡すユーザ名・パスワードを指定してください。 [mysql_memory_tables_*] env.mysqlopts -u cicindela --password=hogehoge 動作確認 munin-run コマンドでテストができます。 # 値の表示 munin-run mysql_memory_tables_db1 &#160; # グラフ設定情報の表示 munin-run mysql_memory_tables_db1 config 動作が確認できたら munin-node を再起動してください。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F1109%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2F4qM1sC%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22MySQL%20MEMORY%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E3%82%B5%E3%82%A4%E3%82%BA%E3%82%92munin%E3%81%A7%E7%9B%A3%E8%A6%96%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>
DB内のMEMORYテーブルのサイズを、テーブルごとにグラフ化するための munin プラグインを作ってみました。
</p>
<p><a href="http://gist.github.com/285906">mysql_memory_tables_</a></p>
<h3>インストール</h3>
<p>
munin-node 本体のプラグインディレクトリ（/usr/share/munin/plugins など）にコピーしてください。
</p>
<h3>設定</h3>
<p>
ワイルドカードプラグインなので、<code>mysql_memory_tables_{チェック対象となるDB名}</code> という名前でシンボリックリンクを張ってください。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>munin<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>mysql_memory_tables_ <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>munin<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>mysql_memory_tables_db1</pre></div></div>



<p>
データを取得するには対象DBの INFORMATION_SCHEMA にアクセスする権限が必要です。プラグイン設定ファイル（/etc/munin/plugin-conf.d/munin-node など）で mysql コマンドに渡すユーザ名・パスワードを指定してください。
</p>
<pre>
[mysql_memory_tables_*]
env.mysqlopts -u cicindela --password=hogehoge
</pre>
<h3>動作確認</h3>
<p>
munin-run コマンドでテストができます。
</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># 値の表示</span>
munin-run mysql_memory_tables_db1
&nbsp;
<span style="color: #666666; font-style: italic;"># グラフ設定情報の表示</span>
munin-run mysql_memory_tables_db1 config</pre></div></div>



<p>
動作が確認できたら munin-node を再起動してください。
</p>
]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/1109/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mymemcheckをCentOSで動かす</title>
		<link>http://wp.serpere.info/archives/536</link>
		<comments>http://wp.serpere.info/archives/536#comments</comments>
		<pubDate>Tue, 23 Jun 2009 10:23:19 +0000</pubDate>
		<dc:creator>tkykmw</dc:creator>
				<category><![CDATA[未分類]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[サーバ管理]]></category>

		<guid isPermaLink="false">http://wp.serpere.info/?p=536</guid>
		<description><![CDATA[『サーバ/インフラを支える技術』に載っていた mymemcheck を試してみようと思って CentOS 5 上で実行してみたところ、いくつかの Perl モジュールが足りなくて動かなかった。例によって rpmforge で検索してみたら、やはり見つかった。 sudo yum --enablerepo=rpmforge install perl-Readonly perl-UNIVERSAL-require 相変わらず便利過ぎるぜ rpmforge。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_jade" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fwp.serpere.info%252Farchives%252F536%22%2C%20%22shorturl%22%3A%20%22http%3A%2F%2Fbit.ly%2FaBTrUW%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22mymemcheck%E3%82%92CentOS%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%99%22%20%7D);"></div>
<p>『<a name="evtst|a|4774135666" href="http://www.amazon.co.jp/24%E6%99%82%E9%96%93365%E6%97%A5-%E3%82%A4%E3%83%B3%E3%83%95%E3%83%A9%E3%82%92%E6%94%AF%E3%81%88%E3%82%8B%E6%8A%80%E8%A1%93-%E2%80%BE%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%A9%E3%83%93%E3%83%AA%E3%83%86%E3%82%A3%E3%80%81%E3%83%8F%E3%82%A4%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%80%81%E7%9C%81%E5%8A%9B%E9%81%8B%E7%94%A8-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774135666%3FSubscriptionId%3D02E5W5871AJF7PMMMS82%26tag%3Dhebinikki09-22%26linkCode%3Dxm2%26camp%3D2025%26creative%3D165953%26creativeASIN%3D4774135666">サーバ/インフラを支える技術</a>』に載っていた <a href="http://dsas.blog.klab.org/archives/50860867.html">mymemcheck</a> を試してみようと思って CentOS 5 上で実行してみたところ、いくつかの Perl モジュールが足りなくて動かなかった。例によって rpmforge で検索してみたら、やはり見つかった。</p>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> yum <span style="color: #660033;">--enablerepo</span>=rpmforge <span style="color: #c20cb9; font-weight: bold;">install</span> perl-Readonly perl-UNIVERSAL-require</pre></div></div>



<p>相変わらず便利過ぎるぜ rpmforge。</p>

]]></content:encoded>
			<wfw:commentRss>http://wp.serpere.info/archives/536/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

