2018-01-01から1年間の記事一覧
一日の時間のうちお仕事に結構時間使っていて、調査と実装が厳しい。 ようやくcharacter-setのwireshark実装からわかる値で実装をした。
読めん。。。golang雰囲気で読んでる、、、 go/ctxutil.go at 50bd1c4d4eb4fac8ddeb5f063c099daccfb71b26 · golang/go · GitHub
ドキュメントにある説明は↓だけだとおもう。 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のフィールド埋められないんだが。 一旦structをmarshalしてjson出力したらそれなりにwiresharkなりと比較しやすい形になったので、いくつかサンプル作ったりして構造がただし以下確認していく。 そ…
responseパケットでアプリケーションレイヤが全てstringで埋め尽くされたものをどうするか問題。 ステートレスにかつ途中からのMySQLパケットを解析しようとして無理してるんだけど、それ諦めれば良いじゃんって気持ちになっている 方法としては3つ? initia…
65565byteを越えたサイズのパケットなのか、MySQLレイヤのヘッダ(packet length(3), seaquence id(1))すらなくstringをぶち込んでくるパケットがある command_typeが0x02, 0x04あたりでpacket lengthが1で2つめ以降のMySQL packetでレスポンスデータを突っ込…
Protocol::HandshakeV10の if more dataってなに? ココらへんはMySQL本体がどうやってパースしているか確認しないと行けない 0xfeのときのOK_PacketとAUTH_SWITCH_REQUESTの判別が難しくて、これは1こずつパースしてどっちかとしてうまくパースできないかど…
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のパケットのデシリアライズがひとまず終わった。 COM_CHANGE_USERとCOM_STMT_EXECUTEはinitial handshake時のオプションを見ていないとパースが難しいので、…
これまでのルールでほとんど全てのパケットをパースできると思っていたが、どうもうまく行かない。 Network上の1packetごとにMySQLプロトコルのパケットが複数含まれるので、そのMySQLパケットの中身がうまくパースできないことはわかっていた。 よく見るとC…
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 …
Connection Phase, Command Phase, General Responseのパケットの分類方法を確認した。 5byte目とpacket全体の長さで大体判断できる。 [fe]のものはhandshakeだとstring, stringがきてOK responseの[fe] int, intがくるので治安が悪い。 これはマッチングし…
MySQLのパケットはStateを保持して読んでいくのが基本なので、State/Modeがコネクションごとに存在する。 それがよくわかるのが↓で、 MySQL: Connection Lifecycle ここの図がわかりやすい。 更に、Handshakeあたりは こんな感じ。 Authentication exchange …
wiresharkでパケットを見てみたらhandshake時のcapacity flag部分が結構ドキュメントと違うことがわかった。 2バイトで分割されて、その2バイトそれぞれの中でリトルエンディアンになっている。 devドキュメントではなくて、source code documentみてもここ…
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_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…
gopacket使って適当にアプリケーション部分のパケット見てみた。 良い感じに見れたので、5byte目を見て単純な分類をしてみよう package main import ( "fmt" "github.com/google/gopacket" "github.com/google/gopacket/pcap" "log" "strings" "time" ) var …
command_typeは結構使われていないものが多いんじゃないかと思っていて、殆どは connection phase, general response packetのもの command phaseの一部 prepared statementでCOM_STMT_*** COM_QUERY だけな気がする。 replicationみたらもう少し出てくるの…
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 …
昨日見つけたmysql-snifferかProxySQLあたりでパケットをどう解析しているか見れば良さそう。 golangでも実装している人がいる。 https://github.com/zorkian/mysql-sniffer ココらへん見るとcom-queryとしてクエリが取れてて、connection phaseとcommand ph…
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…
環境構築 centos環境にMySQL8.0.12用意した。 ソースからビルドしようとして結果失敗した。 途中で/var/lib/mariadb~~.logに書き込めないとか言われて、完全にクリーンなcentosにsource展開してたから、は??ってなったんだけど、そのとき眠すぎて詳細忘れ…
HDD整理。 windows機を作ったりcentos入れたSSD用意したりしていた。 windows機でmemory 8GB4だとどうもOSが落ちてしまったのだけど、8GB2にしたら全く問題なくなった。 何だったんだろう? centos機でMySQLのパフォーマンス測定をそろそろしたい。 SSDとNVM…
p109まで。第3正規形でも更新時異常起こるんだった。
P98まで。 関数従属性は多値従属性の一種というのが本日のハイライト、各種証明は追うのが難しい割にここまで必用になることはなさそうという辛さ、、、
CLionでMySQLの実行コードリーディングしたいので、入れてみる。 githubからコードをimportしてプロジェクトを作成する。 CMake optionsに, -DDOWNLOAD_BOOST=1 -DWITH_BOOST=cmake を指定してビルド。 ビルドは通るけど、パスが通っていない関数、定数がち…
ここまでの復習をしつつP82まで読んだ。 情報無損失分解、分解したリレーションを自然結合しても元に戻るというのはわかるけど、前提なしに数式だけでかかれたら多分わからないので、困る。 ブログに書いた内容インフラ勉強会あたりで発表しておくと改めて整…