Slide 1

Slide 1 text

ぼくらが選んだ次のMySQL 8.0 いったん8.0.28を選んだというか、いったん8.0.29を避けたというか 2022/08/02 yoku0825 LINE Developer Meetup #73 - MySQL

Slide 2

Slide 2 text

TL;DR 我々の次のMySQLは 8.0.28 (効果には個人差があります) 量が膨大になるので昇順に調べるのではなく降順に調べていく パラメーターに現れない、いきなり挙動が変わるかも知れないものは “What Is New” か “Release Notes” What Is New in MySQL 8.0 ‐ MySQL 8.0 Release Notes ‐ パラメーターのデフォルト変更系は “MySQL Parameters” MySQL Parameters ‐ 1/50

Slide 3

Slide 3 text

\こんばんわ/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter: @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ 2/50

Slide 4

Slide 4 text

別にクビになったわけではないです 特にLINEのMySQLに特化した話ではないです LINEのMySQLに特化した話を聞きたい方はお知らせください。現在募集中です(?) データベースエンジニア / MySQL| 求人詳細 | LINE株式会社 ‐ あれ……カジュアル面談だけ希望するパスって無いのか…? ‐ 3/50

Slide 5

Slide 5 text

MySQL 8.0 GA mysql80 160> SELECT CURDATE() /* JST */; +------------+ | CURDATE() | +------------+ | 2018-04-20 | +------------+ 1 row in set (0.00 sec) mysql80 160> SELECT @@version; +-----------+ | @@version | +-----------+ | 8.0.11 | +-----------+ 1 row in set (0.00 sec) 4/50

Slide 6

Slide 6 text

Today’s MySQL 8.0 mysql80 160> SELECT CURDATE() /* JST */; +------------+ | CURDATE() | +------------+ | 2022-08-02 | +------------+ 1 row in set (0.00 sec) mysql80 160> SELECT @@version; +-----------+ | @@version | +-----------+ | 8.0.30 | +-----------+ 1 row in set (0.00 sec) 5/50

Slide 7

Slide 7 text

What’s new in MySQL 8.0… $ curl -L -s https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html | perl -nlE 'if ($_ =~ /(8\.0\.\d+) /) { say $1 }' | sort -n | uniq -c 1 8.0.0 2 8.0.12 6 8.0.13 6 8.0.14 9 8.0.16 10 8.0.17 7 8.0.18 7 8.0.19 3 8.0.2 9 8.0.20 18 8.0.21 11 8.0.22 5 8.0.23 1 8.0.24 4 8.0.26 6 8.0.27 7 8.0.28 14 8.0.29 4 8.0.3 12 8.0.30 2 8.0.31 2 8.0.4 6/50

Slide 8

Slide 8 text

ちなみに5.7… $ curl -L -s https://dev.mysql.com/doc/refman/5.7/en/mysql-nutshell.html | perl -nlE 'if ( $_ =~ /(5\.7\.\d+)/) { say $1 }' | sort -n | uniq -c 1 5.7.1 2 5.7.10 1 5.7.11 1 5.7.19 3 5.7.2 2 5.7.22 1 5.7.23 3 5.7.24 1 5.7.3 1 5.7.33 2 5.7.38 1 5.7.39 3 5.7.4 3 5.7.5 2 5.7.6 2 5.7.8 4 5.7.9 7/50

Slide 9

Slide 9 text

メンテナンスリ リース #とは 8/50

Slide 10

Slide 10 text

とある書籍 MySQL徹底入門 第4版 MySQL 8.0対応|翔泳社の本 9/50

Slide 11

Slide 11 text

