Slide 1

Slide 1 text

MySQL の実装を気合いで 理解したい時の色々 OSC Online/Hokkaido 2023 日本 MySQL ユーザ会 - 竹内 健人 入門編

Slide 2

Slide 2 text

自己紹介 - けんつ (@lrf141) - 本職: しがないバックエンドエンジニア - 好きなこと - MySQL をいじめる、DBMS 的な話題 - ストレージエンジン、オプティマイザ - 好きな MySQL のバージョン - 8.0.16 - 苦戦した MySQL のバージョン - 8.0.18, 8.0.28

Slide 3

Slide 3 text

今まで踏んだ問題 - 特定条件下で temporary table のサイズ計算をミスって死ぬ - サイズ計算で何故か結果 Null になる場合があったっぽい? - date > “2023-01” みたいな比較ができなくなった - 日付を雑に文字列で扱うと DATE, DATETIME にキャストできなくなった - 一度に大量に insert すると commit で固まる - 全く原因がわからないが replica thread を 1 にしたらなんか動いた - CPU リソースを使い切っている状態で接続しまくると MySQL が死ぬ - 新しいスレッドを作れなくて例外で落ちる

Slide 4

Slide 4 text

今まで踏んだ問題 - 特定条件下で temporary table のサイズ計算をミスって死ぬ - サイズ計算で何故か結果 Null になる場合があったっぽい? - date > “2023-01” みたいな比較ができなくなった - 日付を雑に文字列で扱うと DATE, DATETIME にキャストできなくなった - 一度に大量に insert すると commit で固まる - 全く原因がわからないが replica thread を 1 にしたらなんか動いた - CPU リソースを使い切っている状態で接続しまくると MySQL が死ぬ - 新しいスレッドを作れなくて例外で落ちる

Slide 5

Slide 5 text

MySQL の実装を読まないとどうにもならん。 そういう時は確かにある。

Slide 6

Slide 6 text

では、どうやって MySQL の実装を読むか

Slide 7

Slide 7 text

やはり、デバッグである。

Slide 8

Slide 8 text

DBMS の実装を読むのが楽しそう。

Slide 9

Slide 9 text

やはり、デバッグである。

Slide 10

Slide 10 text

今日の目的 - MySQL のビルド・デバッグ出来る - 興味のある機能の実装に到達できる - バグっぽい動きを見つけてどう調べたら良いか分かる - ついでにテストベースで楽にデバッグ出来る - 巨大なソースコードの歩き方が少し分かった - MySQL の実装を読んで盛り上がれる人を増やしたい - 純粋培養の邪念です。

Slide 11

Slide 11 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 12

Slide 12 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 13

Slide 13 text

普段使っている環境 - Pop!_OS 22.04 - Linux がやはり快適。macOS は clang が厳しい。 - Core i7-11800H - 16 スレッドもあればビルドは速い。 - 64 GB RAM - 半分も使ったことがない。快適に IDE を使うため。 - SSD 1TB - 大量のオブジェクトファイルが生成されるので書き込み速度が物を言う。 - Jetbrains CLion - これが最強だと思っている。但しメモリを食う。 - VS Code も良い。Remote development は魔法だと思っている。

Slide 14

Slide 14 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 15

Slide 15 text

MySQL のビルドと調査前準備 ~気合でバイナリを作り出す~

Slide 16

Slide 16 text

MySQL のビルドと調査前準備 1. MySQL のソースコードを手元に落とす 公式から配布されているものなら以下を wget などで取ってくる。 boost 同梱版とそうでないものがある。 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-boost-8.0.XX.tar.gz github で管理されているものなら https://github.com/mysql/mysql-server

Slide 17

Slide 17 text

MySQL のビルドと調査前準備 2. ビルドに必要なパッケージ群を導入する  以下のドキュメントを参照しつつ必要に応じてインストールしていく  https://dev.mysql.com/doc/refman/8.0/en/source-installation-prerequisites.html  基本的に cmake, gcc, openssl, ncurses, bison などなどが必要になる。  仮に入っていない場合は cmake で怒られるのでその際に入れるでも OK。

Slide 18

Slide 18 text

