SlideShare a Scribd company logo
MySQL 運用虎の巻!
@ 徳島オープンセミナー 2013

奥野 幹也
@nippondanji
mikiya (dot) okuno (at) gmail (dot) com
免責事項
●

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

MySQL サポートエンジニア
–

日々のしごと
●
●
●

●

ライフワーク
–

自由なソフトウェアの普及
●

●

トラブルシューティング全般
Q&A 回答
パフォーマンスチューニング
など

オープンソースではない

ブログ
–
–

漢のコンピュータ道
http://nippondanji.blogspot.com/

今日は個人として
参加しています。
アジェンダ
●
●
●
●
●
●

MySQL の概要
インストールと初期設定
ユーザー管理
開発関係の話
バックアップ
パフォーマンスチューニング
MySQL の概要
MySQL とは
●

●

●
●
●

オープンソースのリレーショナル・データベース・マネージメ
ント・システム
MySQL AB => Sun Microsystems => Oracle によって開
発。
Web 開発においては圧倒的なシェア
使い易く、安定して、高速に動作するのがウリ
ホームページ
–
–

http://www-jp.mysql.com/
http://dev.mysql.com/
MySQL の機能的特徴
●

●

●

●
●
●

●

●

ANSI SQL 標準に準拠(一部の
文法を除く。)
種々のプラットフォームをサポー
ト( Windows 、 Linux 、 Mac 、各
種 UNIX 系 OS )
ストレージエンジンによりデータ
を格納するレイヤーを仮想化
ACID 準拠のトランザクション
XA トランザクション
非同期・準同期 - Master/Slave
型レプリケーション
水平パーティショニング
( Range 、 List 、 Hash 、 Key )
ストアドプロシージャ、ストアド
ファンクション、トリガ

●
●
●
●
●
●

●
●
●

●
●

UNION
ビュー
サブクエリ
INFORMATION_SCHEMA
SSL による通信
Unicode をはじめとした各種文
字コードのサポート
全文検索
タイムゾーンのサポート
多種多様な開発言語のサポー
ト( C 、 C+
+ 、 Java 、 Perl 、 PHP 、 Python 、
Ruby など)
ODBC による接続のサポート
NoSQL インターフェイス
MySQL の構造的特徴
●
●
●
●
●
●
●
●
●

●

シングルプロセス・マルチスレッド
1 セッション= 1 スレッド
ストレージエンジン API によるデータストアの仮想化
その他各種プラグイン API
GNU Bison による Lexical Scanner
コストベースのオプティマイザ
全ての更新を保存するバイナリログ
2 種類のスレッドで実装された非同期型レプリケーション
移植性の高い関数群( MySQL システムライブラリ mysys )を使って実装
ソースコードは C/C++ 混在
MySQL の仕組み(イメージ図)
クライアント
Java

クライアント
PHP

コネクション
スレッド

コネクション
スレッド

クライアント
ODBC

コネクション
スレッド

SQL の解析と最
適化は共通

パーサー・オプティマイザ・アクセス管理 等

ストレージエンジン API
MyISAM
table_name.MYI
table_name.MYD

InnoDB
テーブル
スペース
ログファイル

MySQL
Cluster
NDB
API

MySQL サーバ

データノード

データの格納や
アクセス方法は
ストレージエンジ
ンごとに違う
ライセンス
●

MySQL はデュアルライセンスを採用
–

Community 版
●
●

–

GPLv2
FOSS License Exception あり

商用版
●
●
●

コマーシャルライセンス
サブスクリプション
OEM

Oracle がすべての著作権を
保有しているから可能
GPL - GNU General Public License
●

リチャード・ストールマン氏により考案されたソフトウェアラ
イセンス
–
–
–
–

●
●

1989 年〜
世界で最も用いられているオープンソースライセンス
フリー(自由な)ソフトウェアを実現するために考えられた
コピーレフトを具現化するためのライセンス

現在の著作権法の上に立脚
Copyleft – All rights reversed
–

Copyright – All rights reserved を文字ったもの
●

–
–

意味は真逆

ユーザーに完全な自由を認める。
再配布物(派生物や 2 次利用した作品)のライセンスを
同じものにすることを要求
GPL の適用範囲
●

ライセンスを GPL にする必要がある場合
–
–

GPL のソフトウェアを改造してまたはそのまま再配布
GPL のソフトウェアを利用したソフトウェアを再配布
●
●
●