とある書籍 第6章「MySQLの運用」, 194ページです。 MySQL 5.7とそれ以前の系列内でのアップグレードは機能追加よりも不具合の修正に重点が置かれて いたため、「同一リリース系列内の最新バージョンを利用する」ことを主に考えるだけで済んでい ましたが、MySQL 8.0系列は同一リリース内でも非互換がある可能性があるため... それまでであれば「現在リリースされている系列内ではバージョン番号が一番大きなものが一番バ グ修正が進んでいるであろう」ことが期待できましたが、MySQL 8.0系列ではバージョン番号の進行 に伴って新機能が追加されてしまうため、その機能やその周辺に新規にバグが内在する可能性があ ります。そのため、特定のバージョンについて十分な検証を進め、そのバージョンにおける(自身 にとっての)致命的なバグにあたらないことを確認したら、以降はセキュリティバグの修正や十分 に使う価値のある新機能以外での(リリース系列内の)バージョン変更は避けるのが望ましくなる かもしれません。 MySQL徹底入門 第4版 MySQL 8.0対応|翔泳社の本 10/50

Slide 12

Slide 12 text

とある書籍 同じく第6章「MySQLの運用」, 194~195ページです。 現時点で確実に勧められることは、 - 導入時点での最新バージョンを選び動作確認すること - 導入以後のアップグレードに備えてSQLレベルでの非互換を検出できるように回帰テストを作成す ること - アップグレードをする際にはクライアントのバージョンを先に上げること です MySQL徹底入門 第4版 MySQL 8.0対応|翔泳社の本 11/50

Slide 13

Slide 13 text

( ゚д゚) 12/50

Slide 14

Slide 14 text

(゚д゚) 13/50

Slide 15

Slide 15 text

(゚д゚ ) 14/50

Slide 16

Slide 16 text

肝心の!!!! 次にどれを使 うかをどうやって選ぶのか が!!!!!!! 書いてな い!!!!!!!!!!!!1 15/50

Slide 17

Slide 17 text

とある書籍 MySQL徹底入門 第4版 MySQL 8.0対応|翔泳社の本 16/50

Slide 18

Slide 18 text

orz 17/50

Slide 19

Slide 19 text

このトークは、そうとし か書きようがなかった出 版当時の自分への一つの プラクティスの提示です 18/50

Slide 20

Slide 20 text

ぼくらが選んだ 次のMySQL 8.0 19/50

Slide 21

Slide 21 text

ぼくらのMySQL 8.0 AS-IS: 8.0.19 (2020-01-13) TO-BE: WHERE bug NOT IN (致命的) ORDER BY version DESC LIMIT 1 を探す WHERE bug NOT IN (致命的) ORDER BY version ASC はやめた方が良いと思います、量が膨大な ので ‐ 20/50

Slide 22

Slide 22 text

ぼくらの次のMySQL 8.0を探す旅 What Is New in MySQL 8.0 MySQL Parameters MySQL Bugs MySQL 8.0 Release Notes 21/50

Slide 23

Slide 23 text

What Is New in MySQL 8.0 “Ctrl + F” で “8.0.” を探す https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshell.html 22/50

Slide 24

Slide 24 text

MySQL Parameters バージョン指定でdiffだけ見られるので便利 https://mysql-params.tmtms.net/mysqld/?vers=8.0.19,8.0.29&diff=true 23/50

Slide 25

Slide 25 text

MySQL Bugs 毎日数回以上RSSでタイトルをチェック 怪しそうなのがあれば即Subscribe(ただしそれでもチェックを抜けるのはある…) 自分で再現させられたものはなるべく “Affects Me” 24/50

Slide 26

Slide 26 text

MySQL 8.0 Release Notes 毎回斜め読みをしている あんまり今回真面目には見ていない 25/50

Slide 27

Slide 27 text

何を見るのか パラメーターに現れない、いきなり挙動が変わるかも知れないものは “What Is New” か “Release Notes” トランザクションスケジューリングがFIFOからCATSに変更されただとか ‐ HASH JOINの内部処理がリファクタされたとか ‐ パラメーターのデフォルト変更系は “MySQL Parameters” 実mysqldを使ってデータを作ってくれているっぽいので公式じゃないとはいえ確実 ‐ MySQL Parameters の裏側 / MySQL Parameters backend - Speaker Deck ‐ 26/50

Slide 28

Slide 28 text