MySQL のビルドと調査前準備 3. ビルドする まずはこれで make できるようにする。 依存関係などが足りない場合はここでエラーとなる。 mysql-server$ mkdir build && cd $_ mysql-server/build$ cmake ../ -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=./boost -DDOWNLOAD_BOOST=1

Slide 19

Slide 19 text

MySQL のビルドと調査前準備 3. ビルドする ちょっとした解説。 - -DCMAKE_BUILD_TYPE=Debug - この指定によって debug build となる。 - debug trace などを出力できるようにする - -DWITH_BOOST=./boost - boost が存在すると仮定されるディレクトリ。 - build ディレクトリの下に作ってやればビルドし直す時も楽。 - -DDOWNLOAD_BOOST=1 - WITH_BOOST オプションによって与えられたディレクトリに boost を展開する

Slide 20

Slide 20 text

MySQL のビルドと調査前準備 3. ビルドする  ここまで完了したらバイナリを生成する。  cmake か直接 make を叩いても良い。  そこそこ時間がかかるので並列度はマシンスペックに合わせてある程度上げて おくと 良い。 mysql-server/build$ cmake --build . --config debug -j15 or mysql-server/build$ make -j15

Slide 21

Slide 21 text

MySQL のビルドと調査前準備 3. ビルドする: トラブルシュート - Makefile の生成でコケた場合 - 必要な依存関係がない場合がほとんど - 直前にあるログから各種ライブラリのバージョンが正しく取得できているか - make でコケた場合 - VERBOSE=1 make でどこでコケたのかを調べる - cmake/ 以下か、実装がある各ディレクトリ下の CMakeLists.txt から原因を探る - 必要に応じて抑制するか、気合でどうにか対処するかの二択

Slide 22

Slide 22 text

MySQL のビルドと調査前準備 余談: 自分が踏んだビルド時のトラブル - MySQL 8.0.28 以下では OpenSSL v3 を使ってビルドできない - OpenSSL のヘッダーファイルからバージョン情報を取り出している - そのフォーマットが変更されたため、インストールしていても無い判定になる - OpenSSL v3 未満を指定することで解決できる。 - MySQL 8.0.31 ~ 8.0.33 でロケール依存のビルドがある - build-id の検証でコケる - readelf コマンドの出力が en 以外だとその後の grep で Build Id を取得できない - export LANG=C or -DWITH_BUILD_ID=0 で解決できる

Slide 23

Slide 23 text

MySQL のビルドと調査前準備 4. mysqld の初期設定を行う  そのままでは起動しないので諸々の初期設定を行う。 mysql-server/build$ ./bin/mysqld --initialize ... 2023-06-14T11:37:42.100824Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started. 2023-06-14T11:37:42.491830Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended. 2023-06-14T11:37:46.307536Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: bo:?9u=1:RiL

Slide 24

Slide 24 text

MySQL のビルドと調査前準備 4. mysqld の初期設定を行う 出力されたパスワードで root ユーザーとして操作できるので ログインできたら適当なパスワードに変更しておく。 mysql-server/build$ ./bin/mysql -uroot -p"bo:?9u=1:RiL" --protocol=TCP mysql> alter user 'root'@'localhost' identified by 'root'; Query OK, 0 rows affected (0.01 sec) mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)

Slide 25

Slide 25 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 26

Slide 26 text

ディレクトリの構成 ~わかっているとやはり楽~

Slide 27

Slide 27 text

ディレクトリの構成 1. data ディレクトリの構成  data ディレクトリの下には mysqld が利用する様々なファイルがある  例)   binlog.0000X: バイナリログが格納   undo_00X: undo ログが格納   mysql, sys, etc: 各データベースの実データが格納

Slide 28

Slide 28 text

ディレクトリの構成 1. data ディレクトリの構成 mysql-server/build$ tree -L 1 data data |-- #ib_16384_0.dblwr |-- #ib_16384_1.dblwr |-- binlog.000001 |-- ib_buffer_pool |-- ibdata1 |-- mysql |-- mysql.ibd |-- performance_schema |-- sample <- これが DB の dir |-- sys |-- undo_001 mysql-server/build$ tree -L 1 data/sample data/sample `-- t1.ibd <- テーブルの実データ

