MySQL 5.5 Update #denatech

46
MySQL Update MySQL Update 奥野 幹也 @nippondanji mikiya (dot) okuno (at) gmail (dot) com What's cool and new in MySQL 5.5

description

Dena Technology Seminar #2 で使用したスライドです。 http://engineer.dena.jp/2010/06/dena-technology-seminar-2.html

Transcript of MySQL 5.5 Update #denatech

Page 1: MySQL 5.5 Update #denatech

MySQL UpdateMySQL Update

奥野 幹也@nippondanjimikiya (dot) okuno (at) gmail (dot) com

What's cool and new in MySQL 5.5

Page 2: MySQL 5.5 Update #denatech

免責事項● 本プレゼンテーションにおいて示されている見解は、私自身の見解であって、オラクル・コーポレーションの見解を必ずしも反映したものではありません。ご了承ください。

● 現時点( 2010年 6月)の段階では、MySQL 5.5はマイルストーンリリース(β版)です。機能や実装については、予告無く変更される場合がありますのでご注意ください。

Page 3: MySQL 5.5 Update #denatech

自己紹介

● 今日は個人として来ています。– http://nippondanji.blogspot.com/– http://www.google.com/profles/mikiya.okuno

● 現職はMySQLサポートエンジニア。– 2000年にサン・マイクロシステムズ入社– 2007年にMySQL KKへ転職– 気付くとまたサン・マイクロシステムズに

– 現在は日本オラクルに在席。

Page 4: MySQL 5.5 Update #denatech

MySQL 5.5の新機能( 5.1との差分)● MySQL 5.4

– InnoDBの性能改善– DTrace Probeの追加– SHOW ENGINE INNODB STATUSの拡張– 設定値のデフォルト値を変更

● MySQL 5.5– InnoDBの機能・性能改善( InnoDB Plugin)– メタデータのロック改善– Semi-Synchronous Replication– 4バイト UTF-8対応– RANGE/LIST COLUMNSパーティショニング– PERFORMANCE_SCHEMA– XML機能の拡充( LOAD XML文など)– SIGNAL/RESIGNALなど多数

Page 5: MySQL 5.5 Update #denatech

InnoDB性能改善!!

Page 6: MySQL 5.5 Update #denatech

InnoDBとMySQL各バージョンの対応● MySQL 5.1

– InnoDB Plugin 1.0が利用可能。● MySQL 5.1.46で GA版に。

– 既存のビルトイン InnoDBがデフォルト。● MySQL 5.4

– ビルトイン InnoDBをベースにして性能改善。– 改善の内容は InnoDB Pluginに移植された。

● MySQL 5.5– InnoDB Plugin 1.1がビルトインに。

Page 7: MySQL 5.5 Update #denatech

InnoDB Plugin 1.0● Fast Index Creation● データ圧縮● INFORMATION_SCHEMAの追加● 使い易さの改善

– オンライン変更出来るパラメータの増加– TRUNCATE TABLEによる .ibdファイルの再作成– etc

● 性能改善– クラッシュリカバリ時間の短縮– グループコミット– I/Oの多重化– etc

Page 8: MySQL 5.5 Update #denatech

InnoDB Plugin 1.0の使い方● MySQL 5.1.46以降で利用可能。● my.cnfに以下の 2行を追加して再起動するだけ。

– ignore-builtin-innodb – plugin-

load=innodb=ha_innodb_plugin.so;innodb_trx=ha_innodb_plugin.so;innodb_locks=ha_innodb_plugin.so;innodb_lock_waits=ha_innodb_plugin.so;innodb_cmp=ha_innodb_plugin.so;innodb_cmp_reset=ha_innodb_plugin.so;innodb_cmpmem=ha_innodb_plugin.so;innodb_cmpmem_reset=ha_innodb_plugin.so

● 既存のデータファイルは互換性あり。

Page 9: MySQL 5.5 Update #denatech

Fast Index Creation● セカンダリインデックスの作成が高速化

– プライマリキーの作成・削除には影響なし● 特別な書式はなし

– ALTER TABLE .. ADD INDEXや CREATE INDEXが単純に高速化

