Text
Page: 1
MySQLを拡張する
MySQL User Conference 2015
とみたまさひろ
日本MySQLユーザ会
2015-12-15
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 2
自己紹介
とみた まさひろ
http://tmtms.hatenablog.com
http://twitter.com/tmtms
https://github.com/tmtm
長野県北部在住プログラマー( Ruby & C )
長野ソフトウェア技術者グループ(NSEG)
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 3
自己紹介
日本MySQLユーザ会代表
MySQL 3.21 の日本語対応 (1998)
MySQLのRubyバインディング作成 (1998)
OSS貢献者賞 2013
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 4
MySQLは「世界でもっとも普及している
オープンソースデータベース」
https://www-jp.mysql.com/
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 5
「伽藍とバザール」の「伽藍」
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 6
フリーソフトウェア(GPL2)
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 7
フリーソフトウェアでうれしいこと
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 8
無料(フリー)
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 9
無料でうれしい
個人ごとの開発環境
テスト環境
スケールアウトで台数増
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 10
自由(フリー)
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 11
自由でうれしい
ソースが公開されている
自分で調べられる
改変して再配布
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 12
改変
MariaDB
AWS RDS
「多様性は善」
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 13
仮に本家の開発が中断したとしても
第三者が継続できる
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 14
拡張
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 15
MySQLに機能を追加する
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 16
UDF - ユーザー定義関数
一番簡単な拡張
独自の関数を MySQL に組み込む
通常の関数 / 集約関数
MySQLのソースを見なくてもマニュアルだけで作
成可能
http://dev.mysql.com/doc/refman/5.6/ja/adding-udf.html
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 17
UDF
hoge_init()
クエリ実行前に呼び出される(引数チェックとか)
hoge()
関数本体
hoge_deinit()
クエリ実行後に呼び出される(メモリ解放とか)
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 18
例: mysql-mruby
https://github.com/mattn/mysql-mruby
mysql> SELECT mrb_eval('ARGV.map(&:upcase).join(",")',
-> 'hoge', 'fuga') as a;
+ -----------+
| a
|
+ -----------+
| HOGE,FUGA |
+ -----------+
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 19
プラグイン
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 20
プラグイン (5.7.9)
mysql> show plugins;
+----------------------------+----------+--------------------+---------+---------+
| Name
| Status
| Type
| Library | License |
+----------------------------+----------+--------------------+---------+---------+
| binlog
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| mysql_native_password
| ACTIVE
| AUTHENTICATION
| NULL
| GPL
|
| sha256_password
| ACTIVE
| AUTHENTICATION
| NULL
| GPL
|
| MyISAM
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| PERFORMANCE_SCHEMA
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| InnoDB
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| INNODB_TRX
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_LOCKS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_LOCK_WAITS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_CMP
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_CMP_RESET
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_CMPMEM
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_CMPMEM_RESET
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_CMP_PER_INDEX
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_CMP_PER_INDEX_RESET | ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_BUFFER_PAGE
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_BUFFER_PAGE_LRU
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_BUFFER_POOL_STATS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_TEMP_TABLE_INFO
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_METRICS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 21
プラグイン (5.7.9)
| INNODB_FT_DEFAULT_STOPWORD | ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_FT_DELETED
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_FT_BEING_DELETED
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_FT_CONFIG
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_FT_INDEX_CACHE
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_FT_INDEX_TABLE
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_TABLES
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_TABLESTATS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_INDEXES
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_COLUMNS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_FIELDS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_FOREIGN
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_FOREIGN_COLS
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_TABLESPACES
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_DATAFILES
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| INNODB_SYS_VIRTUAL
| ACTIVE
| INFORMATION SCHEMA | NULL
| GPL
|
| MRG_MYISAM
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| MEMORY
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| CSV
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| BLACKHOLE
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| partition
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| FEDERATED
| DISABLED | STORAGE ENGINE
| NULL
| GPL
|
| ARCHIVE
| ACTIVE
| STORAGE ENGINE
| NULL
| GPL
|
| ngram
| ACTIVE
| FTPARSER
| NULL
| GPL
|
+----------------------------+----------+--------------------+---------+---------+
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 22
プラグイン
ストレージエンジンプラグイン
InnoDB, MyISAM, CSV, Blackhole, …
全文パーサープラグイン
全文検索用トークナイザ: ngram
デーモンプラグイン
mysqld プロセス空間内で動作
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 23
プラグイン
INFORMATION_SCHEMA プラグイン
準同期レプリケーションプラグイン
監査プラグイン
認証プラグイン
パスワード検証プラグイン
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 24
プラグインの作り方
リファレンスマニュアル 24.2.4 プラグインの作成
http://dev.mysql.com/doc/refman/5.6/ja/writing-plugins.html
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 25
ストレージエンジンプラグイン
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 26
ストレージエンジンプラグイン
InnoDB, MyISAM, Archive, Blackhole, …
標準のストレージエンジンは全部プラグイン
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 27
巷のストレージエンジンプラグイン
mroonga
http://mroonga.org/ja/
日本語全文検索エンジン Groonga を MySQL から
使う
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 28
ストレージエンジンの作り方
ドキュメントあり
MySQL Internals Manual
Chapter 22 Writing a Custom Storage Engine
http://dev.mysql.com/doc/internals/en/custom-engine.html
でもソースみないと厳しいかも
フリーソフトウェアだから見放題!
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 29
デーモンプラグイン
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 30
デーモンプラグイン
mysqld プロセス空間内で何かを動かす
通常とは異なる TCP/IP の口を開けて何かすると
か
起動直後から定期的に何かするとか
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 31
巷のデーモンプラグイン
HandlerSocket
https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL
Transactd
http://www.bizstation.jp/ja/transactd/
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 32
デーモンプラグインの作り方
リファレンスマニュアル 24.2.4.5 デーモンプラグイ
ンの作成
http://dev.mysql.com/doc/refman/5.6/ja/writing-daemon-plugins.html
init() と deinit() 関数だけ
結構簡単
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 33
以上綺麗な拡張
(mysqldのコンパイル不要)
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 34
綺麗じゃない拡張
(mysqldのコンパイル必要)
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 35
改造
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 36
Charset/Collation
リファレンスマニュアル 10.3 文字セットの追加
http://dev.mysql.com/doc/refman/5.6/ja/adding-character-set.html
実は1バイト文字セットはコンパイル要らず
/usr/local/mysql/share/charsets/
マルチバイト文字は要コンパイル
mysql-5.x.x/strings/CHARSET_INFO.txt
どうしても ハハ=パパ=ババ と 🍣=🍺 問題を解決
したい人は改造してみるのもいいかも
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 37
ネットワークプロトコル
MySQL Internals Manual
Chapter 14 MySQL Client/Server Protocol
http://dev.mysql.com/doc/internals/en/client-server-protocol.html
MySQLのプロトコル解説
http://slide.rabbit-shocker.org/authors/tommy/mysql-protocol/
MySQLクライアントライブラリが無い処理系で実
装
Ruby/MySQL - pure Ruby 実装
https://github.com/tmtm/ruby-mysql
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 38
クエリ
クライアントからのコマンド振り分け
mysql-5.x.x/sql/sql_parse.cc
クエリ構文解析
mysql-5.x.x/sql/sql_yacc.yy
独自のクエリを組み込める
「予約語書き換えればSQLインジェクション対
策!」
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 39
まとめ
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 40
まとめ
プラグイン機構でコンパイルせずに結構拡張でき
る
ソースが見れるからプラグインも作りやすい
mysqld 自体を改造することもできる
無料もいいけど自由重要
フリーソフトウェア万歳!
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 41
おまけ
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 42
アドベントカレンダー
元はク リ ス マ スま で の期 間を数え る
ために使われていたカレンダーのこ
とで
〜中略〜
近年、インターネット上において、こ
のカレンダーにならい、定められた
テーマに従い、参加者が持ち回りで
自身のブログやサイトに記事を投稿
する企画が多く実施されています。
http://blog.qiita.com/post/132928437279/adcal2015
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 43
MySQL 関連のアドベントカレンダー
12/1〜25 まで開催中
MySQL Casual Advent Calendar 2015
http://qiita.com/advent-calendar/2015/mysql-casual
MySQL Fabric&Routerつらくない Advent
Calendar 2015
http://qiita.com/advent-calendar/2015/mysql_fabric
MySQL 5.7の「罠」に狙われてもやられないため
の Advent Calendar 2015
http://qiita.com/advent-calendar/2015/mysql57-yoku0825-traps
MySQLマニュアルを読む Advent Calendar 2015
http://qiita.com/advent-calendar/2015/mysql_manual
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 44
MySQLだけで4つもある!
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 45
4つのうち3つが
「独りアドベントカレンダー」
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 46
MySQLの人たちちょっとおかしい
MySQLを拡張する
Powered by Rabbit 2.1.9
Page: 47
おわり
MySQLを拡張する
Powered by Rabbit 2.1.9