$30 off During Our Annual Pro Sale. View Details »

ぼくらが選んだ次のMySQL 8.0 / MySQL80 Which We Choose

ぼくらが選んだ次のMySQL 8.0 / MySQL80 Which We Choose

ぼくらが選んだ次のMySQL 8.0
yoku0825 / 日本MySQLユーザ会

重い腰を上げて、ついにMySQL 8.0.19からMySQL 8.0.28を(社内的)LTSにすることにしました 8.0.28を選んだ経緯について説明します。ちなみに本番配布はまだです(カナリア段階)

※イベントページ
https://line.connpass.com/event/255090/

LINE Developers
PRO

August 02, 2022
Tweet

More Decks by LINE Developers

Other Decks in Technology

Transcript

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

    View Slide

  2. 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

    View Slide

  3. \こんばんわ/
    yoku0825@とある企業のDBA
    オラクれない

    ポスグれない

    マイエスキューエる

    生息域
    Twitter: @yoku0825

    Blog: 日々の覚書

    日本MySQLユーザ会

    MySQL Casual

    2/50

    View Slide

  4. 別にクビになったわけではないです
    特にLINEのMySQLに特化した話ではないです
    LINEのMySQLに特化した話を聞きたい方はお知らせください。現在募集中です(?)
    データベースエンジニア / MySQL| 求人詳細 | LINE株式会社

    あれ……カジュアル面談だけ希望するパスって無いのか…?

    3/50

    View Slide

  5. 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

    View Slide

  6. 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

    View Slide

  7. 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

    View Slide

  8. ちなみに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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  13. ( ゚д゚)
    12/50

    View Slide

  14. (゚д゚)
    13/50

    View Slide

  15. (゚д゚ )
    14/50

    View Slide

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

    View Slide

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

    View Slide

  18. orz
    17/50

    View Slide

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

    View Slide

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

    View Slide

  21. ぼくらの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

    View Slide

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

    View Slide

  23. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  27. 何を見るのか
    パラメーターに現れない、いきなり挙動が変わるかも知れないものは “What Is
    New” か “Release Notes”
    トランザクションスケジューリングがFIFOからCATSに変更されただとか

    HASH JOINの内部処理がリファクタされたとか

    パラメーターのデフォルト変更系は “MySQL Parameters”
    実mysqldを使ってデータを作ってくれているっぽいので公式じゃないとはいえ確実

    MySQL Parameters の裏側 / MySQL Parameters backend - Speaker Deck

    26/50

    View Slide

  28. 何を見るのか
    完全に肌感覚とはいえ、 “MySQL Bugs” を毎日眺めているのは効果がある
    INSTANT DROP COLUMN関連のバグはかなり高確率で “Access Denied” …

    レプリケーションのプロトコル圧縮 ( CHANGE MASTER TO master_compression_algorithm =
    'zlib' ) は色々あったみたいだけど最近見なくなったなとか

    一時期に比べて圧倒的にTempTableストレージエンジンのレポートが減ったなとか

    “Release Notes” の “Bugs Fixed” は正直量が多すぎるし、最近「ボカした」言い
    回しも増えているので真面目に追うのはコスパが悪い
    最終的にはGitHubのコミット履歴を探す旅に繋がる

    27/50

    View Slide

  29. 何を見るのか
    “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

    View Slide

  30. 何を見るのか
    日々BugsのSubscribeをしていると見えてくるもの
    個人の感覚であり、所属する組織や所属しない組織の意見を一切代表しません

    7月リリース、7月中に即レポートでも直るのはだいたい「次の次」
    レポートが遅れて中の人も気が付いてない(?)不具合は更にその次以降

    致命的でない不具合はさらにもう1世代くらい後ろかな?

    29/50

    View Slide

  31. 優先順位付け
    そこにバグが埋まってるのか埋まってないのかはわからない
    バグレポートに挙がってくるのは、「そこにバグが埋まっており、かつ、レポーターがそれを
    踏んだ」時だけ

    広く使われていない(が、自分たちが使っている)機能にバグがあっても “MySQL Bugs” からだ
    けではわからない

    なので「仮にそこにバグが埋まっていた場合、どうやって回避できるか」を主軸に
    置く
    設定で回避できるものなのか? (できない場合インパクトが大きい)

    使おうと思うと動くものなのか、特に何も意識しないと動くものなのか(明示的に操作を追加
    しないと回避できないものはインパクトが大きい)

    しょっちゅう使う機能なのか? 使いたい人だけ使うような機能なのか?

    あとは「みんなが使うような機能のクリティカルなバグは2世代後」の法則

    30/50

    View Slide

  32. 優先順位付け
    たとえば、 “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

    View Slide

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

    View Slide

  34. というわけ

    33/50

    View Slide

  35. こんな感じ
    34/50

    View Slide

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

    View Slide

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

    View Slide

  38. その後わかったこと
    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

    View Slide

  39. その後わかったこと
    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

    View Slide

  40. その後わかったこと
    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

    View Slide

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

    View Slide

  42. まとめ
    我々の次の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

    View Slide

  43. 広告
    日本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

    View Slide

  44. おまけ
    43/50

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  51. Any Questions
    and/or
    Suggestions?
    50/50

    View Slide