SlideShare uma empresa Scribd logo
1 de 47
Baixar para ler offline
MySQLを拡張する Powered by Rabbit 2.1.9
MySQLを拡張する
MySQL User Conference 2015
とみたまさひろ
2015-12-15
MySQLを拡張する Powered by Rabbit 2.1.9
自己紹介
とみた まさひろ
http://tmtms.hatenablog.com
http://twitter.com/tmtms
https://github.com/tmtm
長野県北部在住プログラマー( Ruby & C )
長野ソフトウェア技術者グループ(NSEG)
MySQLを拡張する Powered by Rabbit 2.1.9
自己紹介
日本MySQLユーザ会代表
MySQL 3.21 の日本語対応 (1998)
MySQLのRubyバインディング作成 (1998)
OSS貢献者賞 2013
MySQLを拡張する Powered by Rabbit 2.1.9
MySQLは「世界でもっとも普及している
オープンソースデータベース」
https://www-jp.mysql.com/
MySQLを拡張する Powered by Rabbit 2.1.9
「伽藍とバザール」の「伽藍」
MySQLを拡張する Powered by Rabbit 2.1.9
フリーソフトウェア(GPL2)
MySQLを拡張する Powered by Rabbit 2.1.9
フリーソフトウェアでうれしいこと
MySQLを拡張する Powered by Rabbit 2.1.9
無料(フリー)
MySQLを拡張する Powered by Rabbit 2.1.9
無料でうれしい
個人ごとの開発環境
テスト環境
スケールアウトで台数増
MySQLを拡張する Powered by Rabbit 2.1.9
自由(フリー)
MySQLを拡張する Powered by Rabbit 2.1.9
自由でうれしい
ソースが公開されている
自分で調べられる
改変して再配布
MySQLを拡張する Powered by Rabbit 2.1.9
改変
MariaDB
AWS RDS
「多様性は善」
MySQLを拡張する Powered by Rabbit 2.1.9
仮に本家の開発が中断したとしても
第三者が継続できる
MySQLを拡張する Powered by Rabbit 2.1.9
拡張
MySQLを拡張する Powered by Rabbit 2.1.9
MySQLに機能を追加する
MySQLを拡張する Powered by Rabbit 2.1.9
UDF - ユーザー定義関数
一番簡単な拡張
独自の関数を MySQL に組み込む
通常の関数 / 集約関数
MySQLのソースを見なくてもマニュアルだけで作
成可能
http://dev.mysql.com/doc/refman/5.6/ja/adding-udf.html
MySQLを拡張する Powered by Rabbit 2.1.9
UDF
hoge_init()
クエリ実行前に呼び出される(引数チェックとか)
hoge()
関数本体
hoge_deinit()
クエリ実行後に呼び出される(メモリ解放とか)
MySQLを拡張する Powered by Rabbit 2.1.9
例: 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
プラグイン
MySQLを拡張する Powered by Rabbit 2.1.9
プラグイン(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
プラグイン(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
プラグイン
ストレージエンジンプラグイン
InnoDB, MyISAM, CSV, Blackhole, …
全文パーサープラグイン
全文検索用トークナイザ: ngram
デーモンプラグイン
mysqld プロセス空間内で動作
MySQLを拡張する Powered by Rabbit 2.1.9
プラグイン
INFORMATION_SCHEMA プラグイン
準同期レプリケーションプラグイン
監査プラグイン
認証プラグイン
パスワード検証プラグイン
MySQLを拡張する Powered by Rabbit 2.1.9
プラグインの作り方
リファレンスマニュアル 24.2.4 プラグインの作成
http://dev.mysql.com/doc/refman/5.6/ja/writing-plugins.html
MySQLを拡張する Powered by Rabbit 2.1.9
ストレージエンジンプラグイン
MySQLを拡張する Powered by Rabbit 2.1.9
ストレージエンジンプラグイン
InnoDB, MyISAM, Archive, Blackhole, …
標準のストレージエンジンは全部プラグイン
MySQLを拡張する Powered by Rabbit 2.1.9
巷のストレージエンジンプラグイン
mroonga
http://mroonga.org/ja/
日本語全文検索エンジン Groonga を MySQL から
使う
MySQLを拡張する Powered by Rabbit 2.1.9
ストレージエンジンの作り方
ドキュメントあり
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
デーモンプラグイン
MySQLを拡張する Powered by Rabbit 2.1.9
デーモンプラグイン
mysqld プロセス空間内で何かを動かす
通常とは異なる TCP/IP の口を開けて何かすると
か
起動直後から定期的に何かするとか
MySQLを拡張する Powered by Rabbit 2.1.9
巷のデーモンプラグイン
HandlerSocket
https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL
Transactd
http://www.bizstation.jp/ja/transactd/
MySQLを拡張する Powered by Rabbit 2.1.9
デーモンプラグインの作り方
リファレンスマニュアル 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
以上綺麗な拡張
(mysqldのコンパイル不要)
MySQLを拡張する Powered by Rabbit 2.1.9
綺麗じゃない拡張
(mysqldのコンパイル必要)
MySQLを拡張する Powered by Rabbit 2.1.9
改造
MySQLを拡張する Powered by Rabbit 2.1.9
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
ネットワークプロトコル
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
クエリ
クライアントからのコマンド振り分け
mysql-5.x.x/sql/sql_parse.cc
クエリ構文解析
mysql-5.x.x/sql/sql_yacc.yy
独自のクエリを組み込める
「予約語書き換えればSQLインジェクション対
策!」
MySQLを拡張する Powered by Rabbit 2.1.9
まとめ
MySQLを拡張する Powered by Rabbit 2.1.9
まとめ
プラグイン機構でコンパイルせずに結構拡張でき
る
ソースが見れるからプラグインも作りやすい
mysqld 自体を改造することもできる
無料もいいけど自由重要
フリーソフトウェア万歳!
MySQLを拡張する Powered by Rabbit 2.1.9
おまけ
MySQLを拡張する Powered by Rabbit 2.1.9
アドベントカレンダー
元はクリスマスまでの期間を数える
ために使われていたカレンダーのこ
とで
〜中略〜
近年、インターネット上において、こ
のカレンダーにならい、定められた
テーマに従い、参加者が持ち回りで
自身のブログやサイトに記事を投稿
する企画が多く実施されています。
http://blog.qiita.com/post/132928437279/adcal2015
MySQLを拡張する Powered by Rabbit 2.1.9
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
MySQLだけで4つもある!
MySQLを拡張する Powered by Rabbit 2.1.9
4つのうち3つが
「独りアドベントカレンダー」
MySQLを拡張する Powered by Rabbit 2.1.9
MySQLの人たちちょっとおかしい
MySQLを拡張する Powered by Rabbit 2.1.9
おわり

Mais conteúdo relacionado

Mais procurados

Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
土岐 孝平
 

Mais procurados (20)

イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情イマドキの現場で使えるJavaライブラリ事情
イマドキの現場で使えるJavaライブラリ事情
 
Add PLEASE clause to Oracle Database
Add PLEASE clause to Oracle DatabaseAdd PLEASE clause to Oracle Database
Add PLEASE clause to Oracle Database
 
わかった気になるMySQL
わかった気になるMySQLわかった気になるMySQL
わかった気になるMySQL
 
MySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したことMySQL ガチBeginnerがやってみたことと反省したこと
MySQL ガチBeginnerがやってみたことと反省したこと
 
Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~Scalaで行うマイグレーション ~Flyway~
Scalaで行うマイグレーション ~Flyway~
 
Ansible2.9 ネットワーク対応のアップデート #ansiblejp
Ansible2.9 ネットワーク対応のアップデート #ansiblejpAnsible2.9 ネットワーク対応のアップデート #ansiblejp
Ansible2.9 ネットワーク対応のアップデート #ansiblejp
 
わたしを支える技術
わたしを支える技術わたしを支える技術
わたしを支える技術
 
20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL20140518 JJUG MySQL Clsuter as NoSQL
20140518 JJUG MySQL Clsuter as NoSQL
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1Oracle Database Connect 2017 / JPOUG#1
Oracle Database Connect 2017 / JPOUG#1
 
MySQL Fabricでぼっこぼこにされたはなし
MySQL FabricでぼっこぼこにされたはなしMySQL Fabricでぼっこぼこにされたはなし
MySQL Fabricでぼっこぼこにされたはなし
 
DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!DBスキーマもバージョン管理したい!
DBスキーマもバージョン管理したい!
 
Babelfish Compatibility
Babelfish CompatibilityBabelfish Compatibility
Babelfish Compatibility
 
Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点) Java Batch 仕様 (Public Review時点)
Java Batch 仕様 (Public Review時点)
 
20160215 04 java ee7徹底入門 jbatch
20160215 04 java ee7徹底入門 jbatch20160215 04 java ee7徹底入門 jbatch
20160215 04 java ee7徹底入門 jbatch
 
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
 
Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理Spring3.1概要 データアクセスとトランザクション処理
Spring3.1概要 データアクセスとトランザクション処理
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-Javaライブラリ
 
MySQLおじさんの逆襲
MySQLおじさんの逆襲MySQLおじさんの逆襲
MySQLおじさんの逆襲
 
光のMySQL 5.7
光のMySQL 5.7光のMySQL 5.7
光のMySQL 5.7
 

Destaque (6)

Which is your favorite mysqld
Which is your favorite mysqldWhich is your favorite mysqld
Which is your favorite mysqld
 
Handlersocket 20140218
Handlersocket 20140218Handlersocket 20140218
Handlersocket 20140218
 
HandlerSocket plugin for MySQL
HandlerSocket plugin for MySQLHandlerSocket plugin for MySQL
HandlerSocket plugin for MySQL
 
Handlerさんコンニチワ
HandlerさんコンニチワHandlerさんコンニチワ
Handlerさんコンニチワ
 
MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形MySQL 5.7が魅せる新しい運用の形
MySQL 5.7が魅せる新しい運用の形
 
MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編MySQLやSSDとかの話 前編
MySQLやSSDとかの話 前編
 

Semelhante a MySQLを拡張する

Semelhante a MySQLを拡張する (20)

MySQL 開発最新動向
MySQL 開発最新動向MySQL 開発最新動向
MySQL 開発最新動向
 
MySQL最新情報  ※2016年12月
MySQL最新情報  ※2016年12月MySQL最新情報  ※2016年12月
MySQL最新情報  ※2016年12月
 
ML2/OVN アーキテクチャ概観
ML2/OVN アーキテクチャ概観ML2/OVN アーキテクチャ概観
ML2/OVN アーキテクチャ概観
 
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
[中国地方DB勉強会] 第22回 Webアプリ開発をデータベース側から変革していく - MySQL 8.0新機能
 
20170622_MySQL最新情報 ~MySQL 8.0 開発状況、MySQL InnoDB Cluster、などのご紹介~ by 日本オラクル株式会社...
20170622_MySQL最新情報 ~MySQL 8.0 開発状況、MySQL InnoDB Cluster、などのご紹介~ by 日本オラクル株式会社...20170622_MySQL最新情報 ~MySQL 8.0 開発状況、MySQL InnoDB Cluster、などのご紹介~ by 日本オラクル株式会社...
20170622_MySQL最新情報 ~MySQL 8.0 開発状況、MySQL InnoDB Cluster、などのご紹介~ by 日本オラクル株式会社...
 
Participation report of data stax accelerate 2019
Participation report of data stax accelerate 2019Participation report of data stax accelerate 2019
Participation report of data stax accelerate 2019
 
Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-Reco choku tech night #09 -reinvent2018報告会-
Reco choku tech night #09 -reinvent2018報告会-
 
ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)ネットワーク自動化ツール紹介(Ansible・NAPALM編)
ネットワーク自動化ツール紹介(Ansible・NAPALM編)
 