Slide 29

Slide 29 text

ディレクトリの構成 2. MySQL のソースコードレイアウト - sql/ - mysql-server に関わる諸々の実装 (多分) - replication, query parser, optimizer, etc… - storage/ - storage engine の実装 - innobase/ 以下に InnoDB の実装がある - mysql-test/ - mysql-server の E2E テスト - cmake/ - 各種ライブラリの依存などを解決する cmake ファイル - boost.cmake もここにある mysql-server$ tree -L 1 . |-- CMakeLists.txt … |-- build |-- client |-- cmake |-- mysql-test |-- mysys |-- sql |-- sql-common `-- storage

Slide 30

Slide 30 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 31

Slide 31 text

mysql-test-run ~めっちゃ便利~

Slide 32

Slide 32 text

mysql-test-run 1. mysql-test-run とは何か  mysql-server の E2E テストを実行するコマンド。  テストケース、期待結果を共に SQL ライクな構文で記述されている。  様々なデバッガと共に実行することも可能。  手動で SQL を流すのは面倒なのでテストケースに全て任せたい。

Slide 33

Slide 33 text

mysql-test-run 2. mysql-test-run のディレクトリ構成  mysql-test/ 以下に t/, r/ というディレクトリがある。  これがそれぞれテストケースと期待結果を保持している。  InnoDB 等のテストは mysql-test/suite 下に同じ形式で置かれている。

Slide 34

Slide 34 text

mysql-test-run 2. mysql-test-run のディレクトリ構成 mysql-test$ tree -L 1 . |-- CMakeLists.txt |-- extra |-- include |-- lib … |-- suite <- 機能別テストスイート |-- mysql-stress-test.pl |-- mysql-test-run.pl |-- r <- 期待結果 |-- t <- テストケース `-- valgrind.supp mysql-test/suite/innodb$ ls ./t/ | head -n 2 add_foreign_key.test alter_crash.test … mysql-test/suite/innodb$ ls ./r/ | head -n 2 add_foreign_key.result alter_crash.result …

Slide 35

Slide 35 text

mysql-test-run 3. テストを実行する  build/mysql-test/ の下に mtr という実行可能ファイルが存在する。  これを実行することで E2E テストを実行できる。 mysql-server/build/mysql-test$ ./mtr Logging: /home/lrf141/mysqlProject/mysql-server/mysql-test/mysql-test-run.pl MySQL Version 8.0.33 Checking supported features - Binaries are debug compiled Using suite(s): auth_sec,binlog ... ============================================================================== TEST NAME RESULT TIME (ms) COMMENT ------------------------------------------------------------------------------ [ 0%] clone.ddl_compress [ skipped ] Test needs 'big-test' or 'only-big-test' option. [ 0%] clone.ddl_compress_encrypt [ skipped ] Test needs 'big-test' or 'only-big-test' option. [ 0%] clone.ddl_encrypt [ skipped ] Test needs 'big-test' or 'only-big-test' option. ...

Slide 36

Slide 36 text

mysql-test-run 4. 特定のテストだけ実行する  例えば、InnoDB のテストのみ実行したい場合。  InnoDB の特定のテストのみ実行したい場合。 mysql-server/build/mysql-test$ ./mtr --suite innodb mysql-server/build/mysql-test$ ./mtr innodb.add_foreign_key

Slide 37

Slide 37 text

mysql-test-run 5. デバッグしながらテストを実行する  例えば gdb でデバッグしながら実行したい場合。  --manual-gdb オプションをつけて実行する。 build/mysql-test$ ./mtr innodb.add_foreign_key --manual-gdb … To start gdb for mysqld.1, type in another window: gdb -cd /home/lrf141/mysqlProject/mysql-server/mysql-test -x /home/lrf141/mysqlProject/mysql-server/build/mysql-test/var/tmp/gdbinit.mysqld.1 /home/lrf141/mysqlProject/mysql-server/build/runtime_output_directory/mysqld

Slide 38

Slide 38 text

