ちょっと硬派なコンピュータフリークのBlogです。

カスタム検索

2010-06-01

「エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド」発刊のおしらせ。






来たる6月12日、我が入魂の書籍が発刊される運びとなった。執筆を開始したのはすでに一年以上前であり、本ブログでも何度か「執筆中です!」といいながらなかなか発刊に至らずお待たせしてしまったのだが、しかし時間がかかってしまった分、内容には磨きがかかったと思うので期待して頂きたい。書籍のタイトルは「エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド」。筆者にとって初の著書(単著)である。名前にエキスパートと冠している通り、中級〜上級者向けの一冊となっている。初心者の方は、まずMySQL 徹底入門 第2版などを先に読んでから本書を購入するといいだろう。以下もくじである。
第1章 MySQLの概要
 1 MySQLとは
  1-1 世界で最も有名なオープンソースのRDBMS
  1-2 LAMPの"M"
  1-3 History
 2 MySQL Serverの種類
  2-1 FOSS Exceptionとは?
 3 MySQLの構造
  3-1 ストレージエンジン
  3-2 MySQLレプリケーション
  3-3 セッション
  3-4 クエリキャッシュ
  3-5 MySQLシステムライブラリ
 4 MySQLのセットアップ
  4-1 MySQLを入手しよう
  4-2 パッケージの種類
  4-3 ディレクトリ構造とシステムデータベース
  4-4 起動・停止・自動起動
  4-5 コマンドラインオプションとオプションファイルの利用
  4-6 my.cnf設定例
  4-7 複数のインスタンスを起動する
 5 MySQL Serverにアクセスする
  5-1 mysqlコマンド
  5-2 Maatkit
  5-3 GUIツール
  5-4 コネクタ(ドライバ)
  5-5 MySQL Proxy
 6 堅牢な運用を行うための推奨設定
  6-1 mysql_secure_installation
  6-2 DNSへの問い合わせを取り除く
  6-3 TCP/IPを利用しない
  6-4 バイナリログ
  6-5 クエリキャッシュを利用しない
  6-6 メモリのサイジング
  6-7 ディスクキャッシュに関する注意点
  6-8 InnoDBにおけるディスク関連のチューニング
 7 インストール中によく起きる問題と対処法
  7-1 パッケージがインストール出来ない
  7-2 異なるバージョンのMySQLが起動する
  7-3 Solaris用パッケージインストール時にエラーメッセージが出る
  7-4 mysqldが起動しない
第2章 開発時における問題
 1 文字化け
  1-1 MySQLにおける文字コードの仕組み
  1-2 文字コード関連のシステム変数
  1-3 利用出来る文字コード
  1-4 MySQL Serverの設定
  1-5 テーブルに格納されるデータの文字コード
  1-6 現在設定されている文字コードを確認する
  1-7 アプリケーションによる文字コードの指定方法
  1-8 文字コードに関する諸問題
  1-9 文字コードに関するまとめ
 2 MySQL CLI上で表示されるエラーを理解する
 3 トランザクション
  3-1 MySQLにおけるトランザクション
  3-2 トランザクション利用時の注意点
  3-3 トランザクションまとめ
 4 SQLモード
  4-1 SQLモードの種類
  4-2 特別なSQLモード
  4-3 SQLモードまとめ
 5 アプリケーションによるエラーハンドリング
  5-1 エラーハンドリングの流れ
  5-2 各種エラーへの対処
  5-3 エラーを捕捉する
  5-4 C API
  5-5 エラーハンドリングまとめ
