Slide 1

Slide 1 text

MySQL8.0にしてみたかった話 WEBエンジニア勉強会 #13

Slide 2

Slide 2 text

もくじ ● 自己紹介 ● 環境のはなし ● ハマったはなし ● あきらめたはなし ● まとめ

Slide 3

Slide 3 text

自己紹介 ● 名前 : 檜垣俊希 ● 職種 : エンジニア(Perl書いてます) ● 趣味 : キーボード作り・同人技術本書いたり ● Twitter : @kamemaim

Slide 4

Slide 4 text

環境のはなし

Slide 5

Slide 5 text

環境のはなし ● どこにあるの? ○ RDS ○ 9割RDSのはなし ● バージョンは? ○ MySQL5.6 ● サーバの数は? ○ MasterとSlave一台ずつ ● なんでやるの? ○ Window関数使ってみたかったから ○ バージョン上げて置くのも大事だよね

Slide 6

Slide 6 text

ハマったはなし① ~インスタンス作るまで~

Slide 7

Slide 7 text

何があったか ● メールが届く ○ We noticed that your RDS MySQL 'インスタンス名' could not be patched to MySQL 8.0.15 The upgrade procedure is getting this error: Table rebuild required. Please do "ALTER TABLE `テーブル名` FORCE" or dump/reload to fix it! …...As a consequence, we have canceled your patch to prevent extended downtime on your database, and restored your database to its original state before the patch was attempted. ● 訳 ○ MySQL 8.0.15のパッチを適用できないぞ。アップグレード手順でこのエラーが 発生したぞ。ので、データベースのダウンタイムが長くならないようにパッチを キャンセルして、パッチを適用する前にデータベースを元の状態に復元して やったぜ!

Slide 8

Slide 8 text

原因 ● 新DATETIME型 ○ 5.6から小数秒の指定ができるようになったアレ ○ 旧DATETIME型のカラムがあった ● やったこと ○ ALTER TABLE `テーブル名` FORCE ■ テーブルを再構築 ■ データが多いと時間がかかるので注意 ○ スペック向上 ■ 実はこれだけでうまく行く

Slide 9

Slide 9 text

ハマったはなし② ~作ったあと~

Slide 10

Slide 10 text

何があったか ● CloudWatchを見ると容量が圧迫 ○ 2週間で100GBぐらい減ってた ■ 他のMaster,Slaveは無事 ○ バイナリログはとってなさげ ■ CloudWatchを見る限り

Slide 11

Slide 11 text

調査① ● ログファイル ○ デフォルトでテーブルに吐く ■ ‍♂ ○ 保存先が違う ■ show variables like '%dir%' ■ slave_load_tmpdir がtmpに向いている ● 再起動->変化なし ■ ‍♂

Slide 12

Slide 12 text

調査② ● 各テーブルの容量確認 ○ バージョン違いで容量圧迫? ○ selects table_name , ROUND((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024) AS `Size (MB)` from TABLES order by (DATA_LENGTH + INDEX_LENGTH); ○ むしろ減ってた!8.0すごい!‍♂

Slide 13

Slide 13 text

調査③ ● 実はCloudWatchにないだけでbinlog取っている? ○ show variables like 'log%' ■ ONになっている ■ パラーメータグループで設定不可 ○ show binary logs ■ 6380 rows in set (0.03 sec) ■ なるほど?とってるのね? ● やったこと ○ パージ期間を減らす ○ binlog_expire_logs_seconds ■ デフォルト30日

Slide 14

Slide 14 text

諦めた話

Slide 15

Slide 15 text

何があったか ● 5.7から8.0のアップグレードができない ○ Database instance is in a state that cannot be upgraded: PreUpgrade checks failed: RDS detected incompatibilities upgrading to MySQL8.0.15. More details can be found in the PrePatchCompatbility.log file, accessible in the ‘log’ section below. ● 訳 ○ データベースインスタンスはアップグレードできない状態だぞ:アップグレード 前チェックに失敗したぞ:RDSはMySQL8.0.15へのアップグレードの非互換性 を検出したぞ。詳細については、下の「ログ」セクションにある PrePatchCompatability.logファイルを参照してどうぞ。

Slide 16

Slide 16 text

何があったか ● RDS側で互換性チェックが走るようになった ○ https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Upg radeDBInstance.MySQL.html ○ 日本語はまだ更新されてなくて書いてない ○ スキップはできない ● PrePatchCompatibility.logの中身 3) Usage of utf8mb3 charset The following objects use the utf8mb3 character set. It is recommended to convert them to use utf8mb4 instead, for improved Unicode support. More Information: https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html ............ Errors: 0 Database Objects Affected: 158

Slide 17

Slide 17 text

Errorねえじゃん

Slide 18

Slide 18 text

原因 ● utf8って知ってる? ○ MySQL内ではutf8mb3のalias ○ 将来的にmb3はなくなるぞ ○ 今のうちにmb4にしとけよ ● エラーはなくても ○ issueがある時点でアップグレードは不可

Slide 19

Slide 19 text

まとめ ● とりあえず試してみよう ○ DATETIME型は新しくする ○ ‍‍・‍♂・ ○ ログファイルを吐く場所を確認 ● とりあえずテスト運用してみよう ○ バイナリログ取りまくってないか確認 ○ slowログも一応見る ● とりあえずリリース前に時間とか測ろう ○ utf8mb4を使う ○ 英語もちゃんと確認する

Slide 20

Slide 20 text

諦めて5.7へ一旦あげる

Slide 21

Slide 21 text

ありがとうございました