mysql-test-run 5. デバッグしながらテストを実行する  main 関数に breakpoint が置かれ停止する。 $ gdb -cd /home/lrf141/mysqlProject/mysql-server/mysql-test \ -x /home/lrf141/mysqlProject/mysql-server/build/mysql-test/var/tmp/gdbinit.mysqld.1 \ /home/lrf141/mysqlProject/mysql-server/build/runtime_output_directory/mysqld … Breakpoint 1, main (argc=8, argv=0x7fffffffddf8) at /home/lrf141/mysqlProject/mysql-server/sql/main.cc:25 25 int main(int argc, char **argv) { return mysqld_main(argc, argv); } (gdb)

Slide 39

Slide 39 text

mysql-test-run 6. テストケースを書く  mysql-test/suite/innodb 以下に書くことを想定 --echo # Sample Test Case CREATE TABLE t1(id int not null primary key) Engine=InnoDB; INSERT INTO t1(id) VALUES(1); --error ER_DUP_ENTRY INSERT INTO t1(id) VALUES(1); SELECT id FROM t1; DROP TABLE t1; # Sample Test Case CREATE TABLE t1(id int not null primary key) Engine=InnoDB; INSERT INTO t1(id) VALUES(1); INSERT INTO t1(id) VALUES(1); ERROR 23000: Duplicate entry '1' for key 't1.PRIMARY' SELECT id FROM t1; id 1 DROP TABLE t1;

Slide 40

Slide 40 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 41

Slide 41 text

MySQL の実装を読むための色々 ~どうやって読むべき実装を限定するか~

Slide 42

Slide 42 text

MySQL の実装を読むための色々 1. git bisect を使った調査  中間バージョンへのチェックアウトとテスト実行をよろしくやるヤツ。   → first bad commit が巨大な場合は無力  前は上手く行っていたのに今はバグる、みたいなパターンに有効。  原因となったコミットが判明すれば読むべき範囲が確定する。   →特に見つかったコミットの変更が小さい場合は勝利である

Slide 43

Slide 43 text

MySQL の実装を読むための色々 1. git bisect を使った調査  例) 8.0.30 では通ったビルドが 8.0.31 で通らない  まずは good commit, bad commit を設定する。 # git bisect start $ git bisect start 8.0.31 8.0.30

Slide 44

Slide 44 text

MySQL の実装を読むための色々 1. git bisect を使った調査  テストスクリプトを用意する #!/bin/bash # testMySQLBuild.sh mkdir build && cd $_ mkdir boost cmake ../ -DCMAKE_BUILD_TYPE=Debug \ -DWITH_BOOST=./boost -DDOWNLOAD_BOOST=1 cmake --build . --config debug -j14 BUILD_STATUS=$? cd `git rev-parse --show-toplevel` rm -rf build exit $BUILD_STATUS

Slide 45

Slide 45 text

MySQL の実装を読むための色々 1. git bisect を使った調査 テストスクリプトを実行してひたすら待つ。 $ git bisect run ../testMySQLBuild.sh … 321f106987a3fd62035057c8b544e7a874bc76d3 is the first bad commit commit 321f106987a3fd62035057c8b544e7a874bc76d3 …

Slide 46

Slide 46 text

MySQL の実装を読むための色々 1. git bisect を使った調査 テストスクリプトを実行してひたすら待つ。 $ git bisect run ../testMySQLBuild.sh … 321f106987a3fd62035057c8b544e7a874bc76d3 is the first bad commit commit 321f106987a3fd62035057c8b544e7a874bc76d3 …

Slide 47

Slide 47 text

MySQL の実装を読むための色々 2. debug trace を気合で読む  テストが書きにくい、どこから読めば良いか分からない。   → debug trace を読むとコードパスは分かる   但し、とにかくサイズがデカい。  本当にサイズがデカい。

Slide 48

Slide 48 text

MySQL の実装を読むための色々 2. debug trace を気合で読む  debug trace を吐き出す方法 #1 /tmp/mysqld.trace mysql-server/build$ ./bin/mysqld --debug #2 build/var/log/mysqld.1.trace mysql-server/build/mysql-test$ ./mtr innodb.add_foreign_key --debug

Slide 49

Slide 49 text

MySQL の実装を読むための色々 2. debug trace を気合で読む  MySQL の実装を読むとデバッグ用のマクロがある。 - DBUG_ENTER - DBUG_RETURN - DBUG_TRACE  これらが debug trace に記録される境界となる。  全ての実装に書かれている訳ではないので自分で書いてビルドするのも良い。