第3章 MySQLの状態を見る
 1 SHOWコマンドとINFORMATION_SCHEMA
  1-1 MySQL Serverの状態を調べるSHOWコマンド
  1-2 MySQLの各種オブジェクトの状態を調べるSHOWコマンド
  1-3 テーブルの詳細な情報を調べるSHOWコマンド
  1-4 権限に関するSHOWコマンド
  1-5 ストレージエンジンの状態を調べるSHOWコマンド
  1-6 レプリケーション関連のSHOWコマンド
  1-7 その他のSHOWコマンド
  1-8 INFORMATION_SCHEMA
 2 EXPLAIN
  2-1 idとSelect Type
  2-2 table
  2-3 Record Access Type
  2-4 possible_keysとkey、key_len
  2-5 ref
  2-6 rows
  2-7 Extra
  2-8 EXPLAINのバリエーション
  2-9 EXPLAINまとめ
 3 プロファイリング
  3-1 プロファイリングを有効にする
  3-2 クエリを実行する
  3-3 プロファイリング情報を表示する
  3-4 プロファイリング情報の履歴
  3-5 プロファイリング情報の見方
 4 MySQLのログ
  4-1 エラーログ
  4-2 バイナリログ
  4-3 一般クエリログ
  4-4 スロークエリログ
  4-5 トレースファイル
  4-6 ストレージエンジンが作成するログファイル
  4-7 ログファイル比較
 5 InnoDBモニタ
  5-1 標準のInnoDBモニタ
  5-2 ロックモニタ
  5-3 テーブルモニタ
  5-4 テーブルスペースモニタ
 6 システムの状態を調べる
  6-1 UNIX基本コマンド
  6-2 情報収集ツール
第4章 DTrace
 1 DTraceとは
  1-1 プローブとプロバイダ
  1-2 SDT/Fasttrapプロバイダの別名
  1-3 MySQL特有のプローブ
  1-4 コンパイル時の設定
 2 dtraceコマンド
  2-1 Probeをリストアップ
  2-2 プローブを有効にする方法
  2-3 プローブがFireしたときに採取できる情報
 3 D言語プログラムを書こう
  3-1 D言語プログラムの構造
  3-2 変数を使おう
  3-3 変数の型
  3-4 情報を出力する方法を極めよう
  3-5 投機トレース
  3-6 D言語プログラムサンプル
 4 DTrace Toolkit
 5 Apple Instruments
 6 DTraceまとめ
第5章 運用中に起きる諸問題
 1 レプリケーション
  1-1 レプリケーションの仕組み
  1-2 レプリケーションのセットアップ
  1-3 レプリケーションの操作
  1-4 よく起きる問題の原因と対処法
  1-5 レプリケーションを堅牢にするためのテクニック
  1-6 まとめ
 2 クラッシュ
  2-1 シグナル
  2-2 スタックトレース
  2-3 スタックトレースからバグの原因を探る
  2-4 コア解析
 3 クラッシュリカバリ
  3-1 InnoDB
  3-2 MyISAM
 4 テーブルの破損
  4-1 テーブル破損のシナリオ
  4-2 破損が起きた時の兆候
  4-3 破損からの回復
 5 性能の低下
  5-1 スロークエリログ
  5-2 MySQLの性能改善計画
 6 ハードウェア障害
  6-1 ネットワークエラー
  6-2 CPUやシステムチップ、バスのエラー
  6-3 メモリエラー
  6-4 ディスクエラー
  6-5 ハードウェア障害に関するまとめ
第6章 堅牢な運用を実現するために
 1 バックアップとリストア
  1-1 mysqldump
  1-2 コールドバックアップ
  1-3 mysqlhotcopy
  1-4 スナップショット
  1-5 バイナリログ
  1-6 InnoDB Hot Backup
  1-7 その他のバックアップツール
  1-8 まとめ
 2 High Availability
  2-1 HAクラスター
  2-2 ネットワークの冗長化
  2-3 MySQL Cluster
  2-4 MySQLレプリケーション
  2-5 High Availabilityまとめ
 3 セキュリティ
  3-1 セキュアなMySQL構築の大原則
  3-2 不正ログインを防ぐ
  3-3 SQLインジェクション
 4 アップグレード
  4-1 MySQLにおけるバージョンの考え方
  4-2 どのよなときにアップグレードするべきか
  4-3 アップグレードの概要
  4-4 レプリケーションを利用したアップグレード
  4-5 アップグレード時における注意点
