<?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; InnoDB</title>
	<atom:link href="http://sakuratan.biz/archives/tag/innodb/feed" rel="self" type="application/rss+xml" />
	<link>http://sakuratan.biz</link>
	<description>モロモロ工事中です</description>
	<lastBuildDate>Sun, 25 Jun 2023 12:51:51 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>mysqlのibdataが原因でディスクフルになったときに復旧方法</title>
		<link>http://sakuratan.biz/archives/4536</link>
		<comments>http://sakuratan.biz/archives/4536#comments</comments>
		<pubDate>Sat, 27 Aug 2011 08:32:11 +0000</pubDate>
		<dc:creator>さくら</dc:creator>
				<category><![CDATA[開発環境]]></category>
		<category><![CDATA[InnoDB]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://sakuratan.biz/?p=4536</guid>
		<description><![CDATA[さっきまで落ちてたsakuratan.bizです。どーもすみません。 原因は MySQL の InnoDB が使用する ibdata ファイルがディスクを食いつぶしてディスクフルになってたためでした。 ibdata はテーブルスペースを保存するファイルで、CentOS ですとデフォルトで /var/lib/mysql/ibdata1 に作成されます。MySQL のデフォルトでは ibdata が自... <div style="margin-top:1ex"><a href="http://sakuratan.biz/archives/4536">(続きを読む)</a></div>]]></description>
			<content:encoded><![CDATA[<p>さっきまで落ちてたsakuratan.bizです。どーもすみません。</p>
<p>原因は MySQL の InnoDB が使用する ibdata ファイルがディスクを食いつぶしてディスクフルになってたためでした。</p>
<p>ibdata はテーブルスペースを保存するファイルで、CentOS ですとデフォルトで /var/lib/mysql/ibdata1 に作成されます。MySQL のデフォルトでは ibdata が自動で拡張されていく設定になっていますので、放っておくとどんどんファイルサイズがでかくなって、さくらの VPS とかですと結構あっさりディスクフルになりました。</p>
<p>とりあえず復旧できたんで手順とか残しときます。同じようにトラブった方は参考程度にどうぞ。</p>
<p style="margin-top:3em">まず ibdata1 がディスクを食いつぶしているので、復旧するにはこれを消すとかファイルを小さく必要があります。</p>
<p> ファイルサイズを小さくする方法は調べたらいっぱいでてきますので（<a href="http://dev.mysql.com/doc/refman/5.1/ja/adding-and-removing.html">13.5.7 InnoDB データとログ ファイルの追加と削除</a> とか <a href="http://bitwalker.dtiblog.com/blog-entry-162.html">ibdata1 のサイズを減らす手順</a> とか <a href="http://d.hatena.ne.jp/masayuki14/20100308/1268039336">ibdata1のサイズを減らす方法</a>とか）、概要だけ引用しますと、</p>
<blockquote>
<ol>
<li>全ての InnoDB テーブルをダンプする為に mysqldump を利用してください。</li>
<li>サーバを停止してください。</li>
<li>全ての存在するテーブルスペース ファイルを削除してください。</li>
<li>新しいテーブルスペースを設定してください。</li>
<li>サーバを再起動してください。</li>
<li>ダンプ ファイルをインポートしてください。</li>
</ol>
<p><cite><a href="http://dev.mysql.com/doc/refman/5.1/ja/adding-and-removing.html">MySQL :: MySQL 5.1 リファレンスマニュアル :: 13.5.7 InnoDB データとログ ファイルの追加と削除</a></cite>
</ol>
</blockquote>
<p>という感じだったりします。要はバックアップ取ってテーブルスペースを作り直せということのようです。</p>
<p>ただまあディスクフルしてるんでサーバ上に mysqldump のダンプファイルなんか置けないので、ssh 経由で mysqldump を実行することにしました。↓のように ssh を起動することで、ネットワーク越しにコマンドを実行して mysqldump の出力をローカルに直接保存できます。</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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;">ssh</span> <span style="color: #c20cb9; font-weight: bold;">who</span><span style="color: #000000; font-weight: bold;">@</span>domain \<br />
mysqldump <span style="color: #660033;">-v</span> <span style="color: #660033;">-u</span> DBUSER \<br />
<span style="color: #660033;">--default-character-set</span>=binary <span style="color: #660033;">-p</span> DBNAME \<br />
TABLE1 TABLE2 ... &nbsp;<span style="color: #000000; font-weight: bold;">|</span> \<br />
<span style="color: #c20cb9; font-weight: bold;">gzip</span> <span style="color: #000000; font-weight: bold;">&gt;</span> mysql.dump</div></div>
<p>それとコマンドを実行する前にサーバ上のサービスをできるだけ止めてある程度作業用のメモリの確保して、ついでに不要なファイルをできるだけ削除しておいた方が良いと思います。メモリかスワップか何が原因か調べてる暇も無かったので詳細は不明ですが、リソースが足らないと mysqldump がテーブル構造を読み込む際にエラーを出します。</p>
<p>今回はリストアする必要が無いテーブルが何個かありましたのでダンプする対象をテーブル単位で指定していますが、全部リストアする場合はデータベース単位で指定してもらえばよろしいかと思います。運用形態によっては mysqldump に &#8211;single-transaction オプションを指定してもらった方が良いかもしれません（とりあえずウチんとこでは不要だったので指定してませんが）。</p>
<p style="margin-top:2em">ダンプできたら mysql を止めてから ibdata1 と ib_logfile0 と ib_logfile1 を消します。他のサイトだとリネームした方が良いとか書いてますがそんな余裕無いのでいきなりマジ削除しました。最悪データ全部豚でもいーや、の覚悟でどうぞw</p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mysql<br />
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> ibdata1 ib_logfile<span style="color: #7a0874; font-weight: bold;">&#91;</span>01<span style="color: #7a0874; font-weight: bold;">&#93;</span></div></div>
<p>/etc/my.cnf に ibdata1 のサイズ制限と innodb_file_per_table を加えてからmysqld を再起動して回復しましたよ、という感じです。</p>
<div class="codecolorer-container sql dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">innodb_data_file_path<span style="color: #66cc66;">=</span>ibdata1:10M:autoextend:<span style="color: #993333; font-weight: bold;">MAX</span>:100M<br />
innodb_file_per_table</div></div>
<p>innodb_file_per_table を指定すると、各テーブルの中身は共有テーブルスペースでは無く個別のファイルに保存されるようになるのですが、こっちのファイルも放置しておくと大きくなっていきますので、定期的に ALTER TABLE を実行してデフラグする必要があります。（詳しくは <a href="http://dev.mysql.com/doc/refman/5.1/ja/innodb-file-defragmenting.html">13.5.14.3 テーブルのデフラグメント化</a> とか <a href="http://cl.pocari.org/2006-07-07-2.html">拡張され続ける InnoDB のデータファイルのサイズを小さくする方法</a> とかをご覧ください。）</p>
<div class="codecolorer-container sql dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><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> <span style="color: #993333; font-weight: bold;">TABLE</span> table1 ENGINE<span style="color: #66cc66;">=</span>InnoDB;</div></div>
<p style="margin-top:3em">個別に ALTER TABLE 実行するのも面倒なので、全ての InnoDB テーブルに対して ALTER TABLE を実行するスクリプトも書いてみました。よろしければどうぞ。</p>
<div class="codecolorer-container python dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="python codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">import</span> MySQLdb<br />
<br />
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:<br />
&nbsp; &nbsp; conn <span style="color: #66cc66;">=</span> MySQLdb.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">'root'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; cur <span style="color: #66cc66;">=</span> conn.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; cur.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SHOW DATABASES'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; databases <span style="color: #66cc66;">=</span> <span style="color: black;">&#91;</span>database <span style="color: #ff7700;font-weight:bold;">for</span> database<span style="color: #66cc66;">,</span> <span style="color: #ff7700;font-weight:bold;">in</span> cur <span style="color: #ff7700;font-weight:bold;">if</span> database <span style="color: #66cc66;">!=</span> <span style="color: #483d8b;">'mysql'</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; cur.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; conn.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
&nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> database <span style="color: #ff7700;font-weight:bold;">in</span> databases:<br />
&nbsp; &nbsp; &nbsp; &nbsp; conn <span style="color: #66cc66;">=</span> MySQLdb.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">user</span><span style="color: #66cc66;">=</span><span style="color: #483d8b;">'root'</span><span style="color: #66cc66;">,</span> db<span style="color: #66cc66;">=</span>database<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cur1 <span style="color: #66cc66;">=</span> conn.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cur1.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'SHOW TABLE STATUS'</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">for</span> t <span style="color: #ff7700;font-weight:bold;">in</span> cur1:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tablename <span style="color: #66cc66;">=</span> t<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; engine <span style="color: #66cc66;">=</span> t<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">if</span> engine <span style="color: #ff7700;font-weight:bold;">and</span> engine.<span style="color: black;">lower</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'innodb'</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Defrag %s.%s'</span> % <span style="color: black;">&#40;</span>database<span style="color: #66cc66;">,</span> tablename<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur2 <span style="color: #66cc66;">=</span> conn.<span style="color: black;">cursor</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur2.<span style="color: black;">execute</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ALTER TABLE %s ENGINE=INNODB'</span> % tablename<span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cur2.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; cur1.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; conn.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><br />
<br />
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ <span style="color: #66cc66;">==</span> <span style="color: #483d8b;">'__main__'</span>:<br />
&nbsp; &nbsp; main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></div></div>
<p>MySQL にパスワード無しで root ログインできる前提でスクリプト書いてますので、その辺の設定変えている方は適当に改造して使ってください。</p>
]]></content:encoded>
			<wfw:commentRss>http://sakuratan.biz/archives/4536/feed</wfw:commentRss>
		<slash:comments>208</slash:comments>
		</item>
	</channel>
</rss>