Slide 50

Slide 50 text

MySQL の実装を読むための色々 2. debug trace を気合で読む ... @2: | | >dd::Raw_new_record::insert T@2: | | | >handler::ha_write_row T@2: | | | | >int ha_innobase::write_row T@2: | | | | | >handler::update_auto_increment T@2: | | | | | | >ha_innobase::update_thd    ← DBUG_ENTER T@2: | | | | | | | ha_innobase::update_thd: user_thd: 0x5555abc30790 -> 0x5555abc30790 T@2: | | | | | | | >innobase_trx_init T@2: | | | | | | | ha_innobase::innobase_lock_autoinc T@2: | | | | | |

Slide 51

Slide 51 text

MySQL の実装を読むための色々 3. error_log を眺める なんか mysqld が即死するクラッシュ系の振る舞いを調べる時。 スタックトレースが出ているのが最高。 読むべき場所をかなり限定することができる。 但し stdc++ まで読む羽目になる場合もある。

Slide 52

Slide 52 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 53

Slide 53 text

読み解くのにやや気合がいる部分 ~自分が手強いと感じたもの~

Slide 54

Slide 54 text

読み解くのにやや気合がいる部分 1. partitioning を利用しているパターン  ストレージエンジンは handler インターフェースを実装している。   → mysql-server はそれらを呼び出すことで INSERT 等を行う  InnoDB では partition を利用している場合、まず専用の実装を呼び出す。   →継承関係がやや複雑   →ha_innopart が Partition_helper を呼び出し、そいつは ha_innopart を呼ぶ

Slide 55

Slide 55 text

読み解くのにやや気合がいる部分 1. partitioning を利用しているパターン  ストレージエンジンは handler インターフェースを実装している。   → mysql-server はそれらを呼び出すことで INSERT 等を行う  InnoDB では partition を利用している場合、まず専用の実装を呼び出す。   →継承関係がやや複雑   →ha_innopart が Partition_helper を呼び出し、そいつは ha_innopart を呼ぶ

Slide 56

Slide 56 text

読み解くのにやや気合がいる部分 1. partitioning を利用しているパターン  ストレージエンジンは handler インターフェースを実装している。   → mysql-server はそれらを呼び出すことで INSERT 等を行う  InnoDB では partition を利用している場合、まず専用の実装を呼び出す。   →継承関係がやや複雑   →ha_innopart が Partition_helper を呼び出し、そいつは ha_innopart を呼ぶ

Slide 57

Slide 57 text

読み解くのにやや気合がいる部分 1. partitioning を利用しているパターン  ストレージエンジンは handler インターフェースを実装している。   → mysql-server はそれらを呼び出すことで INSERT 等を行う  InnoDB では partition を利用している場合、まず専用の実装を呼び出す。   →継承関係がやや複雑   →ha_innopart が Partition_helper を呼び出し、そいつは ha_innopart を呼ぶ

Slide 58

Slide 58 text

読み解くのにやや気合がいる部分 1. partitioning を利用しているパターン: 8.0.33 で比較した概略図    

Slide 59

Slide 59 text

読み解くのにやや気合がいる部分 2. mysql_alter_table に関する処理  mysql-server 側の ALTER TABLE に関する処理。  全て(??) ALTER TABLE は mysql_alter_table 関数を通過する   →とても長い上に複雑な処理になっている   → mysql_alter_table ではなくその先で呼ばれるものを先に読んだ方が良い

Slide 60

Slide 60 text

読み解くのにやや気合がいる部分 2. mysql_alter_table に関する処理  mysql-server 側の ALTER TABLE に関する処理。  全て(??) ALTER TABLE は mysql_alter_table 関数を通過する   →とても長い上に複雑な処理になっている   → mysql_alter_table ではなくその先で呼ばれるものを先に読んだ方が良い

Slide 61

Slide 61 text

読み解くのにやや気合がいる部分 3. trigger を利用しているパターン  ほとんど通常のクエリと同様のコードパスを通過する。  ただし所謂 Server layer で通過する部分が微妙に異なる。  before, after でも微妙に異なる上に goto で飛ぶ部分があり手強い。  ある程度、周辺実装を読む必要があった。  