● 現在の挙動– 新しい定義のテーブルを作成してデータを全てコピー。– コピー完了後に古いテーブルを破棄。– コピー中、テーブルは読み取り専用に。

● 高速化した挙動– 該当のインデックスツーリーだけを作成。– 作成中、テーブルは読み取り専用に。– 時間が大幅に短縮。

Page 10: MySQL 5.5 Update #denatech

Fast Index Creation - つづき

PK=

クラスタインデックス

セカンダリインデックス

従来の動作

PK=

クラスタインデックス

セカンダリインデックス

追加のセカンダリインデックス

すべてコピー

PK=

クラスタインデックス

セカンダリインデックス

Fast Index Creation

追加のセカンダリインデックス

ここだけ新規作成

Page 11: MySQL 5.5 Update #denatech

データ圧縮● 行ごとにデータを圧縮

– データサイズ縮小– I/O減少

● 使い方– innodb_fle_format=Barracuda– innodb_fle_per_table– CREATE TABLE (...) ENGINE INNODB

ROW_FORMAT=Compressed;● 仕組みとか性能とか

– sh2氏の日記を見よ!!● http://d.hatena.ne.jp/sh2/20090628● http://d.hatena.ne.jp/sh2/20090705

Page 12: MySQL 5.5 Update #denatech

もうひとつの新フォーマットDYNAMIC!!

● TEXTが完全にページ外に。– 1行あたり 8KBまでという制限が緩和。– 元々は先頭の 768バイトをページ内に格納。

● 11カラム目でエラーになる可能性があった。● 使い方

– innodb_fle_format=Barracuda– innodb_fle_per_table– CREATE TABLE (...) ENGINE INNODB

ROW_FORMAT=Dynamic;

Page 13: MySQL 5.5 Update #denatech

グループコミット● InnoDB Plugin 1.0.4において、「バイナリログを有効にするとグループコミットが効かなくなる問題」が修正

– 参考:  InnoDB Plugin 1.0.4 - InnoDB 史上極めて重要なリリース - open database life

– http://opendatabaselife.blogspot.com/2009/08/innodb-plugin-104-innodb.html

Page 14: MySQL 5.5 Update #denatech

クラッシュリカバリ時間の短縮● 鍵の本 P.364 コラム「クラッシュリカバリがいつまでも終わらない」参照

● リカバリ時に用いるリストの構造を改良● とあるテストではリカバリ時間が 30分の 1以下に短縮という報告あり。

– 参照: InnoDB recovery is now faster…much faster! http://blogs.innodb.com/wp/2010/04/innodb-performance-recovery/

Page 15: MySQL 5.5 Update #denatech

InnoDB Plugin 1.1● 性能改善 !!

– 複数のバッファプールインスタンス– 複数のロールバックセグメント– fush_listのロックを独立– パージスレッドが独立– random deleteの性能改善– Linuxにおけるネイティブ非同期 I/Oのサポート– PERFORMANCE_SCHEMAのサポート

Page 16: MySQL 5.5 Update #denatech

MySQL Conference & Expo● http://en.oreilly.com/mysql2010/public/schedule

/proceedings– 2010年 4月開催。– スライドが公開されている。– ベンチマーク結果など多数収録。– MySQL 5.5 + InnoDB Plugin 1.1の改善が目の当たりに!!(Mikael Ronstromのスライドは必見)

Page 17: MySQL 5.5 Update #denatech

4 バイトUTF8 !!

Page 18: MySQL 5.5 Update #denatech

MySQL 5.5における UTF-8● MySQL 5.1の UTF-8

– 基本多言語面( BMP)のみをサポート– 1文字あたり最大 3バイトまで– 文字コード名は utf8– 4バイトに割り当てられた文字を使いたい場合には、 binary文字コードで代用。(ソート順が・・・)

● MySQL 5.5の UTF-8– 追加面をサポート。 Unicodeで定義されている漢字をすべて利用可能に!!

– 以前のバージョンと互換のある文字コードと 4バイト対応の文字コードの二刀流

● utf8: 以前と互換性あり● utf8mb4: 4バイト対応

Page 19: MySQL 5.5 Update #denatech

Semi-Synchronous

レプリケーション!!

Page 20: MySQL 5.5 Update #denatech

