というわけで行ってきました.かなり大勢の人が来ていたので,かなり熱い戦いカンファレンスになりました.聞いてきたセッションのほとんどが英語だったので,もう少しヒアリングできればなと,少し後悔しています.
かなり長いのですが,2日分のログを.
##基調講演
- ビジネスボリュームはかなり大きくなっている.
##創設者 David の挨拶
History
- 1982 First database code
- 1995 MySQL code
- 1996 public release
- 2001 ‘Real’ Company start
- 2008 Sun acquires MySQL
特徴
- Pluggable Storage Engines
- それぞれに特徴あるストレージエンジンを,状況に応じて使い分けることができる
- しかし Connector/Parser などは共通なので開発者に優しい
Storage Engines
- External
- Archive
- InnoDB
- PBXT
- InfoBright
- automatic indexing
- NitroSecrity
- IBM DB2
- Internal
- Falcon
- Maria
- MyISAM の上位番
Data Warehousing Appliance
- Kickfire
たくさんのイノベーションを自由に利用できるのが MySQL の特徴
- MySQL Proxy
- MySQL Cluster
- Stored Procedure
多くをサポート
- 数多くの言語でサポートされている
- 数多くのOSでもサポートされている
Sun CEO のブログで,買収しても何も変わらないことを明言している.
ユーザなどから報告されたバグリストは公開している.
- 「隠された汚い下着」と言っているらしい.
MySQL = My(ミー)のSQL
##MyNA
- 日本 MySQL ユーザ会
- 2000年発足
- MySQL ML に入れば会員
- 要望
- 日本語の情報が欲しい
- オープンソースを続けてほしい
- MySQL 社の社員の協力を,今後もいただきたい.
##スポンサー紹介
- 住商情報システム
- MySQL をやって 5 年
- MySQL + Senna のサポート
- MySQL Cluster の実績がある
- VikingZone
- OpenSPARC + Solaris + MySQL
- 野村総研
- オープンソースの普及やサポートなどをやっている
- HP
- MySQL 初のパートナーベンダー
- HP と Sun は裏で OpenSource 的につながっている
##A Bried Overview of the Work Done in Shinsei Bank
- 新生銀行
- IT部門ではかなり革新的で注目されているらしい
- 1000万人規模の顧客がいる
- 裏側
- 紙書類ばかり
- 情報が集約されていない
- 大型メインフレームが必要だった
- Methodology
- Harvard Bisuiness Review
- atricleID=R0803J
- 8年前に立てた原則
- 部分的に構築するが,基本的には何も変えない
- 既存のものだけを使い自社開発はしない
- Open なものを使う
- 顧客の Experience を重視
- Virtual な組織を形成して,世界中の知恵を集結
- 紙を極力使わないように
- Benefits of using standard components
- Low cost
- Speed
- Flexibility
- For customers
- For staff
- Embedded controls
- Methodology at a glance
- Process と Technology に分解
- それぞれを各エレメントに分解
- Technology を conponents(Software/hardware/etc…)に分解
- すべては失敗すると仮定する
- 人が階級しなくても稼働し続けることを重視した
- 保証すべきもの
- 安全性・フレキシビリティ・速度・コスト・能力
- 3ヶ月サイクルで動く
- 低コスト
- ハイエンドなものはつかっておらず,低コストなものを数多く用意する
- 各コンポーネント間で依存性を排除する
- 古いソースコードはみていない
- 古い技術での完成物を参考に,新しいシステムを制作する
- リソースの制約
- 問題を小さく分割して,各個に解決していく
- Dell PC/Server を使っている
- 裏側の変化
- すべての情報が集約化されてスッキリ
- 手法を CCL で公開
- プレゼン資料も CCL で公開
##MySQL トラブルシューティング概要
開発目標
- 安定性
- パフォーマンス
- 使いやすさ
安定性重視だが多くのトラブルが起きる
トラブルシューティング3種の神器
- エラーログ
- エラーが記録されているもの
- 実際にはSTDOUTをリダイレクトしたもの
- SHOW コマンド
:SHOW WARNINGS:Query が失敗したときのエラー小度 :SHOW GLOBAL STATUS:統計情報 :SHOW GLOBAL VARIABLES:設定値を表示 :SHOW INNODB STATUS:InnoDB モニタ
perror
- OS エラーの意味を表示
- MySQL Cluster なら -ndb で各種情報をみることができる
その他よく使うツール
- Slow Query Log/Query.log/Binlog/OS Log
- デバッガ
- DTrace
- 動作確認
- xVM/VMWare
- 動作確認
- gcc
- 動作検証プログラムの作成
###レプリケーション
- マスター側
アプリなど–>テーブル–(更新)–>バイナリログ–(マスタースレッド)–>スレーブへ
- スレーブ側
–(I/O スレッド)–>リレーログ–(SQL スレッド)–>テーブル
###SQL スレッドが停止してしまった
- 原因
- メモリ不足
- 各種バッファに割り当てるメモリが足りない -> 増やして再起動
- スレーブ上のテーブルを更新してしまった
- マスターデータからリストア
- バイナリログ欠損
- コマンドで明示的に purge したりすると発生する
- 対象テーブルがわかっていればマスター上で dump/restore で復旧できる
- その他一時的なエラー
SET GLBOAL SQL_SLAVE_SKIP_COUNTER = N;
START SLAVE;
###I/Oスレッドが停止
- ネットワークのエラー
- ping で確認
- max_allowed_packet を増やす
- ユーザがログインできない
- パスワードを変更したりとか
- server_id がかぶっていないか
###スレーブの遅延
- 長時間かかるクエリはないか?
- マスター上ではクエリ完了時に binlog に記録される
- テーブルの更新は素早く!
- スレーブに負荷をかけすぎていないか?
- 参照系処理の CPU リソースがとられてしまっている
- マスターからのクエリが SQL スレッドでなかなか実行できなくなるから
- ネットワーク帯域は十分か?
###サポートに問い合わせるときは
- SHOW SLAVE STATUS\G
- SHOW MASTER STATUS\G
- SHOW MASTER LOGS\G
- エラーログ
- my.cnf
- テーブル定義
###レプリケーショントラブル対策
- バイナリログ欠損を防ぐ
sync_binlog=1
innodb_flush_logs_at_trx_commit=1
- ただし更新が遅くなる
- テンポラリテーブルは使わない
- クラッシュ再起動後にはなくなるから,CREATE TEMPORARY TABLE は使わない.
- マスターとスレーブにおいて,コネクション毎のバッファは同じ程度に設定しておく
- スレーブでクエリが実行できなくなることを防ぐため
- スレーブを複数用意する
- マスターがこけたとき対策
- バイナリログを有効化
- log_slave_update=ON
###クラッシュ!!
- SEGV が発生するのは
- MySQL のバグ
- NULL を boolean に変換すると crash するというバグがあった
- OS のバグ
- ハードウェアの故障
- Linux は stack trace が表示される
- core file
- core-file オプションが必要
###MySQL サーバが起動しない!!
- 情報源はエラーログ
- 繰り返し発生してないか?
- InnoDB のリカバリは完了しているか?
- クラッシュ後の再起動に自動的にリカバリするので,バイナリログの大きさが大きいと時間がかかる
- ファイルシステムがいっぱいではないか?
- 設定に問題は?
- InnoDB の設定変更は特に注意
###テーブルコラプション・MyISAM
- なぜ起きるのか
- MySQL サーバやOSのクラッシュ
- MyISAM はクラッシュセーフではない
- HDDやファイルシステムの不具合
- MyISAM のバグ
- 復旧手順
- CHECK TABLE/REPAIR TABLE
- mysqlcheck
- 起動中に実行
- myisamcheck
- 起動していないときに実行
- テーブルの再作成
CREATE TABLE new_tbl KILE tbl;
INSERT INTO new_tbl SELECT * FROM tbl;
DROP TABLE tbl;
- 予防策は
- ない!
- 定期的にバックアップ
- レプリケーションをバックアップとして
- クラッシュしたらバックアップからのリストアを検討
- 他のストレージエンジンへ移行
- InnoDB/Maria/Falcon
###テーブルコラプション・InnoDB
- 修復する機能はない
- クラッシュ後にリカバリしなければ The END!!!
- テーブルスペースとログファイルの不整合が起きるパターンが多い
- 復旧方法
- innodb_force_recovery=4 or 6
- mysqldump!
- テーブルをドロップ
- innodb_force_recovery を解除して再起動
- リストア
- 予防策
- innodb_flush_log_at_trx_commit=1
- innodb_doublewrite を有効化
- ファイルシステムのジャーナリング
- H/W RAID のバッテリバックアップ
###デッドロック
- トランザクションではつきもの
- リトライで会費
- lock-wait-timeout とデッドロックは違う
- lock-wait-timeout はロックが獲得できていない状況
- データにアクセする順序を工夫する
###SHOW INNODB STATUS
- 統計情報を見るコマンド
- 1分か見るたびに更新
- SEMAPHORES : ロック情報
###クエリの実行結果がおかしい
- バグの可能性がある
- 再現テスト
- とにかくソースコードを解析
- SHOW WARNINGS が重要な手がかりに
- dtrace が役に立つ
##Out of Memory
- 32bit バージョンは使わない
- 論理アドレス枯渇で起こる
- RSS = 使用物理メモリが 1GB でも起こりうる
- バッファの割り当てすぎ
- 特にセッション毎のバッファが大きすぎる場合が多い
- read_buffer_size=64M とかは多すぎ
- 512K 程度でよい
###Sort Aborted
- ソートバッファを割り当てるためのメモリが足りない
- テンポラリが作れない
- ロック待ち
- ソート中に KILLされた シャットダウンされた
###Aborted Connections
- mysql_close() を忘れた
- TCP/IP timeout
###table is full
- MyISAM
- 内部ポインタのサイズが小さすぎる
- テーブル再作成
- InnoDB
- テーブルスペースを使い効いてしまった
- テーブルスペースの拡張
- ndb
- メモリが足りない
###ログインできない
- パスワードが違う
- root でリセット
- 4.0 以前から 4.1 移行へ接続
- サーバ側で -old-password を用いる
- 場ジョンアップする
- Can’t create a new thread
- スレッド数の上限(OS)
- スタック不足
- Connection refused
- TCP/IP の問題
###文字化け
- 接続用の文字コードは?
- 端末の文字コードは?
- コマンドプロンプトは使わない方がよい
- Query Browser がおすすめ
- LOAD DATA IN FILE で文字化けする
- SHOW CREATE DATABASE で DATABASE の文字コードを確認
###バックアップ
- 終わらない
- 巨大なテーブルを mysqldump でバックアップ
- メモリ不足
- –quick オプションで
- 適切なバックアップを
- レプリケーションなど
###リストアなど
- リストアが終わらない
- 5.0.52 ~ 5.0.54 では CLI が極端に遅い
- 設定が違う
- -max-allowed-packet
- -innodb-buffer-pool-size
- -key-buffer-size
- 時間見積もりが甘かった
- 何とかは買うする
- バイナリログを無効化
- doublewrite を無効化
- trx_commit を2に
###MySQL Enterprise Monitor
- エージェントがサーバへ到達できない
- これが 99% らしい
###MuSQL Cluster
- SQL ノードがクラスタに接続できない
- ネットワーク
- connect-string
- ノードIDなど
- ndb_mgm -e SHOW
- SHOW ENGINE NDB STATUS
- クラッシュしたら
- まずはデータノードを再起動
- クラスタ全体が停止
###パフォーマンス系の問題
- コンサルティングサポートで解析
###SHOW GLOBAL STATUS
- Select_*
- 遅いクエリに関する情報
###ワンポイントアドバイス
- 仕様を理解する
- 正常・異常の区別
- 再現してみる
- ソースコードを読む
- OSに詳しくなる
- POSIX など
##Memcached and MySQL
- なぜ Memcached を使うか
- Chaos だから
- LiveJournal
- 30GB cache TB data
Mixi
Server
- slab allocator
- libevent based
- simple protocol
- Hash Table
- 他のサーバのことは知らない
Client
- Client hashed Key to Serve List(分散)
- オブジェクトはシリアライズ
- データの圧縮など
Consistent Hash
特徴
- memcached はデータベースじゃないからダンプできない
- 冗長的ではない
- サーバではフェイルオーバーじゃない
- 認証機能はない
Examples
- key:value の巨大ハッシュとして扱える
memcached in MySQL
- SQL を通じて memcached cluster にアクセス可能
limit
- Key Size(250 bytes)
- Data Size ! Mega byte
Tools
- Protocol
- Telne
- Text baseだから
CPU 使用率はかなり低い
Memcached 1.2.5
- Multi Interface Support
- UDP all the time
Future
- Binary Protocol
- Multiple Engine Support
- Char based
- Durable
- Queue
- Highly Threaded
##MySQL Enterprise ツールのご紹介 ###Workbench
- MySQL Query Browser
- SQL IDE
- MySQL Administrator
- 管理用
- MySQL Migration Tooklit
- 移行ツールキット
MySQL Workbench
- Entity/Relation Designer
- データ・データベースを文書化する
特徴
- 複雑なデータベース構造を可視化
- モデル化することで関係性をわかりやすく表示する
Forward Engineering
- E/R図からSQLへ変換
- データベースへ接続して直接実行可能
Reverse Engineering
- 実在するデータベースの E/R 図に
- 変更を適用可能
Database Compare
- データベースの比較
Database Synchronization
- データベースの同期化
- オブジェクトレベルでの同期
Documentation
- 文書化.設計書・仕様書など.
Roadmap
- Linux/Mac/Solaris 2008Q4
- SQL IDE 2009Q2
- これは調べておこう
###Enterprise
- Subscription 形式
- Database
- Community Server よりも Fix が早い
- Monitoring
- Enterprise Monitor
- Support
- コンサル
###Enterprise Monitor
特徴
- MySQL Server と Replication を自動探知
- [NEW] Problem Query Detection, Analysis and Tuning
Architecture
- Agent + Manager(JSP)/Dashboard + Repository
MySQL Enterprise Advisor
- 設定やセキュリティ,アップデートやカスタマイズなどの管理機能
- Replication の遅延やメモリの使用率などの統計・監視
- Schema/Performance などの解析とチューニング
- 予期しない変更・更新などの検知
###問題の解決に向けて
Common Pain Points
- データの利用側面と利用率の見込みの甘さ
Slow Query Log
- 遅いクエリーの検出
- インデックス使っているかどうかを調べられる
SHOW PROCESSLIST
- on-time のプロセス一覧が見れる
EXPLAIN
- インデックスがどのように使われているのかがわかる
###Query Analyzer
特徴
- リアルタイムに「問題あるクエリー」の検出ができる
- 悪いクエリーの検出
- クエリーの EXPLAIN
- Enterprise Monitor に統合される
MySQL Proxy 上で動いている
- Proxy を通すことによるパフォーマンスの劣化があるが,一応ドキュメント化されている
表示する情報
- 各クエリーの情報を一覧で表示可能
- 実行回数
- 最短時間
- 最速時間
- 一定期間内の実行時間総計
- どんなクエリーがデータベース内で時間を消費しているのかがわかる
- Slow Query Log/SHOW PROCESSLIST に依存しないので,サーバ再起動など必要ない
###Q&A
- 将来的には Workbench に統合される計画のようだ
##Life-X における MySQL 導入事例紹介
- ライフログサービス
- クローズドβで公開中
###ソニーマーケティング概要
- ソニー商品の販売と促進
- 新規ビジネス開発部門がある
###Life-X とは?
- ネットとデバイスが融合する時代へ向けた,新しい使い方・情報共有の仕方の提案
- テレビやPSPなどのデバイスを製造しているメーカーならではの展開
###Life-X 構築について
- 更新・参照ともに多いので,分散が大変らしい
##Backup Best Practices BoF Tokyo ###基本的なバックアップ
- 前提として
- binlog と データ本体の HDD は分けてる
- binlog は on にしておく
- どこかでフルバックアップをとる
- binlog とは
- COMMITのタイミングで変更点まるごと書き出される
- 各書き込み毎に位置(position)が割り当てられる
- バックアップ時に master_log_pos をとっておけば,どこまでバックアップしたかがわかる
- おおっと!(HDD全損)
- HDD新調
バックアップからリストアしても,バックアップ後の更新は反映されない
- バックアップのポジションがわかるかが重要
mysqlbinlog をつかうと,あるログファイルのあるポジションからの SQL を取り出すことができる
$ mysqlbinlog --start-position=3356424 binlog.000039 | mysql
###バックアップの方法
- バックアップの種類
- Warm/Hot/Cold
- 対応ストレージエンジン
- 論理(Statement-base)/物理(ファイルコピー的)
- 有償/無償
- SQL 分ペース
- 特定のデータだけをバックアップなど可能
- mysqldump
- InnoDB だと SINGLE TRANSACTION にすることで HOT Backup が可能
- OS のファイルコピー
- /var/db/mysql/data などをコピーしてバックアップ
- mysqlhotcopy
- すべてのテーブルにロックをかけてファイルコピーするスクリプト
- Memory/InnoDB/NDB 以外はおおむね対応(表領域を使わないエンジン)
- MySQL Administrator
- GUI で Warm Backup
- レプリケーション
- バックアップスレーブとして
- スナップショット
- ファイルシステムのスナップショット機能を使ってバックアップ
- InnDB Hot Backup
- InnoDB/MyISAM のみだが HOT バックアップできる有償ソフトウェア
- Zmanda Recovery Manager
- GUI でバックアップができる MySQL Enterprise のオプション
- MySQL Parallel Dump
- MySQL Forge か Sourceforge にある.
###MySQL 6.0 のデモ
- 幻の MySQL 5.2.4
- BACKUP DATABASE [database names] TO ‘FILE_PATH’;
- RESTORE FROM ‘FILE_PATH’;
- バックアップ処理を Driver でやるか Engine 側でやるのかも議論がある
- MySQL 6.0.6 では MyISAM も Hot Backup 可能
- バックアップ中に DDL(ALTER TABLE など) は実行できない
- MySQL 6.1 では実行可能になる予定
###InnoDB Hot Backup vs. mysqldump –single-transaction –master-data
InnoDB Hot Backup
- ファイルをごっそりコピー
- バックアップ開始時点での InnoDB 内部ログの位置を記録
- ファイルコピー終了時点での InnoDB 内部ログの位置から,開始~終了までの redolog を抜き出して一緒にバックアップ
- リストアするときは,ファイルコピーをしてから redolog を適用する
mysqldump
- –single-transaction –master-data をつけると,TRANSACTION が走り,その中で SELECT が実行されるのでバックアップ開始時点でのデータであることが保証される.
- mysqldump -> mysqld -> FileSystem -> mysqld -> mysqldump となり,オーバーヘッドがある
- RESTORE のときは SQL を parse したりするので重い
##展示セッションにて
- SPIDER ENGINE
- α版だが,内容を聞く限りではかなり期待大
- GPLで公開なので,実験に使うのはいいかもしれない.