<?xml version="1.0" encoding="utf-8" ?>
<rss version="2.0"
     xmlns:dc="http://purl.org/dc/elements/1.1/"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">

<channel>
  <title>Planet MySQL</title>
  <link>http://www.planetmysql.org/</link>
  <pubDate>Wed, 10 Feb 2010 03:15:01 +0000</pubDate>
  <language>jp</language>
  <description>Planet MySQL - http://www.planetmysql.org/</description>

  <item>
    <title>[db2][mysql][web]DB2 に関するつぶやきを一挙に見られる『DB2eet』を公開しました</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100207/db2eet</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100207/db2eet</link>
    <description>　本日、新サービス『DB2eet』を公開しました。「でーびーつぅいーと」と発音します。 　　http://labo.artry.net/db2eet    　日々たくさんのツイートが Twitter に書き込まれています。 私が関心を持っている MySQL を Oracle が買収する前に一時期買収相手として話題になったIBMが開発しているRDBMS、DB2について、みんなどんなツイートをしているのだろう。 そんな素朴な興味が本サービス開発のきっかけになりました。 ・・・いやすいません、ここまで来る ...</description>
    <content:encoded><![CDATA[　本日、新サービス『DB2eet』を公開しました。「でーびーつぅいーと」と発音します。 　　http://labo.artry.net/db2eet    　日々たくさんのツイートが Twitter に書き込まれています。 私が関心を持っている MySQL を Oracle が買収する前に一時期買収相手として話題になったIBMが開発しているRDBMS、DB2について、みんなどんなツイートをしているのだろう。 そんな素朴な興味が本サービス開発のきっかけになりました。 ・・・いやすいません、ここまで来る ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23367&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23367&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sun, 07 Feb 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[oracle][mysql][web]Oracle に関するつぶやきを一挙に見られる『Oraeet』を公開しました</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100206/oraeet</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100206/oraeet</link>
    <description>　本日、新サービス『Oraeet』を公開しました。 　　http://labo.artry.net/oraeet     　日々たくさんのツイートが Twitter に書き込まれています。 私が関心を持っている MySQL を買収した Oracle について、みんなどんなツイートをしているのだろう。 そんな素朴な興味が本サービス開発のきっかけになりました。 ・・・いやすいません、ちょっとウソ入っています。「きっかけは MySQL」です。ゼッタイ。  　このサービスを使うと、世界中でつぶやかれている  ...</description>
    <content:encoded><![CDATA[　本日、新サービス『Oraeet』を公開しました。 　　http://labo.artry.net/oraeet     　日々たくさんのツイートが Twitter に書き込まれています。 私が関心を持っている MySQL を買収した Oracle について、みんなどんなツイートをしているのだろう。 そんな素朴な興味が本サービス開発のきっかけになりました。 ・・・いやすいません、ちょっとウソ入っています。「きっかけは MySQL」です。ゼッタイ。  　このサービスを使うと、世界中でつぶやかれている  ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23356&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23356&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sat, 06 Feb 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>Cosmic っていうネットワークストレージを作り始めた</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kazuhooku/20100205/1265367336</guid>
    <link>http://d.hatena.ne.jp/kazuhooku/20100205/1265367336</link>
    <description>
			kazuho’s cosmic at master - GitHub
			概要 (というか近場の目標) は、以下のとおり。
			
				 fail-safe な network RAID
				
					 多重マウントが発生しないプロトコルを実装
					 RAID だから DRBD や MySQL の async replication のような lost updates 問題がない
					 software RAID + NBD を使用 (NBD は遅いから iSCSI 対応するかも)
				
				
				 RDBMS レベルのレプリケーションや DRBD と異なり、高可用性のあるブロックデバイスを提供するソフトウェアレイヤとして機能
				
					 様々なストレージミドルウェアを統一的に管理可能なので、管理コストが低い
					 バックアップとかもブロックデバイスレベルで統一的に。
				
				
				 スケールアウトに好適
				
					 ソフトウェアを止めずに使用するディスクの引っ越しとか可能
				
				
			
			背景としては、MySQL とか PostgreSQL とか mogilefs みたいな分散ファイルストアとか、それぞれレプリケーション手段が異なるので面倒だった。要件定義の段階でそれぞれ検討しなきゃいけないし、なんといっても運用が面倒。
			かといって EqualLogic とか? フェイルオーバー機能を備えたストレージって馬鹿高いし。SAN が現実的な時代なんだから、ネットワーク越しに RAID 組んだらいいよね、という感じ。
			もうちょっとできたら会社ブログに書く。
		</description>
    <content:encoded><![CDATA[<div>
			<p><a href="http://github.com/kazuho/cosmic/" target="_blank">kazuho’s cosmic at master - GitHub</a></p>
			<p>概要 (というか近場の目標) は、以下のとおり。</p>
			<ul>
				<li> fail-safe な network RAID
				<ul>
					<li> 多重マウントが発生しないプロトコルを実装</li>
					<li> RAID だから DRBD や MySQL の async replication のような lost updates 問題がない</li>
					<li> software RAID + NBD を使用 (NBD は遅いから iSCSI 対応するかも)</li>
				</ul>
				</li>
				<li> RDBMS レベルのレプリケーションや DRBD と異なり、高可用性のあるブロックデバイスを提供するソフトウェアレイヤとして機能
				<ul>
					<li> 様々なストレージミドルウェアを統一的に管理可能なので、管理コストが低い</li>
					<li> バックアップとかもブロックデバイスレベルで統一的に。</li>
				</ul>
				</li>
				<li> スケールアウトに好適
				<ul>
					<li> ソフトウェアを止めずに使用するディスクの引っ越しとか可能</li>
				</ul>
				</li>
			</ul>
			<p>背景としては、MySQL とか PostgreSQL とか mogilefs みたいな分散ファイルストアとか、それぞれレプリケーション手段が異なるので面倒だった。要件定義の段階でそれぞれ検討しなきゃいけないし、なんといっても運用が面倒。</p>
			<p>かといって EqualLogic とか? フェイルオーバー機能を備えたストレージって馬鹿高いし。SAN が現実的な時代なんだから、ネットワーク越しに RAID 組んだらいいよね、という感じ。</p>
			<p>もうちょっとできたら会社ブログに書く。</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23346&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23346&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 05 Feb 2010 10:55:36 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
  </item>

  <item>
    <title>[mysql][web]MySQL に関するつぶやきを一挙に見られる『MySweet』を公開しました</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100205/mysweet</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100205/mysweet</link>
    <description>　本日、新サービス『MySweet』を公開しました。 　　http://labo.artry.net/mysweet   　日々たくさんのツイートが Twitter に書き込まれています。 私が関心を持っている MySQL について、みんなどんなツイートをしているのだろう。 そんな素朴な興味が本サービス開発のきっかけになりました。  　このサービスを使うと、世界中でつぶやかれている MySQL の話題を一挙に見る ことができます。　これを見ると世界各国様々な言語で、MySQLが話題になってい ること ...</description>
    <content:encoded><![CDATA[　本日、新サービス『MySweet』を公開しました。 　　http://labo.artry.net/mysweet   　日々たくさんのツイートが Twitter に書き込まれています。 私が関心を持っている MySQL について、みんなどんなツイートをしているのだろう。 そんな素朴な興味が本サービス開発のきっかけになりました。  　このサービスを使うと、世界中でつぶやかれている MySQL の話題を一挙に見る ことができます。　これを見ると世界各国様々な言語で、MySQLが話題になってい ること ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23344&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23344&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 05 Feb 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>MySQL管理者最速マスター</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-9033434677537440188</guid>
    <link>http://nippondanji.blogspot.com/2010/02/mysql.html</link>
    <description>巷ではプログラミング言語の最速マスターが流行ってるので、MySQLも参戦。ただし管理者向け。まずはダウンロードとインストールダウンロードサイトhttp://dev.mysql.com/downloads/バイナリにはインストールパッケージ（Windows=MSI、Mac=DMG、Linux=RPMとか）とアーカイブ（*NIX=tar.gz/Windows=zip）があるけど、初心者は黙ってパッケージをチョイス。インストールはウィザードに従うだけ。英語だけどそこはガマン！パッケージリポジトリがあるOSを使ってるなら、リポジトリからインストールするのもありだ。例えば、shell&amp;gt; sudo yum install mysqlとかshell$gt; sudo apt-get install mysqlとか。これは楽チンだけどMySQLのバージョンがちょっと古くなるので注意。もちろんソースコードからビルドするのもアリだ。設定MySQLの設定で何がいちばん重要かっていうと、InnoDBのパラメータまわりだ。特に、ログファイルのサイズは後から変えるのが面倒なので最初にキッチリやっておくこと。そしてバッファプールのサイズをキッチリ増やしておくこと。いくらマシンにメモリを積んでたって、バッファプールに割り当てなきゃ無意味だからな。あと、文字コードとかディレクトリ関係とか接続数とか基本的な設定も大事。シンプルなmy.cnfのサンプル。[mysqld]# basic settingsuser = mysqlport = 3306socket = /tmp/mysql.sockcharacter-set-server = utf8datadir = /var/lib/mysqltmpdir = /var/tmp/mysqllog_slow_queriesmax_connections = 500thread_cache_size = 500max_allowed_packet = 16Mtable_cache = 2000#log-bin = mysql-bin#server-id = 1innodb_buffer_pool_size = 2500Minnodb_flush_method = O_DIRECTinnodb_log_file_size = 256Minnodb_log_buffer_size = 8Mとりあえずこれで動く。パッケージを使ってインストールした場合には既に設定ファイルがあるので、それを編集するといいだろう。また、既にmysqldが起動されてしまっている場合にはInnoDBのログファイルが出来てしまっているが、ログファイルサイズの設定値が実際と違うと起動しない。単純にログファイルを削除するとエラーになる。おまじないとして2回mysqldを再起動してから、ログファイル（ib_logfile*という名前）を削除して、それから設定値を変更するといいだろう。あと、Windowsはウィザード使えってことで。ユーザーの作成とか初期化とか*NIXでtar.gz版を使う場合、ユーザーの作成とかdatadirを初期化とか自動起動の設定とかは自分でやらないとイカン。ユーザーの作成とかshell&amp;gt; sudo mkdir /var/lib/mysqlshell&amp;gt; sudo groupadd mysqlshell&amp;gt; sudo useradd -g mysql -s /bin/false -d /var/lib/mysql mysqlshell&amp;gt; chown mysql:mysql /var/lib/mysql &amp;&amp; chmod 700 /var/lib/mysqlshell&amp;gt; passwd mysqlデータディレクトリの初期化とかshell&amp;gt; cd /usr/local/mysqlshell&amp;gt; sudo bin/mysql_install_db --datadir=/var/lib/mysqlshell&amp;gt; sudo chown -R mysql:mysql /var/lib/mysql自動起動とかshell&amp;gt; sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqlshell&amp;gt; sudo update-rc.d mysql defaultsRPMとかのパッケージだと自動でやってくれるからやっぱり便利だよね。起動＆停止*NIXの場合、起動はrootになって、shell&amp;gt; mysqld_safe &amp;またはshell&amp;gt; /etc/init.d/mysql startまたはshell&amp;gt; service start mysqlとする。rootになるのはmysqldがリソースの設定（ulimitで増やす）などをするためだ。プロセスは後からsetuid()でmy.cnfで設定されているユーザーに変更する。そもそもさっき作成したmysqlユーザーだとログイン出来ないしね。停止はshell&amp;gt; mysqladmin -uroot -p shutdownまたは、rootでshell&amp;gt; /etc/init.d/mysql startまたは、rootでshell&amp;gt; service start mysqlだ。Windowsの場合は、大抵サービスとして動かしてると思うので、「コントロールパネル ⇒ 管理ツール ⇒ サービス」から起動停止すべし。rootパスワードの設定初期状態では、MySQLのrootユーザにはパスワードが設定されていない。超^64危険なのですぐにパスワードを設定すべし！*NIXなら、mysql_secure_installationというコマンドが便利だ。このコマンドは、rootパスワードの設定や、不要なアカウントの削除などを行ってくれる便利ツール。是非使うべし。Windowsならウィザードで設定可能。CLIで接続shell&amp;gt; mysql -h ホスト名 -P ポート番号 -u ユーザー名 -p[パスワード] --default-character-set=文字コード データベース名という感じで。パスワードはスペースを空けずに入力すればコマンド行で指定できるけど、psとかで他のユーザーから見えちゃうから注意。指定がなければパスワードの入力を促すプロンプトが表示されるよ！文字コードは自分の端末と合わせること。$HOME/.my.cnfに設定を書いておくと便利。[mysql]user=ユーザー名password=パスワードdefault-character-set=utf8port=3306host=127.0.0.1ホスト名の指定がない場合、デフォルトではlocalhostに接続する。その場合、*NIXならTCP/IPじゃなくてUNIXドメインソケット接続になる。ユーザーの作成アプリケーションがrootユーザーでMySQLサーバーに接続するのは大変危険じゃ。最低でも管理系の権限と、システムデータベースへのアクセスがないユーザーを作成するのが望ましい。mysql&amp;gt; GRANT ALL ON db1.* TO user1@host1 IDENTIFIED BY 'パスワード'とすれば、最低でも前述の条件は満たせる。もう一手間かけて、DDL（CREATEとかALTERとか）を実行するユーザーと、DML（SELECT/INSERT/DELETE/UPDATE）を実行するユーザーを分けておくといいだろう。（詳細割愛）コネクタ各種プログラミング言語でMySQLにアクセスするにはコネクタ（っつーかドライバ）を使う。オフィシャルなコネクタはダウンロードページから入手しよう。PerlとRubyのオフィシャルなものはないので、Perl用のドライバはCPANからDBD::mysqlを、Ruby用のドライバはgemでruby-mysqlまたはmysqlをゲットするといいだろう。（ruby-mysqlはPure ruby実装）接続方法とかクエリの実行方法とかは書き出すとキリがないので割愛！ただし文字化けには特に注意すること。（コネクタの接続設定で適切な文字コードを指定すればノープロブレムだ！）RTFM！GUIとか今ならMySQL Workbench 5.2がナイスチョイス。β版なので不具合も多少あるだろうけど、不具合に遭遇したら報告してくれると助かりマンモス。レプリケーションとりあえず、ひろせ まさあきさんによる解説を読もう。話はそれからだ。バックアップとリストアデータ量が少ないうちはmysqldumpで充分イケル。バックアップshell&amp;gt; mysqldump -hホスト名 -uroot -p データベース名 &gt; dumpfile.sqlリストアshell&amp;gt; mysql -hホスト名 -uroot -p データベース名 &lt; dumpfile.sqlという具合だ。テーブルがInnoDBだけなら、mysqldumpには--single-transactionというオプションをつけると、バックアップ中も参照・更新共に出来るのでナイスだ。困ったら？まずは日本MySQLユーザ会のメーリングリストで質問してみるといいだろう。熟練したユーザーがよくチェックしているので、適切なアドバイスを貰えることが多い。商用でMySQLを利用する場合には、保険としてオフィシャルなサポートを購入するといいだろう。メーリングリストだと回答を貰える保証はないが、サポートなら確実に回答が返ってくるので安心だ。とりあえずこんなもんで！！追記： コマンドのリファレンスにはMySQL Cheat Sheetもよろしく。</description>
    <content:encoded><![CDATA[巷ではプログラミング言語の最速マスターが流行ってるので、MySQLも参戦。ただし管理者向け。<br /><br /><h4>まずはダウンロードとインストール</h4>ダウンロードサイト<br /><a href="http://dev.mysql.com/downloads/">http://dev.mysql.com/downloads/</a><br /><br />バイナリにはインストールパッケージ（Windows=MSI、Mac=DMG、Linux=RPMとか）とアーカイブ（*NIX=tar.gz/Windows=zip）があるけど、初心者は黙ってパッケージをチョイス。インストールはウィザードに従うだけ。英語だけどそこはガマン！<br /><br />パッケージリポジトリがあるOSを使ってるなら、リポジトリからインストールするのもありだ。例えば、<br /><blockquote>shell&gt; sudo yum install mysql</blockquote>とか<br /><blockquote>shell$gt; sudo apt-get install mysql</blockquote>とか。これは楽チンだけどMySQLのバージョンがちょっと古くなるので注意。<br /><br />もちろんソースコードからビルドするのもアリだ。<br /><br /><h4>設定</h4>MySQLの設定で何がいちばん重要かっていうと、InnoDBのパラメータまわりだ。特に、ログファイルのサイズは後から変えるのが面倒なので最初にキッチリやっておくこと。そしてバッファプールのサイズをキッチリ増やしておくこと。いくらマシンにメモリを積んでたって、バッファプールに割り当てなきゃ無意味だからな。あと、文字コードとかディレクトリ関係とか接続数とか基本的な設定も大事。<br /><br />シンプルなmy.cnfのサンプル。<br /><blockquote><pre>[mysqld]<br /># basic settings<br />user = mysql<br />port = 3306<br />socket = /tmp/mysql.sock<br />character-set-server = utf8<br />datadir = /var/lib/mysql<br />tmpdir = /var/tmp/mysql<br />log_slow_queries<br />max_connections = 500<br />thread_cache_size = 500<br />max_allowed_packet = 16M<br />table_cache = 2000<br />#log-bin = mysql-bin<br />#server-id = 1<br />innodb_buffer_pool_size = 2500M<br />innodb_flush_method = O_DIRECT<br />innodb_log_file_size = 256M<br />innodb_log_buffer_size = 8M<br /></pre></blockquote>とりあえずこれで動く。<br /><br />パッケージを使ってインストールした場合には既に設定ファイルがあるので、それを編集するといいだろう。また、既にmysqldが起動されてしまっている場合にはInnoDBのログファイルが出来てしまっているが、ログファイルサイズの設定値が実際と違うと起動しない。単純にログファイルを削除するとエラーになる。おまじないとして2回mysqldを再起動してから、ログファイル（ib_logfile*という名前）を削除して、それから設定値を変更するといいだろう。<br /><br />あと、Windowsは<a href="http://dev.mysql.com/doc/refman/5.1/ja/windows-config-wizard.html">ウィザード</a>使えってことで。<br /><br /><h4>ユーザーの作成とか初期化とか</h4>*NIXでtar.gz版を使う場合、ユーザーの作成とかdatadirを初期化とか自動起動の設定とかは自分でやらないとイカン。<br /><br /><blockquote><pre>ユーザーの作成とか<br />shell&gt; sudo mkdir /var/lib/mysql<br />shell&gt; sudo groupadd mysql<br />shell&gt; sudo useradd -g mysql -s /bin/false -d /var/lib/mysql mysql<br />shell&gt; chown mysql:mysql /var/lib/mysql && chmod 700 /var/lib/mysql<br />shell&gt; passwd mysql<br /><br />データディレクトリの初期化とか<br />shell&gt; cd /usr/local/mysql<br />shell&gt; sudo bin/mysql_install_db --datadir=/var/lib/mysql<br />shell&gt; sudo chown -R mysql:mysql /var/lib/mysql<br /><br />自動起動とか<br />shell&gt; sudo cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql<br />shell&gt; sudo update-rc.d mysql defaults<br /></pre></blockquote><br />RPMとかのパッケージだと自動でやってくれるからやっぱり便利だよね。<br /><br /><h4>起動＆停止</h4>*NIXの場合、起動は<br /><blockquote><pre>rootになって、<br />shell&gt; mysqld_safe &<br />または<br />shell&gt; /etc/init.d/mysql start<br />または<br />shell&gt; service start mysql<br /></pre></blockquote>とする。rootになるのはmysqldがリソースの設定（ulimitで増やす）などをするためだ。プロセスは後からsetuid()でmy.cnfで設定されているユーザーに変更する。そもそもさっき作成したmysqlユーザーだとログイン出来ないしね。<br /><br />停止は<br /><blockquote><pre>shell&gt; mysqladmin -uroot -p shutdown<br />または、rootで<br />shell&gt; /etc/init.d/mysql start<br />または、rootで<br />shell&gt; service start mysql<br /></pre></blockquote>だ。<br /><br />Windowsの場合は、大抵サービスとして動かしてると思うので、「コントロールパネル ⇒ 管理ツール ⇒ サービス」から起動停止すべし。<br /><br /><h4>rootパスワードの設定</h4>初期状態では、MySQLのrootユーザにはパスワードが設定されていない。超^64危険なのですぐにパスワードを設定すべし！*NIXなら、mysql_secure_installationというコマンドが便利だ。このコマンドは、rootパスワードの設定や、不要なアカウントの削除などを行ってくれる便利ツール。是非使うべし。<br /><br />Windowsならウィザードで設定可能。<br /><br /><h4>CLIで接続</h4><blockquote><pre>shell&gt; mysql -h ホスト名 -P ポート番号 -u ユーザー名 -p[パスワード] --default-character-set=文字コード データベース名<br /></pre></blockquote>という感じで。パスワードはスペースを空けずに入力すればコマンド行で指定できるけど、psとかで他のユーザーから見えちゃうから注意。指定がなければパスワードの入力を促すプロンプトが表示されるよ！文字コードは自分の端末と合わせること。$HOME/.my.cnfに設定を書いておくと便利。<br /><br /><blockquote><pre>[mysql]<br />user=ユーザー名<br />password=パスワード<br />default-character-set=utf8<br />port=3306<br />host=127.0.0.1<br /></pre></blockquote>ホスト名の指定がない場合、デフォルトではlocalhostに接続する。その場合、*NIXならTCP/IPじゃなくてUNIXドメインソケット接続になる。<br /><br /><h4>ユーザーの作成</h4>アプリケーションがrootユーザーでMySQLサーバーに接続するのは大変危険じゃ。最低でも管理系の権限と、システムデータベースへのアクセスがないユーザーを作成するのが望ましい。<br /><pre name="code">mysql&gt; GRANT ALL ON db1.* TO user1@host1 IDENTIFIED BY 'パスワード'</pre>とすれば、最低でも前述の条件は満たせる。もう一手間かけて、DDL（CREATEとかALTERとか）を実行するユーザーと、DML（SELECT/INSERT/DELETE/UPDATE）を実行するユーザーを分けておくといいだろう。（詳細割愛）<br /><br /><h4>コネクタ</h4>各種プログラミング言語でMySQLにアクセスするにはコネクタ（っつーかドライバ）を使う。オフィシャルなコネクタは<a href="http://dev.mysql.com/downloads/connector/">ダウンロードページ</a>から入手しよう。PerlとRubyのオフィシャルなものはないので、Perl用のドライバはCPANからDBD::mysqlを、Ruby用のドライバはgemでruby-mysqlまたはmysqlをゲットするといいだろう。（ruby-mysqlはPure ruby実装）<br /><br />接続方法とかクエリの実行方法とかは書き出すとキリがないので割愛！ただし文字化けには特に注意すること。（コネクタの接続設定で適切な文字コードを指定すればノープロブレムだ！）RTFM！<br /><br /><h4>GUIとか</h4>今なら<a href="http://nippondanji.blogspot.com/2010/01/mysql-workbench-52.html">MySQL Workbench 5.2</a>がナイスチョイス。β版なので不具合も多少あるだろうけど、不具合に遭遇したら報告してくれると助かりマンモス。<br /><br /><h4>レプリケーション</h4>とりあえず、<a href="http://www.irori.org/doc/mysql-rep.html">ひろせ まさあきさんによる解説</a>を読もう。話はそれからだ。<br /><br /><h4>バックアップとリストア</h4>データ量が少ないうちはmysqldumpで充分イケル。<br /><br /><blockquote><pre>バックアップ<br />shell&gt; mysqldump -hホスト名 -uroot -p データベース名 > dumpfile.sql<br /><br />リストア<br />shell&gt; mysql -hホスト名 -uroot -p データベース名 < dumpfile.sql<br /></pre></blockquote>という具合だ。テーブルがInnoDBだけなら、mysqldumpには--single-transactionというオプションをつけると、バックアップ中も参照・更新共に出来るのでナイスだ。<h4>困ったら？</h4>まずは<a href="http://www.mysql.gr.jp/">日本MySQLユーザ会</a>のメーリングリストで質問してみるといいだろう。熟練したユーザーがよくチェックしているので、適切なアドバイスを貰えることが多い。商用でMySQLを利用する場合には、保険としてオフィシャルなサポートを購入するといいだろう。メーリングリストだと回答を貰える保証はないが、サポートなら確実に回答が返ってくるので安心だ。とりあえずこんなもんで！！<br/><br/><span>追記： コマンドのリファレンスには<a href="http://nippondanji.blogspot.com/2009/12/mysql-cheat-sheet-10.html">MySQL Cheat Sheet</a>もよろしく。</span><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-9033434677537440188?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23332&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23332&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 04 Feb 2010 00:26:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>mysql</category>
    <category>gossip</category>
  </item>

  <item>
    <title>MySQL 5.1.43リリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sh2/20100202</guid>
    <link>http://d.hatena.ne.jp/sh2/20100202</link>
    <description>出ました。今回は機能追加が1件、バグ修正が47件あります。バグ修正のうち1件はセキュリティに関するもの、それからパーティショニングに関するものが2件、レプリケーションに関するものが7件となっています。InnoDB PluginはMySQL 5.1.42に引き続きRC版の1.0.6となっています。 今回は注意すべき変更点がいくつかありますので、かいつまんで説明します。 パーティショニングに関する機能追加 パーティショニング機能に関して一つ機能追加があり、UNIX_TIMESTAMP()をパーティショニング表現として利用できるようになりました。先日のMySQL 5.5.0-m2の記事における例を書き直すと以下のようになります。  mysql&amp;#62; CREATE TABLE timeline ( -&amp;#62; id BIGINT(20) NOT NULL, -&amp;#62; created_at DATETIME DEFAULT NULL, -&amp;#62; screen_name VARCHAR(15) DEFAULT NULL, -&amp;#62; text VARCHAR(140) DEFAULT NULL, -&amp;#62; PRIMARY KEY (id, created_at) -&amp;#62; ) -&amp;#62; ENGINE = InnoDB -&amp;#62; PARTITION BY RANGE (TO_DAYS(created_at)) ( -&amp;#62; PARTITION p2009 VALUES LESS THAN (UNIX_TIMESTAMP(&amp;#39;2010-01-01&amp;#39;)), -&amp;#62; PARTITION p2010 VALUES LESS THAN (UNIX_TIMESTAMP(&amp;#39;2011-01-01&amp;#39;)), -&amp;#62; PARTITION p2011 VALUES LESS THAN (UNIX_TIMESTAMP(&amp;#39;2012-01-01&amp;#39;)), -&amp;#62; PARTITION plast VALUES LESS THAN MAXVALUE -&amp;#62; ); Query OK, 0 rows affected (0.06 sec) mysql&amp;#62; SHOW CREATE TABLE timeline&amp;#92;G &amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42; 1. row &amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42; Table: timeline Create Table: CREATE TABLE `timeline` ( `id` bigint(20) NOT NULL, `created_at` datetime NOT NULL DEFAULT &amp;#39;0000-00-00 00:00:00&amp;#39;, `screen_name` varchar(15) DEFAULT NULL, `text` varchar(140) DEFAULT NULL, PRIMARY KEY (`id`,`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 /&amp;#42;!50100 PARTITION BY RANGE (TO_DAYS(created_at)) (PARTITION p2009 VALUES LESS THAN (1262271600) ENGINE = InnoDB, PARTITION p2010 VALUES LESS THAN (1293807600) ENGINE = InnoDB, PARTITION p2011 VALUES LESS THAN (1325343600) ENGINE = InnoDB, PARTITION plast VALUES LESS THAN MAXVALUE ENGINE = InnoDB) &amp;#42;/ 1 row in set (0.00 sec)  MySQL 5.1.42までは以下のようなエラーが返されます。  ERROR 1564 (HY000): This partition function is not allowed  以前、MySQL 5.5ではRANGE COLUMNSパーティショニングによって1日よりも細かい単位でパーティションを作ったり、パーティションの区切りを0時0分以外にできると述べました。MySQL 5.1.43の機能追加によりその優位性は少し薄れてしまった形です。 セキュリティ修正 MySQL組み込みのSSL接続機能について脆弱性が報告されています。組み込みのSSL機能を有効にしている場合、ネットワーク経由の攻撃によってバッファオーバーフローが発生する恐れがあります。組み込みのSSL機能を有効にしているかどうかは、以下のコマンドで「have_ssl」の設定を見ることで確認できます。  mysql&amp;#62; show global variables like &amp;#39;%ssl%&amp;#39;; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+ 7 rows in set (0.00 sec)  have_sslがDISABLEDになっている場合は、危険性はありません。 RAND()がステートメントベースレプリケーションにおいて安全でなくなった ステートメントベースのレプリケーションにおいて、RAND()ファンクションが安全ではないと見なされるようになりました。 RAND()ファンクションを含むDMLをレプリケーションする場合、MySQLは以下のように乱数のSEEDをスレーブに送ることでマスタ/スレーブ間の整合性を確保していました。  #100202 10:50:37 server id 1 end_log_pos 300 Rand SET @@RAND_SEED1=579603802, @@RAND_SEED2=401006069/&amp;#42;!&amp;#42;/; # at 300 #100202 10:50:37 server id 1 end_log_pos 407 Query thread_id=1 exec_tim e=0 error_code=0 SET TIMESTAMP=1265075437/&amp;#42;!&amp;#42;/; INSERT INTO test (c1) VALUES (RAND() &amp;#42; 100)  従来はこれでうまく動くとされていたのですが、実はINSERT ... SELECTのような複数レコードを更新する処理ではレコードの更新順序が保証されません。そのため乱数の値が不一致を起こす場合があるということが分かりました。 今後レプリケーション環境でRAND()ファンクションを利用する場合は、行ベースレプリケーションを利用してください。またRAND()ファンクションに限らず、行ベースレプリケーションへの移行は今後検討すべき課題の一つと考えられます。InnoDBでトランザクション分離レベルがREAD COMMITTEDの場合は、ネクストキーロックを軽減できるというメリットもあります。</description>
    <content:encoded><![CDATA[出ました。今回は機能追加が1件、バグ修正が47件あります。バグ修正のうち1件はセキュリティに関するもの、それからパーティショニングに関するものが2件、レプリケーションに関するものが7件となっています。InnoDB Pluginは<span>MySQL</span> 5.1.42に引き続きRC版の1.0.6となっています。 今回は注意すべき変更点がいくつかありますので、かいつまんで説明します。 パーティショニングに関する機能追加 パーティショニング機能に関して一つ機能追加があり、UNIX_TIMESTAMP()をパーティショニング表現として利用できるようになりました。先日の<span>MySQL</span> 5.5.0-m2の記事における例を書き直すと以下のようになります。  <span>mysql</span>&#62; CREATE TABLE timeline ( -&#62; id BIGINT(20) NOT NULL, -&#62; created_at DATETIME DEFAULT NULL, -&#62; screen_name VARCHAR(15) DEFAULT NULL, -&#62; text VARCHAR(140) DEFAULT NULL, -&#62; PRIMARY KEY (id, created_at) -&#62; ) -&#62; ENGINE = InnoDB -&#62; PARTITION BY RANGE (TO_DAYS(created_at)) ( -&#62; PARTITION p2009 VALUES LESS THAN (UNIX_TIMESTAMP(&#39;2010-01-01&#39;)), -&#62; PARTITION p2010 VALUES LESS THAN (UNIX_TIMESTAMP(&#39;2011-01-01&#39;)), -&#62; PARTITION p2011 VALUES LESS THAN (UNIX_TIMESTAMP(&#39;2012-01-01&#39;)), -&#62; PARTITION plast VALUES LESS THAN MAXVALUE -&#62; ); Query OK, 0 rows affected (0.06 sec) <span>mysql</span>&#62; SHOW CREATE TABLE timeline&#92;G &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 1. row &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; Table: timeline Create Table: CREATE TABLE `timeline` ( `id` bigint(20) NOT NULL, `created_at` datetime NOT NULL DEFAULT &#39;0000-00-00 00:00:00&#39;, `screen_name` varchar(15) DEFAULT NULL, `text` varchar(140) DEFAULT NULL, PRIMARY KEY (`id`,`created_at`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 /&#42;!50100 PARTITION BY RANGE (TO_DAYS(created_at)) (PARTITION p2009 VALUES LESS THAN (1262271600) ENGINE = InnoDB, PARTITION p2010 VALUES LESS THAN (1293807600) ENGINE = InnoDB, PARTITION p2011 VALUES LESS THAN (1325343600) ENGINE = InnoDB, PARTITION plast VALUES LESS THAN MAXVALUE ENGINE = InnoDB) &#42;/ 1 row in set (0.00 sec)  <span>MySQL</span> 5.1.42までは以下のようなエラーが返されます。  ERROR 1564 (HY000): This partition function is not allowed  以前、<span>MySQL</span> 5.5ではRANGE COLUMNSパーティショニングによって1日よりも細かい単位でパーティションを作ったり、パーティションの区切りを0時0分以外にできると述べました。<span>MySQL</span> 5.1.43の機能追加によりその優位性は少し薄れてしまった形です。 セキュリティ修正 <span>MySQL</span>組み込みのSSL接続機能について脆弱性が報告されています。組み込みのSSL機能を有効にしている場合、ネットワーク経由の攻撃によってバッファオーバーフローが発生する恐れがあります。組み込みのSSL機能を有効にしているかどうかは、以下のコマンドで「have_ssl」の設定を見ることで確認できます。  <span>mysql</span>&#62; show global variables like &#39;%ssl%&#39;; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert | | | ssl_cipher | | | ssl_key | | +---------------+----------+ 7 rows in set (0.00 sec)  have_sslがDISABLEDになっている場合は、危険性はありません。 RAND()がステートメントベースレプリケーションにおいて安全でなくなった ステートメントベースのレプリケーションにおいて、RAND()ファンクションが安全ではないと見なされるようになりました。 RAND()ファンクションを含むDMLをレプリケーションする場合、<span>MySQL</span>は以下のように乱数のSEEDをスレーブに送ることでマスタ/スレーブ間の整合性を確保していました。  #100202 10:50:37 server id 1 end_log_pos 300 Rand SET @@RAND_SEED1=579603802, @@RAND_SEED2=401006069/&#42;!&#42;/; # at 300 #100202 10:50:37 server id 1 end_log_pos 407 Query thread_id=1 exec_tim e=0 error_code=0 SET TIMESTAMP=1265075437/&#42;!&#42;/; INSERT INTO test (c1) VALUES (RAND() &#42; 100)  従来はこれでうまく動くとされていたのですが、実はINSERT ... SELECTのような複数レコードを更新する処理ではレコードの更新順序が保証されません。そのため乱数の値が不一致を起こす場合があるということが分かりました。 今後レプリケーション環境でRAND()ファンクションを利用する場合は、行ベースレプリケーションを利用してください。またRAND()ファンクションに限らず、行ベースレプリケーションへの移行は今後検討すべき課題の一つと考えられます。InnoDBでトランザクション分離レベルがREAD COMMITTEDの場合は、ネクストキーロックを軽減できるというメリットもあります。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23304&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23304&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 02 Feb 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sadao Hiratsuka</dc:creator>
  </item>

  <item>
    <title>[勝手に校正] データベースまるごと学習ブック＠日経ソフトウエア2010/01付録</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=834253</guid>
    <link>http://blog.kimuradb.com/?eid=834253</link>
    <description>
日経ソフトウエア 2010年 01月号 [雑誌]
日経ソフトウエアの新年号には「データベースまるごと学習ブック」というMySQL/PostgreSQLをつかった付録がついていました。過去記事をうまくまとめてわかりやすいのだけれども、過去記事ゆえに現状とそぐわないところ、間違っているところがいくつかありましたので、ここでMySQL関連だけ勝手に校正しておきます。(インストール記事が5.1.40を利用しているので、それを前提とします)

(1) データ型の決定(p.12)
  ここで文字列型に注意。char(n)を255バイトと書いて、nバイトの固定長文字列、と書いてあるけども、これはMySQL 4.0までの話。4.1以降はchar(n)はn文字。また、varchar(n)の上限値も違います。

4.1では何が変わったの(MyNA)

(2) ユーザ管理に注意(p.15)
　GRANTの後にflush privileges;が必要とありますが、これは不要。flush privileges;が必要なのは、mysql.userに直接更新を行った場合だけです。

4.8.2. MySQL への新規ユーザの追加

(3) max_connections(p.27の注2)
　MySQLの場合、デフォルトの設定での同時接続数は100です、と書いてありますが、現在デフォルトは100ではなく、5.1.15以降は151になっています。

max_connections

著者のみなさま! できましたら、過去記事を再掲する場合には、最新のマニュアルをチェックしてください。よろしくお願いしますm(_ _)m</description>
    <content:encoded><![CDATA[<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002W821PK/kimuradb-22/" target="_blank"><img border="0" src="http://ecx.images-amazon.com/images/I/617bY1RWgRL._SL160_.jpg" alt="日経ソフトウエア 2010年 01月号 [雑誌]" /></a><br />
<a href="http://www.amazon.co.jp/exec/obidos/ASIN/B002W821PK/kimuradb-22/" target="_blank"><strong>日経ソフトウエア 2010年 01月号 [雑誌]</strong></a><br />
日経ソフトウエアの新年号には「データベースまるごと学習ブック」というMySQL/PostgreSQLをつかった付録がついていました。過去記事をうまくまとめてわかりやすいのだけれども、過去記事ゆえに現状とそぐわないところ、間違っているところがいくつかありましたので、ここでMySQL関連だけ勝手に校正しておきます。(インストール記事が5.1.40を利用しているので、それを前提とします)<br />
<br />
(1) データ型の決定(p.12)<br />
  ここで文字列型に注意。char(n)を255バイトと書いて、nバイトの固定長文字列、と書いてあるけども、これはMySQL 4.0までの話。4.1以降はchar(n)はn文字。また、varchar(n)の上限値も違います。<br />
<br />
<a href="http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_42" target="_blank">4.1では何が変わったの(MyNA)</a><br />
<br />
(2) ユーザ管理に注意(p.15)<br />
　GRANTの後にflush privileges;が必要とありますが、これは不要。flush privileges;が必要なのは、mysql.userに直接更新を行った場合だけです。<br />
<br />
<a href="http://dev.mysql.com/doc/refman/5.1/ja/adding-users.html" target="_blank">4.8.2. MySQL への新規ユーザの追加</a><br />
<br />
(3) max_connections(p.27の注2)<br />
　MySQLの場合、デフォルトの設定での同時接続数は100です、と書いてありますが、現在デフォルトは100ではなく、5.1.15以降は151になっています。<br />
<br />
<a href="http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_max_connections" target="_blank">max_connections</a><br />
<br />
著者のみなさま! できましたら、過去記事を再掲する場合には、最新のマニュアルをチェックしてください。よろしくお願いしますm(_ _)m<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23305&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23305&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 01 Feb 2010 12:12:13 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>MySQL</category>
  </item>

  <item>
    <title>[mysql]【含セキュリティパッチ】MySQL 5.1.43 と MySQL 5.0.90 リリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100201/p1</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100201/p1</link>
    <description>　週末から週明けにかけて、MySQL 5.1 と 5.0 の最新バージョンがリリースされました。MySQL 5.0 シリーズは昨年末で EoL (End of Life) でもう新しいバージョンは出ないと思っていたのですが、セキュリティ上の重要な問題の修正ということでリリースされたものと思われます。  ○MySQL 5.1.43 リリース(日本MySQLユーザ会(MyNA)) http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=1 ...</description>
    <content:encoded><![CDATA[　週末から週明けにかけて、MySQL 5.1 と 5.0 の最新バージョンがリリースされました。MySQL 5.0 シリーズは昨年末で EoL (End of Life) でもう新しいバージョンは出ないと思っていたのですが、セキュリティ上の重要な問題の修正ということでリリースされたものと思われます。  ○MySQL 5.1.43 リリース(日本MySQLユーザ会(MyNA)) http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=1 ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23263&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23263&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 01 Feb 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[MySQL][VP][Other]Engine Independent Test作成開始 VP-0.7リリース</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1243249875644802246.post-5582484666390007673</guid>
    <link>http://wild-growth-ja.blogspot.com/2010/01/mysqlvpotherengine-independent-test-vp.html</link>
    <description>Engine Independent Testというものを作り始めました。http://launchpad.net/engineindependenttestformysqlこれは、どんなストレージエンジンでも試験可能なテストを目指すもので、現在数多くあるストレージエンジン全体の品質の確認と担保を容易にすることを目的としています。草案は以下のwikiにあがっていたのですが、まだ作られてはいないようだったので、私が既に複数のストレージエンジンをリリースしておりそこで必要だったということもあり、作りはじめてみることにしました。http://forge.mysql.com/wiki/EngineIndependentTestSuiteまだ、作り始めではありますが、ご意見ご要望などいただけますと幸いです。Vertical Partitioningストレージエンジンのバージョン 0.7(alpha)をリリースしました。Vertical Partitioningストレージエンジンは、テーブルのVertical Partitioning用のストレージエンジンです。http://launchpad.net/vpformysql今回の主な変更は以下です。　MariaDBに対応しました。それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。</description>
    <content:encoded><![CDATA[Engine Independent Testというものを作り始めました。<br /><a href="http://launchpad.net/engineindependenttestformysql">http://launchpad.net/engineindependenttestformysql</a><br /><br />これは、どんなストレージエンジンでも試験可能なテストを目指すもので、現在数多くあるストレージエンジン全体の品質の確認と担保を容易にすることを目的としています。<br />草案は以下のwikiにあがっていたのですが、まだ作られてはいないようだったので、私が既に複数のストレージエンジンをリリースしておりそこで必要だったということもあり、作りはじめてみることにしました。<br /><a href="http://forge.mysql.com/wiki/EngineIndependentTestSuite">http://forge.mysql.com/wiki/EngineIndependentTestSuite</a><br /><br />まだ、作り始めではありますが、ご意見ご要望などいただけますと幸いです。<br /><br /><br />Vertical Partitioningストレージエンジンのバージョン 0.7(alpha)をリリースしました。<br />Vertical Partitioningストレージエンジンは、テーブルのVertical Partitioning用のストレージエンジンです。<br /><a href="http://launchpad.net/vpformysql">http://launchpad.net/vpformysql</a><br /><br />今回の主な変更は以下です。<br />　MariaDBに対応しました。<br /><br />それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1243249875644802246-5582484666390007673?l=wild-growth-ja.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23260&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23260&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sun, 31 Jan 2010 09:23:00 +0000</pubDate>
    <dc:creator>斯波健徳</dc:creator>
    <category>VP</category>
    <category>MySQL</category>
    <category>Other</category>
  </item>

  <item>
    <title>[mysql]早速MySQLメインサイトからダウンロードページへのリンクがなくなった</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100129/mysql_no_download_link</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100129/mysql_no_download_link</link>
    <description>　MySQLのダウンロードページは http://dev.mysql.com/ というサブドメインの下にあります。もちろんこのページにはメインサイト http://www.mysql.com/ からリンクが張ってあります。というか、ありました。  　どうやらこのリンクが外されたようです。mysql.com のトップページには MySQL Enterprise などの製品やトレーニング、イベントの情報だけが（そこは今まで通り)掲載されています。    　ダウンロードページやドキュメントが存在している h ...</description>
    <content:encoded><![CDATA[　MySQLのダウンロードページは http://dev.mysql.com/ というサブドメインの下にあります。もちろんこのページにはメインサイト http://www.mysql.com/ からリンクが張ってあります。というか、ありました。  　どうやらこのリンクが外されたようです。mysql.com のトップページには MySQL Enterprise などの製品やトレーニング、イベントの情報だけが（そこは今まで通り)掲載されています。    　ダウンロードページやドキュメントが存在している h ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23219&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23219&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 29 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[mysql]InnoDBでCOUNTしたくないとき</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kamipo/20100128/1264684675</guid>
    <link>http://d.hatena.ne.jp/kamipo/20100128/1264684675</link>
    <description>
			たとえば、MySQL を使ったお手軽メッセージキュー実装 - ドワンゴ 研究開発ブログに出てくるようなInnoDBをメッセージキューのように使っているときに、キューにどれだけメッセージが溜まってるかを確認したいとき、普通に考えるとCOUNTすると思う。

SELECT COUNT(&amp;#42;) AS count FROM test_queue;


			この軽い気持ちでしたCOUNTが、もしうっかりキューに100万レコードぐらいあったりするとInnoDBだとPRIMARYキー総なめとかしちゃってレスポンスにかかる0.1秒ぐらいのあいだ罪悪感に苛まれることでしょう。
			このとき冷静に考えると、もしキューが1件も処理されていなければ、idはauto_incrementなので特に細工していなければ

SELECT MAX(id) AS count FROM test_queue;


			これも全体のレコード数に等しいでしょう。
			キューが既に何件か処理されている場合でも、idが小さいほうから順番に処理されていくので

SELECT MAX(id) - MIN(id) + 1 AS count FROM test_queue;


			これで全体のレコード数に等しくなるはずです。
			EXPLAINを見ても

EXPLAIN SELECT MAX(id) - MIN(id) + 1 AS count FROM test_queue&amp;#92;G
&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42; 1. row &amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;&amp;#42;
           id: 1
  select_type: SIMPLE
        table: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra: Select tables optimized away
1 row in set (0.01 sec)


			Select tables optimized awayと出てるだけあってレコード数が増えても一瞬でレスポンスが返ってきます。
			

			こういうユースケースは実際ないかもしれないけど、とりあえずメモ。
		</description>
    <content:encoded><![CDATA[<div>
			<p>たとえば、<a href="http://info.dwango.co.jp/rd/2010/01/mysql.html" target="_blank">MySQL を使ったお手軽メッセージキュー実装 - ドワンゴ 研究開発ブログ</a><a href="http://b.hatena.ne.jp/entry/http%3A//info.dwango.co.jp/rd/2010/01/mysql.html" target="_blank"><img src="http://b.hatena.ne.jp/entry/image/http%3A//info.dwango.co.jp/rd/2010/01/mysql.html" alt="" /></a>に出てくるようなInnoDBをメッセージキューのように使っているときに、キューにどれだけメッセージが溜まってるかを確認したいとき、普通に考えるとCOUNTすると思う。</p>
<pre>
SELECT COUNT(&#42;) AS count FROM test_queue;
</pre>

			<p>この軽い気持ちでしたCOUNTが、もしうっかりキューに100万レコードぐらいあったりするとInnoDBだとPRIMARYキー総なめとかしちゃってレスポンスにかかる0.1秒ぐらいのあいだ罪悪感に苛まれることでしょう。</p>
			<p>このとき冷静に考えると、もしキューが1件も処理されていなければ、idはauto_incrementなので特に細工していなければ</p>
<pre>
SELECT MAX(id) AS count FROM test_queue;
</pre>

			<p>これも全体のレコード数に等しいでしょう。</p>
			<p>キューが既に何件か処理されている場合でも、idが小さいほうから順番に処理されていくので</p>
<pre>
SELECT MAX(id) - MIN(id) + 1 AS count FROM test_queue;
</pre>

			<p>これで全体のレコード数に等しくなるはずです。</p>
			<p>EXPLAINを見ても</p>
<pre>
EXPLAIN SELECT MAX(id) - MIN(id) + 1 AS count FROM test_queue&#92;G
&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42; 1. row &#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;&#42;
           id: 1
  select_type: SIMPLE
        table: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra: Select tables optimized away
1 row in set (0.01 sec)
</pre>

			<p>Select tables optimized awayと出てるだけあってレコード数が増えても一瞬でレスポンスが返ってきます。</p>
			<br>

			<p>こういうユースケースは実際ないかもしれないけど、とりあえずメモ。</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23208&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23208&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 28 Jan 2010 13:17:55 +0000</pubDate>
    <dc:creator>Kamizono Ryuta</dc:creator>
    <category>mysql</category>
  </item>

  <item>
    <title>【DBマガジン3月号特集】オープンソースDB障害対策マニュアル</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=833458</guid>
    <link>http://blog.kimuradb.com/?eid=833458</link>
    <description>
DB Magazine ( マガジン ) 2010年 03月号 [雑誌]
翔泳社

特集1の総論と、ハードウエア部分に寄稿いたしました。OSSDBに力点をおいて書いてみたので、興味のあるかたは是非参照してみてください。なお、MySQLパートの担当者は「MySQL全機能バイブル」著者の鈴木さん、Firebirdパートの担当者は木村と「Firebird徹底入門」を書いたはやしさんです。

----------------------------------------------------------------------------
　　      MySQL,PostgreSQL,Firebirdの3大 OSS DB が集合！
   DBマガジン2010年3月号 特集「オープンソースDB障害対策マニュアル」

　今月発売のDBマガジン2010年3月号の特集1では、活躍の場が広がったオープン
ソースデータベースの御三家(MySQL,PostgreSQL,Firebird)の障害対策が全46ページ
で取り上げられています。各コミュニティでも活躍される方々の執筆であり、
なかなか3つのデータベースがそろって同じテーマで書かれた記事は少ないので、
貴重な特集だと思います。
それぞれのデータベースをお使いの方にも、それぞれのデータベースの違いを知り
たい方にも是非ご覧いただきたいと思いご案内させていただきます。

バックアップ／リカバリからレプリケーション、クラスタまで
オープンソースDB障害対策マニュアル

 Part1 まずは基本から押さえたい障害対策の全体像と運用ノウハウ
　　　 キムラデービー 木村 明治

 Part2 バージョンごとの”クセ”を理解してMySQLのバックアップ／リストアを極める
       InterDB 鈴木 啓修

 Part3 PostgreSQLの障害対策に良く効くアーカイブログ／レプリケーション活用
       SRA OSS, Inc. 日本支社 矢吹 洋一
 
 Part4 単一ファイルDBのメリットを活かしたFirebirdの簡単バックアップ
       アナハイムテクノロジー株式会社 林 務

 Part5 DBサーバーのストレージを冗長化しハードウェア障害に備える
　　　 キムラデービー 木村 明治</description>
    <content:encoded><![CDATA[<a href="http://www.amazon.co.jp/DB-Magazine-%E3%83%9E%E3%82%AC%E3%82%B8%E3%83%B3-2010%E5%B9%B4-03%E6%9C%88%E5%8F%B7/dp/B0031OTZ4E%3FSubscriptionId=AKIAJY3MQPODX7WNOO7A&amp;tag=kimuradb-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=165953&amp;creativeASIN=B0031OTZ4E" target="_blank"><img border="0" src="http://ecx.images-amazon.com/images/I/51z4AABry4L._SL160_.jpg" alt="DB Magazine ( マガジン ) 2010年 03月号 [雑誌]" /></a><br />
<a href="http://www.amazon.co.jp/DB-Magazine-%E3%83%9E%E3%82%AC%E3%82%B8%E3%83%B3-2010%E5%B9%B4-03%E6%9C%88%E5%8F%B7/dp/B0031OTZ4E%3FSubscriptionId=AKIAJY3MQPODX7WNOO7A&amp;tag=kimuradb-22&amp;linkCode=xm2&amp;camp=2025&amp;creative=165953&amp;creativeASIN=B0031OTZ4E" target="_blank"><strong>DB Magazine ( マガジン ) 2010年 03月号 [雑誌]</strong></a><br />
翔泳社<br />
<br />
特集1の総論と、ハードウエア部分に寄稿いたしました。OSSDBに力点をおいて書いてみたので、興味のあるかたは是非参照してみてください。なお、MySQLパートの担当者は「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4774139750/kimuradb-22" target="_blank">MySQL全機能バイブル</a>」著者の鈴木さん、Firebirdパートの担当者は木村と「<a href="http://www.amazon.co.jp/exec/obidos/ASIN/4798119636/kimuradb-22" target="_blank">Firebird徹底入門</a>」を書いたはやしさんです。<br />
<br />
----------------------------------------------------------------------------<br />
　　      MySQL,PostgreSQL,Firebirdの3大 OSS DB が集合！<br />
   DBマガジン2010年3月号 特集「オープンソースDB障害対策マニュアル」<br />
<br />
　今月発売のDBマガジン2010年3月号の特集1では、活躍の場が広がったオープン<br />
ソースデータベースの御三家(MySQL,PostgreSQL,Firebird)の障害対策が全46ページ<br />
で取り上げられています。各コミュニティでも活躍される方々の執筆であり、<br />
なかなか3つのデータベースがそろって同じテーマで書かれた記事は少ないので、<br />
貴重な特集だと思います。<br />
それぞれのデータベースをお使いの方にも、それぞれのデータベースの違いを知り<br />
たい方にも是非ご覧いただきたいと思いご案内させていただきます。<br />
<br />
バックアップ／リカバリからレプリケーション、クラスタまで<br />
オープンソースDB障害対策マニュアル<br />
<br />
 Part1 まずは基本から押さえたい障害対策の全体像と運用ノウハウ<br />
　　　 <a href="http://kimuradb.com/" target="_blank">キムラデービー</a> 木村 明治<br />
<br />
 Part2 バージョンごとの”クセ”を理解してMySQLのバックアップ／リストアを極める<br />
       <a href="http://www.interdb.jp/" target="_blank">InterDB</a> 鈴木 啓修<br />
<br />
 Part3 PostgreSQLの障害対策に良く効くアーカイブログ／レプリケーション活用<br />
       <a href="http://www.sraoss.co.jp/" target="_blank">SRA OSS, Inc. 日本支社</a> 矢吹 洋一<br />
 <br />
 Part4 単一ファイルDBのメリットを活かしたFirebirdの簡単バックアップ<br />
       <a href="http://www.anaheim-tech.com/" target="_blank">アナハイムテクノロジー株式会社</a> 林 務<br />
<br />
 Part5 DBサーバーのストレージを冗長化しハードウェア障害に備える<br />
　　　 <a href="http://kimuradb.com/" target="_blank">キムラデービー</a> 木村 明治<br /><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23207&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23207&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 28 Jan 2010 12:17:17 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>クロスデータベース</category>
  </item>

  <item>
    <title>[mysql]Oracle + Sun Strategy Update での MySQL の話題</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100128/oracle_sun</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100128/oracle_sun</link>
    <description>　今朝、表記のイベントが開催され、Webcast で中継もされました。世間は折しも Apple(和名：おりんご様)の発表で盛りあがっている時。地味にひとり Webcast を見ていました。 　キーワードは「直販」と「We’re hiring!」(私の主観による)。  　前半は主に Sun のハードウェアの話などを中心に。Javaの話になり、、、朝4時過ぎ(日本時間)にようやくMySQLの話が出てきました。 　が。。。。シート1枚だけ(笑)。あっという間に OpenOffice の話に移ってしまいました ...</description>
    <content:encoded><![CDATA[　今朝、表記のイベントが開催され、Webcast で中継もされました。世間は折しも Apple(和名：おりんご様)の発表で盛りあがっている時。地味にひとり Webcast を見ていました。 　キーワードは「直販」と「We’re hiring!」(私の主観による)。  　前半は主に Sun のハードウェアの話などを中心に。Javaの話になり、、、朝4時過ぎ(日本時間)にようやくMySQLの話が出てきました。 　が。。。。シート1枚だけ(笑)。あっという間に OpenOffice の話に移ってしまいました ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23198&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23198&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 28 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>InnoDB で fsync しない方法と、そのメリット</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kazuhooku/20100126/1264486517</guid>
    <link>http://d.hatena.ne.jp/kazuhooku/20100126/1264486517</link>
    <description>
			InnoDB はデフォルトでは同期I/O *1だけど、

innodb_flush_method=nosync


			っていう隠しオプションがあって、それを有効にすると MyISAM みたく fsync しなくなるよ。ってソースコードちら見した自分が言ってた。
			この設定がうれしいのって、どういう時だろう？
			MySQL &amp;#8211; Wikipedia | MySQL Expert | MySQL Performance | MySQL Scalability にも書いてあるけど、スレーブ運用してて「クラッシュしたらリカバリで数時間かかるし、データ一貫性チェックするくらいだったらバックアップからリストアして再開しちゃうもんね〜」的な向きにはおすすめなのかしらん。
			とは言え、fsync しないってことは OS のページキャッシュに書込みデータが滞留することになる → buffer_pool 削る必要が出てくる → 無駄な I/O が増える、わけで、設定するメリットがあるかどうかは知らない。swappiness=0 にしといて、数百MBのページキャッシュに RAID BBU キャッシュと同等の役割をさせる、ってのはあるのかな。でも、そういうケースなら inndb_flush_log_at_trx_commit=[0|2] にしとけば同等のパフォーマンスが出そうに思う。
			あるいは、バッファプールが小さい、ウェブサーバと MySQL を混在させているような環境で、MyISAM に迫るパフォーマンスを稼ぎたい時とかは便利なのかも。
		
		
			*1：fsync, O_DIRECT, O_SYNC 等を使うということ
		</description>
    <content:encoded><![CDATA[<div>
			<p>InnoDB はデフォルトでは同期I/O <span><a href="http://d.hatena.ne.jp/kazuhooku/#f1" name="fn1" title="fsync, O_DIRECT, O_SYNC 等を使うということ">*1</a></span>だけど、</p>
<pre>
innodb_flush_method=nosync
</pre>

			<p>っていう隠しオプションがあって、それを有効にすると MyISAM みたく fsync しなくなるよ。ってソースコードちら見した自分が言ってた。</p>
			<p>この設定がうれしいのって、どういう時だろう？</p>
			<p><a href="http://ronaldbradford.com/blog/mysql-wikipedia-2007-06-15/" target="_blank">MySQL &#8211; Wikipedia | MySQL Expert | MySQL Performance | MySQL Scalability</a> にも書いてあるけど、スレーブ運用してて「クラッシュしたらリカバリで数時間かかるし、データ一貫性チェックするくらいだったらバックアップからリストアして再開しちゃうもんね〜」的な向きにはおすすめなのかしらん。</p>
			<p>とは言え、fsync しないってことは OS のページキャッシュに書込みデータが滞留することになる → buffer_pool 削る必要が出てくる → 無駄な I/O が増える、わけで、設定するメリットがあるかどうかは知らない。swappiness=0 にしといて、数百MBのページキャッシュに RAID BBU キャッシュと同等の役割をさせる、ってのはあるのかな。でも、そういうケースなら inndb_flush_log_at_trx_commit=[0|2] にしとけば同等のパフォーマンスが出そうに思う。</p>
			<p>あるいは、バッファプールが小さい、ウェブサーバと MySQL を混在させているような環境で、MyISAM に迫るパフォーマンスを稼ぎたい時とかは便利なのかも。</p>
		</div>
		<div>
			<p><a href="http://d.hatena.ne.jp/kazuhooku/#fn1" name="f1">*1</a>：fsync, O_DIRECT, O_SYNC 等を使うということ</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23179&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23179&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 26 Jan 2010 06:15:17 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
  </item>

  <item>
    <title>[mysql]知らなかった。mysql の -o オプション</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100126/p1</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100126/p1</link>
    <description>　mysql クライアントコマンドにはたくさんのオプションがあります*1。 その中には使ったことのないオプションもいっぱいあって、私はこの -o オプションというのを知りませんでした。   -o, --one-database Only update the default database. This is useful for skipping updates to other database in the update log.   　指定したスキーマだけをターゲットにできるもののようで、更新 ...</description>
    <content:encoded><![CDATA[　mysql クライアントコマンドにはたくさんのオプションがあります*1。 その中には使ったことのないオプションもいっぱいあって、私はこの -o オプションというのを知りませんでした。   -o, --one-database Only update the default database. This is useful for skipping updates to other database in the update log.   　指定したスキーマだけをターゲットにできるもののようで、更新 ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23194&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23194&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 26 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[mysql]InnoDB PluginとXtraDBのオプションのメモ</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kamipo/20100125/1264439436</guid>
    <link>http://d.hatena.ne.jp/kamipo/20100125/1264439436</link>
    <description>
			
				 mysql 5.1.42
				 InnoDB Plugin 1.0.6
				 XtraDB 1.0.6-9
			
			の場合。
			InnoDB -&amp;#62; InnoDB Pluginで増えたオプション

innodb_adaptive_flushing       ON
innodb_change_buffering        inserts
innodb_file_format     Antelope
innodb_file_format_check       Antelope
innodb_io_capacity     200
innodb_old_blocks_pct  37
innodb_old_blocks_time 0
innodb_read_ahead_threshold    56
innodb_read_io_threads 4
innodb_replication_delay       0
innodb_spin_wait_delay 6
innodb_stats_sample_pages      8
innodb_strict_mode     OFF
innodb_use_sys_malloc  ON
innodb_write_io_threads        4


			InnoDB Plugin -&amp;#62; XtraDBで増えたオプション

innodb_adaptive_checkpoint     estimate
innodb_checkpoint_age_target   0
innodb_dict_size_limit 0
innodb_enable_unsafe_group_commit      0
innodb_expand_import   0
innodb_extra_rsegments 0
innodb_extra_undoslots OFF
innodb_fast_recovery   ON
innodb_flush_neighbor_pages    1
innodb_ibuf_accel_rate 100
innodb_ibuf_active_contract    1
innodb_ibuf_max_size   2147467264
innodb_overwrite_relay_log_info        OFF
innodb_read_ahead      linear
innodb_recovery_stats  OFF
innodb_relax_table_creation    0
innodb_show_locks_held 10
innodb_show_verbose_locks      0
innodb_stats_auto_update       1
innodb_stats_method    nulls_equal
innodb_stats_update_need_lock  1
innodb_thread_concurrency_timer_based  OFF
innodb_use_purge_thread        1


			それぞれのオプションについてはそのうち調べる。
		</description>
    <content:encoded><![CDATA[<div>
			<ul>
				<li> mysql 5.1.42</li>
				<li> InnoDB Plugin 1.0.6</li>
				<li> XtraDB 1.0.6-9</li>
			</ul>
			<p>の場合。</p>
			<p>InnoDB -&#62; InnoDB Pluginで増えたオプション</p>
<pre>
innodb_adaptive_flushing       ON
innodb_change_buffering        inserts
innodb_file_format     Antelope
innodb_file_format_check       Antelope
innodb_io_capacity     200
innodb_old_blocks_pct  37
innodb_old_blocks_time 0
innodb_read_ahead_threshold    56
innodb_read_io_threads 4
innodb_replication_delay       0
innodb_spin_wait_delay 6
innodb_stats_sample_pages      8
innodb_strict_mode     OFF
innodb_use_sys_malloc  ON
innodb_write_io_threads        4
</pre>

			<p>InnoDB Plugin -&#62; XtraDBで増えたオプション</p>
<pre>
innodb_adaptive_checkpoint     estimate
innodb_checkpoint_age_target   0
innodb_dict_size_limit 0
innodb_enable_unsafe_group_commit      0
innodb_expand_import   0
innodb_extra_rsegments 0
innodb_extra_undoslots OFF
innodb_fast_recovery   ON
innodb_flush_neighbor_pages    1
innodb_ibuf_accel_rate 100
innodb_ibuf_active_contract    1
innodb_ibuf_max_size   2147467264
innodb_overwrite_relay_log_info        OFF
innodb_read_ahead      linear
innodb_recovery_stats  OFF
innodb_relax_table_creation    0
innodb_show_locks_held 10
innodb_show_verbose_locks      0
innodb_stats_auto_update       1
innodb_stats_method    nulls_equal
innodb_stats_update_need_lock  1
innodb_thread_concurrency_timer_based  OFF
innodb_use_purge_thread        1
</pre>

			<p>それぞれのオプションについてはそのうち調べる。</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23171&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23171&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 25 Jan 2010 17:10:36 +0000</pubDate>
    <dc:creator>Kamizono Ryuta</dc:creator>
    <category>mysql</category>
  </item>

  <item>
    <title>MySQL Connector/J 5.1.11リリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sh2/20100123</guid>
    <link>http://d.hatena.ne.jp/sh2/20100123</link>
    <description>MySQLのJDBCドライバ、Connector/Jの5.1.11がリリースされました。今回は機能変更が1件、バグ修正が10件となっています。 今回修正されたバグのうち、Bug #48172について簡単に解説しておきます。2009年5月にMySQL Connector/Jにおける大量INSERTのチューニングというエントリで接続プロパティrewriteBatchedStatementsを用いたチューニング手法をご紹介しましたが、Bug #48172はこの機能に関する不具合です。曰く、  INSERT INTO test (col1, col2) VALUES(?, ?)  VALUESのあとにスペースを空けずに括弧を書いてしまうと、SQLの書き換えが行われないというものです。ちょっとしょんぼり(´・ω・`)してしまいますね。 とりあえず、直ってよかったです。</description>
    <content:encoded><![CDATA[<span>MySQL</span>のJDBCドライバ、Connector/Jの5.1.11がリリースされました。今回は機能変更が1件、バグ修正が10件となっています。 今回修正されたバグのうち、Bug #48172について簡単に解説しておきます。2009年5月に<span>MySQL</span> Connector/Jにおける大量INSERTのチューニングというエントリで接続プロパティrewriteBatchedStatementsを用いたチューニング手法をご紹介しましたが、Bug #48172はこの機能に関する不具合です。曰く、  INSERT INTO test (col1, col2) VALUES(?, ?)  VALUESのあとにスペースを空けずに括弧を書いてしまうと、SQLの書き換えが行われないというものです。ちょっとしょんぼり(´・ω・`)してしまいますね。 とりあえず、直ってよかったです。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23160&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23160&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Sat, 23 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sadao Hiratsuka</dc:creator>
  </item>

  <item>
    <title>死んだプロセスのスタックトレースを自動収集するデーモンを書いた (そして、その出力を開発者に送ってあげると喜ばれるよという話)</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kazuhooku/20100122/1264149706</guid>
    <link>http://d.hatena.ne.jp/kazuhooku/20100122/1264149706</link>
    <description>
			死んだプロセス (あるいは kill したプロセス) の core イメージから自動的にスタックトレースを収集するデーモンを書いたので、これをセットアップしてサーバにインストールしとくといいかもです (bt_cores at master from kazuho’s kaztools - GitHub)。Linux のみ対応*1。使い方は bt_cores --help とするか、perl Makefile.PL &amp;&amp; make install して man bt_cores。
			具体的にいうと、Q4M とか Incline とか kazuho product が落ちたり固まったりしたらスタックトレース送ってくれると、私がうれしいです (古いバージョンのスタックトレースだととても悲しいです)。コアファイルは内部データがいろいろ入ってるから外部の人には見せられないけど、スタックトレースならテキストファイルだから、やばいとこだけ伏せ字にして送ってくれますよね？　えへ。
			... ということで解決するはずだったんですが ...
			MySQL の場合は MySQL Bugs: #21723: Should be able to dump core after setuid() under Linux が直ってないのを忘れてた。↑の方法は使えない ToT
			しょうがないので Q4M が固まった場合は、

% echo &amp;#39;thread apply all bt&amp;#39; &amp;#62; allbt.cmd


			のようにして gdb のコマンドをあらかじめファイルに書き出していて、あとは

% sudo gdb -batch -x tmp/allbt.cmd /usr/local/mysql/libexec/mysqld `sudo cat /usr/local/mysql/data/localhost.pid` &amp;#62; stacktrace.txt


			のようして全スレッドのスタックトレースが取って送ってください。この方法だと、SEGV で死んじゃったりした場合の情報が得られないのが痛いですが。なにはともあれ、よろしくお願いします。
		
		
			*1：あと OSX でも動くけど説明書いてない
		</description>
    <content:encoded><![CDATA[<div>
			<p>死んだプロセス (あるいは kill したプロセス) の core イメージから自動的にスタックトレースを収集するデーモンを書いたので、これをセットアップしてサーバにインストールしとくといいかもです (<a href="http://github.com/kazuho/kaztools/blob/master/bt_cores" target="_blank">bt_cores at master from kazuho’s kaztools - GitHub</a>)。Linux のみ対応<span><a href="http://d.hatena.ne.jp/kazuhooku/#f1" name="fn1" title="あと OSX でも動くけど説明書いてない">*1</a></span>。使い方は bt_cores --help とするか、perl Makefile.PL && make install して man bt_cores。</p>
			<p>具体的にいうと、Q4M とか Incline とか kazuho product が落ちたり固まったりしたらスタックトレース送ってくれると、私がうれしいです (<b>古いバージョンのスタックトレースだととても悲しいです</b>)。コアファイルは内部データがいろいろ入ってるから外部の人には見せられないけど、スタックトレースならテキストファイルだから、やばいとこだけ伏せ字にして送ってくれますよね？　えへ。</p>
			<p>... ということで解決するはずだったんですが ...</p>
			<p>MySQL の場合は <a href="http://bugs.mysql.com/bug.php?id=21723" target="_blank">MySQL Bugs: #21723: Should be able to dump core after setuid() under Linux</a> が直ってないのを忘れてた。↑の方法は使えない ToT</p>
			<p>しょうがないので Q4M が固まった場合は、</p>
<pre>
% echo &#39;thread apply all bt&#39; &#62; allbt.cmd
</pre>

			<p>のようにして gdb のコマンドをあらかじめファイルに書き出していて、あとは</p>
<pre>
% sudo gdb -batch -x tmp/allbt.cmd /usr/local/mysql/libexec/mysqld `sudo cat /usr/local/mysql/data/localhost.pid` &#62; stacktrace.txt
</pre>

			<p>のようして全スレッドのスタックトレースが取って送ってください。この方法だと、SEGV で死んじゃったりした場合の情報が得られないのが痛いですが。なにはともあれ、よろしくお願いします。</p>
		</div>
		<div>
			<p><a href="http://d.hatena.ne.jp/kazuhooku/#fn1" name="f1">*1</a>：あと OSX でも動くけど説明書いてない</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23144&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23144&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 22 Jan 2010 08:41:46 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
  </item>

  <item>
    <title>[event][devsumi][mysql]今年もデブサミ開催！ (2/18, 19)</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100122/devsumi2010a</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100122/devsumi2010a</link>
    <description>　今年も翔泳社主催の通称「デブサミ」(痩せていても参加できる）こと「Developers Summit 2010」が開催されます。  ◆Developers Summit 2010 オフィシャルサイト http://codezine.jp/devsumi/2010  　デブサミには毎年テーマが決められていて（第1回のテーマが見つけられなかったけど、最初はなかったのかな）、この変遷を辿ると時代が見えて面白いです。(以下、回数勘違いしてたらすいません）   第１回 (2003) 第２回 (2004) 10 ...</description>
    <content:encoded><![CDATA[　今年も翔泳社主催の通称「デブサミ」(痩せていても参加できる）こと「Developers Summit 2010」が開催されます。  ◆Developers Summit 2010 オフィシャルサイト http://codezine.jp/devsumi/2010  　デブサミには毎年テーマが決められていて（第1回のテーマが見つけられなかったけど、最初はなかったのかな）、この変遷を辿ると時代が見えて面白いです。(以下、回数勘違いしてたらすいません）   第１回 (2003) 第２回 (2004) 10 ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23143&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23143&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 22 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[MySQL][Spider]Spider-2.12リリース</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1243249875644802246.post-5560493320939178025</guid>
    <link>http://wild-growth-ja.blogspot.com/2010/01/mysqlspiderspider-212.html</link>
    <description>Spiderストレージエンジンのバージョン 2.12(beta)をリリースしました。Spiderストレージエンジンは、database sharding用のストレージエンジンです。http://spiderformysql.com/今回の主な変更は以下です。　MariaDBに対応しました。・サーバパラメータに「spider_connect_mutex」「spider_connect_retry_count」「spider_connect_retry_interval」を追加しました。　これらのパラメータは、接続処理が激しくなった際に起こる接続失敗に対応するためのものです。(この現象は特に「spider_conn_recycle_mode=0」を利用している場合に発生します)それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。Mohammadさん、Jayさん、バグレポートありがとうございます。</description>
    <content:encoded><![CDATA[Spiderストレージエンジンのバージョン 2.12(beta)をリリースしました。<br />Spiderストレージエンジンは、database sharding用のストレージエンジンです。<br /><a href="http://spiderformysql.com/">http://spiderformysql.com/</a><br /><br />今回の主な変更は以下です。<br />　MariaDBに対応しました。<br />・サーバパラメータに「spider_connect_mutex」「spider_connect_retry_count」「spider_connect_retry_interval」を追加しました。<br />　これらのパラメータは、接続処理が激しくなった際に起こる接続失敗に対応するためのものです。(この現象は特に「spider_conn_recycle_mode=0」を利用している場合に発生します)<br /><br />それ以外の変更については、ダウンロードドキュメント中の「99_change_logs.txt」をご確認下さい。<br />Mohammadさん、Jayさん、バグレポートありがとうございます。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1243249875644802246-5560493320939178025?l=wild-growth-ja.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23136&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23136&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 21 Jan 2010 18:20:00 +0000</pubDate>
    <dc:creator>斯波健徳</dc:creator>
    <category>MySQL</category>
    <category>Spider</category>
  </item>

  <item>
    <title>Q4M 0.9.2 prerelease avaiable fixing data corruption on 32bit systems</title>
    <guid isPermaLink="false">tag:typepad.jp,2003:post-36934089</guid>
    <link>http://developer.cybozu.co.jp/kazuho/2010/01/thanks-to-a-use.html</link>
    <description>Thanks to a user of Q4M, I have found a bug that would likely lead to data corruption on 32bit versions of Q4M.&amp;nbsp; 64bit versions are unaffected.

Q4M by default uses mmap(2) to read from data files.&amp;nbsp; On 32bit systems, it tries to map max. 1GB per each table into memory using mmap.&amp;nbsp; When mmap fails to map memory due to low memory, Q4M falls back to file I/O to read the data.

However there was a bug in handling the response from mmap, that led to reading corrupt data from database files when mmap(2) failed after the size of the underlying file was grown / shrunk by Q4M.&amp;nbsp; And since Q4M writes back the corrupt data into the database file when rows are being consumed, the bug will likely destroy the database files.

I have fixed the bug and have uploaded Q4M 0.9.2, into the prerelease directory at q4m.31tools.com/dist/pre.&amp;nbsp; Source tarball and prebuilt binaries for MySQL 5.1.42 for 32bit linux are available.

If you are using 32bit versions of Q4M, I highly recommend either to update to 0.9.2 or switch to 64bit versions if possible.

BTW in 0.9.2 release, I also changed the maximum mmap size per table from 1GB to 256MB, to lower the possiblity of low memory.&amp;nbsp; However this countermeasure might not be sufficient in some cases, i.e. databases having many Q4M tables or if other storage engines also used a lot of memory.&amp;nbsp; I am considering of just disabling the use of mmap(2) on 32bit systems in future releases.&amp;nbsp; If you have any comments on this, please let me know.</description>
    <content:encoded><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p>Thanks to a user of <a href="http://q4m.31tools.com/">Q4M</a>, I have found a bug that would likely lead to data corruption on 32bit versions of Q4M.&nbsp; 64bit versions are unaffected.</p>

<p>Q4M by default uses mmap(2) to read from data files.&nbsp; On 32bit systems, it tries to map max. 1GB per each table into memory using mmap.&nbsp; When mmap fails to map memory due to low memory, Q4M falls back to file I/O to read the data.</p>

<p>However there was a bug in handling the response from mmap, that led to reading corrupt data from database files when mmap(2) failed after the size of the underlying file was grown / shrunk by Q4M.&nbsp; And since Q4M writes back the corrupt data into the database file when rows are being consumed, the bug will likely destroy the database files.</p>

<p>I have fixed the bug and have uploaded Q4M 0.9.2, into the prerelease directory at <a href="http://q4m.31tools.com/dist/pre/">q4m.31tools.com/dist/pre</a>.&nbsp; Source tarball and prebuilt binaries for MySQL 5.1.42 for 32bit linux are available.</p>

<p>If you are using 32bit versions of Q4M, I highly recommend either to update to 0.9.2 or switch to 64bit versions if possible.</p>

<p>BTW in 0.9.2 release, I also changed the maximum mmap size per table from 1GB to 256MB, to lower the possiblity of low memory.&nbsp; However this countermeasure might not be sufficient in some cases, i.e. databases having many Q4M tables or if other storage engines also used a lot of memory.&nbsp; I am considering of just disabling the use of mmap(2) on 32bit systems in future releases.&nbsp; If you have any comments on this, please let me know.</p></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23135&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23135&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 21 Jan 2010 16:26:00 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
    <category>in English</category>
    <category>MySQL</category>
  </item>

  <item>
    <title>そろそろMySQL Workbench 5.2についてひとこと言っておくか。</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-570640258576686654</guid>
    <link>http://nippondanji.blogspot.com/2010/01/mysql-workbench-52.html</link>
    <description>MySQLといえば、コマンドラインで操作するしかできないようなイメージが世間では定着してしまっている気がするのだが、実はちゃんとGUIも存在する。MySQLはかねてより（MySQL AB時代から）オフィシャルなGUIツールとして、管理ツールとしてMySQL Administrator、SQL文を編集＆実行するためのQuery Browser、そして他のRDBMSからの移行ツールであるMigration Toolkitという3つのツールを提供していたのだが、先日それらのツールに対して開発終了のお知らせが出てしまった。オフィシャルなGUIツールはもう無くなるのか？！！と思ってしまわれるかも知れないが、どうか焦らないで頂きたい。現在、MySQLが提供するGUIツールとして活発に開発が続けられているものとして、MySQL Workbenchというものがある。このツールは、ビジュアル的に（実体相関図＝EER図を使って）テーブルの設計を行うためのツールである。テーブルを設計しているときのイメージは次のようなものだ。これは、MySQLが提供しているオフィシャルサンプルデータベースである「employees」をリバースエンジニアリングしたものであり、自分で設計したモデルではないので恐縮であるが、雰囲気だけでも掴んで頂ければと思う。（むしろ、簡単にリバースエンジニアリングができるので、既存のテーブルをちょいとビジュアル的に相関関係を表示したいという場合にWorkbenchは小回りが利いて便利。）さらに、スキーマの変更管理などが出来たりして、なかなか気が利いている点も見逃せない。そんなこんなでMySQL Workbenchは割と人気のツールだったりする。MySQL Workbenchは現在進行形で進化を続けており、現在β版であるバージョン5.2では前述のMySQL AdministratorとQuery Browser相当の機能が加わっている！MySQL Workbencは、単にEER図を使ってテーブルを設計するだけのツールではなく、MySQL ServerへアクセスするためのSingle Point of Contactへと変貌しつつあるのである。前置きが長くなったが、今日はそのMySQL Workbench 5.2について紹介しよう。MySQL Workbench 5.2を入手するには、ダウンロードページへアクセスして、「Development Releases」タブを開いて適切なプラットフォーム向けのバージョンをダウンロードして頂きたい。Windows、Mac、Linux向けのバイナリが用意されている。もちろんライセンスはGPLだ。MySQL Workbenchは直感的に使えるツールなので、インストール方法や使い方の詳細については説明を割愛する。その辺の細かいことについてはマニュアルを参照して頂きたい。MySQL Workbench 5.2では、次のようなホーム画面が追加されている。この画面において、使いたい機能を選択するのだ、左から順にSQL Development（Query Browser相当）、Data Modeling（従来からあるWorkbenchの機能）、Server Administration（MySQL Administrator相当）となっている。SQL Development機能を利用する場合には、まずは接続設定をするために「New Connection」ボタンを、Server Administration機能を使いたい場合には「New Server Instance」ボタンを押して、対象のMySQL Serverに関する情報を入力しよう。そうすればホーム画面に接続やインスタンスが表示され、アクセスできるようになる。次はSQL Developmentの画面である。SQLのキーワードがハイライト表示されたり、構文のチェックなどを行ってくれるので、入力のミスが低減することだろう。次の画面はストアドプロシージャの編集画面だが、このように長文を編集するときにはさらに便利さを実感できるだろう。コードの折りたたみ機能もついている。駆け足で進むが、お次はServer Administration機能の説明である。Server Administrationでは、MySQL Serverインスタンスの起動と停止設定（my.cnf）の編集ユーザーアカウントの管理セッション（クライアントからの接続）の管理サーバーのステータス監視データのバックアップログの表示などの機能が利用出来る。また、負荷状況が一目で分かるグラフが常に表示されているので、管理対象のサーバーがどんな状態かがすぐに把握できるようになっている。次は設定の編集画面であるが、設定値が機能ごとにカテゴリ分けされていて便利である。次はバックアップ機能の画面である。現在のバージョンでは、まだバックアップのプロジェクトを作成したり、スケジューリングしたりといった機能はないのだが、ちょいとデータをバックアップしたい場合などにはいいだろう。（mysqldumpのラッパーなので、データ量が多すぎるときは時間がかかるので注意が必要！本番環境じゃなくて、テスト環境でデータを移行したいときなんかには便利かも知れない。）そんなわけで今日はMySQL Workbench 5.2について紹介したが、MySQLをCLIではなくGUIで管理したいと考えているならば、是非MySQL Workbenchを試して頂きたい。※追記1：バックアップ機能は建設予定地です。まだご利用になれません。※追記2：MySQL Workbenchには、機能が強化された有償版もあります。※追記3：Migration Toolkit相当の機能は、将来のバージョンに搭載予定です。</description>
    <content:encoded><![CDATA[MySQLといえば、コマンドラインで操作するしかできないようなイメージが世間では定着してしまっている気がするのだが、実はちゃんとGUIも存在する。<br /><br />MySQLはかねてより（MySQL AB時代から）オフィシャルなGUIツールとして、管理ツールとしてMySQL Administrator、SQL文を編集＆実行するためのQuery Browser、そして他のRDBMSからの移行ツールであるMigration Toolkitという3つのツールを提供していたのだが、先日それらのツールに対して<a href="http://www-jp.mysql.com/support/eol-notice.html">開発終了のお知らせ</a>が出てしまった。<br /><br /><b><span>オフィシャルなGUIツールはもう無くなるのか？！！</span></b>と思ってしまわれるかも知れないが、<b>どうか焦らないで頂きたい。</b><br /><br />現在、MySQLが提供するGUIツールとして活発に開発が続けられているものとして、MySQL Workbenchというものがある。このツールは、ビジュアル的に（実体相関図＝EER図を使って）テーブルの設計を行うためのツールである。テーブルを設計しているときのイメージは次のようなものだ。<br /><br /><div><a href="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exWQsWc7I/AAAAAAAAAQ0/4L7OIXEe0wk/s1600-h/wb-eer.png" imageanchor="1"><img border="0" height="468" src="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exWQsWc7I/AAAAAAAAAQ0/4L7OIXEe0wk/s640/wb-eer.png" width="640" /></a><br /></div><br />これは、MySQLが提供しているオフィシャルサンプルデータベースである「employees」をリバースエンジニアリングしたものであり、自分で設計したモデルではないので恐縮であるが、雰囲気だけでも掴んで頂ければと思う。（むしろ、簡単にリバースエンジニアリングができるので、既存のテーブルをちょいとビジュアル的に相関関係を表示したいという場合にWorkbenchは小回りが利いて便利。）さらに、スキーマの変更管理などが出来たりして、なかなか気が利いている点も見逃せない。そんなこんなでMySQL Workbenchは割と人気のツールだったりする。<br /><br />MySQL Workbenchは現在進行形で進化を続けており、現在β版である<b><span>バージョン5.2では前述のMySQL AdministratorとQuery Browser相当の機能が加わっている！</span></b>MySQL Workbencは、単にEER図を使ってテーブルを設計するだけのツールではなく、MySQL ServerへアクセスするためのSingle Point of Contactへと変貌しつつあるのである。<br /><br />前置きが長くなったが、今日はそのMySQL Workbench 5.2について紹介しよう。MySQL Workbench 5.2を入手するには、<b><a href="http://dev.mysql.com/downloads/workbench">ダウンロードページ</a></b>へアクセスして、「Development Releases」タブを開いて適切なプラットフォーム向けのバージョンをダウンロードして頂きたい。Windows、Mac、Linux向けのバイナリが用意されている。<b>もちろんライセンスはGPLだ。</b><br /><br />MySQL Workbenchは直感的に使えるツールなので、インストール方法や使い方の詳細については説明を割愛する。その辺の細かいことについては<a href="http://dev.mysql.com/doc/workbench/en/index.html">マニュアル</a>を参照して頂きたい。<br /><br />MySQL Workbench 5.2では、次のようなホーム画面が追加されている。<br /><br /><div><a href="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exP3aslvI/AAAAAAAAAQs/83OfkxliFy8/s1600-h/wb-home.png" imageanchor="1"><img border="0" height="482" src="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exP3aslvI/AAAAAAAAAQs/83OfkxliFy8/s640/wb-home.png" width="640" /></a><br /></div><br />この画面において、使いたい機能を選択するのだ、左から順にSQL Development（Query Browser相当）、Data Modeling（従来からあるWorkbenchの機能）、Server Administration（MySQL Administrator相当）となっている。<br /><br />SQL Development機能を利用する場合には、まずは接続設定をするために「New Connection」ボタンを、Server Administration機能を使いたい場合には「New Server Instance」ボタンを押して、対象のMySQL Serverに関する情報を入力しよう。そうすればホーム画面に接続やインスタンスが表示され、アクセスできるようになる。<br /><br />次はSQL Developmentの画面である。<br /><br /><div><a href="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exd628MfI/AAAAAAAAAQ8/kOGCMru-vek/s1600/wb-query.png" imageanchor="1"><img border="0" height="472" src="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exd628MfI/AAAAAAAAAQ8/kOGCMru-vek/s640/wb-query.png" width="640" /></a><br /></div><br />SQLのキーワードがハイライト表示されたり、構文のチェックなどを行ってくれるので、入力のミスが低減することだろう。<br /><br />次の画面はストアドプロシージャの編集画面だが、このように長文を編集するときにはさらに便利さを実感できるだろう。コードの折りたたみ機能もついている。<br /><br /><div><a href="http://4.bp.blogspot.com/_3l-X4JQ1EX4/S1exiDeuqaI/AAAAAAAAARE/UWvWpzHrycE/s1600-h/wb-proc.png" imageanchor="1"><img border="0" height="556" src="http://4.bp.blogspot.com/_3l-X4JQ1EX4/S1exiDeuqaI/AAAAAAAAARE/UWvWpzHrycE/s640/wb-proc.png" width="640" /></a><br /></div><br />駆け足で進むが、お次はServer Administration機能の説明である。Server Administrationでは、<br /><ul><li>MySQL Serverインスタンスの起動と停止</li><li>設定（my.cnf）の編集</li><li>ユーザーアカウントの管理</li><li>セッション（クライアントからの接続）の管理</li><li>サーバーのステータス監視</li><li>データのバックアップ</li><li>ログの表示</li></ul>などの機能が利用出来る。また、負荷状況が一目で分かるグラフが常に表示されているので、管理対象のサーバーがどんな状態かがすぐに把握できるようになっている。<br /><br /><div><a href="http://2.bp.blogspot.com/_3l-X4JQ1EX4/S1exk4E50UI/AAAAAAAAARM/KI_O0MXDPY4/s1600-h/wb-admin.png" imageanchor="1"><img border="0" height="472" src="http://2.bp.blogspot.com/_3l-X4JQ1EX4/S1exk4E50UI/AAAAAAAAARM/KI_O0MXDPY4/s640/wb-admin.png" width="640" /></a><br /></div><br />次は設定の編集画面であるが、設定値が機能ごとにカテゴリ分けされていて便利である。<br /><br /><div><a href="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exnNn7moI/AAAAAAAAARU/xaGzzBf9Mvk/s1600-h/wb-config.png" imageanchor="1"><img border="0" height="492" src="http://1.bp.blogspot.com/_3l-X4JQ1EX4/S1exnNn7moI/AAAAAAAAARU/xaGzzBf9Mvk/s640/wb-config.png" width="640" /></a><br /></div><br />次はバックアップ機能の画面である。現在のバージョンでは、まだバックアップのプロジェクトを作成したり、スケジューリングしたりといった機能はないのだが、ちょいとデータをバックアップしたい場合などにはいいだろう。（mysqldumpのラッパーなので、データ量が多すぎるときは時間がかかるので注意が必要！本番環境じゃなくて、テスト環境でデータを移行したいときなんかには便利かも知れない。）<br /><br /><div><a href="http://2.bp.blogspot.com/_3l-X4JQ1EX4/S1expFjwPxI/AAAAAAAAARc/iOnnrhHBA1k/s1600-h/wb-backup.png" imageanchor="1"><img border="0" height="556" src="http://2.bp.blogspot.com/_3l-X4JQ1EX4/S1expFjwPxI/AAAAAAAAARc/iOnnrhHBA1k/s640/wb-backup.png" width="640" /></a><br /></div><br /><span><br /></span><br />そんなわけで今日はMySQL Workbench 5.2について紹介したが、MySQLをCLIではなくGUIで管理したいと考えているならば、是非MySQL Workbenchを試して頂きたい。<br /><br /><br /><div><span>※追記1：バックアップ機能は建設予定地です。まだご利用になれません。</span><br /></div><div><span>※追記2：MySQL Workbenchには、機能が強化された有償版もあります。</span><br /><span>※追記3：Migration Toolkit相当の機能は、将来のバージョンに搭載予定です。</span><br /></div><div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-570640258576686654?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23128&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23128&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 21 Jan 2010 02:49:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>mysql</category>
    <category>gui</category>
    <category>workbench</category>
  </item>

  <item>
    <title>[mysql]EU が Oracle の Sun 買収を承認</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100121/ora_win</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100121/ora_win</link>
    <description>　本日ついに EU が、Oracle の Sun Microsystems 買収を承認しました。  ○EUの発表 http://europa.eu/rapid/pressReleasesAction.do?reference=IP/10/40&amp;format=HTML&amp;aged=0&amp;language=EN&amp;guiLanguage=en   ○ロイター電： http://www.reuters.com/article/idUSBFA00103020100121 http:/ ...</description>
    <content:encoded><![CDATA[　本日ついに EU が、Oracle の Sun Microsystems 買収を承認しました。  ○EUの発表 http://europa.eu/rapid/pressReleasesAction.do?reference=IP/10/40&format=HTML&aged=0&language=EN&guiLanguage=en   ○ロイター電： http://www.reuters.com/article/idUSBFA00103020100121 http:/ ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23131&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23131&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Thu, 21 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>[mysql]MariaDBでスレッドプーリングを使うには</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kamipo/20100120/1264002742</guid>
    <link>http://d.hatena.ne.jp/kamipo/20100120/1264002742</link>
    <description>
			configureオプションで--with-libeventを指定してbuildしないとスレッドプーリングは使えナッシブルです！
			とりあえず自分のmacbookには以下のようにして入れてます。

./configure --prefix=/usr/local/mariadb --with-charset=utf8 --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-pic --with-big-tables --with-readline --with-embedded-server --with-plugins=all --without-docs --with-libevent --with-debug
make
sudo make install


			linux用のバイナリパッケージは--with-libevent付きなので展開してそのまま使って大丈夫。
			んで、デフォルトのthread_handlingはone-thread-per-connectionなので、--thread_handling=pool-of-threadsオプション付きでサーバ起動すればスレッドプーリングで使える。
		</description>
    <content:encoded><![CDATA[<div>
			<p>configureオプションで--with-libeventを指定してbuildしないとスレッドプーリングは使えナッシブルです！</p>
			<p>とりあえず自分のmacbookには以下のようにして入れてます。</p>
<pre>
./configure --prefix=/usr/local/mariadb --with-charset=utf8 --with-extra-charsets=complex --enable-thread-safe-client --enable-local-infile --with-pic --with-big-tables --with-readline --with-embedded-server --with-plugins=all --without-docs --with-libevent --with-debug
make
sudo make install
</pre>

			<p>linux用のバイナリパッケージは--with-libevent付きなので展開してそのまま使って大丈夫。</p>
			<p>んで、デフォルトのthread_handlingはone-thread-per-connectionなので、--thread_handling=pool-of-threadsオプション付きでサーバ起動すればスレッドプーリングで使える。</p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23114&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23114&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 20 Jan 2010 15:52:22 +0000</pubDate>
    <dc:creator>Kamizono Ryuta</dc:creator>
    <category>mysql</category>
  </item>

  <item>
    <title>Building a highly configurable, easy-to-maintain backup solution for LVM-based VMs and MySQL databases</title>
    <guid isPermaLink="false">tag:typepad.jp,2003:post-36863669</guid>
    <link>http://developer.cybozu.co.jp/kazuho/2010/01/building-a-high.html</link>
    <description>Motives and the Features

For the servers running in our new network, I was in need for a highly configurable, but easy-to-use backup solution that can take online backups of VMs and MySQL databases running multiple storage engines.

Since my colleagues are all researchers or programmers but there are no dedicated engineers for managing our system, I decided to write a set of command line scripts to accomplish the task instead of using an existing, highly-configurable but time-taking-to-learn backup solutions, like Amanda.

And what I have come up with now is a backup solution with following characteristics, let me introduce them.


a central backup server able to take backup of other servers over SSH using public-key authentication
no need to install backup agents into each server
LVM snapshot-based online, incremental backups (capable of taking online backups of LVM-based VMs)
taking online backups of MySQL databases running mulitple storage engines with sophisticated lock control
no configuration files, only use crontab and shell-scripts


The solution consists of two tools, blockdiff (kazuho's blockdiff at master - GitHub), and cronlog script of kaztools (kazuho's kaztools at master - GitHub).

Blockdiff

Blockdiff is a set of scripts for taking block-based diffs of files or volumes on a local machine or on remote machines over the network using SSH.&amp;nbsp; The script below takes online backup of three LVM volumes from three servers.&amp;nbsp; In the form below, a full backup will be taken once a month, and incremetal backups will be taken during every month.

backup.sh
#! /bin/bashexport YEARMONTH=`date '+%Y%m'`# backup a LVM volume (using snapshot) at /dev/pv/lv on srv00blockdiff_backup /var/backup/srv00-pv-lv-$YEARMONTH ssh_lvm_dump --gzip \&amp;nbsp; root@srv00 /dev/pv/lv \&amp;nbsp; || exit $?# backup another LVM volume on an another serverblockdiff_backup /var/backup/srv01-pv-lv-$YEARMONTH ssh_lvm_dump --gzip \&amp;nbsp; root@srv01 /dev/pv/lv \&amp;nbsp; || exit $?# backup a MySQL database stored on volume /dev/pv/lv on server db00 BLOCKSIZE=16384 \&amp;nbsp; LVCREATE_PREFIX='mysqllock --host=db00 --user=root --password=XXXX' \&amp;nbsp; blockdiff_backup /var/backup/db00-pv-lv-$YEARMONTH ssh_lvm_dump --gzip \&amp;nbsp; root@db00 /dev/pv/lv \&amp;nbsp; || exit $?


The backup command of the last volume uses mysqllock command included in blockdiff to keep &amp;quot;FLUSH TABLES WITH WRITE LOCK&amp;quot; running while taking a snapshot of the LVM volume on which the database files exist.&amp;nbsp; It is also possible to implement other kinds of locks so as not to issue the &amp;quot;FLUSH TABLES WITH WRITE LOCK&amp;quot; while long-running queries are in execution.&amp;nbsp; Since the flush statement blocks other queries until all of the already running queries complete, issuing the flush query when long-running queries exist will lead to the database not responding to other queries for a certain amount of time.

Crontab and the cronlog script

The backup script is invoked by cron via cronlog, a script that logs the output of the executed task, as well as controlling the output passed to cron so that an alert mail will be sent when the backup script fails.&amp;nbsp; It uses setlock command of daemontools for holding an exclusive lock while running the backup script (and to alert the administrator on when failing to acquire the lock).

Crontab script
MAILTO=admin@example.com5 3 * * * cd /var/backup &amp;amp;&amp;amp; exec setlock -nX /tmp/backup.lock cronlog -l /var/backup/backup.log -t -- ./backup.sh 2&amp;gt;&amp;amp;1


This is all that needs to be set up to backup LVM volumes including MySQL databases.&amp;nbsp; Output of the log will be like the following.

backup.log
------------------------------------------------------------------------------[Sat Jan&amp;nbsp; 9 03:05:02 2010] backup-srv starting: ./backup.sh[Sat Jan&amp;nbsp; 9 03:05:02 2010] creating snapshot...[Sat Jan&amp;nbsp; 9 03:05:07 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; created[Sat Jan&amp;nbsp; 9 03:05:07 2010] running: ssh_blockdiff_dump --gzip &amp;quot;root@srv00&amp;quot; &amp;quot;/dev/pv/lv&amp;quot;...[Sat Jan&amp;nbsp; 9 03:19:22 2010] removing snapshot /dev/pv/lvm_dump...[Sat Jan&amp;nbsp; 9 03:19:23 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; successfully removed[Sat Jan&amp;nbsp; 9 03:19:23 2010] backup completed successfully(snip)[Sat Jan&amp;nbsp; 9 03:35:56 2010] creating snapshot...[Sat Jan&amp;nbsp; 9 03:35:56 2010] issuing lock statement: FLUSH TABLES WITH READ LOCK[Sat Jan&amp;nbsp; 9 03:36:00 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; created[Sat Jan&amp;nbsp; 9 03:36:00 2010] issuing unlock statement: UNLOCK TABLES[Sat Jan&amp;nbsp; 9 03:36:00 2010] running: bin/ssh_blockdiff_dump --gzip &amp;quot;root@db00&amp;quot; &amp;quot;/dev/pv/lv&amp;quot;...[Sat Jan&amp;nbsp; 9 04:18:44 2010] removing snapshot /dev/pv/lvm_dump...[Sat Jan&amp;nbsp; 9 04:18:46 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; successfully removed[Sat Jan&amp;nbsp; 9 04:18:46 2010] backup completed successfully[Sat Jan&amp;nbsp; 9 04:18:46 2010] command exited with code:0

The files in the backup directory will be like below.&amp;nbsp; The .gz files contain the backup data, and .md5 files contain per-block checksums used for taking incremental or differential backups.

The backup files
% ls -l db00-pv-lv-201001*-rw-r--r-- 1 backup backup 50289166539 2010-01-01 05:35 db00-pv-lv-201001.1.gz-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;131072004 2010-01-01 05:35 db00-pv-lv-201001.1.md5-rw-r--r-- 1 backup backup 10914423057 2010-01-02 04:32 db00-pv-lv-201001.2.gz-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;131072004 2010-01-02 04:32 db00-pv-lv-201001.2.md5-rw-r--r-- 1 backup backup 13648250036 2010-01-03 04:33 db00-pv-lv-201001.3.gz-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;131072004 2010-01-03 04:34 db00-pv-lv-201001.3.md5(snip)-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 3 2010-01-18 04:34 db00-pv-lv-201001.ver

For more information, please read the source code and the accompanying documentation.

Conclusion



As can be seen, this is a powerful backup solution that can be built up with minimum setup. It will work well if you work in a small number of experienced engineers, while it might not be suitable for large-scale deployments with many admins.&amp;nbsp; If you are interested, please give it a try.&amp;nbsp; I am looking forward to your ideas and / or suggestions.

PS. The blockdiff_merge command can be used to restore the backups.</description>
    <content:encoded><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Motives and the Features</strong></p>

<p>For the servers running in our new network, I was in need for a highly configurable, but easy-to-use backup solution that can take online backups of VMs and MySQL databases running multiple storage engines.</p>

<p>Since my colleagues are all researchers or programmers but there are no dedicated engineers for managing our system, I decided to write a set of command line scripts to accomplish the task instead of using an existing, highly-configurable but time-taking-to-learn backup solutions, like <a href="http://amanda.zmanda.com/">Amanda</a>.</p>

<p>And what I have come up with now is a backup solution with following characteristics, let me introduce them.</p>

<ul>
<li>a central backup server able to take backup of other servers over SSH using public-key authentication</li>
<li>no need to install backup agents into each server</li>
<li>LVM snapshot-based online, incremental backups (capable of taking online backups of LVM-based VMs)</li>
<li>taking online backups of MySQL databases running mulitple storage engines with sophisticated lock control</li>
<li>no configuration files, only use crontab and shell-scripts</li>
</ul>

<p>The solution consists of two tools, blockdiff (<a href="http://github.com/kazuho/blockdiff">kazuho's blockdiff at master - GitHub</a>), and cronlog script of kaztools (<a href="http://github.com/kazuho/kaztools">kazuho's kaztools at master - GitHub</a>).</p>

<p><strong>Blockdiff</strong></p>

<p>Blockdiff is a set of scripts for taking block-based diffs of files or volumes on a local machine or on remote machines over the network using SSH.&nbsp; The script below takes online backup of three LVM volumes from three servers.&nbsp; In the form below, a full backup will be taken once a month, and incremetal backups will be taken during every month.</p>

<div>backup.sh</div>
<pre>#! /bin/bash<br /><br />export YEARMONTH=`date '+%Y%m'`<br /><br /># backup a LVM volume (using snapshot) at /dev/pv/lv on srv00<br />blockdiff_backup /var/backup/srv00-pv-lv-$YEARMONTH ssh_lvm_dump --gzip \<br />&nbsp; root@srv00 /dev/pv/lv \<br />&nbsp; || exit $?<br /><br /># backup another LVM volume on an another server<br />blockdiff_backup /var/backup/srv01-pv-lv-$YEARMONTH ssh_lvm_dump --gzip \<br />&nbsp; root@srv01 /dev/pv/lv \<br />&nbsp; || exit $?<br /><br /><br /># backup a MySQL database stored on volume /dev/pv/lv on server db00 <br />BLOCKSIZE=16384 \<br />&nbsp; LVCREATE_PREFIX='mysqllock --host=db00 --user=root --password=XXXX' \<br />&nbsp; blockdiff_backup /var/backup/db00-pv-lv-$YEARMONTH ssh_lvm_dump --gzip \<br />&nbsp; root@db00 /dev/pv/lv \<br />&nbsp; || exit $?</pre>


<p>The backup command of the last volume uses <em>mysqllock</em> command included in blockdiff to keep &quot;FLUSH TABLES WITH WRITE LOCK&quot; running while taking a snapshot of the LVM volume on which the database files exist.&nbsp; It is also possible to implement other kinds of locks so as not to issue the &quot;FLUSH TABLES WITH WRITE LOCK&quot; while long-running queries are in execution.&nbsp; Since the flush statement blocks other queries until all of the already running queries complete, issuing the flush query when long-running queries exist will lead to the database not responding to other queries for a certain amount of time.</p>

<p><strong>Crontab and the cronlog script</strong></p>

<p>The backup script is invoked by cron via cronlog, a script that logs the output of the executed task, as well as controlling the output passed to cron so that an alert mail will be sent when the backup script fails.&nbsp; It uses setlock command of <a href="http://cr.yp.to/daemontools.html">daemontools</a> for holding an exclusive lock while running the backup script (and to alert the administrator on when failing to acquire the lock).</p>

<div>Crontab script</div>
<pre>MAILTO=admin@example.com<br />5 3 * * * cd /var/backup &amp;&amp; exec setlock -nX /tmp/backup.lock cronlog -l /var/backup/backup.log -t -- ./backup.sh 2&gt;&amp;1</pre>


<p>This is all that needs to be set up to backup LVM volumes including MySQL databases.&nbsp; Output of the log will be like the following.</p>

<div>backup.log</div>
<pre>------------------------------------------------------------------------------<br />[Sat Jan&nbsp; 9 03:05:02 2010] backup-srv starting: ./backup.sh<br />[Sat Jan&nbsp; 9 03:05:02 2010] creating snapshot...<br />[Sat Jan&nbsp; 9 03:05:07 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; created<br />[Sat Jan&nbsp; 9 03:05:07 2010] running: ssh_blockdiff_dump --gzip &quot;root@srv00&quot; &quot;/dev/pv/lv&quot;...<br />[Sat Jan&nbsp; 9 03:19:22 2010] removing snapshot /dev/pv/lvm_dump...<br />[Sat Jan&nbsp; 9 03:19:23 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; successfully removed<br />[Sat Jan&nbsp; 9 03:19:23 2010] backup completed successfully<br />(snip)<br />[Sat Jan&nbsp; 9 03:35:56 2010] creating snapshot...<br />[Sat Jan&nbsp; 9 03:35:56 2010] issuing lock statement: FLUSH TABLES WITH READ LOCK<br />[Sat Jan&nbsp; 9 03:36:00 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; created<br />[Sat Jan&nbsp; 9 03:36:00 2010] issuing unlock statement: UNLOCK TABLES<br />[Sat Jan&nbsp; 9 03:36:00 2010] running: bin/ssh_blockdiff_dump --gzip &quot;root@db00&quot; &quot;/dev/pv/lv&quot;...<br />[Sat Jan&nbsp; 9 04:18:44 2010] removing snapshot /dev/pv/lvm_dump...<br />[Sat Jan&nbsp; 9 04:18:46 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; successfully removed<br />[Sat Jan&nbsp; 9 04:18:46 2010] backup completed successfully<br />[Sat Jan&nbsp; 9 04:18:46 2010] command exited with code:0</pre>

<p>The files in the backup directory will be like below.&nbsp; The .gz files contain the backup data, and .md5 files contain per-block checksums used for taking incremental or differential backups.</p>

<div>The backup files</div>
<pre>% ls -l db00-pv-lv-201001*<br />-rw-r--r-- 1 backup backup 50289166539 2010-01-01 05:35 db00-pv-lv-201001.1.gz<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;131072004 2010-01-01 05:35 db00-pv-lv-201001.1.md5<br />-rw-r--r-- 1 backup backup 10914423057 2010-01-02 04:32 db00-pv-lv-201001.2.gz<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;131072004 2010-01-02 04:32 db00-pv-lv-201001.2.md5<br />-rw-r--r-- 1 backup backup 13648250036 2010-01-03 04:33 db00-pv-lv-201001.3.gz<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;131072004 2010-01-03 04:34 db00-pv-lv-201001.3.md5<br />(snip)<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 3 2010-01-18 04:34 db00-pv-lv-201001.ver</pre>

<p>For more information, please read the source code and the accompanying documentation.</p>

<p><strong>Conclusion</strong>

</p>

<p>As can be seen, this is a powerful backup solution that can be built up with minimum setup. It will work well if you work in a small number of experienced engineers, while it might not be suitable for large-scale deployments with many admins.&nbsp; If you are interested, please give it a try.&nbsp; I am looking forward to your ideas and / or suggestions.</p>

<p>PS. The blockdiff_merge command can be used to restore the backups.</p></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23107&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23107&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 20 Jan 2010 09:54:28 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
    <category>in English</category>
    <category>MySQL</category>
  </item>

  <item>
    <title>それでも私が MySQL を使いつづける理由または、Why I still use MySQL? 的な。</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-1901255419767759836</guid>
    <link>http://nippondanji.blogspot.com/2010/01/mysql-why-i-still-use-mysql.html</link>
    <description>元ネタ: Why I still use Perl5? - TokuLog 改めB日記 ===&gt; それでも私が Perl を使いつづける理由 - kazuhoのメモ置き場なんつーかノリが楽しそうだったのでMySQLで便乗。Perlのことはよく分からないけど。Fast Enoughもっとはやいといいな、とおもうときはあるけど、他の RDB とくらべても速い部類。GPLであるいろんなライブラリを組み合わせるときにはライセンスを考えるのが面倒臭いけど、自分の書いたコードがプロプラエタリにならないとか、ユーザーの利用に制限がないとか、GPLの利点も多い。MySQL community is so goodMySQL コミュニティは質問とかにもわりと答えてくれるし、一緒に仕事してて楽しいですね。I know MySQL Internals個人的な理由だけど、MySQL の内部のことはだいぶ調べたので、かなり内部の挙動がわかるんで、なにか問題があったときも把握しやすい。Easy to installなんだかんだで unix 系の OS ならデフォルトでインストールされていることもあるし、自分でインストールする場合でも5分もあればインストールできるんで、便利ですね。Stableしょっちゅうクラッシュしてしまうような RDB は安心してサポートできない(少なくとも自分のような仕事では)。QAとかリリース前にしっかりしておいてほしい。少なくともMySQLではそれがまず保証されていると見ていいと思う。Scalable垂直でも水平でもかなり柔軟にスケールしてくれるので、小規模から大規模まで一貫して使えて便利。MySQL have enough users.どんなすぐれた RDB でもユーザが少なければ、ユーティリティやノウハウがたまらないので、自分で実装/研究する部分が増えてしまってコスト高になる。その点、MySQLにはいろいろツールが出揃ってるので運用する敷居は低いと思う。まとめ以上にのべた点にくらべると、買収が云々とかは些事にすぎない。</description>
    <content:encoded><![CDATA[元ネタ: <a href="http://d.hatena.ne.jp/tokuhirom/20100120/1263958061">Why I still use Perl5? - TokuLog 改めB日記</a> ===> <a href="http://d.hatena.ne.jp/kazuhooku/20100120/1263960313">それでも私が Perl を使いつづける理由 - kazuhoのメモ置き場</a><br /><br />なんつーかノリが楽しそうだったのでMySQLで便乗。Perlのことはよく分からないけど。<br /><br /><h4>Fast Enough</h4>もっとはやいといいな、とおもうときはあるけど、他の RDB とくらべても速い部類。<br /><br /><h4>GPLである</h4>いろんなライブラリを組み合わせるときにはライセンスを考えるのが面倒臭いけど、自分の書いたコードがプロプラエタリにならないとか、ユーザーの利用に制限がないとか、GPLの利点も多い。<br /><br /><h4>MySQL community is so good</h4>MySQL コミュニティは質問とかにもわりと答えてくれるし、一緒に仕事してて楽しいですね。<br /><br /><h4>I know MySQL Internals</h4>個人的な理由だけど、MySQL の内部のことはだいぶ調べたので、かなり内部の挙動がわかるんで、なにか問題があったときも把握しやすい。<br /><br /><h4>Easy to install</h4>なんだかんだで unix 系の OS ならデフォルトでインストールされていることもあるし、自分でインストールする場合でも5分もあればインストールできるんで、便利ですね。<br /><br /><h4>Stable</h4>しょっちゅうクラッシュしてしまうような RDB は安心してサポートできない(少なくとも自分のような仕事では)。<br /><br />QAとかリリース前にしっかりしておいてほしい。少なくともMySQLではそれがまず保証されていると見ていいと思う。<br /><br /><h4>Scalable</h4>垂直でも水平でもかなり柔軟にスケールしてくれるので、小規模から大規模まで一貫して使えて便利。<br /><br /><h4>MySQL have enough users.</h4>どんなすぐれた RDB でもユーザが少なければ、ユーティリティやノウハウがたまらないので、自分で実装/研究する部分が増えてしまってコスト高になる。その点、MySQLにはいろいろツールが出揃ってるので運用する敷居は低いと思う。<br /><br /><h4>まとめ</h4>以上にのべた点にくらべると、買収が云々とかは些事にすぎない。<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-1901255419767759836?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23106&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23106&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 20 Jan 2010 09:32:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>mysql</category>
  </item>

  <item>
    <title>SystemTapでMySQLのDisk I/Oを分析する</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sh2/20100120</guid>
    <link>http://d.hatena.ne.jp/sh2/20100120</link>
    <description>実験エントリです。 動機 OracleのStatspack/AWRで取れるファイル単位のDisk I/O情報を、MySQLでも採取したい。これは次に示すようなデータです。  File IO Stats DB/Inst: ORA112/ORA112 Snaps: 6-7 -&amp;#62;Mx Rd Bkt: Max bucket time for single block read -&amp;#62;ordered by Tablespace, File Tablespace Filename ------------------------ ---------------------------------------------------- Av Mx Av Av Rd Rd Av Av Buffer BufWt Reads Reads/s (ms) Bkt Blks/Rd Writes Writes/s Waits (ms) -------------- ------- ----- --- ------- ------------ -------- ---------- ------ SYSAUX /opt/oracle/oradata/ORA112/sysaux01.dbf 48 1 8.5 ### 2.0 37 0 0 SYSTEM /opt/oracle/oradata/ORA112/system01.dbf 47 1 8.1 32 1.0 9 0 0 UNDOTBS1 /opt/oracle/oradata/ORA112/undotbs01.dbf 2 0 40.0 ### 1.0 13 0 0 USERS /opt/oracle/oradata/ORA112/users01.dbf 4,358 57 48.9 ### 1.9 5 0 8 15.0 -------------------------------------------------------------  Oracleではこうした情報を表領域単位、ファイル単位、テーブル・インデックス単位で取得することができます。パフォーマンスチューニングのためにはぜひとも欲しい情報です。 方式案 いろいろ考えました。  MySQLにパッチを当てるとともに、プラグインを書いてINFORMATION_SCHEMAで情報を見られるようにする⇒ 理想的ですが、主に私の技術力が足りません。 ptrace(2)でDisk I/O関連のシステムコールをフックする⇒ 途中まで作っていたのですが、3番目の案を思いついたのでやめました。 SystemTapでDisk I/O関連のシステムコールを監視する⇒ これでできそうな気がします。  SystemTapとは SystemTapはLinuxカーネルの動作をモニタリングするツールです。概要については以下のIBM developerWorksの記事が参考になると思います。  Linux のイントロスペクションと SystemTap (日本語)  あわせて、公式サイトのビギナーズガイドとリファレンスマニュアルもご参照ください。  SystemTap Beginners Guide (英語) SystemTap Language Reference (英語)  CentOS 5の場合、SystemTapはディストリビューションに付属しています。ただし、追加でkernel-debuginfoとkernel-debuginfo-commonをインストールする必要があります。これらのパッケージは http://debuginfo.centos.org/ で配布されています。 SystemTapスクリプト 今回作成したSystemTapスクリプトを以下に示します。  global PROCNAME = &amp;#34;mysqld&amp;#34; global fds probe begin { printf(&amp;#34;start￥n&amp;#34;) } probe syscall.read, syscall.pread { if (execname() == PROCNAME) { fds[pid(), tid()] = fd } } probe syscall.read.return, syscall.pread.return { if (execname() == PROCNAME &amp;#38;&amp;#38; $return != -1) { printf(&amp;#34;read￥t%d￥t%d￥t%d￥n&amp;#34;, pid(), fds[pid(), tid()], $return) } } probe syscall.write, syscall.pwrite { if (execname() == PROCNAME) { fds[pid(), tid()] = fd } } probe syscall.write.return, syscall.pwrite.return { if (execname() == PROCNAME &amp;#38;&amp;#38; $return != -1) { printf(&amp;#34;write￥t%d￥t%d￥t%d￥n&amp;#34;, pid(), fds[pid(), tid()], $return) } } probe syscall.close { if (execname() == PROCNAME) { printf(&amp;#34;close￥t%d￥t%d￥n&amp;#34;, pid(), fd) } } probe timer.s(5) { printf(&amp;#34;print￥n&amp;#34;) }  これはread(2)、pread(2)、write(2)、pwrite(2)を監視してプロセスID、ファイルディスクリプタ、読み書きしたバイト数を標準出力にダンプするスクリプトです。その際ログが大量に出力されるのを防ぐため、監視対象をmysqldプロセスに限定しています。 Perlスクリプト SystemTapだけではどうしても処理を完結できなかったので、補助的にPerlを使いました。次に示すスクリプトで出力結果の集計を行います。  #!/usr/bin/perl use strict; use warnings; my (%file, $flag, %entry, %reads, %writes, %rbytes, %wbytes, $interval); $flag = 0; $interval = 5; while (my $line = &amp;#60;&amp;#62;) { chomp($line); my ($call, $pid, $fd, $size) = split(/￥t/, $line); if (($call eq ’read’) or ($call eq ’write’)) { if (!defined($file{&amp;#34;$pid,$fd&amp;#34;})) { $file{&amp;#34;$pid,$fd&amp;#34;} = readlink(&amp;#34;/proc/$pid/fd/$fd&amp;#34;) or next; } my $f = $file{&amp;#34;$pid,$fd&amp;#34;}; if (substr($f, 0, 1) eq ’/’) { $flag = 1; $entry{$f} = 1; if ($call eq ’read’) { $reads{$f}++; $rbytes{$f} += $size; } elsif ($call eq ’write’) { $writes{$f}++; $wbytes{$f} += $size; } } } elsif ($call eq ’close’) { if (defined($file{&amp;#34;$pid,$fd&amp;#34;})) { delete($file{&amp;#34;$pid,$fd&amp;#34;}); } } elsif ($call eq ’print’) { if ($flag == 1) { my ($sec, $min, $hour, $day, $mon, $year) = localtime(); printf &amp;#34;￥n%04d-%02d-%02d %02d:%02d:%02d￥n&amp;#34;, $year + 1900, $mon + 1, $day, $hour, $min, $sec; print &amp;#34; r/s w/s rKB/s wKB/s file￥n&amp;#34;; foreach my $f (sort keys %entry) { printf &amp;#34;%7.1f %7.1f %8.1f %8.1f %s￥n&amp;#34;, defined($reads{$f}) ? $reads{$f} / $interval : 0, defined($writes{$f}) ? $writes{$f} / $interval : 0, defined($rbytes{$f}) ? $rbytes{$f} / $interval / 1024 : 0, defined($wbytes{$f}) ? $wbytes{$f} / $interval / 1024 : 0, $f; } $flag = 0; %entry = %reads = %writes = %rbytes = %wbytes = (); } } else { print &amp;#34;$call￥n&amp;#34;; } }  実行例 SystemTapはrootユーザで実行します。MySQLでInnoDBを利用している場合は、innodb_file_per_tableを有効にしてテーブルごとにファイルを分けておくことをおすすめします。試しにTPC-Bのトランザクションを実行してみたところ、以下の結果を得ることができました。  # stap mysql.stp | perl mysqltap.pl start 2010-01-20 03:34:27 r/s w/s rKB/s wKB/s file 0.0 20.8 0.0 23.1 /var/lib/mysql/ib_logfile0 1.4 0.0 22.4 0.0 /var/lib/mysql/ibdata1 16.4 0.0 262.4 0.0 /var/lib/mysql/tpcb/accounts.ibd 0.6 0.0 9.6 0.0 /var/lib/mysql/tpcb/branches.ibd 0.0 0.6 0.0 22.4 /var/lib/mysql/tpcb/history.ibd 0.6 0.0 9.6 0.0 /var/lib/mysql/tpcb/tellers.ibd 2010-01-20 03:34:32 r/s w/s rKB/s wKB/s file 0.0 78.8 0.0 84.0 /var/lib/mysql/ib_logfile0 62.0 0.0 992.0 0.0 /var/lib/mysql/tpcb/accounts.ibd 0.0 0.2 0.0 6.4 /var/lib/mysql/tpcb/history.ibd 2010-01-20 03:34:37 r/s w/s rKB/s wKB/s file 0.0 80.0 0.0 84.1 /var/lib/mysql/ib_logfile0 0.2 1.0 3.2 176.0 /var/lib/mysql/ibdata1 59.6 0.0 953.6 0.0 /var/lib/mysql/tpcb/accounts.ibd 0.0 0.6 0.0 35.2 /var/lib/mysql/tpcb/history.ibd 2010-01-20 03:34:42 r/s w/s rKB/s wKB/s file 0.0 80.6 0.0 81.8 /var/lib/mysql/ib_logfile0 61.4 0.0 982.4 0.0 /var/lib/mysql/tpcb/accounts.ibd 0.0 0.4 0.0 6.4 /var/lib/mysql/tpcb/history.ibd 2010-01-20 03:34:47 r/s w/s rKB/s wKB/s file 0.0 52.6 0.0 56.3 /var/lib/mysql/ib_logfile0 0.0 1.8 0.0 1120.0 /var/lib/mysql/ibdata1 41.8 33.0 668.8 662.4 /var/lib/mysql/tpcb/accounts.ibd 0.0 0.2 0.0 3.2 /var/lib/mysql/tpcb/branches.ibd 0.0 0.2 0.0 3.2 /var/lib/mysql/tpcb/history.ibd 0.0 0.2 0.0 3.2 /var/lib/mysql/tpcb/tellers.ibd 2010-01-20 03:34:52 r/s w/s rKB/s wKB/s file 0.0 1.4 0.0 0.7 /var/lib/mysql/ib_logfile0 0.0 5.4 0.0 3769.6 /var/lib/mysql/ibdata1 0.0 204.8 0.0 4009.6 /var/lib/mysql/tpcb/accounts.ibd 0.0 0.6 0.0 25.6 /var/lib/mysql/tpcb/history.ibd  いかがでしょう。MySQLが何をしていてどこに負荷がかかっているのか、一目瞭然ですね！ また、要するにこれはiostatをファイル単位で見られるようなものですから、MySQL以外にもいろいろ応用が利きそうです。 今後の課題 とりあえずMySQLのパフォーマンスチューニングには使えそうなのですが、完璧を期すにはいくつか足りないところがあります。  他にも監視しなければならないシステムコールがある(io_submit(2)など) 実際の物理I/Oを見るには、もっと低いレイヤの関数を監視する必要がある  正直私はこれでいっぱいいっぱいなので、詳しい方に改良していただけるととてもうれしいです。</description>
    <content:encoded><![CDATA[実験エントリです。 動機 OracleのStatspack/AWRで取れるファイル単位のDisk I/O情報を、<span>MySQL</span>でも採取したい。これは次に示すようなデータです。  File IO Stats DB/Inst: ORA112/ORA112 Snaps: 6-7 -&#62;Mx Rd Bkt: Max bucket time for single block read -&#62;ordered by Tablespace, File Tablespace Filename ------------------------ ---------------------------------------------------- Av Mx Av Av Rd Rd Av Av Buffer BufWt Reads Reads/s (ms) Bkt Blks/Rd Writes Writes/s Waits (ms) -------------- ------- ----- --- ------- ------------ -------- ---------- ------ SYSAUX /opt/oracle/oradata/ORA112/sysaux01.dbf 48 1 8.5 ### 2.0 37 0 0 SYSTEM /opt/oracle/oradata/ORA112/system01.dbf 47 1 8.1 32 1.0 9 0 0 UNDOTBS1 /opt/oracle/oradata/ORA112/undotbs01.dbf 2 0 40.0 ### 1.0 13 0 0 USERS /opt/oracle/oradata/ORA112/users01.dbf 4,358 57 48.9 ### 1.9 5 0 8 15.0 -------------------------------------------------------------  Oracleではこうした情報を表領域単位、ファイル単位、テーブル・インデックス単位で取得することができます。パフォーマンスチューニングのためにはぜひとも欲しい情報です。 方式案 いろいろ考えました。  <span>MySQL</span>にパッチを当てるとともに、プラグインを書いてINFORMATION_SCHEMAで情報を見られるようにする⇒ 理想的ですが、主に私の技術力が足りません。 ptrace(2)でDisk I/O関連のシステムコールをフックする⇒ 途中まで作っていたのですが、3番目の案を思いついたのでやめました。 SystemTapでDisk I/O関連のシステムコールを監視する⇒ これでできそうな気がします。  SystemTapとは SystemTapはLinuxカーネルの動作をモニタリングするツールです。概要については以下のIBM developerWorksの記事が参考になると思います。  Linux のイントロスペクションと SystemTap (日本語)  あわせて、公式サイトのビギナーズガイドとリファレンスマニュアルもご参照ください。  SystemTap Beginners Guide (英語) SystemTap Language Reference (英語)  CentOS 5の場合、SystemTapはディストリビューションに付属しています。ただし、追加でkernel-debuginfoとkernel-debuginfo-commonをインストールする必要があります。これらのパッケージは http://debuginfo.centos.org/ で配布されています。 SystemTapスクリプト 今回作成したSystemTapスクリプトを以下に示します。  global PROCNAME = &#34;<span>mysql</span>d&#34; global fds probe begin { printf(&#34;start￥n&#34;) } probe syscall.read, syscall.pread { if (execname() == PROCNAME) { fds[pid(), tid()] = fd } } probe syscall.read.return, syscall.pread.return { if (execname() == PROCNAME &#38;&#38; $return != -1) { printf(&#34;read￥t%d￥t%d￥t%d￥n&#34;, pid(), fds[pid(), tid()], $return) } } probe syscall.write, syscall.pwrite { if (execname() == PROCNAME) { fds[pid(), tid()] = fd } } probe syscall.write.return, syscall.pwrite.return { if (execname() == PROCNAME &#38;&#38; $return != -1) { printf(&#34;write￥t%d￥t%d￥t%d￥n&#34;, pid(), fds[pid(), tid()], $return) } } probe syscall.close { if (execname() == PROCNAME) { printf(&#34;close￥t%d￥t%d￥n&#34;, pid(), fd) } } probe timer.s(5) { printf(&#34;print￥n&#34;) }  これはread(2)、pread(2)、write(2)、pwrite(2)を監視してプロセスID、ファイルディスクリプタ、読み書きしたバイト数を標準出力にダンプするスクリプトです。その際ログが大量に出力されるのを防ぐため、監視対象を<span>mysql</span>dプロセスに限定しています。 Perlスクリプト SystemTapだけではどうしても処理を完結できなかったので、補助的にPerlを使いました。次に示すスクリプトで出力結果の集計を行います。  #!/usr/bin/perl use strict; use warnings; my (%file, $flag, %entry, %reads, %writes, %rbytes, %wbytes, $interval); $flag = 0; $interval = 5; while (my $line = &#60;&#62;) { chomp($line); my ($call, $pid, $fd, $size) = split(/￥t/, $line); if (($call eq ’read’) or ($call eq ’write’)) { if (!defined($file{&#34;$pid,$fd&#34;})) { $file{&#34;$pid,$fd&#34;} = readlink(&#34;/proc/$pid/fd/$fd&#34;) or next; } my $f = $file{&#34;$pid,$fd&#34;}; if (substr($f, 0, 1) eq ’/’) { $flag = 1; $entry{$f} = 1; if ($call eq ’read’) { $reads{$f}++; $rbytes{$f} += $size; } elsif ($call eq ’write’) { $writes{$f}++; $wbytes{$f} += $size; } } } elsif ($call eq ’close’) { if (defined($file{&#34;$pid,$fd&#34;})) { delete($file{&#34;$pid,$fd&#34;}); } } elsif ($call eq ’print’) { if ($flag == 1) { my ($sec, $min, $hour, $day, $mon, $year) = localtime(); printf &#34;￥n%04d-%02d-%02d %02d:%02d:%02d￥n&#34;, $year + 1900, $mon + 1, $day, $hour, $min, $sec; print &#34; r/s w/s rKB/s wKB/s file￥n&#34;; foreach my $f (sort keys %entry) { printf &#34;%7.1f %7.1f %8.1f %8.1f %s￥n&#34;, defined($reads{$f}) ? $reads{$f} / $interval : 0, defined($writes{$f}) ? $writes{$f} / $interval : 0, defined($rbytes{$f}) ? $rbytes{$f} / $interval / 1024 : 0, defined($wbytes{$f}) ? $wbytes{$f} / $interval / 1024 : 0, $f; } $flag = 0; %entry = %reads = %writes = %rbytes = %wbytes = (); } } else { print &#34;$call￥n&#34;; } }  実行例 SystemTapはrootユーザで実行します。<span>MySQL</span>でInnoDBを利用している場合は、innodb_file_per_tableを有効にしてテーブルごとにファイルを分けておくことをおすすめします。試しにTPC-Bのトランザクションを実行してみたところ、以下の結果を得ることができました。  # stap <span>mysql</span>.stp | perl <span>mysql</span>tap.pl start 2010-01-20 03:34:27 r/s w/s rKB/s wKB/s file 0.0 20.8 0.0 23.1 /var/lib/<span>mysql</span>/ib_logfile0 1.4 0.0 22.4 0.0 /var/lib/<span>mysql</span>/ibdata1 16.4 0.0 262.4 0.0 /var/lib/<span>mysql</span>/tpcb/accounts.ibd 0.6 0.0 9.6 0.0 /var/lib/<span>mysql</span>/tpcb/branches.ibd 0.0 0.6 0.0 22.4 /var/lib/<span>mysql</span>/tpcb/history.ibd 0.6 0.0 9.6 0.0 /var/lib/<span>mysql</span>/tpcb/tellers.ibd 2010-01-20 03:34:32 r/s w/s rKB/s wKB/s file 0.0 78.8 0.0 84.0 /var/lib/<span>mysql</span>/ib_logfile0 62.0 0.0 992.0 0.0 /var/lib/<span>mysql</span>/tpcb/accounts.ibd 0.0 0.2 0.0 6.4 /var/lib/<span>mysql</span>/tpcb/history.ibd 2010-01-20 03:34:37 r/s w/s rKB/s wKB/s file 0.0 80.0 0.0 84.1 /var/lib/<span>mysql</span>/ib_logfile0 0.2 1.0 3.2 176.0 /var/lib/<span>mysql</span>/ibdata1 59.6 0.0 953.6 0.0 /var/lib/<span>mysql</span>/tpcb/accounts.ibd 0.0 0.6 0.0 35.2 /var/lib/<span>mysql</span>/tpcb/history.ibd 2010-01-20 03:34:42 r/s w/s rKB/s wKB/s file 0.0 80.6 0.0 81.8 /var/lib/<span>mysql</span>/ib_logfile0 61.4 0.0 982.4 0.0 /var/lib/<span>mysql</span>/tpcb/accounts.ibd 0.0 0.4 0.0 6.4 /var/lib/<span>mysql</span>/tpcb/history.ibd 2010-01-20 03:34:47 r/s w/s rKB/s wKB/s file 0.0 52.6 0.0 56.3 /var/lib/<span>mysql</span>/ib_logfile0 0.0 1.8 0.0 1120.0 /var/lib/<span>mysql</span>/ibdata1 41.8 33.0 668.8 662.4 /var/lib/<span>mysql</span>/tpcb/accounts.ibd 0.0 0.2 0.0 3.2 /var/lib/<span>mysql</span>/tpcb/branches.ibd 0.0 0.2 0.0 3.2 /var/lib/<span>mysql</span>/tpcb/history.ibd 0.0 0.2 0.0 3.2 /var/lib/<span>mysql</span>/tpcb/tellers.ibd 2010-01-20 03:34:52 r/s w/s rKB/s wKB/s file 0.0 1.4 0.0 0.7 /var/lib/<span>mysql</span>/ib_logfile0 0.0 5.4 0.0 3769.6 /var/lib/<span>mysql</span>/ibdata1 0.0 204.8 0.0 4009.6 /var/lib/<span>mysql</span>/tpcb/accounts.ibd 0.0 0.6 0.0 25.6 /var/lib/<span>mysql</span>/tpcb/history.ibd  いかがでしょう。<span>MySQL</span>が何をしていてどこに負荷がかかっているのか、一目瞭然ですね！ また、要するにこれはiostatをファイル単位で見られるようなものですから、<span>MySQL</span>以外にもいろいろ応用が利きそうです。 今後の課題 とりあえず<span>MySQL</span>のパフォーマンスチューニングには使えそうなのですが、完璧を期すにはいくつか足りないところがあります。  他にも監視しなければならないシステムコールがある(io_submit(2)など) 実際の物理I/Oを見るには、もっと低いレイヤの関数を監視する必要がある  正直私はこれでいっぱいいっぱいなので、詳しい方に改良していただけるととてもうれしいです。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23096&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23096&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 20 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sadao Hiratsuka</dc:creator>
  </item>

  <item>
    <title>2010年代にはLVMスナップショットベースのバックアップとか流行らない (もしくはログ構造化ファイルシステムへの期待)</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/kazuhooku/20100119/1263876978</guid>
    <link>http://d.hatena.ne.jp/kazuhooku/20100119/1263876978</link>
    <description>
			感想文です。タイトルはテンプレから。
			たとえばうちの環境（普段 20-80 IOPS くらいの負荷がかかっている HDD) で、blockdiff (参照: Kazuho@Cybozu Labs: blockdiff を使ったお手軽ホットバックアップ環境の構築 (Linux, MySQL, etc.)) を実行すると、バックアップ速度は 10MB/sec. くらいになる。これはフルバックアップでも増分バックアップでも同じで、ボトルネックは HDD のシーケンシャルリード速度。他の I/O があるから、それぐらいの速度になってしまう *1。
			換言とすると、100GB のボリュームをバックアップするのに約３時間かかる。必要な時間が３時間ならデイリーバックアップで運用できるけど、これが 1TB のボリュームとかになると、ウィークリーバックアップしか選択肢がなくなる。
			ただ、
			
				 ウィークリーバックアップだと頻度が低い。もっと高頻度でバックアップしたい
				 負荷が高い昼間は、LVM スナップショットがない状態で運用できるとうれしい
			
			という２点もあるので、TB クラスのストレージだと LVM スナップショットベースのバックアップは苦しいのかなぁ、と思っている。
			この問題に対応できるのはログ構造化ファイルシステムで、例えば zfs はスナップショットベースの増分バックアップ機能を備えている。ファイルシステムが、前回のバックアップ以降 HDD のどこに変更がかかったか覚えているので、インクリメンタルバックアップの際に発生する読み込み量はストレージのサイズではなく、変更の発生した量に依存することになる。従って、ストレージのサイズに関係なく、高頻度のバックアップが可能*2。
			Linux のログ構造化ファイルシステムにどういうものがあるかは良く知らないけど、Nilfs には差分バックアップ機能はなさそうだった*3。
			もうひとつの可能性は、LVM ベースで同様の、差分だけを HDD からバックアップするような仕組みを作れるか、という点。前回のバックアップ時のスナップショットを取っておいて、最新のスナップショットと差分を取るようにすれば、きっとできるはず。ただ、
			
				 おそらく、スナップショット間の差分を読み出すためのドライバは自作しなければいけない
				 常にスナップショット機能がオンだと書き込みパフォーマンスが落ちるので、あまりうれしくない
			
			という２点がある。なので、できれば、高パフォーマンスで安定した、増分バックアップの取れるログ構造化ファイルシステムが Linux にもほしいなぁ、なんて思ってる。
		
		
			*1：逆に、X25-M のような並列アクセスに強い SSD を使っている場合は他の処理が動いていても関係ない感じ
			*2：このへん XtraBackup は zfs ぽいやり方してるのかなーとか思ってるけど未確認
			*3：ML で議論された形跡はある。参考:  &amp;#91;NILFS users&amp;#93; Dump tools for checkpoints   
		</description>
    <content:encoded><![CDATA[<div>
			<p>感想文です。タイトルはテンプレから。</p>
			<p>たとえばうちの環境（普段 20-80 IOPS くらいの負荷がかかっている HDD) で、blockdiff (参照: <a href="http://developer.cybozu.co.jp/kazuho/2010/01/blockdiff-linux.html" target="_blank">Kazuho@Cybozu Labs: blockdiff を使ったお手軽ホットバックアップ環境の構築 (Linux, MySQL, etc.)</a>) を実行すると、バックアップ速度は 10MB/sec. くらいになる。これはフルバックアップでも増分バックアップでも同じで、ボトルネックは HDD のシーケンシャルリード速度。他の I/O があるから、それぐらいの速度になってしまう <span><a href="http://d.hatena.ne.jp/kazuhooku/#f1" name="fn1" title="逆に、X25-M のような並列アクセスに強い SSD を使っている場合は他の処理が動いていても関係ない感じ">*1</a></span>。</p>
			<p>換言とすると、100GB のボリュームをバックアップするのに約３時間かかる。必要な時間が３時間ならデイリーバックアップで運用できるけど、これが 1TB のボリュームとかになると、ウィークリーバックアップしか選択肢がなくなる。</p>
			<p>ただ、</p>
			<ul>
				<li> ウィークリーバックアップだと頻度が低い。もっと高頻度でバックアップしたい</li>
				<li> 負荷が高い昼間は、LVM スナップショットがない状態で運用できるとうれしい</li>
			</ul>
			<p>という２点もあるので、TB クラスのストレージだと LVM スナップショットベースのバックアップは苦しいのかなぁ、と思っている。</p>
			<p>この問題に対応できるのはログ構造化ファイルシステムで、例えば zfs はスナップショットベースの増分バックアップ機能を備えている。ファイルシステムが、前回のバックアップ以降 HDD のどこに変更がかかったか覚えているので、インクリメンタルバックアップの際に発生する読み込み量はストレージのサイズではなく、変更の発生した量に依存することになる。従って、ストレージのサイズに関係なく、高頻度のバックアップが可能<span><a href="http://d.hatena.ne.jp/kazuhooku/#f2" name="fn2" title="このへん XtraBackup は zfs ぽいやり方してるのかなーとか思ってるけど未確認">*2</a></span>。</p>
			<p>Linux のログ構造化ファイルシステムにどういうものがあるかは良く知らないけど、Nilfs には差分バックアップ機能はなさそうだった<span><a href="http://d.hatena.ne.jp/kazuhooku/#f3" name="fn3" title="ML で議論された形跡はある。参考: [https://www.nilfs.org/pipermail/users/2009-March/001742.html:title]">*3</a></span>。</p>
			<p>もうひとつの可能性は、LVM ベースで同様の、差分だけを HDD からバックアップするような仕組みを作れるか、という点。前回のバックアップ時のスナップショットを取っておいて、最新のスナップショットと差分を取るようにすれば、きっとできるはず。ただ、</p>
			<ul>
				<li> おそらく、スナップショット間の差分を読み出すためのドライバは自作しなければいけない</li>
				<li> 常にスナップショット機能がオンだと書き込みパフォーマンスが落ちるので、あまりうれしくない</li>
			</ul>
			<p>という２点がある。なので、できれば、高パフォーマンスで安定した、増分バックアップの取れるログ構造化ファイルシステムが Linux にもほしいなぁ、なんて思ってる。</p>
		</div>
		<div>
			<p><a href="http://d.hatena.ne.jp/kazuhooku/#fn1" name="f1">*1</a>：逆に、X25-M のような並列アクセスに強い SSD を使っている場合は他の処理が動いていても関係ない感じ</p>
			<p><a href="http://d.hatena.ne.jp/kazuhooku/#fn2" name="f2">*2</a>：このへん XtraBackup は zfs ぽいやり方してるのかなーとか思ってるけど未確認</p>
			<p><a href="http://d.hatena.ne.jp/kazuhooku/#fn3" name="f3">*3</a>：ML で議論された形跡はある。参考: <a href="https://www.nilfs.org/pipermail/users/2009-March/001742.html" target="_blank"> &#91;NILFS users&#93; Dump tools for checkpoints   </a></p>
		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23091&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23091&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 19 Jan 2010 04:56:18 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
  </item>

  <item>
    <title>[mysql][memo]MySQL Linux へのインストールメモ</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100119/p1</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100119/p1</link>
    <description>　滅多にやらないので（本番環境は yum で入れられる標準バージョンを使うことにしているので）、いつもやり方を忘れてしまいます。　なので自分用メモとしてここに書いておくことにします。 　今回入れたのは ML115 - CentOS 5.4 64bit へ。  $ wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.5/mysql-5.5.1-m2-linux-x86_64-glibc23.tar.gz # /usr/sbin/groupad ...</description>
    <content:encoded><![CDATA[　滅多にやらないので（本番環境は yum で入れられる標準バージョンを使うことにしているので）、いつもやり方を忘れてしまいます。　なので自分用メモとしてここに書いておくことにします。 　今回入れたのは ML115 - CentOS 5.4 64bit へ。  $ wget http://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.5/mysql-5.5.1-m2-linux-x86_64-glibc23.tar.gz # /usr/sbin/groupad ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23093&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23093&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 19 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>監視とは継続的なテストである、という話 (もしくは cronlog とテストスクリプトを組み合わせた監視手法について)</title>
    <guid isPermaLink="false">tag:typepad.jp,2003:post-36818721</guid>
    <link>http://developer.cybozu.co.jp/kazuho/2010/01/cronlog-52f2.html</link>
    <description>　結論から先に。cronlog を使えば、アプリケーションのテストコードと全く同じ形式で、監視用のスクリプトを書くことができます。プログラマが監視ツールの記法を覚える必要はありません。これは、プログラマが運用も行うケースでは特に有効な手法だと思います。

　先週公開した Kazuho@Cybozu Labs: crontab を使って効率的にサービス監視する方法 というエントリで、crontab と拙作の cronlog を用いてサービス監視を書く手法を紹介しました。しかし、挙げた例はいずれも ping や http のテストといった外形監視の手法です。RDBMS とウェブアプリケーションのみから構成されるサービスならそれだけで十分でしょう。

　しかし、外形監視だけでは、メッセージキューのような非同期処理の遅延を観測することはできません。また、http のログを監視して、エラーレスポンスや平均応答時間の監視も行うことが望ましいです。それらの処理をどう書くか。

　自分は、監視とは継続的なテストである、という観点から、キューの処理遅延等の監視を、アプリケーションのテストスートの一部として書いています。具体的には、以下のような感じ (一部改変)。テストはアプリケーションと設定情報を共有しているので、監視ソフトウェアに様々な設定値を入力する必要もありません。

use strict;use warnings;use Test::More;use Pathtraq;my $app = Pathtraq-&amp;gt;new;cmp_ok&amp;nbsp; &amp;nbsp; do {&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; my $row = $app-&amp;gt;dbh-&amp;gt;selectrow_arrayref(&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;'select XXXX', # Q4M 使ってない昔のキュー監視&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; ) or die $app-&amp;gt;dbh-&amp;gt;errstr;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; $row-&amp;gt;[0];&amp;nbsp; &amp;nbsp; },&amp;nbsp; &amp;nbsp; '&amp;lt;',&amp;nbsp; &amp;nbsp; 1000,&amp;nbsp; &amp;nbsp; 'delay of updater';for my $tbl (qw(analyze_page set_page_info analyze_keyword)) {&amp;nbsp; &amp;nbsp; cmp_ok&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; do {&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;my $row = $app-&amp;gt;dbh_queue-&amp;gt;selectrow_arrayref(&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;quot;select count(*) from $tbl&amp;quot;,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;) or die $app-&amp;gt;dbh_queue-&amp;gt;errstr;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;$row-&amp;gt;[0];&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; },&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; '&amp;lt;',&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 1000,&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;quot;delay of $tbl&amp;quot;,}done_testing;

　あとは、これらのテストコードを、crontab 上で cronlog を介してテストの実行ツール (perl なら prove) に食わせるだけ。

*/5 * * * * cd /var/webapp &amp;amp;&amp;amp; exec setlock -nX /tmp/monitor.lock cronlog -- prove -v monitor.t/*.t 2&amp;gt;&amp;amp;1

　これで、監視対象項目 (＝テスト項目) になんらかの問題が見つかった場合には、以下のような感じのメールが届くようになります。

Subject: Cron &amp;lt;user@host&amp;gt; cd /var/webapp &amp;amp;&amp;amp; exec setlock -nX /tmp/monitor.lock cronlog -- prove -v monitor.t/*.t 2&amp;gt;&amp;amp;1host.example.com starting: prove -v monitor.t/queue.t#&amp;nbsp; &amp;nbsp;Failed test 'delay of analyze_page'#&amp;nbsp; &amp;nbsp;at monitor.t/queue.t line 23.#&amp;nbsp; &amp;nbsp;&amp;nbsp; '1396'#&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;#&amp;nbsp; &amp;nbsp;&amp;nbsp; '1000'# Looks like you failed 1 test of 4.monitor.t/queue.t ..ok 1 - delay of updaternot ok 2 - delay of analyze_pageok 3 - delay of set_page_infook 4 - delay of analyze_keyword1..4Dubious, test returned 1 (wstat 256, 0x100)Failed 1/4 subtestsTest Summary Report-------------------monitor.t/queue.t (Wstat: 256 Tests: 4 Failed: 1) Failed test:&amp;nbsp; 2 Non-zero exit status: 1Files=1, Tests=4,&amp;nbsp; 0 wallclock secs ( 0.02 usr&amp;nbsp; 0.00 sys +&amp;nbsp; 0.40 cusr&amp;nbsp; 0.08 csys =&amp;nbsp; 0.50 CPU)Result: FAILcommand exited with code:1

　perl に限らず、テストの実行ツールは一般に、成功した場合はゼロ、失敗した場合は非ゼロを返します (そうしないと make test &amp;amp;&amp;amp; make install とか自動化できない)。この特性と cronlog の、非ゼロが返った場合だけ cron を経由してログをメールで送信する、という機能を組み合わせることで、テストコードが監視系に早変わりするのです。さらに外側で setlock -nX しているのは、５分間でテストが終了しなかった場合に、やはりエラーメールを送信するため。

　以上のように、cronlog を使えば、プログラマが使い慣れたテストスートの一部として監視系を書くことができます。パストラックでは更に、リバースプロキシのログ監視を touch_if コマンドとテストコードを連動する形で実施するようにしています。どうぞご覧ください。</description>
    <content:encoded><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p>　結論から先に。cronlog を使えば、アプリケーションのテストコードと全く同じ形式で、監視用のスクリプトを書くことができます。プログラマが監視ツールの記法を覚える必要はありません。これは、プログラマが運用も行うケースでは特に有効な手法だと思います。</p>

<p>　先週公開した <a href="http://developer.cybozu.co.jp/kazuho/2010/01/crontab-f131.html">Kazuho@Cybozu Labs: crontab を使って効率的にサービス監視する方法</a> というエントリで、crontab と拙作の cronlog を用いてサービス監視を書く手法を紹介しました。しかし、挙げた例はいずれも ping や http のテストといった外形監視の手法です。RDBMS とウェブアプリケーションのみから構成されるサービスならそれだけで十分でしょう。</p>

<p>　しかし、外形監視だけでは、メッセージキューのような非同期処理の遅延を観測することはできません。また、http のログを監視して、エラーレスポンスや平均応答時間の監視も行うことが望ましいです。それらの処理をどう書くか。</p>

<p>　自分は、監視とは継続的なテストである、という観点から、キューの処理遅延等の監視を、アプリケーションのテストスートの一部として書いています。具体的には、以下のような感じ (一部改変)。テストはアプリケーションと設定情報を共有しているので、監視ソフトウェアに様々な設定値を入力する必要もありません。</p>

<pre>use strict;<br />use warnings;<br /><br />use Test::More;<br />use Pathtraq;<br /><br />my $app = Pathtraq-&gt;new;<br /><br />cmp_ok<br />&nbsp; &nbsp; do {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; my $row = $app-&gt;dbh-&gt;selectrow_arrayref(<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;'select XXXX', # Q4M 使ってない昔のキュー監視<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; ) or die $app-&gt;dbh-&gt;errstr;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; $row-&gt;[0];<br />&nbsp; &nbsp; },<br />&nbsp; &nbsp; '&lt;',<br />&nbsp; &nbsp; 1000,<br />&nbsp; &nbsp; 'delay of updater';<br /><br />for my $tbl (qw(analyze_page set_page_info analyze_keyword)) {<br />&nbsp; &nbsp; cmp_ok<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; do {<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;my $row = $app-&gt;dbh_queue-&gt;selectrow_arrayref(<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; &quot;select count(*) from $tbl&quot;,<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;) or die $app-&gt;dbh_queue-&gt;errstr;<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;$row-&gt;[0];<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; },<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; '&lt;',<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 1000,<br />&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &quot;delay of $tbl&quot;,<br />}<br /><br />done_testing;</pre>

<p>　あとは、これらのテストコードを、crontab 上で cronlog を介してテストの実行ツール (perl なら prove) に食わせるだけ。</p>

<pre>*/5 * * * * cd /var/webapp &amp;&amp; exec setlock -nX /tmp/monitor.lock cronlog -- prove -v monitor.t/*.t 2&gt;&amp;1</pre>

<p>　これで、監視対象項目 (＝テスト項目) になんらかの問題が見つかった場合には、以下のような感じのメールが届くようになります。</p>

<pre>Subject: Cron &lt;user@host&gt; cd /var/webapp &amp;&amp; exec setlock -nX /tmp/monitor.lock cronlog -- prove -v monitor.t/*.t 2&gt;&amp;1<br /><br />host.example.com starting: prove -v monitor.t/queue.t<br /><br />#&nbsp; &nbsp;Failed test 'delay of analyze_page'<br />#&nbsp; &nbsp;at monitor.t/queue.t line 23.<br />#&nbsp; &nbsp;&nbsp; '1396'<br />#&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&lt;<br />#&nbsp; &nbsp;&nbsp; '1000'<br /># Looks like you failed 1 test of 4.<br />monitor.t/queue.t ..<br />ok 1 - delay of updater<br />not ok 2 - delay of analyze_page<br />ok 3 - delay of set_page_info<br />ok 4 - delay of analyze_keyword<br />1..4<br />Dubious, test returned 1 (wstat 256, 0x100)<br />Failed 1/4 subtests<br /><br />Test Summary Report<br />-------------------<br />monitor.t/queue.t (Wstat: 256 Tests: 4 Failed: 1)<br /> Failed test:&nbsp; 2<br /> Non-zero exit status: 1<br />Files=1, Tests=4,&nbsp; 0 wallclock secs ( 0.02 usr&nbsp; 0.00 sys +&nbsp; 0.40 cusr&nbsp; 0.08 csys =&nbsp; 0.50 CPU)<br />Result: FAIL<br />command exited with code:1</pre>

<p>　perl に限らず、テストの実行ツールは一般に、成功した場合はゼロ、失敗した場合は非ゼロを返します (そうしないと make test &amp;&amp; make install とか自動化できない)。この特性と cronlog の、非ゼロが返った場合だけ cron を経由してログをメールで送信する、という機能を組み合わせることで、テストコードが監視系に早変わりするのです。さらに外側で setlock -nX しているのは、５分間でテストが終了しなかった場合に、やはりエラーメールを送信するため。</p>

<p>　以上のように、cronlog を使えば、プログラマが使い慣れたテストスートの一部として監視系を書くことができます。パストラックでは更に、リバースプロキシのログ監視を <a href="http://github.com/kazuho/kaztools/blob/master/touch_if">touch_if</a> コマンドとテストコードを連動する形で実施するようにしています。どうぞご覧ください。</p></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23085&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23085&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 18 Jan 2010 06:03:54 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
    <category>Perl</category>
    <category>管理・運用</category>
  </item>

  <item>
    <title>blockdiff を使ったお手軽ホットバックアップ環境の構築 (Linux, MySQL, etc.)</title>
    <guid isPermaLink="false">tag:typepad.jp,2003:post-36816863</guid>
    <link>http://developer.cybozu.co.jp/kazuho/2010/01/blockdiff-linux.html</link>
    <description>　一昨日に開催された hbstudy #7 にバックアップの話を聞きに行ってきました。Amanda を中心にした話で、とても勉強になりました。が、設定がめんどくさそうだなぁ、とも。自分の需要にはあわない感じでした。

　勉強会が終わったあとで、自作のバックアップスクリプト blockdiff に関する話を何人かの方とさせていただいたのですが、思いのほか反応が良かったので、あらためて紹介したいと思います。

　blockdiff は、一言でいうと、パーティションやデータベースのデータファイルの差分バックアップツールです。rsnapshot に似ていますが、rsnapshot ではデータベースのホットバックアップ不可能です。逆に blockdiff はディレクトリ単位でのバックアップには対応していないかわり、ファイルシステムやデータベースを、一貫性を保ちつつ実質無停止で差分バックアップすることができます。

　blockdiff の具体的な特徴は以下のとおりです。


設定ファイルが不要
複雑な設定がありません。コマンドライン (あるいは crontab) で、適当な引数をつけてバックアップコマンドを呼び出すだけの簡単インターフェイスです。コマンドラインで動作を制御するため、(ホットバックアップを含む) 様々なバックアップロジックを組むことも可能です。
バックアップを取るサーバにソフトウェアのインストールが不要
ssh 経由でリモートサーバのバックアップを取ることができます。サーバにバックアップソフトウェアをインストールする必要はありません (バックアップを取るために必要なプログラムは自動的に送り込まれます) 注1
フルバックアップと増分バックアップに対応
フルバックアップと増分バックアップに対応しています。また、下位レイヤのスクリプト (blockdiff_dump) を直接実行すれば、差分バックアップも可能です。
ファイル単位、あるいは LVM スナップショットを使ったバックアップが可能
ファイル単位のバックアップと、LVM スナップショットを使ったホットバックアップに対応しています。
MySQL のホットバックアップが可能
同梱の mysqllock コマンドと組み合わせることで、LVM スナップショットを使った MySQL データベースのホットバックアップが可能です。PostgreSQL については確認はしていませんが、ロックコマンドを使わなくてもバックアップが取れるんじゃないかと思います。
LVM ベースの VM のホットバックアップが可能
LVM ベースの仮想ディスクを用いた Xen の DomU のホットバックアップが可能です注2。私は使っていないので試していませんが、KVM の仮想マシンについても同等のことが可能だと思われます。LVM ベースではない VM についても、スナップショット機構によってはホットバックアップが可能だと思われます。


　blockdiff を使った LVM ボリュームのバックアップ方法については Kazuho@Cybozu Labs: リモートからXenのDomUとかLVMやファイルを差分バックアップするスクリプトを書いた で触れたので、ここでは MySQL データベースをホットバックアップする場合の設定を紹介したいと思います。前提として、MySQL のデータが LVM ボリューム上に保存されている必要があります。

　バックアップスクリプトは、以下のような感じになります。

#! /bin/bashexport BLOCKSIZE=16834export LVCREATE_PREFIX=&amp;quot;mysqllock --host=db-host --user=root --password=XXX&amp;quot;export YEARMONTH=`date '+%Y%m'`blockdiff_backup /var/backup/db-backup-$YEARMONTH bin/ssh_lvm_dump --gzip \&amp;nbsp; root@db-host /dev/mapper/logical_volume_of_mysql

このバックアップスクリプトは以下のことを行っています。


バックアップのブロックサイズを InnoDB のブロックサイズである 16KB に設定
スナップショットを取る瞬間に mysqllock コマンドを使って FLUSH TABLES WITH READ LOCK を使うことで、MyISAM テーブル等の一貫性のあるバックアップを実現
１ヶ月毎にフルバックアップ。それ以内は増分バックアップ


　バックアップスクリプトを実行すると、最初に db-backup-YYYYMM.1.gz, db-backup-YYYYMM.1.md5, db_backup-YYYYMM.ver という３つのファイルが作成されます。YYYYMM.1.gz がバックアップデータ、YYYYMM1.md5 がブロック単位のチェックサム情報です。次に実行すると YYYYMM.2.* が、その次は YYYYMM.3.* が、という形で増分バックアップが増えていきます。最新のバックアップの番号は .ver ファイルが記憶しているので、バックアップが途中で失敗しても問題ありません。次回バックアップ時に壊れたバックアップファイルが上書きされます。

% ls -l db-backup-201001*-rw-r--r-- 1 backup backup 50289166539 2010-01-01 05:35 db-backup-201001.1.gz-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;131072004 2010-01-01 05:35 db-backup-201001.1.md5-rw-r--r-- 1 backup backup 10914423057 2010-01-02 04:32 db-backup-201001.2.gz-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;131072004 2010-01-02 04:32 db-backup-201001.2.md5-rw-r--r-- 1 backup backup 13648250036 2010-01-03 04:33 db-backup-201001.3.gz-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;131072004 2010-01-03 04:34 db-backup-201001.3.md5...-rw-r--r-- 1 backup backup&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; 3 2010-01-18 04:34 db-backup-201001.ver

　バックアップスクリプトが正しく動作することを確認したら、crontab を設定して毎日バックアップを取るようにします。

0 4 * * * setlock -nX /var/backup/backup.lock cronlog -l /var/backup/backup.log -t -- /var/backup/backup.sh 2&gt;&amp;1

　ここでは、daemontools の setlock コマンドを使って万が一の重複起動を抑止しています。また、kaztools の cronlog コマンドを使うことで、バックアップの進捗をログに保存しつつ、バックアップが失敗した場合は cron 経由でアラートメールが送信されるようになっています。

　ちなみに、バックアップのログ (backup.log) は、毎日次のような感じで追記されていきます。データベースの停止期間 (アプリケーションからのクエリがロックされる期間) は 03:35:56 から 03:36:00 までの４秒間であり、実質無停止でのバックアップができていることがわかります。

------------------------------------------------------------------------------[Sat Jan&amp;nbsp; 9 03:05:02 2010] backup-srv starting: /var/backup/backup.sh[Sat Jan&amp;nbsp; 9 03:05:02 2010] creating snapshot...[Sat Jan&amp;nbsp; 9 03:05:07 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; created[Sat Jan&amp;nbsp; 9 03:05:07 2010] running: bin/ssh_blockdiff_dump --gzip &amp;quot;root@db-host&amp;quot; &amp;quot;/dev/db/lvm_dump&amp;quot;...[Sat Jan&amp;nbsp; 9 03:19:22 2010] removing snapshot /dev/db/lvm_dump...[Sat Jan&amp;nbsp; 9 03:19:23 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; successfully removed[Sat Jan&amp;nbsp; 9 03:19:23 2010] backup completed successfully[Sat Jan&amp;nbsp; 9 03:19:23 2010] creating snapshot...[Sat Jan&amp;nbsp; 9 03:35:56 2010] issuing lock statement: FLUSH TABLES WITH READ LOCK[Sat Jan&amp;nbsp; 9 03:36:00 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; created[Sat Jan&amp;nbsp; 9 03:36:00 2010] issuing unlock statement: UNLOCK TABLES[Sat Jan&amp;nbsp; 9 03:36:00 2010] running: bin/ssh_blockdiff_dump --gzip &amp;quot;root@db-host&amp;quot; &amp;quot;/dev/x25m.1/lvm_dump&amp;quot;...[Sat Jan&amp;nbsp; 9 04:18:44 2010] removing snapshot /dev/x25m.1/lvm_dump...[Sat Jan&amp;nbsp; 9 04:18:46 2010]&amp;nbsp; &amp;nbsp;Logical volume &amp;quot;lvm_dump&amp;quot; successfully removed[Sat Jan&amp;nbsp; 9 04:18:46 2010] backup completed successfully[Sat Jan&amp;nbsp; 9 04:18:46 2010] command exited with code:0

　このように、blockdiff を使うことで VM 単位のバックアップだけでなく、データベースのホットバックアップも簡単に取ることができます。パストラックでは、これらバックアップスクリプトに処理を追加し、バックアップ中は統計処理を抑止するといったことも行っています。

　blockdiff や kaztools は、いずれも私の github リポジトリ (github.com/kazuho) からダウンロードして perl Makefile.PL &amp;amp;&amp;amp; make all test &amp;amp;&amp;amp; make install でインストール可能です。あるいは nopan がインストールされていれば、nopan http://github.com/kazuho/blockdiff http://github.com/kazuho/kaztools と１コマンドでインストールすることができます。いずれもパストラックで実際に運用しているツール群ですが、興味のある方は (at your own risk で) お試しあれ。


注1: バックアップを取るサーバに Perl 5.8 以降がインストールされている必要があります。また、公開鍵認証を用いて SSH ログインできる必要があります
注2: XenServer のスナップショット機能とは併用できません
</description>
    <content:encoded><![CDATA[<div xmlns="http://www.w3.org/1999/xhtml"><p>　一昨日に開催された <a href="http://heartbeats.jp/hbstudy/2009/12/hbstudy7.html">hbstudy #7</a> にバックアップの話を聞きに行ってきました。<a href="http://zmanda.jp/amanda.html">Amanda</a> を中心にした話で、とても勉強になりました。が、設定がめんどくさそうだなぁ、とも。自分の需要にはあわない感じでした。</p>

<p>　勉強会が終わったあとで、自作のバックアップスクリプト <a href="http://github.com/kazuho/blockdiff">blockdiff</a> に関する話を何人かの方とさせていただいたのですが、思いのほか反応が良かったので、あらためて紹介したいと思います。</p>

<p>　blockdiff は、一言でいうと、パーティションやデータベースのデータファイルの差分バックアップツールです。rsnapshot に似ていますが、rsnapshot ではデータベースのホットバックアップ不可能です。逆に blockdiff はディレクトリ単位でのバックアップには対応していないかわり、<strong>ファイルシステムやデータベースを、一貫性を保ちつつ実質無停止で差分バックアップすることができます</strong>。</p>

<p>　blockdiff の具体的な特徴は以下のとおりです。</p>

<ul>
<li>設定ファイルが不要</li>
<p>複雑な設定がありません。コマンドライン (あるいは crontab) で、適当な引数をつけてバックアップコマンドを呼び出すだけの簡単インターフェイスです。コマンドラインで動作を制御するため、(ホットバックアップを含む) 様々なバックアップロジックを組むことも可能です。</p>
<li>バックアップを取るサーバにソフトウェアのインストールが不要</li>
<p>ssh 経由でリモートサーバのバックアップを取ることができます。サーバにバックアップソフトウェアをインストールする必要はありません (バックアップを取るために必要なプログラムは自動的に送り込まれます) <sup>注1</sup></p>
<li>フルバックアップと増分バックアップに対応</li>
<p>フルバックアップと増分バックアップに対応しています。また、下位レイヤのスクリプト (blockdiff_dump) を直接実行すれば、差分バックアップも可能です。</p>
<li>ファイル単位、あるいは LVM スナップショットを使ったバックアップが可能</li>
<p>ファイル単位のバックアップと、LVM スナップショットを使ったホットバックアップに対応しています。</p>
<li>MySQL のホットバックアップが可能</li>
<p>同梱の mysqllock コマンドと組み合わせることで、LVM スナップショットを使った MySQL データベースのホットバックアップが可能です。PostgreSQL については確認はしていませんが、ロックコマンドを使わなくてもバックアップが取れるんじゃないかと思います。</p>
<li>LVM ベースの VM のホットバックアップが可能</li>
<p>LVM ベースの仮想ディスクを用いた Xen の DomU のホットバックアップが可能です<sup>注2</sup>。私は使っていないので試していませんが、KVM の仮想マシンについても同等のことが可能だと思われます。LVM ベースではない VM についても、スナップショット機構によってはホットバックアップが可能だと思われます。</p>
</ul>

<p>　blockdiff を使った LVM ボリュームのバックアップ方法については <a href="http://developer.cybozu.co.jp/kazuho/2009/11/lvm-d8f3.html">Kazuho@Cybozu Labs: リモートからXenのDomUとかLVMやファイルを差分バックアップするスクリプトを書いた</a> で触れたので、ここでは MySQL データベースをホットバックアップする場合の設定を紹介したいと思います。前提として、MySQL のデータが LVM ボリューム上に保存されている必要があります。</p>

<p>　バックアップスクリプトは、以下のような感じになります。</p>

<pre>#! /bin/bash<br /><br />export BLOCKSIZE=16834<br />export LVCREATE_PREFIX=&quot;mysqllock --host=db-host --user=root --password=XXX&quot;<br />export YEARMONTH=`date '+%Y%m'`<br /><br />blockdiff_backup /var/backup/db-backup-$YEARMONTH bin/ssh_lvm_dump --gzip \<br />&nbsp; root@db-host /dev/mapper/logical_volume_of_mysql</pre>

<p>このバックアップスクリプトは以下のことを行っています。</p>

<ul>
<li>バックアップのブロックサイズを InnoDB のブロックサイズである 16KB に設定</li>
<li>スナップショットを取る瞬間に mysqllock コマンドを使って FLUSH TABLES WITH READ LOCK を使うことで、MyISAM テーブル等の一貫性のあるバックアップを実現</li>
<li>１ヶ月毎にフルバックアップ。それ以内は増分バックアップ</li>
</ul>

<p>　バックアップスクリプトを実行すると、最初に db-backup-YYYYMM.1.gz, db-backup-YYYYMM.1.md5, db_backup-YYYYMM.ver という３つのファイルが作成されます。YYYYMM.1.gz がバックアップデータ、YYYYMM1.md5 がブロック単位のチェックサム情報です。次に実行すると YYYYMM.2.* が、その次は YYYYMM.3.* が、という形で増分バックアップが増えていきます。最新のバックアップの番号は .ver ファイルが記憶しているので、バックアップが途中で失敗しても問題ありません。次回バックアップ時に壊れたバックアップファイルが上書きされます。</p>

<pre>% ls -l db-backup-201001*<br />-rw-r--r-- 1 backup backup 50289166539 2010-01-01 05:35 db-backup-201001.1.gz<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;131072004 2010-01-01 05:35 db-backup-201001.1.md5<br />-rw-r--r-- 1 backup backup 10914423057 2010-01-02 04:32 db-backup-201001.2.gz<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;131072004 2010-01-02 04:32 db-backup-201001.2.md5<br />-rw-r--r-- 1 backup backup 13648250036 2010-01-03 04:33 db-backup-201001.3.gz<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;131072004 2010-01-03 04:34 db-backup-201001.3.md5<br />...<br />-rw-r--r-- 1 backup backup&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; 3 2010-01-18 04:34 db-backup-201001.ver</pre>

<p>　バックアップスクリプトが正しく動作することを確認したら、crontab を設定して毎日バックアップを取るようにします。</p>

<pre>0 4 * * * setlock -nX /var/backup/backup.lock cronlog -l /var/backup/backup.log -t -- /var/backup/backup.sh 2>&1</pre>

<p>　ここでは、<a href="http://cr.yp.to/daemontools.html">daemontools</a> の setlock コマンドを使って万が一の重複起動を抑止しています。また、<a href="http://github.com/kazuho/kaztools">kaztools</a> の cronlog コマンドを使うことで、バックアップの進捗をログに保存しつつ、バックアップが失敗した場合は cron 経由でアラートメールが送信されるようになっています。</p>

<p>　ちなみに、バックアップのログ (backup.log) は、毎日次のような感じで追記されていきます。データベースの停止期間 (アプリケーションからのクエリがロックされる期間) は 03:35:56 から 03:36:00 までの４秒間であり、実質無停止でのバックアップができていることがわかります。</p>

<pre>------------------------------------------------------------------------------<br />[Sat Jan&nbsp; 9 03:05:02 2010] backup-srv starting: /var/backup/backup.sh<br />[Sat Jan&nbsp; 9 03:05:02 2010] creating snapshot...<br />[Sat Jan&nbsp; 9 03:05:07 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; created<br />[Sat Jan&nbsp; 9 03:05:07 2010] running: bin/ssh_blockdiff_dump --gzip &quot;root@db-host&quot; &quot;/dev/db/lvm_dump&quot;...<br />[Sat Jan&nbsp; 9 03:19:22 2010] removing snapshot /dev/db/lvm_dump...<br />[Sat Jan&nbsp; 9 03:19:23 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; successfully removed<br />[Sat Jan&nbsp; 9 03:19:23 2010] backup completed successfully<br />[Sat Jan&nbsp; 9 03:19:23 2010] creating snapshot...<br />[Sat Jan&nbsp; 9 03:35:56 2010] issuing lock statement: FLUSH TABLES WITH READ LOCK<br />[Sat Jan&nbsp; 9 03:36:00 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; created<br />[Sat Jan&nbsp; 9 03:36:00 2010] issuing unlock statement: UNLOCK TABLES<br />[Sat Jan&nbsp; 9 03:36:00 2010] running: bin/ssh_blockdiff_dump --gzip &quot;root@db-host&quot; &quot;/dev/x25m.1/lvm_dump&quot;...<br />[Sat Jan&nbsp; 9 04:18:44 2010] removing snapshot /dev/x25m.1/lvm_dump...<br />[Sat Jan&nbsp; 9 04:18:46 2010]&nbsp; &nbsp;Logical volume &quot;lvm_dump&quot; successfully removed<br />[Sat Jan&nbsp; 9 04:18:46 2010] backup completed successfully<br />[Sat Jan&nbsp; 9 04:18:46 2010] command exited with code:0</pre>

<p>　このように、blockdiff を使うことで VM 単位のバックアップだけでなく、データベースのホットバックアップも簡単に取ることができます。パストラックでは、これらバックアップスクリプトに処理を追加し、バックアップ中は統計処理を抑止するといったことも行っています。</p>

<p>　blockdiff や kaztools は、いずれも私の github リポジトリ (<a href="http://github.com/kazuho/">github.com/kazuho</a>) からダウンロードして perl Makefile.PL &amp;&amp; make all test &amp;&amp; make install でインストール可能です。あるいは <a href="http://search.cpan.org/dist/App-NoPAN/">nopan</a> がインストールされていれば、nopan http://github.com/kazuho/blockdiff http://github.com/kazuho/kaztools と１コマンドでインストールすることができます。いずれも<a href="http://pathtraq.com/">パストラック</a>で実際に運用しているツール群ですが、興味のある方は (at your own risk で) お試しあれ。</p>

<p>
注1: バックアップを取るサーバに Perl 5.8 以降がインストールされている必要があります。また、公開鍵認証を用いて SSH ログインできる必要があります<br />
注2: XenServer のスナップショット機能とは併用できません
</p></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23083&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23083&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 18 Jan 2010 02:53:54 +0000</pubDate>
    <dc:creator>Kazuho Oku</dc:creator>
    <category>MySQL</category>
    <category>Perl</category>
    <category>PostgreSQL</category>
    <category>管理・運用</category>
  </item>

  <item>
    <title>[mysql]MySQL 5.5.1-m2 リリース</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sakaik/20100115/my551</guid>
    <link>http://d.hatena.ne.jp/sakaik/20100115/my551</link>
    <description>　MySQL 5.5.1-m2 がリリースされました。65項目近くの修正がなされています。 　http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=164  　ダウンロードページの操作が、プラットフォームを小さいコンボボックスから選択するというワンステップが必要になり、使いにくくなりました(x_x)。   InnoDB Plugin が MySQL 5.5.0-m2 では 1.0.5 でしたが、今回 1.0.6 になりました rpm ...</description>
    <content:encoded><![CDATA[　MySQL 5.5.1-m2 がリリースされました。65項目近くの修正がなされています。 　http://www.mysql.gr.jp/frame/modules/news/article.php?storyid=164  　ダウンロードページの操作が、プラットフォームを小さいコンボボックスから選択するというワンステップが必要になり、使いにくくなりました(x_x)。   InnoDB Plugin が MySQL 5.5.0-m2 では 1.0.5 でしたが、今回 1.0.6 になりました rpm ...<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23066&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23066&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Fri, 15 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sakai Kei</dc:creator>
  </item>

  <item>
    <title>SQLインジェクションとは何か？その正体とクラッキング対策。</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-6834472597384772623</guid>
    <link>http://nippondanji.blogspot.com/2010/01/sql.html</link>
    <description>世間では、今Gumblar祭りが勃発中であり、SQLインジェクションがニュースに出てくることは少なくなったが、だからと言ってSQLインジェクションの脅威がなくなったわけではない。SQLインジェクションはGumblarを仕掛ける手段としても利用されることがあり、Webアプリケーションを提供する全ての人にとって、対策を講じなければいけない驚異であることに変わりはない。SQLインジェクションという攻撃手法が認識され、大いに悪用されているにも係わらず、その本質に迫って解説している記事は少ないように思う。従来のWeb屋だけでなく、今やアプリケーション開発の主戦場はWebであると言っても過言ではなく、そういう意味ではSQLインジェクションについて理解することは、全てのプログラマにとっての嗜みであると言えるだろう。というわけで、今日は改めてSQLインジェクションについて語ってみようと思う。SQLインジェクションとは？SQLインジェクションは、一言で言うと不正にSQLを書き換えてしまう攻撃手法である。名前からするとデータベース上のセキュリティ脆弱性のように思ってしまうかも知れないが、実はそうではなく、Webアプリケーション側の問題なのである。データベースは、安全なSQLであるか不正に書き換えられたSQLであるかを見分けることは出来ない。文法さえ正しければSQLを実行して結果をしまうのである。それはデータベースにとって期待通りの動作であり、文法的に正しいSQLを実行するのは欠陥でも何もない。（むしろ実行出来ないのが欠陥であると言える。）つまり、Webアプリケーション側でSQLが書き換えられた時点で、時はもう既に遅し！なのである。従って、SQLインジェクション攻撃は特定のデータベースだけの問題ではない。MySQLはもちろんのこと、ポスグレだってオラクルだってDB2だってMS SQL ServerだってSQLインジェクションの餌食となりえるのである。なぜなら、Webアプリケーションの問題だから。おっと、もちろんFirebirdもだ。では、何故Webアプリケーション側でSQLインジェクション攻撃が可能なのか？というと、それは、WebアプリケーションがSQLを動的に組み立てるからである。Webアプリケーションでは、まあ一番最悪な例では次のように、文字列を連結してSQL文を組み立てようとすることがある。$sql = &quot;SELECT user, pass FROM usersWHERE user = '&quot; + $user + &quot;' AND pass = '&quot; + $password + &quot;'&quot;$userや$passwordはHTMLの入力フォームから受け取った文字列であるとしよう。これは何らかのユーザー認証を仮定したものであるが、「これの何が悪いの？」と思った人はアウト〜〜〜ッ！！である。これはまさにSQLインジェクションが可能なコードだからだ。攻撃例例えばユーザーとして「nippondanji」、パスワードに「fundoshi」という文字列を代入したとしよう。すると、このコードが生成するSQL文（つまりデータベースに投げられるもの）は次のようなものになる。SELECT user, pass FROM users WHERE user = 'nippondanji' AND pass = 'fundoshi'これのSQL文なら安全である。攻撃者は、$userや$passwordに相当する部分について様々なテクニックを使って攻撃をし、不正にログインしたり、不正にクレジットカードなどの情報を入手したり、不正にデータを書き換えたりする。そして結果的に、文法は正しいが全く意味の異なるSQL文へと書き換えてしまうことにより、攻撃を成立させるのである。SQLインジェクションに利用される書き換えのテクニックには様々なものが存在するが、例えば次のようなものが挙げられる。クォーテーションを文字列の中に混入させる。これにより、攻撃者は新たなSQLの文法を注入＝インジェクトすることが可能になる。SQL文を途中でコメントアウトしてしまう。これにより、文法的に正しいSQL文を組み立てやすくなる。OR 1=1など恒常的に成り立つ条件を利用する。これにより、WHERE句の条件を無視してしまう。UNIONを用いて任意の情報を入手する。INFORMATION_SCHEMAへアクセスしてどのようなテーブルが存在するかといった情報を入手する。セミコロンを使って複数のSQL文を記述し、任意のSQL文を実行する。これにより、不正にデータを改竄してしまう。 攻撃方法は数えあげればキリがないが、実に様々なバリエーションが存在する。（攻撃方法が分かったとしても、絶対に悪用してはいけないよ！）例えば、前述のSQL文に対してパスワードの確認をすっ飛ばしたいと思ったなら、$userに「nippondanji'#」というような値を混入させてしまうことである。そうすると、SQL文は次のように違った意味のものになってしまうだろう。SELECT user, pass FROM users WHERE user = 'nippondanji'#' AND pass = 'hoge'この例では、クォーテーションによって文字列が意図しないところで閉じており、なおかつハッシュ記号（#）以降はコメントアウトされてしまっているので、パスワードの値が何であってもユーザーが存在すればログイン出来てしまうのである！もう一つ例を紹介しよう。次は、氏名からユーザーを検索するコードだと仮定して欲しい。$sql = &quot;SELECT user, first_name, last_name, prof FROM usersWHERE MATCH(first_name, last_name) AGAINST ('&quot; + $search + &quot;')&quot;例えばこのコードの$searchに対して「Mikiya」と入力すると次のようなSQL文になる。SELECT user, first_name, last_name, prof FROM users WHERE MATCH(first_name, last_name) AGAINST('Mikiya')ああ、可愛そうなSQL・・・。このSELECT文を書き換えると、最悪の場合任意の情報をデータベースから抜き出すことが可能になる。例えば、検索語のところに「') LIMIT 0 UNION SELECT user, pass, 1, 1 FROM users ORDER BY RAND() LIMIT 10 #」という文字列を入れたとしよう。すると、このSQL文は次のようになってしまう。SELECT user, firt_name, last_name, prof FROM users WHERE MATCH(first_name, last_name) AGAINST('') LIMIT 0 UNION SELECT user, pass, 1, 1 FROM users ORDER BY RAND() LIMIT 10 #')おわかりだろうか？全く意味の異なるSQL文であるが、これは文法的には正しい。そして、意図しない情報（この場合は任意のユーザーのパスワード10個）を抜き出しているのである。UNIONを利用すれば任意のテーブルから任意の情報を取り出すことが可能であり、それはそれは恐ろしい攻撃が成立してしまうのである。しかも、UNIONを使ってINFORMATION_SCHEMAにアクセスすればどのようなテーブルが存在するかが把握出来るので、攻撃者は思いのままに情報を入手出来てしまうだろう。このように、SQLインジェクションは本当にヤバい攻撃なのである。対策編SQLインジェクションの最も確実で根本的な対策は、プリペアードステートメントを利用することである。問題は、SQLを組み立てる過程にあるので、動的にSQLを組み立てなければ原理的にはSQLインジェクションは発生しない。Webのフォームから受け取った値は、パラメータとしてプリペアードステートメントに渡せばいいわけである。ただし、プリペアードステートメント自身を動的に組み立ててしまうと元の木阿弥なので注意しよう！また、せっかくプリペアードステートメントを利用しても、その中でストアドプロシージャを呼び出し、ストアドプロシージャ内で動的なSQLの組み立てをやっていた・・・などということにもならないように注意したい。何らかの事情によってプリペアードステートメントが利用出来ない場合は動的にSQLを組み立てるしかないが、その場合はWebのフォームから受け取った値をチェックしたりエスケープしたりしてフィルタするしかない。例えば入力される値が数字であると分かっていれば、正規表現で不正な入力を簡単にはじくことができるだろう。文字列の場合にはしっかりとエスケープする必要があるが、攻撃者はフィルタをすり抜けて不正なシングルクォーテーションを混入させる手法の発見に血道をあげており、フィルタの開発と攻撃手法の確立はいたちごっこであると言える。（今は完全に見えてもどこかに穴があるかも知れない。穴がひとつでも存在していれば一巻の終わりなのだ！）Webアプリケーションファイアウォールを使ってフィルタを強化するのもアリだろう。ただし、フィルタはWebから受け取った値だけを対象にするだけでは不十分である。いったんデータベースへ不正な値を格納させておいてから、それを攻撃に利用する「セカンドオーダーインジェクション」という手法が存在するので、フィルタはSQLを組み立てるのに利用する値全てに適用する必要があるので注意しよう。UNIONなどを使った攻撃では、そのSQL文を実行するユーザーが入手出来る情報なら、ありとあらゆるものが入手出来てしまう。従って、「このサービスはあんまりアクセスが多くないから・・・」などと思って油断してはならない。どれだけアクセスが少なかろうとも、SQLインジェクション攻撃が成立してしまった時の被害の大きさに違いは無いからである！油断しないこと！それが一番大事なSQLインジェクション対策であると言える。その他の対策としては、データベースのセキュリティを徹底したり、大事な情報（パスワードやクレジットカード番号など）をアプリケーション側で暗号化してからデータベースに突っ込んだり、ハニーポットを仕掛けておいたり、といった基本的なことが考えられる。O/Rマッパーを使うのも有効である。（フィルタが備わっていたり、自動的にプリペアードステートメントを使ってくれたりすることがあるため。）まとめと宣伝SQLインジェクションはとても恐ろしい攻撃であり、どのようなデータベース製品であろうとも、ひとたびSQLが書き換えられてしまうとそれを防ぐことは出来ない。そのためにはWebアプリケーション側でしっかりと対策をしておく必要がある。本稿ではSQLインジェクションの原理と対策について説明したが、何よりも重要なことは皆がSQLインジェクションの驚異を認識し、危機感を持つことである。そして、皆で協力し、対策を講じるためのノウハウがWebに蓄積していくことが重要だと思う。この投稿も皆さんのお役に立てれば幸いである。現在執筆中の書籍にも、SQLインジェクションの話が出てくるのだが、この記事よりもうちょっと（かなり？）詳しく説明している。春に発売する予定なので乞うご期待！！皆さん買って下さいｗ</description>
    <content:encoded><![CDATA[世間では、今Gumblar祭りが勃発中であり、SQLインジェクションがニュースに出てくることは少なくなったが、だからと言ってSQLインジェクションの脅威がなくなったわけではない。SQLインジェクションはGumblarを仕掛ける手段としても利用されることがあり、Webアプリケーションを提供する全ての人にとって、対策を講じなければいけない驚異であることに変わりはない。SQLインジェクションという攻撃手法が認識され、大いに悪用されているにも係わらず、その本質に迫って解説している記事は少ないように思う。従来のWeb屋だけでなく、今やアプリケーション開発の主戦場はWebであると言っても過言ではなく、そういう意味ではSQLインジェクションについて理解することは、全てのプログラマにとっての嗜みであると言えるだろう。<br /><br />というわけで、今日は改めてSQLインジェクションについて語ってみようと思う。<br /><br /><h4>SQLインジェクションとは？</h4>SQLインジェクションは、一言で言うと不正にSQLを書き換えてしまう攻撃手法である。名前からするとデータベース上のセキュリティ脆弱性のように思ってしまうかも知れないが、実はそうではなく、Webアプリケーション側の問題なのである。データベースは、安全なSQLであるか不正に書き換えられたSQLであるかを見分けることは出来ない。文法さえ正しければSQLを実行して結果をしまうのである。それはデータベースにとって期待通りの動作であり、文法的に正しいSQLを実行するのは欠陥でも何もない。（むしろ実行出来ないのが欠陥であると言える。）つまり、Webアプリケーション側でSQLが書き換えられた時点で、時はもう既に遅し！なのである。<br /><br />従って、SQLインジェクション攻撃は特定のデータベースだけの問題ではない。MySQLはもちろんのこと、ポスグレだってオラクルだってDB2だってMS SQL ServerだってSQLインジェクションの餌食となりえるのである。なぜなら、Webアプリケーションの問題だから。おっと、もちろんFirebirdもだ。<br /><br />では、何故Webアプリケーション側でSQLインジェクション攻撃が可能なのか？というと、それは、WebアプリケーションがSQLを動的に組み立てるからである。Webアプリケーションでは、まあ一番最悪な例では次のように、文字列を連結してSQL文を組み立てようとすることがある。<br /><pre name="code">$sql = "SELECT user, pass FROM users<br />WHERE user = '" + $user + "' AND pass = '" + $password + "'"</pre>$userや$passwordはHTMLの入力フォームから受け取った文字列であるとしよう。これは何らかのユーザー認証を仮定したものであるが、「これの何が悪いの？」と思った人はアウト〜〜〜ッ！！である。これはまさにSQLインジェクションが可能なコードだからだ。<br /><br /><h4>攻撃例</h4>例えばユーザーとして「nippondanji」、パスワードに「fundoshi」という文字列を代入したとしよう。すると、このコードが生成するSQL文（つまりデータベースに投げられるもの）は次のようなものになる。<br /><pre name="code">SELECT user, pass FROM users WHERE user = 'nippondanji' AND pass = 'fundoshi'</pre>これのSQL文なら安全である。攻撃者は、$userや$passwordに相当する部分について様々なテクニックを使って攻撃をし、不正にログインしたり、不正にクレジットカードなどの情報を入手したり、不正にデータを書き換えたりする。そして結果的に、文法は正しいが全く意味の異なるSQL文へと書き換えてしまうことにより、攻撃を成立させるのである。SQLインジェクションに利用される書き換えのテクニックには様々なものが存在するが、例えば次のようなものが挙げられる。<br /><ul><li>クォーテーションを文字列の中に混入させる。これにより、攻撃者は新たなSQLの文法を注入＝インジェクトすることが可能になる。</LI><li>SQL文を途中でコメントアウトしてしまう。これにより、文法的に正しいSQL文を組み立てやすくなる。</LI><li>OR 1=1など恒常的に成り立つ条件を利用する。これにより、WHERE句の条件を無視してしまう。</LI><li>UNIONを用いて任意の情報を入手する。</LI><li>INFORMATION_SCHEMAへアクセスしてどのようなテーブルが存在するかといった情報を入手する。</LI><li>セミコロンを使って複数のSQL文を記述し、任意のSQL文を実行する。これにより、不正にデータを改竄してしまう。</LI> </UL>攻撃方法は数えあげればキリがないが、実に様々なバリエーションが存在する。（攻撃方法が分かったとしても、絶対に悪用してはいけないよ！）例えば、前述のSQL文に対してパスワードの確認をすっ飛ばしたいと思ったなら、$userに「nippondanji'#」というような値を混入させてしまうことである。そうすると、SQL文は次のように違った意味のものになってしまうだろう。<br /><pre name="code">SELECT user, pass FROM users WHERE user = 'nippondanji'#' AND pass = 'hoge'<br /></pre>この例では、クォーテーションによって文字列が意図しないところで閉じており、なおかつハッシュ記号（#）以降はコメントアウトされてしまっているので、パスワードの値が何であってもユーザーが存在すればログイン出来てしまうのである！<br /><br />もう一つ例を紹介しよう。次は、氏名からユーザーを検索するコードだと仮定して欲しい。<br /><pre name="code">$sql = "SELECT user, first_name, last_name, prof FROM users<br />WHERE MATCH(first_name, last_name) AGAINST ('" + $search + "')"</pre>例えばこのコードの$searchに対して「Mikiya」と入力すると次のようなSQL文になる。<br /><pre name="code">SELECT user, first_name, last_name, prof FROM users WHERE MATCH(first_name, last_name) AGAINST('Mikiya')</pre>ああ、可愛そうなSQL・・・。このSELECT文を書き換えると、最悪の場合任意の情報をデータベースから抜き出すことが可能になる。例えば、検索語のところに「') LIMIT 0 UNION SELECT user, pass, 1, 1 FROM users ORDER BY RAND() LIMIT 10 #」という文字列を入れたとしよう。すると、このSQL文は次のようになってしまう。<br /><pre name="code">SELECT user, firt_name, last_name, prof FROM users WHERE MATCH(first_name, last_name) AGAINST('') LIMIT 0 UNION SELECT user, pass, 1, 1 FROM users ORDER BY RAND() LIMIT 10 #')</pre>おわかりだろうか？全く意味の異なるSQL文であるが、これは文法的には正しい。そして、意図しない情報（この場合は任意のユーザーのパスワード10個）を抜き出しているのである。UNIONを利用すれば任意のテーブルから任意の情報を取り出すことが可能であり、それはそれは恐ろしい攻撃が成立してしまうのである。しかも、UNIONを使ってINFORMATION_SCHEMAにアクセスすればどのようなテーブルが存在するかが把握出来るので、攻撃者は思いのままに情報を入手出来てしまうだろう。<br /><br />このように、SQLインジェクションは本当にヤバい攻撃なのである。<br /><br /><h4>対策編</h4>SQLインジェクションの最も確実で根本的な対策は、プリペアードステートメントを利用することである。問題は、SQLを組み立てる過程にあるので、<span>動的にSQLを組み立てなければ原理的にはSQLインジェクションは発生しない。</span>Webのフォームから受け取った値は、パラメータとしてプリペアードステートメントに渡せばいいわけである。ただし、プリペアードステートメント自身を動的に組み立ててしまうと元の木阿弥なので注意しよう！また、せっかくプリペアードステートメントを利用しても、その中でストアドプロシージャを呼び出し、ストアドプロシージャ内で動的なSQLの組み立てをやっていた・・・などということにもならないように注意したい。<br /><br />何らかの事情によってプリペアードステートメントが利用出来ない場合は動的にSQLを組み立てるしかないが、その場合はWebのフォームから受け取った値をチェックしたりエスケープしたりしてフィルタするしかない。例えば入力される値が数字であると分かっていれば、正規表現で不正な入力を簡単にはじくことができるだろう。文字列の場合にはしっかりとエスケープする必要があるが、攻撃者はフィルタをすり抜けて不正なシングルクォーテーションを混入させる手法の発見に血道をあげており、<span>フィルタの開発と攻撃手法の確立はいたちごっこである</span>と言える。（今は完全に見えてもどこかに穴があるかも知れない。穴がひとつでも存在していれば一巻の終わりなのだ！）Webアプリケーションファイアウォールを使ってフィルタを強化するのもアリだろう。<br /><br />ただし、フィルタはWebから受け取った値だけを対象にするだけでは不十分である。いったんデータベースへ不正な値を格納させておいてから、それを攻撃に利用する「セカンドオーダーインジェクション」という手法が存在するので、フィルタはSQLを組み立てるのに利用する値全てに適用する必要があるので注意しよう。<br /><br />UNIONなどを使った攻撃では、そのSQL文を実行するユーザーが入手出来る情報なら、ありとあらゆるものが入手出来てしまう。従って、「このサービスはあんまりアクセスが多くないから・・・」などと思って油断してはならない。どれだけアクセスが少なかろうとも、SQLインジェクション攻撃が成立してしまった時の被害の大きさに違いは無いからである！油断しないこと！それが一番大事なSQLインジェクション対策であると言える。<br /><br />その他の対策としては、データベースのセキュリティを徹底したり、大事な情報（パスワードやクレジットカード番号など）をアプリケーション側で暗号化してからデータベースに突っ込んだり、ハニーポットを仕掛けておいたり、といった基本的なことが考えられる。O/Rマッパーを使うのも有効である。（フィルタが備わっていたり、自動的にプリペアードステートメントを使ってくれたりすることがあるため。）<br /><br /><h4>まとめと宣伝</h4>SQLインジェクションはとても恐ろしい攻撃であり、どのようなデータベース製品であろうとも、ひとたびSQLが書き換えられてしまうとそれを防ぐことは出来ない。そのためにはWebアプリケーション側でしっかりと対策をしておく必要がある。本稿ではSQLインジェクションの原理と対策について説明したが、何よりも重要なことは皆がSQLインジェクションの驚異を認識し、危機感を持つことである。そして、皆で協力し、対策を講じるためのノウハウがWebに蓄積していくことが重要だと思う。この投稿も皆さんのお役に立てれば幸いである。<br /><br />現在執筆中の書籍にも、SQLインジェクションの話が出てくるのだが、この記事よりもうちょっと（かなり？）詳しく説明している。春に発売する予定なので乞うご期待！！皆さん買って下さいｗ<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-6834472597384772623?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23039&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23039&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Wed, 13 Jan 2010 23:10:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>sql injection</category>
    <category>mysql</category>
    <category>security</category>
  </item>

  <item>
    <title>Heartbeat(V3) + Pacemaker(V1) + DRBDの参考</title>
    <guid isPermaLink="false">http://blog.kimuradb.com/?eid=830832</guid>
    <link>http://blog.kimuradb.com/?eid=830832</link>
    <description>とりあえずDRBDマニュアルのここらへんから始めるのか吉かと。(MySQLってのはまだ見あたらないので、V2表記を参考にするといい感じです)

第8章 DRBDとPacemakerクラスタの統合

PacemakerはHeartbeatから分離独立したCRM部分です。ここらへんの経緯については以下をご参照ください。

Heartbeatでかんたんクラスタリング（5）Heartbeat開発プロジェクトの現状

分離独立したことからHeartbeatのみならずOpenAISもサポートするようになりました。

Pacemaker

OpenAIS

今後のHeartbeatはPacemakerと組み合わせてVersion 3形式での記述がが主流になっていくことが期待されます。
基本的にはVersion 2形式(cib.xml)ですが、それを直接編集するのではなく、シェルもしくはGUIツールで利用します。

折良くDRBD開発元のオーストリアLINBIT社によるHeartbeat 3のメンテナンススケジュールも発表され、
Heartbeat 3.0.2が来週にもリリース予定です。

[Linux-ha-jp] Heartbeat 3のメンテナンススケジュールがアナウンスされました

まだ書籍などはないのですが、LINBIT社の日本でのパートナーであるサードウエアさんが
無償/有償のセミナーをやっているので、ざっくり全体を知りたい場合には、申し込んでみるのもよいと思います。</description>
    <content:encoded><![CDATA[とりあえずDRBDマニュアルのここらへんから始めるのか吉かと。(MySQLってのはまだ見あたらないので、V2表記を参考にするといい感じです)<br />
<br />
<a href="http://www.drbd.jp/users-guide/ch-pacemaker.html" target="_blank">第8章 DRBDとPacemakerクラスタの統合</a><br />
<br />
PacemakerはHeartbeatから分離独立したCRM部分です。ここらへんの経緯については以下をご参照ください。<br />
<br />
<a href="http://www.atmarkit.co.jp/flinux/rensai/heartbeat05/heartbeat05a.html" target="_blank">Heartbeatでかんたんクラスタリング（5）Heartbeat開発プロジェクトの現状</a><br />
<br />
分離独立したことからHeartbeatのみならずOpenAISもサポートするようになりました。<br />
<br />
<a href="http://www.clusterlabs.org/wiki/Main_Page" target="_blank">Pacemaker</a><br />
<br />
<a href="http://www.openais.org/doku.php" target="_blank">OpenAIS</a><br />
<br />
今後のHeartbeatはPacemakerと組み合わせてVersion 3形式での記述がが主流になっていくことが期待されます。<br />
基本的にはVersion 2形式(cib.xml)ですが、それを直接編集するのではなく、シェルもしくはGUIツールで利用します。<br />
<br />
折良くDRBD開発元のオーストリアLINBIT社によるHeartbeat 3のメンテナンススケジュールも発表され、<br />
Heartbeat 3.0.2が来週にもリリース予定です。<br />
<br />
<a href="http://sourceforge.jp/projects/linux-ha/lists/archive/japan/2009-December/000274.html" target="_blank">[Linux-ha-jp] Heartbeat 3のメンテナンススケジュールがアナウンスされました</a><br />
<br />
まだ書籍などはないのですが、<a href="http://www.3ware.co.jp/seminar.html" target="_blank">LINBIT社の日本でのパートナーであるサードウエアさんが<br />
無償/有償のセミナーをやっている</a>ので、ざっくり全体を知りたい場合には、申し込んでみるのもよいと思います。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23031&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=23031&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 12 Jan 2010 21:48:24 +0000</pubDate>
    <dc:creator>MeijiK</dc:creator>
    <category>MySQL</category>
  </item>

  <item>
    <title>データベース負荷テストツールまとめ(3)</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/sh2/20100112</guid>
    <link>http://d.hatena.ne.jp/sh2/20100112</link>
    <description>データベース負荷テストツールまとめの第3回です。  データベース負荷テストツールまとめ(1) TPC-B、TPC-Wベースのツールを6つ紹介 データベース負荷テストツールまとめ(2) TPC-Cベースのツールを6つ紹介  かなり期間が空いてしまいましたが、今回はTPC-Hベースのツールを見ていきたいと思います。 TPC-Hとは TPC-HはRDBMSベンチマーク仕様の一つで、意思決定支援システム(DSS)としての性能を測定するものです。大規模なデータを対象にアドホックなクエリを実行します。クエリは全部で22種類定義されています。 TPC-HはTPC-B/W/Cなどと異なり、実行するクエリそのものやテストデータ生成ツールがTPCから提供されています。試しに、一番負荷が高い9番のクエリを確認してみましょう。  -- $ID$ -- TPC-H/TPC-R Product Type Profit Measure Query (Q9) -- Functional Query Definition -- Approved February 1998 :x :o select nation, o_year, sum(amount) as sum_profit from ( select n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice &amp;#42; (1 - l_discount) - ps_supplycost &amp;#42; l_quantity as amount from part, supplier, lineitem, partsupp, orders, nation where s_suppkey = l_suppkey and ps_suppkey = l_suppkey and ps_partkey = l_partkey and p_partkey = l_partkey and o_orderkey = l_orderkey and s_nationkey = n_nationkey and p_name like &amp;#39;%:1%&amp;#39; ) as profit group by nation, o_year order by nation, o_year desc; :n -1  SQLだけだと分かりづらいので、ER図も貼り付けておきます。  どうやら何かの売り上げデータのようですね。中央に注文テーブル(orders)と注文明細テーブル(lineitem)があって、注文明細テーブルには部品(part)と仕入れ先(supplier)をM：N結合したpartsuppテーブルとのリレーションが張られています。 お金のデータに注目すると、部品テーブルのp_retailpriceが希望小売価格、partsuppテーブルのps_supplycostが仕入れ先ごとの実際の卸価格、注文明細テーブルのl_extendedpriceは明細ごとの販売価格、そして注文テーブルのo_totalpriceが明細を束ねた合計価格となっています。 9番のクエリは「ある名前の部品について、仕入れ先の国および年度別の利益額を求めなさい」というものです。基本的には注文明細テーブルを集計すればよいのですが、レコードの絞り込みや利益額の計算に必要なデータが各テーブルに散らばってしまっているため、かなり厳しいクエリになっています。  厳しいというか、ER図をじっと眺めていても効率的なSQL実行計画がさっぱり見えてきません。これが仕事だったらテーブルを非正規化するかスタースキーマに作り変えてしまう、あるいはOracleでマテリアライズド・ビューを作ってしまうところですが…。それをやってしまっては反則なので、あくまでこのテーブル構造を守りながら、無茶なクエリにどれだけ耐えられるかというのがTPC-Hのポイントになるわけです。 DBT-3  対応RDBMS：PostgreSQL、SAP DB 対応OS：Linuxなど 言語：C、シェルスクリプト 作者：OSDL(現在のThe Linux Foundation) ライセンス：The Artistic License トランザクション仕様：TPC-Hベース URL：http://sourceforge.net/projects/osdldbt/  DBT-3は、OSDLによるTPC-Hの実装です。TPCが提供するクエリとテストデータ生成ツールをPostgreSQL、SAP DBで動作するようにカスタマイズし、データベース構築スクリプトと負荷テスト実行用のシェルスクリプトを追加した構成になっています。 このうちCで書かれているのはテストデータ生成ツールのみで、あとはシェルスクリプトになっています。以前紹介したDBT-1、DBT-2はあまりプログラムの品質が良いとは言えなかったのですが、DBT-3については処理の見通しもよく、大きな問題はないと思います。 DBT-3 IPA版  対応RDBMS：MySQL 対応OS：Linuxなど 言語：C、シェルスクリプト 作者：日本OSS推進フォーラム ライセンス：The Artistic License トランザクション仕様：TPC-Hベース URL：http://ossipedia.ipa.go.jp/documents/dbt3-mysql/dbt3-1.9_mysql_porting.html  DBT-3 IPA版は、オリジナルのDBT-1をMySQLに対応させたものです。実際の移植作業は日本HPが実施しています。HPさんの報告書はかなり出来が良いので、一度目を通しておくことをおすすめします。  DBT-3 version 1.9 MySQL5.0への移植作業報告書 DBT-3 MySQL版によるMySQL5.0の評価手順 OSS iPedia内を「DBT-3 MySQL」で検索した結果  DBT-3 IPA版はMySQL 5.1でもそのまま動作します。ということで試してみました。   MySQL 5.1.38＋InnoDB Plugin 1.0.4 InnoDBバッファプール：512MB TPC-Hのスケールファクタ：1  スケールファクタが1のとき、注文明細テーブルは約2.3GB(テーブル約900MB、インデックス約1,400MB)となり、データベース全体のサイズはおよそ3GBとなります。1時間17分もかかった9番のクエリなどは、完全にディスクI/Oネックになっています。それにしても、遅いですね。 また、移植作業報告書の5.3節で18番のクエリの変更について言及されていますが、  5.3.クエリ番号18の修正 (実施上の問題回避) MySQL5.0ではクエリ番号18内にあるIN演算子とSELECT文の組み合わせた演算コストが非常に大きく、演算が完了できなかった。このため、テンポラリテーブルを利用したクエリに展開した。 MySQLにおけるテンポラリテーブルは、作成されたセッション中にのみ有効なテーブルとなっているため、 Throughputテストにおいて、同一クエリが実施された場合でも問題なく、クエリを実施可能となっている。  この原因については、漢(オトコ)のコンピュータ道: なぜMySQLのサブクエリは遅いのか。で詳しく解説されています。それぞれのクエリがどうして速いのか、あるいは遅いのかは、今ではほぼ明らかになっていると思います。  MySQLは内部的にINを直接処理することができないので、EXISTSに変換することでSQL的には相関のないサブクエリも相関サブクエリになってしまうのである。これがまさにMySQLのサブクエリが遅い！と言われている原因だろう。  MySQLのDSSへの適用性 TPC-Hを題材にしたMySQLの性能改善については、MySQL Conference &amp;#38; Expo 2008におけるSergey Petrunia氏のセッションも参考になります(PDF資料)。本資料の25ページにおいて、18番のクエリはMaterializationというテクニックによりMySQLの将来のバージョンで大幅に改善されることが述べられています。ただ、Sergey氏は昨年Sun Microsystemsを辞めてしまったのでちょっと微妙な状況ではありますが…。 こうした複雑なクエリを実行するDSSに対して、現在のMySQLが向いていないのは残念ながら事実です。しかし逆に考えればそれはビジネスチャンスでもあります。MySQLがオープンソースソフトウェアであることを利用して、現在複数のベンチャーがDSSソリューションを提供しています。  Infobright MySQLに独自のオプティマイザとストレージエンジンを組み込んでいる InfiniDB 列指向データベースエンジン。MySQLをフロントエンドとして利用する Kickfire MySQLをベースとするアプライアンス。SQL処理を支援する独自開発のLSIを搭載  Kickfireは実際にTPC-Hでも優秀な結果を残しています。こうした動きもおさえておきたいですね。 続きます というわけで第3回はTPC-Hベースの負荷テストツールを2つ見てきました。他にもご紹介したいツールはまだまだたくさんあるので、不定期ですがじっくり続けていきたいと思います。それでは。</description>
    <content:encoded><![CDATA[データベース負荷テストツールまとめの第3回です。  データベース負荷テストツールまとめ(1) TPC-B、TPC-Wベースのツールを6つ紹介 データベース負荷テストツールまとめ(2) TPC-Cベースのツールを6つ紹介  かなり期間が空いてしまいましたが、今回はTPC-Hベースのツールを見ていきたいと思います。 TPC-Hとは TPC-HはRDBMSベンチマーク仕様の一つで、意思決定支援システム(DSS)としての性能を測定するものです。大規模なデータを対象にアドホックなクエリを実行します。クエリは全部で22種類定義されています。 TPC-HはTPC-B/W/Cなどと異なり、実行するクエリそのものやテストデータ生成ツールがTPCから提供されています。試しに、一番負荷が高い9番のクエリを確認してみましょう。  -- $ID$ -- TPC-H/TPC-R Product Type Profit Measure Query (Q9) -- Functional Query Definition -- Approved February 1998 :x :o select nation, o_year, sum(amount) as sum_profit from ( select n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice &#42; (1 - l_discount) - ps_supplycost &#42; l_quantity as amount from part, supplier, lineitem, partsupp, orders, nation where s_suppkey = l_suppkey and ps_suppkey = l_suppkey and ps_partkey = l_partkey and p_partkey = l_partkey and o_orderkey = l_orderkey and s_nationkey = n_nationkey and p_name like &#39;%:1%&#39; ) as profit group by nation, o_year order by nation, o_year desc; :n -1  SQLだけだと分かりづらいので、ER図も貼り付けておきます。  どうやら何かの売り上げデータのようですね。中央に注文テーブル(orders)と注文明細テーブル(lineitem)があって、注文明細テーブルには部品(part)と仕入れ先(supplier)をM：N結合したpartsuppテーブルとのリレーションが張られています。 お金のデータに注目すると、部品テーブルのp_retailpriceが希望小売価格、partsuppテーブルのps_supplycostが仕入れ先ごとの実際の卸価格、注文明細テーブルのl_extendedpriceは明細ごとの販売価格、そして注文テーブルのo_totalpriceが明細を束ねた合計価格となっています。 9番のクエリは「ある名前の部品について、仕入れ先の国および年度別の利益額を求めなさい」というものです。基本的には注文明細テーブルを集計すればよいのですが、レコードの絞り込みや利益額の計算に必要なデータが各テーブルに散らばってしまっているため、かなり厳しいクエリになっています。  厳しいというか、ER図をじっと眺めていても効率的なSQL実行計画がさっぱり見えてきません。これが仕事だったらテーブルを非正規化するかスタースキーマに作り変えてしまう、あるいはOracleでマテリアライズド・ビューを作ってしまうところですが…。それをやってしまっては反則なので、あくまでこのテーブル構造を守りながら、無茶なクエリにどれだけ耐えられるかというのがTPC-Hのポイントになるわけです。 DBT-3  対応RDBMS：PostgreSQL、SAP DB 対応OS：Linuxなど 言語：C、シェルスクリプト 作者：OSDL(現在のThe Linux Foundation) ライセンス：The Artistic License トランザクション仕様：TPC-Hベース URL：http://sourceforge.net/projects/osdldbt/  DBT-3は、OSDLによるTPC-Hの実装です。TPCが提供するクエリとテストデータ生成ツールをPostgreSQL、SAP DBで動作するようにカスタマイズし、データベース構築スクリプトと負荷テスト実行用のシェルスクリプトを追加した構成になっています。 このうちCで書かれているのはテストデータ生成ツールのみで、あとはシェルスクリプトになっています。以前紹介したDBT-1、DBT-2はあまりプログラムの品質が良いとは言えなかったのですが、DBT-3については処理の見通しもよく、大きな問題はないと思います。 DBT-3 IPA版  対応RDBMS：<span>MySQL</span> 対応OS：Linuxなど 言語：C、シェルスクリプト 作者：日本OSS推進フォーラム ライセンス：The Artistic License トランザクション仕様：TPC-Hベース URL：http://ossipedia.ipa.go.jp/documents/dbt3-<span>mysql</span>/dbt3-1.9_<span>mysql</span>_porting.html  DBT-3 IPA版は、オリジナルのDBT-1を<span>MySQL</span>に対応させたものです。実際の移植作業は日本HPが実施しています。HPさんの報告書はかなり出来が良いので、一度目を通しておくことをおすすめします。  DBT-3 version 1.9 <span>MySQL</span>5.0への移植作業報告書 DBT-3 <span>MySQL</span>版による<span>MySQL</span>5.0の評価手順 OSS iPedia内を「DBT-3 <span>MySQL</span>」で検索した結果  DBT-3 IPA版は<span>MySQL</span> 5.1でもそのまま動作します。ということで試してみました。   <span>MySQL</span> 5.1.38＋InnoDB Plugin 1.0.4 InnoDBバッファプール：512MB TPC-Hのスケールファクタ：1  スケールファクタが1のとき、注文明細テーブルは約2.3GB(テーブル約900MB、インデックス約1,400MB)となり、データベース全体のサイズはおよそ3GBとなります。1時間17分もかかった9番のクエリなどは、完全にディスクI/Oネックになっています。それにしても、遅いですね。 また、移植作業報告書の5.3節で18番のクエリの変更について言及されていますが、  5.3.クエリ番号18の修正 (実施上の問題回避) <span>MySQL</span>5.0ではクエリ番号18内にあるIN演算子とSELECT文の組み合わせた演算コストが非常に大きく、演算が完了できなかった。このため、テンポラリテーブルを利用したクエリに展開した。 <span>MySQL</span>におけるテンポラリテーブルは、作成されたセッション中にのみ有効なテーブルとなっているため、 Throughputテストにおいて、同一クエリが実施された場合でも問題なく、クエリを実施可能となっている。  この原因については、漢(オトコ)のコンピュータ道: なぜ<span>MySQL</span>のサブクエリは遅いのか。で詳しく解説されています。それぞれのクエリがどうして速いのか、あるいは遅いのかは、今ではほぼ明らかになっていると思います。  <span>MySQL</span>は内部的にINを直接処理することができないので、EXISTSに変換することでSQL的には相関のないサブクエリも相関サブクエリになってしまうのである。これがまさに<span>MySQL</span>のサブクエリが遅い！と言われている原因だろう。  <span>MySQL</span>のDSSへの適用性 TPC-Hを題材にした<span>MySQL</span>の性能改善については、<span>MySQL</span> Conference &#38; Expo 2008におけるSergey Petrunia氏のセッションも参考になります(PDF資料)。本資料の25ページにおいて、18番のクエリはMaterializationというテクニックにより<span>MySQL</span>の将来のバージョンで大幅に改善されることが述べられています。ただ、Sergey氏は昨年Sun Microsystemsを辞めてしまったのでちょっと微妙な状況ではありますが…。 こうした複雑なクエリを実行するDSSに対して、現在の<span>MySQL</span>が向いていないのは残念ながら事実です。しかし逆に考えればそれはビジネスチャンスでもあります。<span>MySQL</span>がオープンソースソフトウェアであることを利用して、現在複数のベンチャーがDSSソリューションを提供しています。  Infobright <span>MySQL</span>に独自のオプティマイザとストレージエンジンを組み込んでいる InfiniDB 列指向データベースエンジン。<span>MySQL</span>をフロントエンドとして利用する Kickfire <span>MySQL</span>をベースとするアプライアンス。SQL処理を支援する独自開発のLSIを搭載  Kickfireは実際にTPC-Hでも優秀な結果を残しています。こうした動きもおさえておきたいですね。 続きます というわけで第3回はTPC-Hベースの負荷テストツールを2つ見てきました。他にもご紹介したいツールはまだまだたくさんあるので、不定期ですがじっくり続けていきたいと思います。それでは。<br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22995&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22995&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Tue, 12 Jan 2010 00:00:00 +0000</pubDate>
    <dc:creator>Sadao Hiratsuka</dc:creator>
  </item>

  <item>
    <title>[MySQL][Ruby] Ruby/MySQL 2.9</title>
    <guid isPermaLink="false">http://d.hatena.ne.jp/tmtms/20100111/1263213332</guid>
    <link>http://d.hatena.ne.jp/tmtms/20100111/1263213332</link>
    <description>
			Ruby から MySQL を使うための pure Ruby ライブラリ Ruby/MySQL 2.9 を公開しました。まだベータ版です。 http://github.com/tmtm/ruby-mysql/tree/2.9
			前の Ruby/MySQL は 0.2.6 だったのですが、今回 2.9 とした理由は:
			
				 Cライブラリ版の MySQL/Ruby 2.8.x の後継。
				 次は 3.0 にしたいという希望。
			
			…という意味があります。
			gem は gemcutter にあります。http://gemcutter.org/gems/ruby-mysql/versions/2.9.0
			gemcutter が設定されて入れば次のコマンドでインストールできます。

# gem install ruby-mysql -v 2.9


			対応する Ruby バージョンは 1.8.7 / 1.9.1 / 1.9.2、MySQL バージョンは 5.1.x です。
			MySQL/Ruby 2.8.x との互換
			以前のバージョンと異なり、MySQL/Ruby 2.8.x とほぼ互換があります。ただし以下の非互換があります。
			Ruby 1.8.x で使用する場合、Mysql#escape_string は、マルチバイト文字の一部として特殊記号を含むマルチバイト文字セットに対して安全ではありません。シフトJIS(sjis, cp932)等は2バイト目に「\」を含むためこの制限にあてはまります。プログラム側で独自にエスケープ処理を行うか、ストアドプロシジャを使用してください。そうでないと SQL インジェクションの危険性があります。EUC-JP や UTF-8 は問題ありません。
			いくつかのメソッドがありません: Mysql#debug, Mysql#change_user, Mysql#create_db, Mysql#drop_db, Mysql#dump_debug_info, Mysql#ssl_set, Mysql#reconnect
			Mysql#options でサポートしているオプションは次のものだけです: Mysql::INIT_COMMAND, Mysql::OPT_CONNECT_TIMEOUT, Mysql::OPT_LOCAL_INFILE, Mysql::OPT_READ_TIMEOUT, Mysql::OPT_WRITE_TIMEOUT, Mysql::SET_CHARSET_NAME. これら以外を指定すると &quot;option not implementted&quot; という warning が標準エラー出力に出力されます。
			Mysql#use_result は Mysql#store_result と同じです。つまりサーバーから一気に結果セットを読み込みます。
			 MySQL/Ruby 2.8.x からの改良点
			Ruby 1.9.x の M17N に対応しています。mysqld へのクエリ文字列やプリペアドステートメントで与える値は mysqld との接続の文字コードに自動的に変換されます。mysqld からの結果文字列は接続文字コードとして取り出されます。
			Mysql::Result, Mysql::Stmt が Enumerable を include しています。
			ブロックなしの Mysql::Result#each, each_hash Mysql::Stmt#each, each_hash が Enumerator を返します。
			Mysql#charset= で接続 charset を指定できます。
			Mysql::Error だけでなく、エラー種別ごとにエラークラスが用意されてます。たとえば、構文エラーの場合は Mysql::ParseError など。これらのエラーは Mysql::Error の継承クラスです。
			他に pure Ruby 版であることのメリットとして、Ruby のマルチスレッドが同時に動くというのがあります。あるスレッドで時間のかかるクエリを実行中に他のスレッドが動くことができます。
			機能的な改良点ではありませんが、ライセンスは Ruby ライセンスです。Cライブラリ版の MySQL/Ruby は libmysqlclient をリンクするため、それを使用する Ruby スクリプトも GPL にするか、それが嫌なら MySQL の商用ライセンスを購入する必要がありました。Ruby/MySQL は libmysqlclient をリンクしないため、その制限はありません。
			 Ruby 1.9.x M17N 対応
			MySQL はデータベース、テーブル、カラム毎にそれぞれ文字セットを持っています。また、サーバーとクライアントの間の接続に文字セットを持っています。接続とカラムとの間の文字セットは MySQL のサーバー側で自動的に変換されます。
			Ruby/MySQL では MySQL 接続の文字セットを Mysql#charset= で指定できます。または、Mysql#connect 前に Mysql#options(Mysql::SET_CHARSET_NAME) で設定します。
			Ruby 1.9.x では文字列はそれぞれエンコーディング(文字セット)を持っています。Ruby/MySQL で Ruby プログラムから MySQL サーバーに渡す文字列（クエリ文字列や、プリペアドステートメントのパラメータ）は自動的に接続に応じた文字セットに変換されます。
			MySQL サーバーから返される文字列の Ruby のエンコーディングは接続の文字セットに対応したものになります。ただし、プリペアドステートメントでは、BINARY型とBIT型のデータは ASCII-8BIT エンコーディングで返ります。
			例:

# -*- coding:utf-8 -*-
require 'mysql'
my = Mysql.connect(nil, 'username', 'password')
my.charset = 'cp932'          # 接続の文字セットは CP932
query = 'select &amp;#34;あいう&amp;#34;'     # UTF-8 のクエリ文字列
query.encoding                # =&amp;#62; #&amp;#60;Encoding:UTF-8&amp;#62;
col, = my.query(query).fetch  # 取り出した値は接続と同じく CP932
col.encoding                  # =&amp;#62; #&amp;#60;Encoding:Windows-31J&amp;#62;
col                           # =&amp;#62; CP932 で &amp;#34;あいう&amp;#34;


		</description>
    <content:encoded><![CDATA[<div>
			<p>Ruby から MySQL を使うための pure Ruby ライブラリ Ruby/MySQL 2.9 を公開しました。まだベータ版です。 <a href="http://github.com/tmtm/ruby-mysql/tree/2.9" target="_blank">http://github.com/tmtm/ruby-mysql/tree/2.9</a></p>
			<p>前の Ruby/MySQL は 0.2.6 だったのですが、今回 2.9 とした理由は:</p>
			<ul>
				<li> Cライブラリ版の MySQL/Ruby 2.8.x の後継。</li>
				<li> 次は 3.0 にしたいという希望。</li>
			</ul>
			<p>…という意味があります。</p>
			<p>gem は gemcutter にあります。<a href="http://gemcutter.org/gems/ruby-mysql/versions/2.9.0" target="_blank">http://gemcutter.org/gems/ruby-mysql/versions/2.9.0</a></p>
			<p>gemcutter が設定されて入れば次のコマンドでインストールできます。</p>
<pre>
# gem install ruby-mysql -v 2.9
</pre>

			<p>対応する Ruby バージョンは 1.8.7 / 1.9.1 / 1.9.2、MySQL バージョンは 5.1.x です。</p>
			<h4>MySQL/Ruby 2.8.x との互換</h4>
			<p>以前のバージョンと異なり、MySQL/Ruby 2.8.x とほぼ互換があります。ただし以下の非互換があります。</p>
			<p>Ruby 1.8.x で使用する場合、Mysql#escape_string は、マルチバイト文字の一部として特殊記号を含むマルチバイト文字セットに対して<span>安全ではありません</span>。シフトJIS(sjis, cp932)等は2バイト目に「\」を含むためこの制限にあてはまります。プログラム側で独自にエスケープ処理を行うか、ストアドプロシジャを使用してください。そうでないと <span>SQL インジェクションの危険性があります</span>。EUC-JP や UTF-8 は問題ありません。</p>
			<p>いくつかのメソッドがありません: Mysql#debug, Mysql#change_user, Mysql#create_db, Mysql#drop_db, Mysql#dump_debug_info, Mysql#ssl_set, Mysql#reconnect</p>
			<p>Mysql#options でサポートしているオプションは次のものだけです: Mysql::INIT_COMMAND, Mysql::OPT_CONNECT_TIMEOUT, Mysql::OPT_LOCAL_INFILE, Mysql::OPT_READ_TIMEOUT, Mysql::OPT_WRITE_TIMEOUT, Mysql::SET_CHARSET_NAME. これら以外を指定すると "option not implementted" という warning が標準エラー出力に出力されます。</p>
			<p>Mysql#use_result は Mysql#store_result と同じです。つまりサーバーから一気に結果セットを読み込みます。</p>
			<h4> MySQL/Ruby 2.8.x からの改良点</h4>
			<p>Ruby 1.9.x の M17N に対応しています。mysqld へのクエリ文字列やプリペアドステートメントで与える値は mysqld との接続の文字コードに自動的に変換されます。mysqld からの結果文字列は接続文字コードとして取り出されます。</p>
			<p>Mysql::Result, Mysql::Stmt が Enumerable を include しています。</p>
			<p>ブロックなしの Mysql::Result#each, each_hash Mysql::Stmt#each, each_hash が Enumerator を返します。</p>
			<p>Mysql#charset= で接続 charset を指定できます。</p>
			<p>Mysql::Error だけでなく、エラー種別ごとにエラークラスが用意されてます。たとえば、構文エラーの場合は Mysql::ParseError など。これらのエラーは Mysql::Error の継承クラスです。</p>
			<p>他に pure Ruby 版であることのメリットとして、Ruby のマルチスレッドが同時に動くというのがあります。あるスレッドで時間のかかるクエリを実行中に他のスレッドが動くことができます。</p>
			<p>機能的な改良点ではありませんが、ライセンスは Ruby ライセンスです。Cライブラリ版の MySQL/Ruby は libmysqlclient をリンクするため、それを使用する Ruby スクリプトも GPL にするか、それが嫌なら MySQL の商用ライセンスを購入する必要がありました。Ruby/MySQL は libmysqlclient をリンクしないため、その制限はありません。</p>
			<h4> Ruby 1.9.x M17N 対応</h4>
			<p>MySQL はデータベース、テーブル、カラム毎にそれぞれ文字セットを持っています。また、サーバーとクライアントの間の接続に文字セットを持っています。接続とカラムとの間の文字セットは MySQL のサーバー側で自動的に変換されます。</p>
			<p>Ruby/MySQL では MySQL 接続の文字セットを Mysql#charset= で指定できます。または、Mysql#connect 前に Mysql#options(Mysql::SET_CHARSET_NAME) で設定します。</p>
			<p>Ruby 1.9.x では文字列はそれぞれエンコーディング(文字セット)を持っています。Ruby/MySQL で Ruby プログラムから MySQL サーバーに渡す文字列（クエリ文字列や、プリペアドステートメントのパラメータ）は自動的に接続に応じた文字セットに変換されます。</p>
			<p>MySQL サーバーから返される文字列の Ruby のエンコーディングは接続の文字セットに対応したものになります。ただし、プリペアドステートメントでは、BINARY型とBIT型のデータは ASCII-8BIT エンコーディングで返ります。</p>
			<p>例:</p>
<pre>
<span># -*- coding:utf-8 -*-</span>
<span>require</span> <span>'</span><span>mysql</span><span>'</span>
my = <span>Mysql</span>.connect(<span>nil</span>, <span>'</span><span>username</span><span>'</span>, <span>'</span><span>password</span><span>'</span>)
my.charset = <span>'</span><span>cp932</span><span>'</span>          <span># 接続の文字セットは CP932</span>
query = <span>'</span><span>select &#34;あいう&#34;</span><span>'</span>     <span># UTF-8 のクエリ文字列</span>
query.encoding                <span># =&#62; #&#60;Encoding:UTF-8&#62;</span>
col, = my.query(query).fetch  <span># 取り出した値は接続と同じく CP932</span>
col.encoding                  <span># =&#62; #&#60;Encoding:Windows-31J&#62;</span>
col                           <span># =&#62; CP932 で &#34;あいう&#34;</span>
</pre>

		</div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22992&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22992&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 11 Jan 2010 12:35:32 +0000</pubDate>
    <dc:creator>Masahiro Tomita</dc:creator>
  </item>

  <item>
    <title>MySQLでINFORMATION_SCHEMAへのアクセス時に利用される最適化アルゴリズム</title>
    <guid isPermaLink="false">tag:blogger.com,1999:blog-1906500952232920237.post-4157797528431046394</guid>
    <link>http://nippondanji.blogspot.com/2010/01/mysqlinformationschema.html</link>
    <description>実は今、延び延びになってしまっている著書の推敲をしているのだが、編集者からページ数を減らすよう言われてしまっていて色々とネタを削っている。せっかく書いたし勿体ないので削ったネタをブログに貼っておく。とりあえずは以下。また面白いネタがあったら貼るかも。I_Sの最適化INFORMATION_SCHEMAに対してクエリを行うSELECTに対してEXPLAINを実行すると、Extraフィールドに以下のメッセージが表示されます。Skip_open_table ... テーブルをまったくOpenする必要がない場合（データベースディレクトリのエントリを見るだけでクエリが解決できる場合）に表示されます。（クエリ例：select table_name from tables;）Open_frm_only... .frmファイル（テーブル定義ファイル）をOpenするだけでクエリを解決できる場合に表示されます。（クエリ例：select table_name, engine from tables;）Open_full_table... .frmファイルだけでなく実際にテーブルをOpenする（MyISAMの場合は.MYDや.MYIファイルを開く）必要がある場合に表示されます。（クエリ例：select table_name, data_free from tables;）Scanned 0 databases... データベースのスキャンをする必要がない場合に表示されます。（クエリ例：select table_name from tables where table_schema='test' and table_name='t1';）Scanned 1 database... データベースを一つだけスキャンする必要がある場合に表示されます。（クエリ例：select table_name from tables where table_schema='test';）Scanned all databases... 全てのデータベースをスキャンする必要がある場合に表示されます。（クエリ例：select table_name from tables;）上記のうち、Skip_open_table、Open_frm_only、Open_full_tableのどれが表示されるかは、INFORMATION_SCHEMA内のテーブルのどのカラムへアクセスするかによって決まっています。（上記のクエリ例でSELECTされているカラムを見て下さい。）Scanned X databasesは、どれだけデータベースやテーブルが具体的に指定されているかで決まります。テーブル名がより具体的に指定されているほうがクエリの効率が良いということになります。このネタはちょっとマニアック過ぎて現場で必要になることはないだろう。（ということでカットしたのだが。）しかし、DBAならI_Sを用いてデータベースを監視することもあると思うので、その時に如何に効率的なクエリを書くか？ということは考える必要があるかも知れない。書籍ではネタをスリム化して内容の濃ゆ〜〜〜いものを提供するので乞うご期待！</description>
    <content:encoded><![CDATA[実は今、延び延びになってしまっている著書の推敲をしているのだが、編集者からページ数を減らすよう言われてしまっていて色々とネタを削っている。せっかく書いたし勿体ないので削ったネタをブログに貼っておく。とりあえずは以下。また面白いネタがあったら貼るかも。<br /><br /><blockquote><h4>I_Sの最適化</h4><br />INFORMATION_SCHEMAに対してクエリを行うSELECTに対してEXPLAINを実行すると、Extraフィールドに以下のメッセージが表示されます。<br /><br /><UL><LI>Skip_open_table ... テーブルをまったくOpenする必要がない場合（データベースディレクトリのエントリを見るだけでクエリが解決できる場合）に表示されます。（クエリ例：select table_name from tables;）</LI><LI>Open_frm_only... .frmファイル（テーブル定義ファイル）をOpenするだけでクエリを解決できる場合に表示されます。（クエリ例：select table_name, engine from tables;）</LI><LI>Open_full_table... .frmファイルだけでなく実際にテーブルをOpenする（MyISAMの場合は.MYDや.MYIファイルを開く）必要がある場合に表示されます。（クエリ例：select table_name, data_free from tables;）</LI><LI>Scanned 0 databases... データベースのスキャンをする必要がない場合に表示されます。（クエリ例：select table_name from tables where table_schema='test' and table_name='t1';）</LI><LI>Scanned 1 database... データベースを一つだけスキャンする必要がある場合に表示されます。（クエリ例：select table_name from tables where table_schema='test';）</LI><LI>Scanned all databases... 全てのデータベースをスキャンする必要がある場合に表示されます。（クエリ例：select table_name from tables;）</LI></UL><br />上記のうち、Skip_open_table、Open_frm_only、Open_full_tableのどれが表示されるかは、INFORMATION_SCHEMA内のテーブルのどのカラムへアクセスするかによって決まっています。（上記のクエリ例でSELECTされているカラムを見て下さい。）Scanned X databasesは、どれだけデータベースやテーブルが具体的に指定されているかで決まります。テーブル名がより具体的に指定されているほうがクエリの効率が良いということになります。<br /></blockquote><br />このネタはちょっとマニアック過ぎて現場で必要になることはないだろう。（ということでカットしたのだが。）しかし、DBAならI_Sを用いてデータベースを監視することもあると思うので、その時に如何に効率的なクエリを書くか？ということは考える必要があるかも知れない。<br /><br />書籍ではネタをスリム化して内容の濃ゆ〜〜〜いものを提供するので乞うご期待！<div><img width="1" height="1" src="https://blogger.googleusercontent.com/tracker/1906500952232920237-4157797528431046394?l=nippondanji.blogspot.com" alt="" /></div><br/>PlanetMySQL Voting:
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22987&vote=1&apivote=1">Vote UP</a> /
	 <a href="http://planet.mysql.com/entry/vote/?entry_id=22987&vote=-1&apivote=1">Vote DOWN</a>]]></content:encoded>
    <pubDate>Mon, 11 Jan 2010 06:58:00 +0000</pubDate>
    <dc:creator>Mikiya Okuno</dc:creator>
    <category>i_s</category>
    <category>mysql</category>
  </item>

</channel>
</rss>