何を見るのか 完全に肌感覚とはいえ、 “MySQL Bugs” を毎日眺めているのは効果がある INSTANT DROP COLUMN関連のバグはかなり高確率で “Access Denied” … ‐ レプリケーションのプロトコル圧縮 ( CHANGE MASTER TO master_compression_algorithm = 'zlib' ) は色々あったみたいだけど最近見なくなったなとか ‐ 一時期に比べて圧倒的にTempTableストレージエンジンのレポートが減ったなとか ‐ “Release Notes” の “Bugs Fixed” は正直量が多すぎるし、最近「ボカした」言い 回しも増えているので真面目に追うのはコスパが悪い 最終的にはGitHubのコミット履歴を探す旅に繋がる ‐ 27/50

Slide 29

Slide 29 text

何を見るのか “Bugs Fixed” の文字列の後ろに出てきた行の数だけ数えてみる。ようやくバグ曲 線っぽくなってきたか…? 以前(8.0.21くらいまで?)はどう考えてもバグ「直線」でした ‐ $ for n in $(seq 19 30) ; do > total=$(w3m -T text/html https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-${n}.html | wc -l) > bugs=$(w3m -T text/html https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-${n}.html | sed -n '/Bugs Fix ed/,$p' | wc -l) > printf "8.0.%d\t%d\t%d\t%2.2f\n" $n $bugs $total $(( 100 * $bugs / $total )) > done 8.0.19 1663 1821 91.00 8.0.20 1347 1486 90.00 8.0.21 1531 1679 91.00 8.0.22 1289 1430 90.00 8.0.23 1179 1319 89.00 8.0.24 1070 1204 88.00 8.0.25 72 184 39.00 8.0.26 1593 1731 92.00 8.0.27 1420 1566 90.00 8.0.28 1286 1422 90.00 8.0.29 1162 1298 89.00 8.0.30 1056 1188 88.00 28/50

Slide 30

Slide 30 text

何を見るのか 日々BugsのSubscribeをしていると見えてくるもの 個人の感覚であり、所属する組織や所属しない組織の意見を一切代表しません ‐ 7月リリース、7月中に即レポートでも直るのはだいたい「次の次」 レポートが遅れて中の人も気が付いてない(?)不具合は更にその次以降 ‐ 致命的でない不具合はさらにもう1世代くらい後ろかな? ‐ 29/50

Slide 31

Slide 31 text

優先順位付け そこにバグが埋まってるのか埋まってないのかはわからない バグレポートに挙がってくるのは、「そこにバグが埋まっており、かつ、レポーターがそれを 踏んだ」時だけ ‐ 広く使われていない(が、自分たちが使っている)機能にバグがあっても “MySQL Bugs” からだ けではわからない ‐ なので「仮にそこにバグが埋まっていた場合、どうやって回避できるか」を主軸に 置く 設定で回避できるものなのか? (できない場合インパクトが大きい) ‐ 使おうと思うと動くものなのか、特に何も意識しないと動くものなのか(明示的に操作を追加 しないと回避できないものはインパクトが大きい) ‐ しょっちゅう使う機能なのか? 使いたい人だけ使うような機能なのか? ‐ あとは「みんなが使うような機能のクリティカルなバグは2世代後」の法則 ‐ 30/50

Slide 32

Slide 32 text

優先順位付け たとえば、 “Reusing SSL Sessions” (8.0.29) https://dev.mysql.com/doc/refman/8.0/en/reusing-ssl-sessions.html ‐ ssl_session_cache_mode でOFFにできる ‐ たとえば、 “Transaction Scheduling” (8.0.21) https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-scheduling.html ‐ ON/OFFも無く、SQLシンタックスでも制御できる類ではない ‐ 31/50

Slide 33

Slide 33 text

ちなみに8.0.19から8.0.29の間で廃止されたのは “no longer supports the TLSv1 and TLSv1.1 protocols” だけだったみたい 見落としている可能性はある 32/50

Slide 34

Slide 34 text

というわけ で 33/50

Slide 35

Slide 35 text

こんな感じ 34/50

Slide 36

Slide 36 text

回避方法だけで優先度つけたもの 35/50

Slide 37

Slide 37 text