レプリケーションの問題点と解決法● 非同期なのでマスターがクラッシュするとマスターにしか存在しないデータが発生する。

– スレーブの昇格が難しい。● 一部のデータが失われる。● マスター復旧後、最悪データのコピーをしなければいけない。

● Semi-Synchronous Replicationでは、マスターがCOMMITをしてクライアントへ応答を返す前に、最低でもひとつのスレーブに更新を転送する。

Page 21: MySQL 5.5 Update #denatech

MySQL 5.1のレプリケーション

Page 22: MySQL 5.5 Update #denatech

Semi-Synchronousレプリケーション

Page 23: MySQL 5.5 Update #denatech

COLUMNSPARTITIONING

!!

Page 24: MySQL 5.5 Update #denatech

今までと何が違うのか?● パーティション式を通じて結果を整数値に変換。

● DATE=>TO_DAYS()● 単一の値。

● カラムの値をそのまま評価。

● DATE=> 直接比較● 複数の値を利用可。

Page 25: MySQL 5.5 Update #denatech

RANGE COLUMNSパーティショニング例 1

create table t1 ( id int unsigned not null auto_increment, year_ smallint not null, month_ tinyint unsigned not null, primary key(id,year_,month_)) partition by range columns (year_,month_) ( partition p1 values less than (2000, 4), partition p2 values less than (2001, 8), partition p3 values less than (2004, 11), partition p4 values less than (2008, 2), partition p5 values less than (2010, 3), partition p6 values less than (2011, 4), partition p7 values less than (maxvalue, maxvalue));

Page 26: MySQL 5.5 Update #denatech

EXPLAIN - RANGE COLUMNSmysql> explain partitions -> select * from t1 -> where year_ = 2008\G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: t1 partitions: p4,p5 type: indexpossible_keys: NULL key: PRIMARY key_len: 7 ref: NULL rows: 8193 Extra: Using where; Using index1 row in set (0.00 sec)

Page 27: MySQL 5.5 Update #denatech

RANGE COLUMNSパーティショニング例 2

create table t2 ( id int unsigned not null auto_increment, mydate date not null, primary key(id,mydate)) partition by range columns (mydate) ( partition p1 values less than ('2000-04-01'), partition p2 values less than ('2001-08-01'), partition p3 values less than ('2004-11-01'), partition p4 values less than ('2008-01-01'), partition p5 values less than ('2010-03-01'), partition p6 values less than ('2011-04-01'), partition p7 values less than (maxvalue));

Page 28: MySQL 5.5 Update #denatech

LIST COLUMNSパーティショニング例

create table t3 ( id int unsigned not null auto_increment, gender char(10), flag tinyint unsigned not null, primary key (id, gender, flag)) partition by list columns (gender, flag) ( partition p1 values in (('male', 0)), partition p2 values in (('female', 0)), partition p3 values in (('male', 1)), partition p4 values in (('female', 1)), partition p5 values in (('unknown', 0),('unknown',1)));

Page 29: MySQL 5.5 Update #denatech

DTrace!!

Page 30: MySQL 5.5 Update #denatech

DTrace Probes!!● Solaris 10で搭載された機能。

– Solaris/Mac OS X/FreeBSDで利用可能● カーネル / ユーザープロセスをトレース。● プローブと呼ばれる観測点を対象のプログラムに動的に埋め込む。

● プローブの種類に応じたプロバイダ。● D 言語と呼ばれるプログラムで操作● 参考

– D 言語基本文法最速マスター( DTraceのほう)http://nippondanji.blogspot.com/2010/02/ddtrace.html

– DTraceによるMySQL解析ことはじめhttp://www.slideshare.net/nippondanji/dtracemysql-3588894

Page 31: MySQL 5.5 Update #denatech

PERFORMANCESCHEMA !!

Page 32: MySQL 5.5 Update #denatech

PERFORMANCE_SCHEMAとは。● DTraceに似た情報収集と表示の仕組み。● プロファイリングに利用可能。

– 情報は相当マニアックなので開発者向けかも。● P_Sのアーキテクチャー

– ストレージエンジンとして実装– ソースコード中の随所にしかけられた「 Instrument 」か

