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

August 02, 2022
Tweet

More Decks by LINE Developers

Other Decks in Technology

Transcript

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

    8.0系列ではバージョン番号の進行 に伴って新機能が追加されてしまうため、その機能やその周辺に新規にバグが内在する可能性があ ります。そのため、特定のバージョンについて十分な検証を進め、そのバージョンにおける(自身 にとっての)致命的なバグにあたらないことを確認したら、以降はセキュリティバグの修正や十分 に使う価値のある新機能以外での(リリース系列内の)バージョン変更は避けるのが望ましくなる かもしれません。 MySQL徹底入門 第4版 MySQL 8.0対応|翔泳社の本 10/50
  6. ぼくらの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
  7. 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
  8. 何を見るのか パラメーターに現れない、いきなり挙動が変わるかも知れないものは “What Is New” か “Release Notes” トランザクションスケジューリングがFIFOからCATSに変更されただとか ‐

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

    … ‐ レプリケーションのプロトコル圧縮 ( CHANGE MASTER TO master_compression_algorithm = 'zlib' ) は色々あったみたいだけど最近見なくなったなとか ‐ 一時期に比べて圧倒的にTempTableストレージエンジンのレポートが減ったなとか ‐ “Release Notes” の “Bugs Fixed” は正直量が多すぎるし、最近「ボカした」言い 回しも増えているので真面目に追うのはコスパが悪い 最終的にはGitHubのコミット履歴を探す旅に繋がる ‐ 27/50
  10. 何を見るのか “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
  11. 優先順位付け そこにバグが埋まってるのか埋まってないのかはわからない バグレポートに挙がってくるのは、「そこにバグが埋まっており、かつ、レポーターがそれを 踏んだ」時だけ ‐ 広く使われていない(が、自分たちが使っている)機能にバグがあっても “MySQL Bugs” からだ けではわからない

    ‐ なので「仮にそこにバグが埋まっていた場合、どうやって回避できるか」を主軸に 置く 設定で回避できるものなのか? (できない場合インパクトが大きい) ‐ 使おうと思うと動くものなのか、特に何も意識しないと動くものなのか(明示的に操作を追加 しないと回避できないものはインパクトが大きい) ‐ しょっちゅう使う機能なのか? 使いたい人だけ使うような機能なのか? ‐ あとは「みんなが使うような機能のクリティカルなバグは2世代後」の法則 ‐ 30/50
  12. 優先順位付け たとえば、 “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
  13. ぶっちゃけ INSTANT DROP COLUMN(と、その影響で任意の個所にINSTANT ADD COLUMNできるようになった)はヤバい InnoDB REDOログの構造にも手を入れたらしい Bugs見てるだけで積みあがっていく “Access

    Denied” .. これを避けて8.0.28に回避の難しいバグが埋まっていないか、2世代以上経ってい るか……が評価のポイントだった 避けられない何かは無さそうだったので、「ぼくたちの次のMySQL 8.0」 == 8.0.28 に決定した 36/50
  14. その後わかったこと 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
  15. その後わかったこと 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
  16. その後わかったこと 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
  17. 広告 日本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