●

GPL のライブラリをリンク
GPL のソースコードを拝借
プロセス間通信で GPL のプログラムと協調動作。(グ
レーゾーン中のグレーゾーン!)

ライセンスを GPL にする必要がない場合
–
–
–
–
–
–

ソフトウェアを頒布しない場合
ネットワーク経由で GPL のプログラムと協調動作
単独で動作するプロセスとしてバンドル
GPL の OS カーネル上で動作する
GPL のシステムライブラリを利用する
GPL ソフトウェア用の”インストーラ”
インストールと設定
インストールは 15 分
●

3 ステップ
–
–
–
–

●
●
●

ダウンロード
http://dev.mysql.com/downloads
パッケージのインストール
起動!!

慣れれば 5 分でインストール可能
最新版を使うべし!
Windows 版はインストールウィザードあり
–
–

サーバー本体だけでなく、ドライバや GUI ツールも一発
インストール
ただし XP は非対応
MySQL Sandbox
http://mysqlsandbox.net/
●
●
●
●

Giuseppe Maxia 氏による検証用 MySQL イントールツール
複数のバージョンのインスタンスを同時にインストール
レプリケーションも一発構築可能
対応プラットフォームは *NIX
–

tar.gz 版のパッケージを利用
mysql_secure_installation
●

セキュリティの脅威になりやすい初期設定を変更するツー
ル
–
–
–
–

root ユーザーのパスワード変更
リモートからの root ユーザーによるログインを無効化
匿名ユーザーの削除
test データベース(誰でもアクセスできる)の削除
鉄板設定
これだけはやっておけ!
●

スロークエリログの有効化
–
–

●

バイナリログの有効化
–
–
–

●

character_set_server = utf8

接続数
–
–

●

log_bin=mysql-bin
expired_logs_days = 30
sync_binlog=1

文字コード
–

●

slow_query_log=1
long_query_time=1

max_connections = 1000
limits.conf で FD を増やしておくこと

InnoDB の各種パラメータ調整
–
–
–
–
–

innodb_buffer_pool_size = 10G
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
innodb_file_format = Barracuda
innodb_io_capacity = 2000 # SSD の場合
ユーザー管理
MySQL のユーザーアカウント
●

●

●

username@hostname という形式
– username は任意のユーザー名(文字列)
– hostname はクライアントのホスト名または IP アドレス
– ユーザー名が同じでも接続元が違えば別アカウント!
匿名ユーザー
– ''@host1
ワイルドカード = %
– john@'%' … 任意のホスト名に一致
– john@'%.hoge.com' … hoge.com というドメイン名に一致
– john@'192.168.1.%' … 192.168.1.0 のネットワークに一致
● john@'192.168.1.0/255.255.255.0' のほうがベター
ユーザーアカウントの
マッチング
●
●
●

より具体的なアカウントから先にマッチする
ユーザー名よりもホスト名優先
優先順位の例
1.john@hoge
2.''@hoge
3.john@'%.hoge.com'
4.john@'%'
5.''@'%'

●

最初にマッチしたユーザーアカウントが選択される
MySQL 5.6 で利用可能な
認証プラグイン
プラグイン名

説明

商用

Native

デフォルトの認証方式

Old Native

バージョン 4.1 以前の認証方式

SHA-256

SHA-256 をパスワードのハッシュに利用する方式

Clear Text

平文を用いた認証方式。外部認証を行う場合に必
要

PAM

PAM を用いた認証方式。 MySQL サーバーにはパ Y
スワードを平文で送る必要がある

Windows Native

Windows 認証を用いて接続する

Socket PeerCredential

UNIX ドメインソケットで接続するときに利用可能な
特殊なプラグイン。

Y
ユーザーの作成例
SHA-256 プラグインの場合
●

ユーザーの作成
–

●

CREATE USER 'sha256user'@'localhost'
IDENTIFIED WITH sha256_password;

パスワードの設定
–
–

SET old_passwords = 2;
SET PASSWORD FOR 'sha256user'@'localhost' =
PASSWORD('sha256P@ss');
ドライバ
利用可能なドライバの例
言語

名称

配布元

ライセンス

C

libmysqlclient

Oracle

GPLv2

C++

Connector/C++

Oracle

GPLv2

Java

Connector/J

Oracle

GPLv2

.NET

Connector/.NET

Oracle

GPLv2

ODBC

Connector/ODBC

