Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ぼくらが選んだ次の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
  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
  3. \こんばんわ/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter:

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

    あれ……カジュアル面談だけ希望するパスって無いのか…? ‐ 3/50
  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
  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
  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
  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
  9. メンテナンスリ リース #とは 8/50

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

  11. とある書籍 第6章「MySQLの運用」, 194ページです。 MySQL 5.7とそれ以前の系列内でのアップグレードは機能追加よりも不具合の修正に重点が置かれて いたため、「同一リリース系列内の最新バージョンを利用する」ことを主に考えるだけで済んでい ましたが、MySQL 8.0系列は同一リリース内でも非互換がある可能性があるため... それまでであれば「現在リリースされている系列内ではバージョン番号が一番大きなものが一番バ グ修正が進んでいるであろう」ことが期待できましたが、MySQL

    8.0系列ではバージョン番号の進行 に伴って新機能が追加されてしまうため、その機能やその周辺に新規にバグが内在する可能性があ ります。そのため、特定のバージョンについて十分な検証を進め、そのバージョンにおける(自身 にとっての)致命的なバグにあたらないことを確認したら、以降はセキュリティバグの修正や十分 に使う価値のある新機能以外での(リリース系列内の)バージョン変更は避けるのが望ましくなる かもしれません。 MySQL徹底入門 第4版 MySQL 8.0対応|翔泳社の本 10/50
  12. とある書籍 同じく第6章「MySQLの運用」, 194~195ページです。 現時点で確実に勧められることは、 - 導入時点での最新バージョンを選び動作確認すること - 導入以後のアップグレードに備えてSQLレベルでの非互換を検出できるように回帰テストを作成す ること -

    アップグレードをする際にはクライアントのバージョンを先に上げること です MySQL徹底入門 第4版 MySQL 8.0対応|翔泳社の本 11/50
  13. ( ゚д゚) 12/50

  14. (゚д゚) 13/50

  15. (゚д゚ ) 14/50

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

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

  18. orz 17/50

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

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

  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
  22. ぼくらの次のMySQL 8.0を探す旅 What Is New in MySQL 8.0 MySQL Parameters

    MySQL Bugs MySQL 8.0 Release Notes 21/50
  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
  24. MySQL Parameters バージョン指定でdiffだけ見られるので便利 https://mysql-params.tmtms.net/mysqld/?vers=8.0.19,8.0.29&diff=true 23/50

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

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

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

    HASH JOINの内部処理がリファクタされたとか ‐ パラメーターのデフォルト変更系は “MySQL Parameters” 実mysqldを使ってデータを作ってくれているっぽいので公式じゃないとはいえ確実 ‐ MySQL Parameters の裏側 / MySQL Parameters backend - Speaker Deck ‐ 26/50
  28. 何を見るのか 完全に肌感覚とはいえ、 “MySQL Bugs” を毎日眺めているのは効果がある INSTANT DROP COLUMN関連のバグはかなり高確率で “Access Denied”

    … ‐ レプリケーションのプロトコル圧縮 ( CHANGE MASTER TO master_compression_algorithm = 'zlib' ) は色々あったみたいだけど最近見なくなったなとか ‐ 一時期に比べて圧倒的にTempTableストレージエンジンのレポートが減ったなとか ‐ “Release Notes” の “Bugs Fixed” は正直量が多すぎるし、最近「ボカした」言い 回しも増えているので真面目に追うのはコスパが悪い 最終的にはGitHubのコミット履歴を探す旅に繋がる ‐ 27/50
  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
  30. 何を見るのか 日々BugsのSubscribeをしていると見えてくるもの 個人の感覚であり、所属する組織や所属しない組織の意見を一切代表しません ‐ 7月リリース、7月中に即レポートでも直るのはだいたい「次の次」 レポートが遅れて中の人も気が付いてない(?)不具合は更にその次以降 ‐ 致命的でない不具合はさらにもう1世代くらい後ろかな? ‐ 29/50

  31. 優先順位付け そこにバグが埋まってるのか埋まってないのかはわからない バグレポートに挙がってくるのは、「そこにバグが埋まっており、かつ、レポーターがそれを 踏んだ」時だけ ‐ 広く使われていない(が、自分たちが使っている)機能にバグがあっても “MySQL Bugs” からだ けではわからない

    ‐ なので「仮にそこにバグが埋まっていた場合、どうやって回避できるか」を主軸に 置く 設定で回避できるものなのか? (できない場合インパクトが大きい) ‐ 使おうと思うと動くものなのか、特に何も意識しないと動くものなのか(明示的に操作を追加 しないと回避できないものはインパクトが大きい) ‐ しょっちゅう使う機能なのか? 使いたい人だけ使うような機能なのか? ‐ あとは「みんなが使うような機能のクリティカルなバグは2世代後」の法則 ‐ 30/50
  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
  33. ちなみに8.0.19から8.0.29の間で廃止されたのは “no longer supports the TLSv1 and TLSv1.1 protocols” だけだったみたい

    見落としている可能性はある 32/50
  34. というわけ で 33/50

  35. こんな感じ 34/50

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

  37. ぶっちゃけ INSTANT DROP COLUMN(と、その影響で任意の個所にINSTANT ADD COLUMNできるようになった)はヤバい InnoDB REDOログの構造にも手を入れたらしい Bugs見てるだけで積みあがっていく “Access

    Denied” .. これを避けて8.0.28に回避の難しいバグが埋まっていないか、2世代以上経ってい るか……が評価のポイントだった 避けられない何かは無さそうだったので、「ぼくたちの次のMySQL 8.0」 == 8.0.28 に決定した 36/50
  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
  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
  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
  41. やっぱり埋 まってた() 40/50

  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
  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
  44. おまけ 43/50

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

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

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

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

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

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

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