LINEのMySQL運用について
LINEのMySQL運用についてLINEのMySQL運用について
LINEのMySQL運用について
 
MySQLの文字コード事情
MySQLの文字コード事情MySQLの文字コード事情
MySQLの文字コード事情
 
Index shotgun on mysql5.6
Index shotgun on mysql5.6Index shotgun on mysql5.6
Index shotgun on mysql5.6
 
20160929 inno db_fts_jp
20160929 inno db_fts_jp20160929 inno db_fts_jp
20160929 inno db_fts_jp
 
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
日本発オープンソース!! スケールアウト型データベース GridDB入門 ~ GitHubからダウンロードして使ってみましょう ~
 
Ansible ネットワーク自動化チュートリアル (JANOG42)
Ansible ネットワーク自動化チュートリアル (JANOG42)Ansible ネットワーク自動化チュートリアル (JANOG42)
Ansible ネットワーク自動化チュートリアル (JANOG42)
 
Node-REDのノード開発容易化ツール Node generator
Node-REDのノード開発容易化ツールNode generatorNode-REDのノード開発容易化ツールNode generator
Node-REDのノード開発容易化ツール Node generator
 
New relic
New relicNew relic
New relic
 
States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -States of Dolphin - MySQL最新技術情報2013秋 -
States of Dolphin - MySQL最新技術情報2013秋 -
 