Slide 62

Slide 62 text

今日話すこと 1. 普段使っている開発環境 2. MySQL のビルドと調査前準備 3. ディレクトリの構成 4. mysql-test-run 5. MySQL の実装を読むための色々 6. 読み解くのにやや気合のいる箇所 7. rr-debugger を使う

Slide 63

Slide 63 text

rr-debugger を使う ~面倒なデバッグからの解放~

Slide 64

Slide 64 text

rr-debugger を使う 1. rr-debugger is 何  アプリケーションの実行状況を記録、再生出来るナイスなデバッガ。   →実行ごとに変化する値を固定した状態で何度もデバッグできる   →タイムスタンプや乱数といった実行時で変化するものを固定  使用感はほとんど gdb でありつつ、逆実行できるのが更にナイス。   →breakpoint の貼り忘れ、ミスって step over 等した時に戻ることができる

Slide 65

Slide 65 text

rr-debugger を使う 1. rr-debugger の使い方  trace ファイルを生成  trace ファイルを元に実行する mysql-server/build$ _RR_TRACE_DIR=/tmp/rr-trace rr record ./bin/mysqld mysql-server/build$ rr replay /tmp/rr-trace/latest-trace 0x00007f11b61532b0 in _start () from /lib64/ld-linux-x86-64.so.2 (rr)

Slide 66

Slide 66 text

rr-debugger を使う 1. rr-debugger の使い方  InnoDB のテーブルに一行追加を考える (rr) b ha_innobase::write_row Breakpoint 2 at 0x55d0c65b7866: file mysql-server/storage/innobase/handler/ha_innodb.cc, line 8972. (rr) c Continuing. Thread 1 hit Breakpoint 2, ha_innobase::write_row 8972 { (rr)

Slide 67

Slide 67 text

rr-debugger を使う 1. rr-debugger の使い方  InnoDB のテーブルに一行追加を考える (rr) b ha_innobase::write_row Breakpoint 2 at 0x55d0c65b7866: file mysql-server/storage/innobase/handler/ha_innodb.cc, line 8972. (rr) c Continuing. Thread 1 hit Breakpoint 2, ha_innobase::write_row 8972 { (rr)

Slide 68

Slide 68 text

rr-debugger を使う 1. rr-debugger の使い方  既に通過した処理に breakpoint 貼って戻る (rr) b handler::ha_write_row Breakpoint 3 at 0x55d0c511ed2c: ... (rr) rc Continuing. Thread 1 hit Breakpoint 3, handler::ha_write_row ... 7937 int handler::ha_write_row(uchar *buf) { (rr) c Continuing. Thread 1 hit Breakpoint 2, ha_innobase::write_row ... 8972 {

Slide 69

Slide 69 text

ここまでで出来るようになること - MySQL のビルド・デバッグ - プラグインなんかも作れるようになるはず - ストレージエンジンを作るというロマンへ … - mysql-test-run を使ったテスト実行・デバッグ - どうやって見たい実装を見つけるか - デバッグを楽にするにはどうしたら良いか - mtr で使えないことが悔やまれる rr-debugger - MySQL/MariaDB にパッチを送れるかも - MariaDB も基本的には同じ

Slide 70

Slide 70 text

参考にした・したい資料 - 実例で学ぶ MySQL/MariaDB デバッグ - https://nayuta-yanagisawa.hatenablog.com/entry/learning-mysql-mariadb-debugging-by-example - Run MySQL Test Suite - https://dev.mysql.com/doc/dev/mysql-server/latest/PAGE_MYSQL_TEST_RUN_PL.html - Expert MySQL - 内容は古いが内部実装について書かれた良書 - High Performance MySQL 4th Edition - 実は内部実装の前提などが書かれている - 日々の覚書 - https://yoku0825.blogspot.com/ - 困ったら大体ここ見てどうにかなる

Slide 71

Slide 71 text

是非 MySQL の実装を読み解いて 一緒にわちゃわちゃしましょう。

Slide 72

Slide 72 text

それでは良い MySQL ライフを。