ぶっちゃけ INSTANT DROP COLUMN(と、その影響で任意の個所にINSTANT ADD COLUMNできるようになった)はヤバい InnoDB REDOログの構造にも手を入れたらしい Bugs見てるだけで積みあがっていく “Access Denied” .. これを避けて8.0.28に回避の難しいバグが埋まっていないか、2世代以上経ってい るか……が評価のポイントだった 避けられない何かは無さそうだったので、「ぼくたちの次のMySQL 8.0」 == 8.0.28 に決定した 36/50

Slide 38

Slide 38 text

その後わかったこと Percona fixed the corruption issue and several other issues with the INSTANT ADD/DROP column feature in the upcoming Percona Server for MySQL 8.0.29 (check PS-8291 / PS-8292 / PS-8303 for more details) we also raised and provided patches for those issues as a contribution to Community MySQL (see 107613 / 107611 / 107854 for details). Percona XtraBackup 8.0.29 and INSTANT ADD/DROP Columns - Percona Database Performance Blog 37/50

Slide 39

Slide 39 text

その後わかったこと InnoDB: A TRUNCATE TABLE operation failed to remove data dictionary entries for columns that were dropped using ALGORITHM=INSTANT.(Bug #34302445) InnoDB: An incorrect nullable column calculation on tables with instantly added columns caused data to be interpreted incorrectly. (Bug #34243694) InnoDB: After upgrading to MySQL 8.0.29, a failure occurred when attempting to access a table with an instantly added column. (Bug #34233264) MySQL :: MySQL 8.0 Release Notes :: Changes in MySQL 8.0.30 (2022-07-26, General Availability) 38/50

Slide 40

Slide 40 text

その後わかったこと InnoDB: Only the physical position of instantly added columns was logged, which was not sufficient for index recovery. The logical position of columns was also required. (Bug #34181432) InnoDB: The field_phy_pos debug variable in the InnoDB sources was not updated for child tables during a cascading update operation. (Bug #34181419) InnoDB: Some instances of the rec_get_instant_row_version_old() function in the InnoDB sources did not check for row versioning. (Bug #34173616) MySQL :: MySQL 8.0 Release Notes :: Changes in MySQL 8.0.30 (2022-07-26, General Availability) 39/50

Slide 41

Slide 41 text

やっぱり埋 まってた() 40/50

Slide 42

Slide 42 text

まとめ 我々の次のMySQLは 8.0.28 (効果には個人差があります) 量が膨大になるので昇順に調べるのではなく降順に調べていく ‐ パラメーターに現れない、いきなり挙動が変わるかも知れないものは “What Is New” か “Release Notes” What Is New in MySQL 8.0 ‐ MySQL 8.0 Release Notes ‐ パラメーターのデフォルト変更系は “MySQL Parameters” MySQL Parameters ‐ 41/50

Slide 43

Slide 43 text

広告 日本MySQLユーザ会ではMySQLのリリースノートを読む勉強会を開催しています MySQLリリースノート勉強会8.0.29開催してました - sakaikの日々雑感~(T)編 ‐ MySQLリリースノート勉強会8.0.28開催しました - sakaikの日々雑感~(T)編 ‐ MySQL 8.0.30もリリースされたので、今月か来月くらいに開催される気がしま す。 MyNA(日本MySQLユーザ会) - connpass 今夜も生でMySQL(仮題) #03 - connpass ‐ 42/50

Slide 44

Slide 44 text

おまけ 43/50

Slide 45

Slide 45 text

バージョン50% 減(当社比) 44/50

Slide 46

Slide 46 text

MySQL坂 画像は省略します 45/50

Slide 47

Slide 47 text

更におまけ https://www.oracle.com/us/assets/lifetime-support-technology-069183.pdf 46/50

Slide 48

Slide 48 text

更におまけ https://www.mysql.com/support/supportedplatforms/database.html 47/50

Slide 49

Slide 49 text

1年で2倍にならな ないといけないんだ ろうか… 48/50

Slide 50

Slide 50 text

MySQL坂 画像は省略します 49/50

Slide 51

Slide 51 text

Any Questions and/or Suggestions? 50/50