tombo2-progress’s diary

できるだけ毎日1時間を切り取ってここに晒す。誤字脱字気にしない。日本語が崩壊するのも気にしない。最終的にまとめて本ブログに書く

2018-01-01から1年間の記事一覧

character set実装

一日の時間のうちお仕事に結構時間使っていて、調査と実装が厳しい。 ようやくcharacter-setのwireshark実装からわかる値で実装をした。

golang のMySQL driverも読んで見る

読めん。。。golang雰囲気で読んでる、、、 go/ctxutil.go at 50bd1c4d4eb4fac8ddeb5f063c099daccfb71b26 · golang/go · GitHub

character setについて

ドキュメントにある説明は↓だけだとおもう。 https://dev.mysql.com/doc/internals/en/character-set.html wiresharkのmysqlモジュールのコードから主要な部分は判定できそうなので、これで良いかも。 https://github.com/wireshark/wireshark/blob/3a514caa…

サンプル作成

sakila database突っ込んだMySQLで各コマンドを打ったサンプルを作成する show databases; use sakila show tables; select * from city order by city_id desc limit 3; insert into city (city, country_id) values ('Tokyo', 50); select * from city whe…

どこまで対応するか

対応予定 statusFlag未実装部分 SSL移行後の解決(別リポジトリでやるかも?) character_set部分的にでも(utf8とか有名どころだけでも) パケット内の複数パケットのパース X protocol (一般的なprotocol bufferのパース) 対応しない protocolバージョン320のも…

character setの一覧はないわけ?

character setのフラグなり値の一覧がないとcharacter setのフィールド埋められないんだが。 一旦structをmarshalしてjson出力したらそれなりにwiresharkなりと比較しやすい形になったので、いくつかサンプル作ったりして構造がただし以下確認していく。 そ…

全てstringが入ってくるパケットをどうするか

responseパケットでアプリケーションレイヤが全てstringで埋め尽くされたものをどうするか問題。 ステートレスにかつ途中からのMySQLパケットを解析しようとして無理してるんだけど、それ諦めれば良いじゃんって気持ちになっている 方法としては3つ? initia…

65565byteを越えたサイズのパケットなのか、MySQLレイヤのヘッダ(packet length(3), seaquence id(1))すらなくstringをぶち込んでくるパケットがある command_typeが0x02, 0x04あたりでpacket lengthが1で2つめ以降のMySQL packetでレスポンスデータを突っ込…

if more data ってなに?

Protocol::HandshakeV10の if more dataってなに? ココらへんはMySQL本体がどうやってパースしているか確認しないと行けない 0xfeのときのOK_PacketとAUTH_SWITCH_REQUESTの判別が難しくて、これは1こずつパースしてどっちかとしてうまくパースできないかど…

とにかくflagが厄介

Connection phaseで5byte目で判断できない厄介なケースのまとめ Protocol::HandshakeResponse41 4 capability flags, CLIENT_PROTOCOL_41 always set 4 max-packet size 1 character set string[23] reserved (all [0]) 頭の部分がこれで来る。 string[23]で…

Command Phase Packetようやく実装

体調崩しててどうもだめだった。 ようやく回復してきたので、実装の続きを進めた。 Command Phaseのパケットのデシリアライズがひとまず終わった。 COM_CHANGE_USERとCOM_STMT_EXECUTEはinitial handshake時のオプションを見ていないとパースが難しいので、…

どうもパースがうまく行かない原因がわかった

これまでのルールでほとんど全てのパケットをパースできると思っていたが、どうもうまく行かない。 Network上の1packetごとにMySQLプロトコルのパケットが複数含まれるので、そのMySQLパケットの中身がうまくパースできないことはわかっていた。 よく見るとC…

Hexで覚え始めた文字列たち

MySQLパケットを追っているときにhexのまま追えると便利というか、いちいちstringに直されたの見るの面倒なので、hex見てたら覚えた文字列たち。 よくある文字列 MySQL: 4d 79 53 51 4c select: 73 65 6c 65 63 74 SELECT: 53 45 4c 45 43 54 update: 75 70 …

MySQL packet分類

Connection Phase, Command Phase, General Responseのパケットの分類方法を確認した。 5byte目とpacket全体の長さで大体判断できる。 [fe]のものはhandshakeだとstring, stringがきてOK responseの[fe] int, intがくるので治安が悪い。 これはマッチングし…

MySQL Packet読んでる