Building Silverlight Large Scale Application Using MVVM
Building Silverlight Large Scale Application Using MVVMBuilding Silverlight Large Scale Application Using MVVM
Building Silverlight Large Scale Application Using MVVM
 
Qlik TECH TALK 20210706 SAPデータ分析を加速するQlikのアクセレレーターパッケージご紹介
Qlik TECH TALK 20210706 SAPデータ分析を加速するQlikのアクセレレーターパッケージご紹介Qlik TECH TALK 20210706 SAPデータ分析を加速するQlikのアクセレレーターパッケージご紹介
Qlik TECH TALK 20210706 SAPデータ分析を加速するQlikのアクセレレーターパッケージご紹介
 
SAP Extractorのソースエンドポイントとしての利用
SAP Extractorのソースエンドポイントとしての利用SAP Extractorのソースエンドポイントとしての利用
SAP Extractorのソースエンドポイントとしての利用
 

Mais de Masahiro Tomita

「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
Masahiro Tomita
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
Masahiro Tomita
 

Mais de Masahiro Tomita (20)

お前の罪を数えろ
お前の罪を数えろお前の罪を数えろ
お前の罪を数えろ
 
Ruby 2.5
Ruby 2.5Ruby 2.5
Ruby 2.5
 
本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル本当はこわいMySQLプロトコル
本当はこわいMySQLプロトコル
 