第7章 ソースコードのビルド
 1 ソースコードを入手する
  1-1 ソースコード版パッケージ
  1-2 Bazaar
 2 ビルドしよう!
  2-1 gccコンパイラオプション
  2-2 ソースコードを展開する
  2-3 configure
  2-4 make
  2-5 ccache
  2-6 BUILD/compile*スクリプト
 3 QAテスト
  3-1 MySQL Test Framework
  3-2 valgrind
  3-3 ベンチマークツール
  3-4 QAテストまとめ
かなり広範囲な内容を扱っているが、切り口は一貫してMySQLのトラブルシューティングについてであり、現場のMySQLエンジニアが活用出来る内容を目指して書いた。MySQLは非常に安定しているデータベースソフトウェアであるので、トラブルに見舞われる頻度は高くないが、それでもゼロにすることは不可能である。MySQLの重要性は日々増していく傾向にあり、障害が発生した際のダメージは甚大になるばかりだ。すなわち、迅速なトラブルシューティングが求められるのである!!

MySQLのトラブルシューティングには定石というものはない。トラブルとは想定しない動作をすることであるから、トラブルの内容は必然的に千差万別となってしまう。とはいえ、実はトラブルシューティングには必須の知識が存在する。それはMySQLの構造である。仕組みが理解できれば「本来どのように動作しなければならないか。なぜそのトラブルが起きているのか。」ということを理解できる。何が起きているかを理解してはじめて、問題を復旧できるというものである。そのため、MySQLの構造についての理解は不可欠であり、本書ではMySQLの構造に焦点を当てた記述をかなり盛り込んだ。

第1章では、MySQLの紹介〜セットアップおよびセットアップ時に発生しやすい問題、推奨設定などについて紹介している。素早くMySQLをセットアップして、ハードウェアに適したパラメーターを選択するのに役立つだろう。また、導入部ではMySQLの構造を俯瞰的に紹介しているので、MySQLが全体的にどのような仕組みになっているのかを知りたい人に読んで頂きたい。

第2章では、開発時に直面しやすい問題についてまとめている。とはいえ、半分は文字化けの話題である。MySQLにおいて文字コードがどのように扱われているか、また、各種言語でどのように対応すれば良いかということについて説明している。第2節「トランザクション」では、MySQLにおけるトランザクションの考え方について説明している。とことんまでデータの安全性を追求したい方はぜひ読んで頂きたい。また、開発者に必須の知識として、第5節「アプリケーションによるエラーハンドリング」では、各言語で例外処理をどのように実装するかということについて纏めている。直接MySQLを叩く場合には必須の知識である。第2章をよく読んで、より堅牢なアプリケーションを構築して頂きたいと思う。

第3章では、MySQLがどのような状態であるかを知るための様々な方法について説明している。この章の見所は第2節「EXPLAIN」および第5節「InnoDBモニタ」である。第2節ではこれ以上ないほどEXPLAINを徹底的に解説した。ちなみに、コンサルタントの松信氏が最も敏感に反応を示したのがこの章である。第5節ではInnoDBモニタ=SHOW ENGINE INNODB STATUSの出力について説明した。各値がどのよな意味を持っているのかということについて、これまで漠然と理解されていた方は、ぜひこの章で理解を深めて頂ければ幸いである。(SHOW ENGINE INNODB STATUSの完全解説は、恐らく和書・洋書を含めて初めてではないだろうか。)

第4章はDTraceを使ってMySQLを追跡する方法について説明している。DTraceが利用できるプラットフォーム(Solaris/Mac/FreeBSDなど)でMySQLを運用されている方は、ぜひ参考にして頂きたいと思う。MacにおいてDTraceで得られた情報を活用するGUIであるInstrumentsについてもさらりと紹介している。

