Slide 1

Slide 1 text

MySQL Shell dumpInstance のバグを調べた件 2020/12/11 忘年LT⼤会 2020

Slide 2

Slide 2 text

2 坂井さん 毎年ありがとうございます︕

Slide 3

Slide 3 text

MySQL Shell の util.dumpInstance おさらい • 論理バックアップ • 並列で⾼速にバックアップ • 1つのテーブルをチャンクに分けてSELECT 3 $ ls -rw-r----- 1 samitani users 296 Oct 28 23:13 t.json -rw-r----- 1 samitani users 531 Oct 28 23:13 t.sql -rw-r----- 1 samitani users 289084 Oct 28 23:13 t@t@@0.tsv -rw-r----- 1 samitani users 8 Oct 28 23:13 t@t@@0.tsv.idx

Slide 4

Slide 4 text

⼀貫性のあるバックアップ • 複数のセッションでバックアップを⾏う • 各セッションで同じ時点のデータを読まなければ、正しい バックアップとならない 4 SELECT 〜 FROM t WHERE pk BETWEEN 1 AND 100 SELECT 〜 FROM t WHERE pk BETWEEN 101 AND 200 SELECT 〜 FROM t WHERE pk BETWEEN 201 AND 300

Slide 5

Slide 5 text

⼀貫性がどのように担保されているか 5 FLUSH TABLES WITH READ LOCK START TRANSACTION START TRANSACTION START TRANSACTION UNLOCK TABLES SELECT 〜 FROM t WHERE pk BETWEEN 1 AND 100 SELECT 〜 FROM t WHERE pk BETWEEN 101 AND 200 SELECT 〜 FROM t WHERE pk BETWEEN 201 AND 300 この間は 書き込め ない

Slide 6

Slide 6 text

⼀貫性がどのように担保されているか 6 FLUSH TABLES WITH READ LOCK START TRANSACTION START TRANSACTION START TRANSACTION UNLOCK TABLES SELECT 〜 FROM t WHERE pk BETWEEN 1 AND 100 SELECT 〜 FROM t WHERE pk BETWEEN 101 AND 200 SELECT 〜 FROM t WHERE pk BETWEEN 201 AND 300 この間は 書き込め ない なるほど かしこい

Slide 7

Slide 7 text

7 しかし・・・

Slide 8

Slide 8 text

⼀貫性のあるバックアップが取れない • このようなトランザクションを実⾏中にバックアップする・・・ • db1.t1, db2.t2 で件数が⼀致しないバックアップが 出来上がってしまった・・・ 8 BEGIN; INSERT INTO db1.t1 VALUES(1); INSERT INTO db2.t1 VALUES(1); COMMIT;

Slide 9

Slide 9 text

⼀貫性のあるバックアップが取れない • このようなトランザクションを実⾏中にバックアップする・・・ • db1.t1, db2.t2 で件数が⼀致しないバックアップが 出来上がってしまった・・・ 9 BEGIN; INSERT INTO db1.t1 VALUES(1); INSERT INTO db2.t1 VALUES(1); COMMIT; その後、調べて原因がわかりました

Slide 10

Slide 10 text

原因 10 FLUSH TABLES WITH READ LOCK START TRANSACTION START TRANSACTION START TRANSACTION UNLOCK TABLES SELECT 〜 FROM t WHERE pk BETWEEN 1 AND 100 SELECT 〜 FROM t WHERE pk BETWEEN 101 AND 200 SELECT 〜 FROM t WHERE pk BETWEEN 201 AND 300 LOCK TABLES mysql.proc

Slide 11

Slide 11 text

原因 11 FLUSH TABLES WITH READ LOCK START TRANSACTION START TRANSACTION START TRANSACTION UNLOCK TABLES SELECT 〜 FROM t WHERE pk BETWEEN 1 AND 100 SELECT 〜 FROM t WHERE pk BETWEEN 101 AND 200 SELECT 〜 FROM t WHERE pk BETWEEN 201 AND 300 LOCK TABLES mysql.proc 暗黙の コミット

Slide 12

Slide 12 text

修正済 • 8.0.23 で修正される 12

Slide 13

Slide 13 text

13 気づいたこと x 2

Slide 14

Slide 14 text

MySQL Shell のビルドが茨の道だった • 本体もビルドが必要 • 本体は cmake3 系 • Shell は cmake2 系 • 他にも⾊々・・・ • https://mita2db.hateblo.jp/entry/2020/11/05/223232 • (CentOS 7 以外なら簡単かも) 14

Slide 15

Slide 15 text

MySQL Shell、デバッグに便利 • タイミングイシューのため、複数回バックアップを実⾏す る必要があった • Pythonでそのまま、書ける。簡単。 15 mysqlsh> \py mysqlsh> for i in range(10): util.dump_instance('/tmp/bk%s' % i, compression='none')

Slide 16

Slide 16 text

16 まとめ

Slide 17

Slide 17 text

まとめ • dumpInstance はFTWLで⼀貫性を確保 • バグは 8.0.23 で修正されるよ • MySQL Shell @CentOS7 でのビルド⽅法 • https://mita2db.hateblo.jp/entry/2020/11/05/223232 • MySQL Shell デバッグにも便利︕ 17

Slide 18

Slide 18 text

18 おしまい