MySQL 5.5 Update #denatech

Preview:

DESCRIPTION

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

Citation preview

MySQL UpdateMySQL Update

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

What's cool and new in MySQL 5.5

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

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

自己紹介

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

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

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

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など多数

InnoDB性能改善!!

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がビルトインに。

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

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

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

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

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

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

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

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

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

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

Fast Index Creation - つづき

PK=

クラスタインデックス

セカンダリインデックス

従来の動作

PK=

クラスタインデックス

セカンダリインデックス

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

すべてコピー

PK=

クラスタインデックス

セカンダリインデックス

Fast Index Creation

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

ここだけ新規作成

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

– データサイズ縮小– 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

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

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

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

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

ROW_FORMAT=Dynamic;

グループコミット● 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

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

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

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

InnoDB Plugin 1.1● 性能改善 !!

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

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

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

4 バイトUTF8 !!

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バイト対応

Semi-Synchronous

レプリケーション!!

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

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

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

MySQL 5.1のレプリケーション

Semi-Synchronousレプリケーション

COLUMNSPARTITIONING

!!

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

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

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

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

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));

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)

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));

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)));

DTrace!!

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

PERFORMANCESCHEMA !!

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

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

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

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

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

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

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

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

P_Sの仕組み

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

PERFORMANCESCHEMA

Storage Engine

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

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

SIGNAL !!RESIGNAL !!

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 ;

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();

MySQL 5.5総評!!

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

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

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

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

MySQLの開発目標

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

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

起きるんです。。。

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

テーブルコラプション

クラッシュ

サーバが起動しない

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

接続エラー

ログインできない

文字化け

MySQL Enterprise MonitorOut Of Memory

性能劣化

OSのエラー

Too many connections

リストア出来ない

バックアップ不具合

Table is full

起動に時間がかかる

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

スレーブの遅延

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

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

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

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

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

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

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

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

そして・・・

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

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

Q!!&

A!!

Recommended