ネットワークこわい
ネットワークこわいネットワークこわい
ネットワークこわい
 
CSV
CSVCSV
CSV
 
MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版MySQLの文字コード事情 2017春版
MySQLの文字コード事情 2017春版
 
MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版MySQLの文字コード事情 2017版
MySQLの文字コード事情 2017版
 
Ruby24
Ruby24Ruby24
Ruby24
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル「理論から学ぶデータベース実践入門」読書会スペシャル
「理論から学ぶデータベース実践入門」読書会スペシャル
 
MyNAができるまで
MyNAができるまでMyNAができるまで
MyNAができるまで
 
文字化け
文字化け文字化け
文字化け
 
Crystal
CrystalCrystal
Crystal
 
メールの暗号化
メールの暗号化メールの暗号化
メールの暗号化
 
文字化け
文字化け文字化け
文字化け
 
進捗と品質
進捗と品質進捗と品質
進捗と品質
 
アジャイルジャパン長野サテライト
アジャイルジャパン長野サテライトアジャイルジャパン長野サテライト
アジャイルジャパン長野サテライト
 
🍣=🍺
🍣=🍺🍣=🍺
🍣=🍺
 
本当はこわいエンコーディングの話
本当はこわいエンコーディングの話本当はこわいエンコーディングの話
本当はこわいエンコーディングの話
 
Sequelのすすめ
SequelのすすめSequelのすすめ
Sequelのすすめ
 

Último