Oracle

GPLv2

PHP

mysqlnd

PHP

PHP

Python

Connector/Python

Oracle

GPLv2

Perl

DBD::mysql

cpan

GPLv2

Ruby

Ruby/MySQL

gem(tmtm 氏 )

Ruby
FOSS License Exception
●

平たく言うと・・・
–

●

ドライバが対象
–

●

自由あるいはオープンソースソフトウェアのために
MySQL を利用する場合は、 GPLv2 を適用しなくても良
いという規定
サーバーは Exception なし

適用されるライセンスのリスト
–
–

http://www.mysql.com/about/legal/licensing/fossexception/
例) AGPLv3 、 GPLv3 、 LGPLv2 〜、 MIT 、 BSD 、 Apac
he License 、 PHP License 、 Python License 、 Artistic
License
文字コード
意外とハマりやすい文字コード
MySQL の文字コードの実装は
とても柔軟

柔軟さが増せば複雑さも増す・・・
MySQL で利用可能な文字コード
文字コード名

対応文字

ストレージサイズ

sjis

JIS X 0208:1997

1 〜 2 バイト

cp932

JIS X 0208:1997 + NEC 特殊文字・ IBM
拡張文字

1 〜 2 バイト

ujis

JIS X 0208:1997

1 〜 3 バイト

eucjpms

JIS X 0208:1997 + NEC 特殊文字・ IBM
拡張文字

1 〜 3 バイト

utf8

JIS X 0208:1997 + NEC 特殊文字・ IBM
拡張文字

1 〜 3 バイト

utf8mb4

JIS X 0213:2004

1 〜 4 バイト
文字コードと照合順序
●

文字コード
–

●

利用可能な文字の集合をコード化したもの

照合順序
–
–
–

文字コードに対する並び順を定義したもの
大文字小文字の区別あり・なしなど
SHOW COLLATIONS
文字コードが適用される箇所
●

カラム内のデータ
–

●
●

文字コードはカラムごとに異なるものを指定可能

テーブル名などのメタデータ
クライアントとの通信
文字コードの指定はカラム単位
CREATE TABLE t (
a VARCHAR(100) CHARACTER SET cp932,
b VARCHAR(100) CHARACTER SET eucjpms,
c VARCHAR(100) CHARACTER SET utf8,
:
);

必要に応じて
自動変換
MySQL サーバーにおける
文字コード自動変換
④ データを
蓄える際の
文字コード

② クエリの実行
に利用する
文字コード

⑤ テーブル名や
カラム名に対する
文字コード

テーブル

① 送信する
SQL 文に対する
文字コード

クライアント

セッション

MySQL サーバー

⑥ ファイル名を
解決する際の
文字コード

③ クエリの
実行結果に対する
文字コード

ファイルシステム

出展:エキスパートのための MySQL
[運用+管理]トラブルシューティングガイド
カラムの文字コードのデフォルト値
CREATE TABLE t (
a VARCHAR(100) CHARACTER SET cp932,
b VARCHAR(100) CHARACTER SET eucjpms,
c VARCHAR(100),
:
指定がない
) CHARACTER SET utf8;

デフォルト値として
テーブルの文字コードが
カラムに適用される
テーブルの文字コードのデフォルト値
CREATE TABLE t (
a VARCHAR(100),
b VARCHAR(100),
c VARCHAR(100),
:
);

カラム、テーブル双方に
文字コードの指定がない

CREATE DATABASE db CHARACTER SET utf8;
データベースの文字コードが適用される
データベースの文字コードの
デフォルト値
CREATE DATABASE db1 CHARACTER SET utf8;
CREATE DATABASE db2;
データベース作成時に
文字コードの指定がない

指定がない場合には
character_set_server
が適用される
文字コード適用のルール
characer_set_server

データベースの文字コード
( character_set_database )

テーブルのデフォルト文字コード

カラムの文字コード

優先度が
最も高い
トランザクション
トランザクションが利用可能な
ストレージエンジン
●

InnoDB
–
–
–
–
–

標準の MySQL に添付
多くの負荷パターンで良
好な性能を発揮
行レベルロック
MVCC
クラスタインデックス

●

ndbcluster
–
–
–
–
–
–

MySQL サーバーとは別
パッケージで配布
並列分散型のデータスト
ア
シェアードナッシングアー
キテクチャ
インメモリデータベース
ピーキーな性能特性
Join Pushdown
利用可能な分離レベル
ダーティ
リード