MySQLのパケットはStateを保持して読んでいくのが基本なので、State/Modeがコネクションごとに存在する。 それがよくわかるのが↓で、 MySQL: Connection Lifecycle ここの図がわかりやすい。 更に、Handshakeあたりは こんな感じ。 Authentication exchange …

MySQLパケット続き

wiresharkでパケットを見てみたらhandshake時のcapacity flag部分が結構ドキュメントと違うことがわかった。 2バイトで分割されて、その2バイトそれぞれの中でリトルエンディアンになっている。 devドキュメントではなくて、source code documentみてもここ…

x protocolはどんな感じか

MySQL 4.1くらいの時からMySQLの通信プロトコルにはObsoletedなフィールドが多かったのでX protocolではどうなのか探してみた https://dev.mysql.com/doc/internals/en/x-protocol-messages-messages.html#x-protocol-messages-message-structure protocol b…

MySQLパケット続き

結局パケットはMySQL_Packet_interfaceみたいなインターフェースの構造体にデシリアライズして、typeフィールドみたいなもので、どのcommand_typeか判断してフィールドを判断してもらうようにする。 handshake時の情報とか、ステートマシンがpacketを解釈す…

続き

進捗だめでsう package main import ( "fmt" "github.com/google/gopacket" "github.com/google/gopacket/pcap" "log" // "strings" "time" ) var ( device string = "lo" snapshot_len int32 = 1024 promiscuous bool = false err error // timeout time.Du…

MySQLのpacket見ていく

gopacket使って適当にアプリケーション部分のパケット見てみた。 良い感じに見れたので、5byte目を見て単純な分類をしてみよう package main import ( "fmt" "github.com/google/gopacket" "github.com/google/gopacket/pcap" "log" "strings" "time" ) var …

MySQLのパケットみとる

command_typeは結構使われていないものが多いんじゃないかと思っていて、殆どは connection phase, general response packetのもの command phaseの一部 prepared statementでCOM_STMT_*** COM_QUERY だけな気がする。 replicationみたらもう少し出てくるの…

MySQLのpacketつづき

general response packet https://dev.mysql.com/doc/internals/en/generic-response-packets.html OK, [00] or [fe] ERR, [ff] EOF, [fe] OKとEOFかぶってるの厄介。 これOKは[00]使われてたりしないのか? [00]はCOM_SLEEPともかぶってる、、、、 Command …

引き続きpacketについて

昨日見つけたmysql-snifferかProxySQLあたりでパケットをどう解析しているか見れば良さそう。 golangでも実装している人がいる。 https://github.com/zorkian/mysql-sniffer ココらへん見るとcom-queryとしてクエリが取れてて、connection phaseとcommand ph…

引き続きpacketについて

int payload_length int sequence_id string payload [len=payload_length] packetの説明にある型にかんしてはここ https://dev.mysql.com/doc/internals/en/describing-packets.html sequence_idについてはhttps://dev.mysql.com/doc/internals/en/sequence…

MySQLのpacket その1

環境構築 centos環境にMySQL8.0.12用意した。 ソースからビルドしようとして結果失敗した。 途中で/var/lib/mariadb~~.logに書き込めないとか言われて、完全にクリーンなcentosにsource展開してたから、は??ってなったんだけど、そのとき眠すぎて詳細忘れ…

dd簡易測定

HDD整理。 windows機を作ったりcentos入れたSSD用意したりしていた。 windows機でmemory 8GB4だとどうもOSが落ちてしまったのだけど、8GB2にしたら全く問題なくなった。 何だったんだろう? centos機でMySQLのパフォーマンス測定をそろそろしたい。 SSDとNVM…

p109まで。第3正規形でも更新時異常起こるんだった。

続き

P98まで。 関数従属性は多値従属性の一種というのが本日のハイライト、各種証明は追うのが難しい割にここまで必用になることはなさそうという辛さ、、、

CLionでMySQLいれられないか

CLionでMySQLの実行コードリーディングしたいので、入れてみる。 githubからコードをimportしてプロジェクトを作成する。 CMake optionsに, -DDOWNLOAD_BOOST=1 -DWITH_BOOST=cmake を指定してビルド。 ビルドは通るけど、パスが通っていない関数、定数がち…

リレーショナル・データベース入門 続き

ここまでの復習をしつつP82まで読んだ。 情報無損失分解、分解したリレーションを自然結合しても元に戻るというのはわかるけど、前提なしに数式だけでかかれたら多分わからないので、困る。 ブログに書いた内容インフラ勉強会あたりで発表しておくと改めて整…