ら情報を収集。– 統計情報は P_S内に保管される。– P_Sストレージエンジンを通じて、 SELECTによりデータを取得。

● 各種集計関数が利用可能– P_Sの操作は P_Sテーブルを UPDATEすることで行う。

Page 33: MySQL 5.5 Update #denatech

使い方。● MySQL 5.5.3以降● my.cnfの [mysqld]セクションに

performance_schemaと書いて再起動。● PERFORMANCE_SCHEMAデータベースのテーブルにアクセスするだけ。

– SETUP_*テーブルで ON/OFFを切り換え可能。

Page 34: MySQL 5.5 Update #denatech

P_Sの仕組み

mysqld内の随所に仕掛けられたInstruments

PERFORMANCESCHEMA

Storage Engine

SELECT ... FROM PERFORMANCE_SCHEMA.EVENTS_WAITS_CURRENT...;

SQLでアクセス 行データとして統計情報を取得

Page 35: MySQL 5.5 Update #denatech

SIGNAL !!RESIGNAL !!

Page 36: MySQL 5.5 Update #denatech

SIGNAL● ストアドルーチン内で自発的にエラーを発生させる。

delimiter //create trigger t4_bi before insert on t4for each row begin if NEW.a >= 100 then signal SQLSTATE VALUE '42000' set MESSAGE_TEXT ='The column `a` value should be less than 100.'; end if;end;//delimiter ;

Page 37: MySQL 5.5 Update #denatech

RESIGNAL● HANDLER内で SIGNALを再度発生させる。

DROP TABLE IF EXISTS xx;delimiter //CREATE PROCEDURE p ()BEGIN DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SET @error_count = @error_count + 1; IF @a = 0 THEN RESIGNAL; END IF; END; DROP TABLE xx;END//delimiter ;SET @error_count = 0;SET @a = 0;CALL p();

Page 38: MySQL 5.5 Update #denatech

MySQL 5.5総評!!

Page 39: MySQL 5.5 Update #denatech

MySQL 5.5は正しい進歩 !!● 性能が向上しつつ利便性も向上

– 日本人待望の 4バイト UTF-8。– InnoDBの飛躍的な性能改善。– Semi-Synchronous Replication– パーティショニングの改善– DTrace/PERFORMANCE_SCHEMA– など

全てのユーザーに自信を持ってお勧め出来るバージョン!!

Page 40: MySQL 5.5 Update #denatech

トラブルシューティング!!

Page 41: MySQL 5.5 Update #denatech

MySQLの開発目標

1. 安定性2. パフォーマンス3. 使いやすさ

トラブルなんて起きるの?

Page 42: MySQL 5.5 Update #denatech

起きるんです。。。

レプリケーション停止デッドロック

テーブルコラプション

クラッシュ

サーバが起動しない

クエリの実行結果がおかしい

接続エラー

ログインできない

文字化け

MySQL Enterprise MonitorOut Of Memory

性能劣化

OSのエラー

Too many connections

リストア出来ない

バックアップ不具合

Table is full

起動に時間がかかる

データロスト SQLインジェクション

スレーブの遅延

Page 43: MySQL 5.5 Update #denatech

トラブルに打ち勝て!!● トラブルとは想定外の事象● ゆえにトラブルシューティングにセオリーなし!!● 唯一の対策は、MySQLをよく知ること。

– 仕組み– 仕様(本来あるべき姿)– ソースコード

彼(かれ)を知り己(おのれ)を知れば、百戦しても殆(あやう)からず。

Page 44: MySQL 5.5 Update #denatech

トラブルシューティングの心構え!● 仕様を理解する。

– 何が正常で何が異常なのか?– どのような仕組みになっているのか?

● 自分でやってみる。– 再現が出来ればこちらのもの!– 素早く再現環境を作成する能力が必要。

● ソースコードを読む。– 最終的にはソースコードに全てが書いてある。

● OSに詳しくなる。– 問題が OSからやってくることも多い。

Page 45: MySQL 5.5 Update #denatech

そして・・・

つづきは書籍にて!!「エキスパートのためのMySQL[運用 +管理 ]

トラブルシューティングガイド」

Page 46: MySQL 5.5 Update #denatech

Q!!&

A!!