反復不可能読
み取り

ファントム

O

X

O

READ-COMMITTED

X

X

O

REPEATABLE-READ

X

O

X

X

O

X

分離レベル
READUNCOMMITTED

SERIALIZABLE

分離性

低

高
ロックの種類
●

データへのアクセスはすべて行ロック
–
–

Non-locking read
Record Locks
●
●

–
–
●

インデックスレコードをロックする
X-lock / S-lock

Next Key lock
Insertion Intention

テーブルロックあり
–
–
–

LOCK TABLES
DDL 用
IX 、 X 、 IS 、 S ロック
ネクストキーロック
●
●

Next Key Lock = Record Lock + Gap Lock
Gap Lock とは
–
–
–

レコードとレコードの間の仮想的な空間をロックする
S-Lock / X-Lock
ファントム防止
●

●

X-Gap-Lock は Insertion Intention Lock と競合する

Insertion Intention Lock
–
–

レコードを挿入する前に Gap をロックする
共有ロック
●

同じ Gap に対して同時に INSERT 可能
エラー処理
●
●

最低でもトランザクションのリトライは必須
トランザクション理論では、トランザクションの終了ステータ
スは Commit もしくは Abort
–

Abort を皆無にすることは理論上不可能
リトライするべきエラー
エラーの種類

エラーの判別方法

追加で行うべき対処

デッドロック

エラーコード 1213
または SQLSTATE
40001

行へアクセスする順序の見直し。

Lock Wait
Timeout

エラーコード 1205

SHOW PROCESSLIST の記録。
長時間ロックを保持するトランザクショ
ンのチューニング。

一時的なエラー
( NDB )

エラーコード 1297

各種リソースの見直し。

接続関係のエラー

SQLSTATE 08S01

COMMIT 中にエラーが発生した場合
は COMMIT が成功したかどうかの確
認。
レプリケーション
レプリケーションの用途
●
●
●
●
●

高可用性用スタンバイ
バックアップ
レポーティング等の負荷の分離
スケールアウト
ディザスタリカバリ
スタンバイとしてのレプリケーション
●

非同期または準同期
–

準同期はスレーブへログが到着するのを待つ
●
●

●

切り替えは高速!
–
–
–

●

スレーブへ切り替えてもデータの損失はない
マスター側で COMMIT の応答が返ったかどうかは分
からない

論理的なコピーなのでクラッシュリカバリは不要
MySQL 自身には切り替えのための機能はない
クライアントの繋ぎ変え

問題点
–
–

切り戻しの手順が複雑になりがち
スレーブが複数ある場合は差分を解消する必要あり
準同期レプリケーション
アプリケーション

1. COMMIT

7. send_ok

6-1-2. ack

接続
スレッド
3. ログ更新

ストレージ
エンジン

2.

6-1-1. ack

スレーブ接続
スレッド
バ
イ
更 ナリ
新 ロ

グ

4. バイナリログ
送信

バイナリログ

マスター

I/O
スレッド

SQL
スレッド

5. リレーログ更新
6-2. 更新の適用

リレーログ

ストレージ
エンジン
スレーブ
クエリのチューニング
Explain
mysql> EXPLAIN SELECT 'cond1' AS LABEL, COUNT(1) AS COUNT FROM Country WHERE Code LIKE 'J%' UNION SELECT 'cond2', COUNT(1)
FROM Country WHERE IndepYear > 1900 UNION SELECT 'cond3', COUNT(1) FROM Country WHERE Continent = 'Africa' UNION SELECT
'cond4', count(1) FROM Country WHERE Name = LocalName;
+----+--------------+----------------+-------+---------------+---------+---------+------+------+--------------------------+
| id | select_type | table
| type | possible_keys | key
| key_len | ref | rows | Extra
|
+----+--------------+----------------+-------+---------------+---------+---------+------+------+--------------------------+
| 1 | PRIMARY
| Country
| range | PRIMARY
| PRIMARY | 3
| NULL |
3 | Using where; Using index |
| 2 | UNION
| Country
| ALL
| NULL
| NULL
| NULL
| NULL | 239 | Using where
|
| 3 | UNION
| Country
| ALL
| NULL
| NULL
| NULL
| NULL | 239 | Using where
|
| 4 | UNION
| Country
| ALL
| NULL
| NULL
| NULL
| NULL | 239 | Using where
|
| NULL | UNION RESULT | <union1,2,3,4> | ALL
| NULL
| NULL
| NULL
| NULL | NULL | Using temporary
|
+----+--------------+----------------+-------+---------------+---------+---------+------+------+--------------------------+
5 rows in set (0.00 sec)
クエリの構造を読み解く
●