第5章は運用中に起きる問題に焦点を当てた。如何に素早く状態を回復するか?!ということはトラブルシューティングにおける至上命題であり、本書の一番のテーマであると言えよう。第3節「クラッシュリカバリ」では、InnoDBの持つ各データ構造について解説をしている。InnoDBの構造を知ることは、チューニングを行う上でも必須の知識であるため、ぜひこの節には目を通して頂きたい。

第6章では堅牢な運用をするために必要な各種ノウハウを解説している。バックアップ設計、いざ必要となったときのリカバリ手順、HA化、セキュリティ対策、アップグレードなど。割と座学的な話も多い章ではあるが、手堅い運用をする際にはいずれも必須の知識であるので、眠くならずに読んで頂ければ幸いである。なお、第3節「セキュリティ」ではSSLのセットアップ方法について詳しく説明している。Amazon EC2などのクラウド上でMySQL利用する場合には、情報漏洩を防ぐためにSSLの利用は必須である。これからEC2などのクラウド環境を利用する機会は増えるだろうから、SSL設定のポイントはぜひ抑えておきたい。

第7章はソースコードをビルドするお話しである。この章は全てのDBAにとって必須というわけではないかも知れないが、MySQLをハック(改造)して骨の髄までとことんしゃぶり尽くしたい方々のための章である。MySQLハッカーにとっても、安全にMySQLを利用するのは至上命題なのである。

本書は520ページにも上る大作だ。(自分で大作といってしまうのもなんだが。)しかもページ数を圧縮するためフォントを小さくしているので、実際にはページ数以上の読み応えがあるだろう。内容はまさにてんこ盛りである。ページ数を圧縮したのはあまり価格が高くならないようにという配慮であり、出来るだけ多くの人に本書を読んで現場の運用に役立てて頂きたいという筆者の願いからである。(価格は3300円+消費税)最近は様々なデータベースシステムが登場し、NoSQLと呼ばれて業界を賑わせているが、それでもなお、RDBMSは大変便利であるためまだまだデータベースの中心的存在として現役で使われ続けることだろう。そして、オープンソースRDBMSの雄であるMySQLは、これからますます使われる機会が多くなるだろう。本書をよく読んで、MySQLを用いて堅牢なアプリケーション開発および堅牢な運用をして頂きたい!!日本国民全員に!!というのが筆者の願いである。

もちろん、本書がトラブルシューティングのすべてをカバーしているわけではない。本当にミッションクリティカルなところでMySQLを利用する場合には、商用サポートの存在を思い出していただきたい。きっとお役に立てるはずである。

本書のレビューにおいては、MyNA副代表の坂井恵氏(@sakaik)、サイボウズラボの奥一穂氏(@kazuho)、そして尊敬すべき同僚たち(@meijik@matsunobu@rkajiyama)に多大なる協力を頂いた。この場を借りてお礼を申し上げる。また、MySQLを開発したMonty Widenius氏および偉大なる開発者たち、MySQLコミュニティの全ての方々に深く感謝する。ありがとう。あなたたちが居たから執筆することが出来た!!そして、執筆・編集期間中、部屋に閉じこもりっぱなしだった自分を支えてくれた妻には、最高の感謝を表したい。

というわけで、皆さん是非買って下さい!!

2 コメント:

test さんのコメント...

はじめまして。
いつも「漢のコンピュータ道」を拝見しております。ためになる情報ありがとうございます。
いきなり質問で恐縮ですが、MySQLでSQLエラーのみログを出力する設定ってできるのでしょうか。いろいろ調べたのですが有用な情報が見つかりませんでした。
お手すきの時にご回答いただけますと幸いです。
よろしくお願いいたします。

Mikiya Okuno さんのコメント...

SQLがエラーになった場合には、その情報はクライアントが受け取るだけでサーバー側で一元的にログに記録するということはありません。「そのような機能はない」というのが回答です。必要ならクライアント側でログへ出力するようにするといいと思います。

コメントを投稿