Último (10)

新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

MySQLを拡張する

  • 1. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLを拡張する MySQL User Conference 2015 とみたまさひろ 2015-12-15
  • 2. MySQLを拡張する Powered by Rabbit 2.1.9 自己紹介 とみた まさひろ http://tmtms.hatenablog.com http://twitter.com/tmtms https://github.com/tmtm 長野県北部在住プログラマー( Ruby & C ) 長野ソフトウェア技術者グループ(NSEG)
  • 3. MySQLを拡張する Powered by Rabbit 2.1.9 自己紹介 日本MySQLユーザ会代表 MySQL 3.21 の日本語対応 (1998) MySQLのRubyバインディング作成 (1998) OSS貢献者賞 2013
  • 4. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLは「世界でもっとも普及している オープンソースデータベース」 https://www-jp.mysql.com/
  • 5. MySQLを拡張する Powered by Rabbit 2.1.9 「伽藍とバザール」の「伽藍」
  • 6. MySQLを拡張する Powered by Rabbit 2.1.9 フリーソフトウェア(GPL2)
  • 7. MySQLを拡張する Powered by Rabbit 2.1.9 フリーソフトウェアでうれしいこと
  • 8. MySQLを拡張する Powered by Rabbit 2.1.9 無料(フリー)
  • 9. MySQLを拡張する Powered by Rabbit 2.1.9 無料でうれしい 個人ごとの開発環境 テスト環境 スケールアウトで台数増
  • 10. MySQLを拡張する Powered by Rabbit 2.1.9 自由(フリー)
  • 11. MySQLを拡張する Powered by Rabbit 2.1.9 自由でうれしい ソースが公開されている 自分で調べられる 改変して再配布
  • 12. MySQLを拡張する Powered by Rabbit 2.1.9 改変 MariaDB AWS RDS 「多様性は善」
  • 13. MySQLを拡張する Powered by Rabbit 2.1.9 仮に本家の開発が中断したとしても 第三者が継続できる
  • 14. MySQLを拡張する Powered by Rabbit 2.1.9 拡張
  • 15. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLに機能を追加する
  • 16. MySQLを拡張する Powered by Rabbit 2.1.9 UDF - ユーザー定義関数 一番簡単な拡張 独自の関数を MySQL に組み込む 通常の関数 / 集約関数 MySQLのソースを見なくてもマニュアルだけで作 成可能 http://dev.mysql.com/doc/refman/5.6/ja/adding-udf.html
  • 17. MySQLを拡張する Powered by Rabbit 2.1.9 UDF hoge_init() クエリ実行前に呼び出される(引数チェックとか) hoge() 関数本体 hoge_deinit() クエリ実行後に呼び出される(メモリ解放とか)
  • 18. MySQLを拡張する Powered by Rabbit 2.1.9 例: mysql-mruby https://github.com/mattn/mysql-mruby mysql> SELECT mrb_eval('ARGV.map(&:upcase).join(",")', -> 'hoge', 'fuga') as a; +-----------+ | a | +-----------+ | HOGE,FUGA | +-----------+
  • 19. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン
  • 20. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン(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 |
  • 21. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン(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 | +----------------------------+----------+--------------------+---------+---------+
  • 22. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン ストレージエンジンプラグイン InnoDB, MyISAM, CSV, Blackhole, … 全文パーサープラグイン 全文検索用トークナイザ: ngram デーモンプラグイン mysqld プロセス空間内で動作
  • 23. MySQLを拡張する Powered by Rabbit 2.1.9 プラグイン INFORMATION_SCHEMA プラグイン 準同期レプリケーションプラグイン 監査プラグイン 認証プラグイン パスワード検証プラグイン
  • 24. MySQLを拡張する Powered by Rabbit 2.1.9 プラグインの作り方 リファレンスマニュアル 24.2.4 プラグインの作成 http://dev.mysql.com/doc/refman/5.6/ja/writing-plugins.html
  • 25. MySQLを拡張する Powered by Rabbit 2.1.9 ストレージエンジンプラグイン
  • 26. MySQLを拡張する Powered by Rabbit 2.1.9 ストレージエンジンプラグイン InnoDB, MyISAM, Archive, Blackhole, … 標準のストレージエンジンは全部プラグイン
  • 27. MySQLを拡張する Powered by Rabbit 2.1.9 巷のストレージエンジンプラグイン mroonga http://mroonga.org/ja/ 日本語全文検索エンジン Groonga を MySQL から 使う
  • 28. MySQLを拡張する Powered by Rabbit 2.1.9 ストレージエンジンの作り方 ドキュメントあり MySQL Internals Manual Chapter 22 Writing a Custom Storage Engine http://dev.mysql.com/doc/internals/en/custom-engine.html でもソースみないと厳しいかも フリーソフトウェアだから見放題!
  • 29. MySQLを拡張する Powered by Rabbit 2.1.9 デーモンプラグイン
  • 30. MySQLを拡張する Powered by Rabbit 2.1.9 デーモンプラグイン mysqld プロセス空間内で何かを動かす 通常とは異なる TCP/IP の口を開けて何かすると か 起動直後から定期的に何かするとか
  • 31. MySQLを拡張する Powered by Rabbit 2.1.9 巷のデーモンプラグイン HandlerSocket https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL Transactd http://www.bizstation.jp/ja/transactd/
  • 32. MySQLを拡張する Powered by Rabbit 2.1.9 デーモンプラグインの作り方 リファレンスマニュアル 24.2.4.5 デーモンプラグイ ンの作成 http://dev.mysql.com/doc/refman/5.6/ja/writing-daemon-plugins.html init() と deinit() 関数だけ 結構簡単
  • 33. MySQLを拡張する Powered by Rabbit 2.1.9 以上綺麗な拡張 (mysqldのコンパイル不要)
  • 34. MySQLを拡張する Powered by Rabbit 2.1.9 綺麗じゃない拡張 (mysqldのコンパイル必要)
  • 35. MySQLを拡張する Powered by Rabbit 2.1.9 改造
  • 36. MySQLを拡張する Powered by Rabbit 2.1.9 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 どうしても ハハ=パパ=ババ と 🍣=🍺 問題を解決 したい人は改造してみるのもいいかも
  • 37. MySQLを拡張する Powered by Rabbit 2.1.9 ネットワークプロトコル 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
  • 38. MySQLを拡張する Powered by Rabbit 2.1.9 クエリ クライアントからのコマンド振り分け mysql-5.x.x/sql/sql_parse.cc クエリ構文解析 mysql-5.x.x/sql/sql_yacc.yy 独自のクエリを組み込める 「予約語書き換えればSQLインジェクション対 策!」
  • 39. MySQLを拡張する Powered by Rabbit 2.1.9 まとめ
  • 40. MySQLを拡張する Powered by Rabbit 2.1.9 まとめ プラグイン機構でコンパイルせずに結構拡張でき る ソースが見れるからプラグインも作りやすい mysqld 自体を改造することもできる 無料もいいけど自由重要 フリーソフトウェア万歳!
  • 41. MySQLを拡張する Powered by Rabbit 2.1.9 おまけ
  • 42. MySQLを拡張する Powered by Rabbit 2.1.9 アドベントカレンダー 元はクリスマスまでの期間を数える ために使われていたカレンダーのこ とで 〜中略〜 近年、インターネット上において、こ のカレンダーにならい、定められた テーマに従い、参加者が持ち回りで 自身のブログやサイトに記事を投稿 する企画が多く実施されています。 http://blog.qiita.com/post/132928437279/adcal2015
  • 43. MySQLを拡張する Powered by Rabbit 2.1.9 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
  • 44. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLだけで4つもある!
  • 45. MySQLを拡張する Powered by Rabbit 2.1.9 4つのうち3つが 「独りアドベントカレンダー」
  • 46. MySQLを拡張する Powered by Rabbit 2.1.9 MySQLの人たちちょっとおかしい
  • 47. MySQLを拡張する Powered by Rabbit 2.1.9 おわり