select_type でクエリの構造が分かる!
–

JOIN
●

–

UNION
●

–

SIMPLE
UNION, UNION RESULT

サブクエリ
●
●

●

FROM 句のサブクエリ ... PRIMARY, DERIVED
その他 ... PRIMARY, SUBQUERY, DEPENDENT
SUBQUERY, UNCACHEABLE SUBQUERY など。
サブクエリが UNION になっている場合 ...
DEPENDENT UNION, UNCACHEABLE UNION
Visual Explain
JOIN の種類
●

MySQL にある JOIN の種類
–
–
–
–

Nested Loop Join
Block Nested Loop Join ← 変形 NLJ
Batched Key Access Join ← 変形 BNLJ
Pushdown Join ( MySQL Cluster のみ。爆速)
Block Nested Look Join
t2

t1
スキャン
1. WHERE 句の条件に沿って
t1 からレコードをフェッチし
バッファに格納
2. バッファが満タンに
なったら t2 を
スキャンして JOIN
3. t1 のすべての
レコードについて
JOIN Buffer
くりかえし

Using Join Buffer...
Batched Key Access Join
t2

t1

1. WHERE 句の条件に沿って
t1 からレコードをフェッチし
バッファに格納
2. バッファが満タンに
なったら MRR で t2 から
レコードをフェッチして
JOIN

MRR
Scan

4. t1 のすべての
レコードについて
くりかえし

3. ROWID の順で
t2 からレコードをフェッチ
JOIN Buffer
Performance Schema
●
●
●
●

各種統計情報を収集するストレージエンジン
SELECT で情報にアクセス
UPDATE で設定
情報が豊富だが、豊富すぎて直接扱うのは難しい
–
–

ps_helper が便利!
http://www.markleith.co.uk/ps_helper/
バックアップ
バックアップ戦略
〜考慮するべきポイント〜
●
●
●
●
●

オンライン or オフライン
論理 or 物理
フル or 差分 / 増分
どのストレージエンジンが対象か
バックアップ / リストアにかかる時間
–
–

●

スケジュール。
–
–

●
●
●

復旧優先?
データ保全優先?
どの時間帯にとるか?
どこまで巻戻っても OK か?

手順は確立されているか?
バックアップの保管先
有償 or 無償
バックアップツールの種類
バックアップ方法
(ツール名)

オン
ライン

Inno
DB

My
ISAM

形式

バック
アップ
速度

リストア
速度

フル

差
分

mysqldump

Yes

Yes

Yes

Logical

Mid

Slow

Yes

No

コールドバックアップ

No

Yes

Yes

Raw

Fast

Fast

Yes

No

スナップショット

Yes

Yes

Yes

Raw

Instant

Fast

Yes

No

バイナリログ

Yes

Yes

Yes

Logical

--

Slow

No

Yes

MySQL Enterprise
Backup

Yes

Yes

Yes

InnoDB Fast
Native

Fast

Yes

Yes

レプリケーション

Yes

Yes

Yes

Logical

Contigu Very
ous
Fast

Yes

Yes
バックアップのための
レプリケーション活用
●

フルバックアップの負荷分散
–
–

●

スレーブはマスターの完全なコピー
マスターへの影響がないのでどの方式でバックアップを
取ることも可能

遅延レプリケーション
–

スレーブ側で更新の適用を意図的に遅らせる
●

–

例えば1時間など

ヒューマンエラー(間違ってテーブルを DROP した!)など
が起きても直ぐに代わりとして利用可能
まとめ
まとめ
●
●
●

MySQL はお手頃な RDBMS
GPLv2+FOSS License Exception / 商用ライセンス
運用のコツをおさえて安定稼働
–
–
–
–
–
–
–
–

設定のツボを抑える
文字コードは確実に指定
トランザクションのエラー処理は忘れずに
使い方広がるレプリケーション
準同期レプリケーションでお手軽 HA
MySQL Workbench で Visual Explain
バックアップは万全に
遅延レプリケーションでお手軽バックアップ
Q&A!!
ご静聴ありがとうございました。

More Related Content

Mysql toranomaki