Slide 1

Slide 1 text

ぼくらが8.0に至ったみちのり(踏 破) -reprise- ぼくと8.0のこれから 2019/08/19 yoku0825 日本MySQLユーザ会会(MyNA会) 2019年8月

Slide 2

Slide 2 text

先に言いたい こといいます 1/147

Slide 3

Slide 3 text

MySQL 8.0でこれからに期待しているなうよ CHECK制約 パラレルIndex READ 式デフォルト Cloneぷらぎん!!!1 2/147

Slide 4

Slide 4 text

CHECK制約 8.0.16から もう「MySQLには無いから…」とは言わせない イマイチ ENUM型 なり Foreign KEY制約 以上のメリットを見 いだせないんだけど、Window関数と一緒でそのうちきっと 「あって良かった」的な感じになるはず 3/147

Slide 5

Slide 5 text

MySQL 8.0でこれからに期待しているなうよ CHECK制約 パラレルIndex READ 式デフォルト Cloneぷらぎん!!!1 4/147

Slide 6

Slide 6 text

パラレルIndex READ 8.0.14から 8.0.17現在、 CHECK TABLE くらいしか目立った恩恵はな いっぽい そのうち mysqldump や mysqlpump でも使ってくれるように なるんではないか Clustered Indexのパラレル読み込みだから、分析系のクエ リーはきっと使わないけれども 5/147

Slide 7

Slide 7 text

MySQL 8.0でこれからに期待しているなうよ CHECK制約 パラレルIndex READ 式デフォルト Cloneぷらぎん!!!1 6/147

Slide 8

Slide 8 text

式デフォルト 8.0.13から 今までは DATETIME とかそれ系に CURRENT_TIMESTAMP しか使 えなかった関数デフォルトが解禁 これにより、 GEO系のデータ型にデフォルト値が突っ込め るようになったり、今までデフォルトが持てなかった BLOB 型にデフォルトが設定できるようになったり DEFAULT CURRENT_DATE() + INTERVAL 1 YEAR) ‐ DEFAULT RAND() * RAND() ‐ DEFAULT UUID_TO_BIN(UUID()) ‐ 7/147

Slide 9

Slide 9 text

MySQL 8.0でこれからに期待しているなうよ CHECK制約 パラレルIndex READ 式デフォルト Cloneぷらぎん!!!1 8/147

Slide 10

Slide 10 text

Clone Plugin 全国1.000000人のDBAが待ち望んだ機能 なんとこの2行だけでオンライン物理バックアップが取れる mysql80 672> INSTALL PLUGIN clone SONAME 'mysql_clone.so'; Query OK, 0 rows affected (0.02 sec) mysql80 672> CLONE LOCAL DATA DIRECTORY '/tmp/clone'; Query OK, 0 rows affected (0.39 sec) 9/147

Slide 11

Slide 11 text

CLONE LOCAL DATA $ ll /tmp/clone total 161800 drwxr-x--- 2 yoku0825 yoku0825 85 Aug 19 16:39 #clone drwxr-x--- 2 yoku0825 yoku0825 19 Aug 19 16:39 d1 -rw-r----- 1 yoku0825 yoku0825 12582912 Aug 19 16:39 ibdata1 -rw-r----- 1 yoku0825 yoku0825 50331648 Aug 19 16:39 ib_logfile0 -rw-r----- 1 yoku0825 yoku0825 50331648 Aug 19 16:39 ib_logfile1 drwxr-x--- 2 yoku0825 yoku0825 6 Aug 19 16:39 mysql -rw-r----- 1 yoku0825 yoku0825 24117248 Aug 19 16:39 mysql.ibd drwxr-x--- 2 yoku0825 yoku0825 27 Aug 19 16:39 sys -rw-r----- 1 yoku0825 yoku0825 14680064 Aug 19 16:39 undo_001 -rw-r----- 1 yoku0825 yoku0825 13631488 Aug 19 16:39 undo_002 10/147

Slide 12

Slide 12 text

Clone Plugin 全国1.000000人のDBAが待ち望んだ機能 まずはマスター側にアカウントを作成 Cloneプラグインはインストール済みとして ‐ mysql80 674> CREATE USER cloner IDENTIFIED WITH mysql_native_pass word BY 'secret'; Query OK, 0 rows affected (0.04 sec) mysql80 674> GRANT BACKUP_ADMIN ON *.* TO cloner; Query OK, 0 rows affected (0.01 sec) 11/147

Slide 13

Slide 13 text

CLONE INSTANCE 次いでスレーブになる側 mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so'; Query OK, 0 rows affected (0.01 sec) mysql> SET GLOBAL clone_valid_donor_list = '127.0.0.1:64080'; Query OK, 0 rows affected (0.00 sec) mysql> CLONE INSTANCE FROM [email protected]:64080 IDENTIFIED BY 'secret'; Query OK, 0 rows affected (1.55 sec) /* ここでいちどRESTARTがかかる */ 12/147

Slide 14

Slide 14 text

CLONE INSTANCE あとは CHANGE MASTER TO するだけ。情報は performance_schema.clone_status にある mysql> SELECT * FROM performance_schema.clone_status\G *************************** 1. row *************************** ID: 1 PID: 0 STATE: Completed BEGIN_TIME: 2019-08-19 16:59:53.658 END_TIME: 2019-08-19 17:00:00.131 SOURCE: 127.0.0.1:64080 DESTINATION: LOCAL INSTANCE ERROR_NO: 0 ERROR_MESSAGE: BINLOG_FILE: bin.000011 BINLOG_POSITION: 195 GTID_EXECUTED: 552f89cd-aded-11e9-9af8-0201a32caf75:1-21 1 row in set (0.00 sec) 13/147

Slide 15

Slide 15 text

CLONE INSTANCE こんなエラーで START GROUP_REPLICATION に失敗しても 2019-08-19T09:24:12.214486Z 0 [Warning] [MY-013470] [Repl] Plugin group_replication reported: 'As no ONLINE member has the missing data for recovering in its binary logs, this member will use clo ning as its recovery strategy.' 2019-08-19T09:24:13.251773Z 0 [ERROR] [MY-013464] [Repl] Plugin g roup_replication reported: 'There was an issue when configuring t he remote cloning process: The clone plugin is not present or act ive in this server.' 2019-08-19T09:24:13.251836Z 0 [ERROR] [MY-013467] [Repl] Plugin g roup_replication reported: 'No valid or ONLINE members exist to g et the missing data from the group. For cloning check if donors o f the same version and with clone plugin installed exist. For dis tributed recovery check if you have donors where the required dat a was not purged from the binary logs.' 14/147

Slide 16

Slide 16 text

CLONE INSTANCE Cloneを使えばさっくりと mysql> INSTALL PLUGIN clone SONAME 'mysql_clone.so'; Query OK, 0 rows affected (0.11 sec) mysql> SET GLOBAL clone_valid_donor_list= '172.17.0.3:3306'; Query OK, 0 rows affected (0.00 sec) mysql> CLONE INSTANCE FROM [email protected]:3306 IDENTIFIED BY 'ccc'; ERROR 3707 (HY000): Restart server failed (mysqld is not managed by supervisor pro cess). mysql> CHANGE MASTER TO master_user= 'gr', master_password= 'ccc' FOR CHANNEL 'gro up_replication_recovery'; Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> SET GLOBAL group_replication_group_seeds= '172.17.0.3:13306,172.17.0.4:1330 6'; Query OK, 0 rows affected (0.00 sec) mysql> start group_replication; Query OK, 0 rows affected (3.88 sec) 15/147

Slide 17

Slide 17 text

MySQL 8.0でこれからに期待しているなうよ CHECK制約 パラレルIndex READ 式デフォルト Cloneぷらぎん!!!1 16/147

Slide 18

Slide 18 text

あなたと マイエスキューエル 今すぐ アップグレー ド 17/147

Slide 19

Slide 19 text

We are hiring! インフラエンジニア(本社(渋谷))の採用情報 | GMOメディア 株式会社 18/147

Slide 20

Slide 20 text

ここから 本編です 19/147

Slide 21

Slide 21 text

MySQL 8.0 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) 20/147

Slide 22

Slide 22 text

MySQL 8.0 mysql80 671> SELECT CURDATE() /* JST */; +------------+ | CURDATE() | +------------+ | 2019-08-19 | +------------+ 1 row in set (0.00 sec) mysql80 671> SELECT @@version; +-----------+ | @@version | +-----------+ | 8.0.17 | +-----------+ 1 row in set (0.00 sec) 21/147

Slide 23

Slide 23 text

MySQL 8.0 ナッツシェル( What is New in MySQL 8.0 の章)が何故か どんどん増える $ curl -L -s https://dev.mysql.com/doc/refman/8.0/en/mysql-nutshe ll.html | perl -nlE 'if ($_ =~ /(8\.0\.\d+)/) { say $1 }' | sort -t "." -k 3 -n | uniq -c 1 8.0.0 3 8.0.2 3 8.0.3 2 8.0.4 2 8.0.12 6 8.0.13 6 8.0.14 8 8.0.16 8 8.0.17 8.0.15はガチで8.0.14のリグレッションを1件だけ直した「メンテナンスリリース」だった。よってWhat is Newの中にはない 22/147

Slide 24

Slide 24 text

さすが変態 © tmtms 23/147

Slide 25

Slide 25 text

MySQL 8.0 「メンテナンスリリース」 だと言い張る The MySQL 8.0.12 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.13 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.14 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.16 Maintenance Release is Generally Available | MySQL Server Blog ‐ The MySQL 8.0.17 Maintenance Release is Generally Available | MySQL Server Blog ‐ 8.0.15はガチで8.0.14のリグレッションを1件だけ直した「メンテナンスリリース」だった。よって公式ブログに記事は無い() 24/147

Slide 26

Slide 26 text

さすが変態 © tmtms 25/147

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

ぼくらが8.0に至ったみちのり(踏破) -reprise- ぼくらが8.0にいたるまでのみちのり(未到) Oracle MySQL Innovation Day 2018 秋 \- connpass ‐ ぼくらが8.0に至ったみちのり(踏破) Middlewares Deep Talks\-Tokyo\-20190523 ‐ 27/147

Slide 29

Slide 29 text

この物語(の前半)は、 一年近くの期間をかけ て MySQL 8.0.15を本 番に導入するまでの話で ある… 28/147

Slide 30

Slide 30 text

おさらい 29/147

Slide 31

Slide 31 text

インスタンスの特徴 2011年にMySQL 5.5でサービス開始 文字コードは (3バイト) UTF-8 ‐ 接続元アプリケーションはJava ‐ テーブルは ほぼ InnoDBストレージエンジン ‐ 2016年、MySQL 5.6バージョンアップ 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ‐ 30/147

Slide 32

Slide 32 text

インスタンスの特徴 2011年にMySQL 5.5でサービス開始 文字コードは (3バイト) UTF-8 ‐ 接続元アプリケーションはJava ‐ テーブルは ほぼ InnoDBストレージエンジン ‐ 2016年、MySQL 5.6バージョンアップ 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ‐ 31/147

Slide 33

Slide 33 text

インスタンスの特徴 2011年にMySQL 5.5でサービス開始 文字コードは (3バイト) UTF-8 ←救いだった ‐ 接続元アプリケーションはJava ‐ テーブルは ほぼ InnoDBストレージエンジン ‐ 2016年、MySQL 5.6バージョンアップ 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ‐ 32/147

Slide 34

Slide 34 text

インスタンスの特徴 2011年にMySQL 5.5でサービス開始 文字コードは (3バイト) UTF-8 ←救いだった ‐ 接続元アプリケーションはJava ‐ テーブルは ほぼ InnoDBストレージエンジン ‐ 2016年、MySQL 5.6バージョンアップ 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ← 5.7どこ行っ た? ‐ 33/147

Slide 35

Slide 35 text

インスタンスの特徴 2011年にMySQL 5.5でサービス開始 文字コードは (3バイト) UTF-8 ←救いだった ‐ 接続元アプリケーションはJava ‐ テーブルは ほぼ InnoDBストレージエンジン ‐ 2016年、MySQL 5.6バージョンアップ 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ← 5.7どこ行っ た? データ作り直しだからいいんじゃね? ‐ 34/147

Slide 36

Slide 36 text

インスタンスの特徴 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ← 5.7どこ行っ た? データ作り直しだからいいんじゃね? ‐ 2018年秋、既存のデータもアプリも捨てられないことが確 定 35/147

Slide 37

Slide 37 text

インスタンスの特徴 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ← 5.7どこ行っ た? データ作り直しだからいいんじゃね? ‐ 2018年秋、既存のデータもアプリも捨てられないことが確 定 MySQL 5.6から8.0へのレプリケーションでのデータ移行 ‐ 36/147

Slide 38

Slide 38 text

今までMySQLのバージョンアップでやられたこと? 4.0とそれ以前 ⇒ 4.1とそれ以降 timestamp型の変更、varchar型が文字コードをサポートしたことによる地 獄 5.5 ⇒ 5.6 datetime, time, timestamp型の内部の変更、InnoDBのパラメーター変 遷、ICPが積極的に選ばれて憤死、良かれと思って設定した explicit_defaults_for_timestamp が略、 mysql_old_password 認証プラグ インがデフォルトでOFFられててあぼん 5.6 ⇒ 5.7 Condition Fanout Filterが変に選ばれて略、sql_modeの暗黙のデフォルト を変え忘れて死 37/147

Slide 39

Slide 39 text

sql_modeを弱い方に 倒せば「クエリーが通 らない!」で苦労した 記憶はなかった 38/147

Slide 40

Slide 40 text

(4.0を除 く) 39/147

Slide 41

Slide 41 text

が 40/147

Slide 42

Slide 42 text

8.0へのレプリケーションがガンガン止まる あっ、ハイ、8.0でなくなるやつですよね NO_AUTO_CREATE_USER で5.7上でもエラーにできればいいのに…! ‐ Last_Errno: 1064 Last_Error: Error 'You have an error in your SQL syntax; check th e manual that corresponds to your MySQL server version for the ri ght syntax to use near 'IDENTIFIED WITH 'mysql_native_password' A S '*4266488C892EA7950486FEC0A1CFFC1BD95' at line 1' on query. Def ault database: ''. Query: 'GRANT USAGE ON *.* TO 'yoku0825'@'%' I DENTIFIED WITH 'mysql_native_password' AS '*4266488C892EA7950486F EC0A1CFFC1BD9543F7B'' 41/147

Slide 43

Slide 43 text

8.0へのレプリケーションがガンガン止まる あっ予約語だ! binlog_format= ROW にする? (これまでは MIXED ) ‐ 片っ端からオブジェクト名をバッククォートして回る? 生SQLでなければこんな心配要らない予感 ‐ Last_SQL_Errno: 1064 Last_SQL_Error: Error 'You have an error in your SQL syntax; chec k the manual that corresponds to your MySQL server version for th e right syntax to use near 'rank) VALUES (4)' at line 1' on query . Default database: 'd1'. Query: 'INSERT INTO t1 (rank) VALUES (4 )' 42/147

Slide 44

Slide 44 text

8.0へのレプリケーションがガンガン止まる 止まるかな? と思って打ったら止まった。今は反省してい る。 FLUSH ステートメントの一部はバイナリーログに記録されるのです ‐ Last_SQL_Errno: 1064 Last_SQL_Error: Error 'You have an error in your SQL syntax; chec k the manual that corresponds to your MySQL server version for th e right syntax to use near 'QUERY CACHE' at line 1' on query. Def ault database: ''. Query: 'FLUSH QUERY CACHE' 43/147

Slide 45

Slide 45 text

感想 あんまり長期間マスター5.6, スレーブ8.0とかやると心が黒 くなる 8.0マスターならちゃんとエラーになるやつばっかり ‐ binlog_format= ROW に変えちゃったからもうわからないけ ど、予約語以外のDMLはフツーに流れていた いい加減(他の8.0関係ないところでも) ROW に変えよう… ‐ 44/147

Slide 46

Slide 46 text

感想 MySQL Shellの checkForServerUpgrade はやっておいて 損はない MySQL 5.6とそれ以前に対しても実行できる非公式なPerl5実装があ るらしいよ yoku0825/p5-mysql-upgrade-checker: Translation of MySQL Shell Upgrade Checker into Perl5 ‐ 45/147

Slide 47

Slide 47 text

レプリケーションを止めがちな「削除された機能」 Using GRANT to create users ✓ Using GRANT to modify account properties other than privilege assignments ✓ IDENTIFIED BY PASSWORD ‘hash_string’ syntax ✓ The PASSWORD() function. ✓ MySQL :: MySQL 8.0 Reference Manual :: 1.4 What Is New in MySQL 8.0 46/147

Slide 48

Slide 48 text

GRANT で直接ユーザーを作れなくなった 5.7からワーニングは出てたじゃろ? GRANT でパスワードを変えたり MAX_USER_CONNECTIONS を変えたりも できなくなった ‐ IDENTIFIED BY PASSWORD は IDENTIFIED WITH .. AS .. に変わる ‐ SET PASSWORD 構文はもうイコールの後ろに PASSWORD() 関数を噛ま せられない ‐ mysql> CREATE USER yoku0825@'%' IDENTIFIED BY 'plain_password'; mysql> GRANT DRINK beer.* TO yoku0825@'%'; mysql> ALTER USER yoku0825@'%' IDENTIFIED WITH mysql_native_passw ord AS '*hashed_password'; mysql> SET PASSWORD FOR yoku0825@'%' = 'plain_password'; 47/147

Slide 49

Slide 49 text

インスタンスの特徴 2018年、アプリケーションのフルスクラッチリファクタリ ング(?)が決定 接続元アプリケーションはPHP(Laravel)に変更 ‐ MySQLも8.0にバージョンアップすることが決定 ← 5.7どこ行っ た? データ作り直しだからいいんじゃね? ‐ 2018年秋、既存のデータもアプリも捨てられないことが確 定 MySQL 5.6から8.0へのレプリケーションでのデータ移行 ‐ しかも2011年から継ぎ足され続けた秘伝のJavaがつなぎに来る ‐ 48/147

Slide 50

Slide 50 text

インスタンスの特徴 2018年秋、既存のデータもアプリも捨てられないことが確 定 MySQL 5.6から8.0へのレプリケーションでのデータ移行 ‐ しかも2011年から継ぎ足され続けた秘伝のJavaがつなぎに来る ‐ 2018年冬、気が付く 49/147

Slide 51

Slide 51 text

インスタンスの特徴 2018年秋、既存のデータもアプリも捨てられないことが確 定 MySQL 5.6から8.0へのレプリケーションでのデータ移行 ‐ しかも2011年から継ぎ足され続けた秘伝のJavaがつなぎに来る ‐ 2018年冬、気が付く 5.6から8.0へのレプリケーション、死ぬわ… ‐ 50/147

Slide 52

Slide 52 text

インスタンスの特徴 2018年秋、既存のデータもアプリも捨てられないことが確 定 MySQL 5.6から8.0へのレプリケーションでのデータ移行 ‐ しかも2011年から継ぎ足され続けた秘伝のJavaがつなぎに来る ‐ 2018年冬、気が付く 5.6から8.0へのレプリケーション、死ぬわ… 主にSQLスレッドと俺の心が ‐ 51/147

Slide 53

Slide 53 text

インスタンスの特徴 2018年秋、既存のデータもアプリも捨てられないことが確 定 MySQL 5.6から8.0へのレプリケーションでのデータ移行 ‐ しかも2011年から継ぎ足され続けた秘伝のJavaがつなぎに来る ‐ 2018年冬、気が付く 5.6から8.0へのレプリケーション、死ぬわ… 主にSQLスレッドと俺の心が サポートされない構成だしな ‐ 52/147

Slide 54

Slide 54 text

インスタンスの特徴 2018年冬、気が付く 5.6から8.0へのレプリケーション、死ぬわ… 主にSQLスレッドと俺の心が サポートされない構成だしな ‐ 「せめて今のマスターを5.7にバージョンアップせねば…」 ‐ 53/147

Slide 55

Slide 55 text

インスタンスの特徴 2018年冬、気が付く 5.6から8.0へのレプリケーション、死ぬわ… 主にSQLスレッドと俺の心が サポートされない構成だしな ‐ 「せめて今のマスターを5.7にバージョンアップせねば…」 ‐ 「調整の結果、新規の開発とは別件としてバージョンアップを進める ことになりました」 ‐ 54/147

Slide 56

Slide 56 text

インスタンスの特徴 2018年冬、気が付く 5.6から8.0へのレプリケーション、死ぬわ… 主にSQLスレッドと俺の心が サポートされない構成だしな ‐ 「せめて今のマスターを5.7にバージョンアップせねば…」 ‐ 「調整の結果、新規の開発とは別件としてバージョンアップを進める ことになりました」 ‐ 「メンテナンス日程は新規開発のリリースメンテと合わせてやること になりました」 ‐ 55/147

Slide 57

Slide 57 text

という訳 で 56/147

Slide 58

Slide 58 text

開発開始時 master(5.6) schema1 schema2 slave(5.6) schema1 schema2 slave(5.6) schema1 schema2 slave(5.6) schema1 schema2 slave(8.0) schema1 schema2 schema3 57/147

Slide 59

Slide 59 text

スレーブから先にバージョンを上げて master(5.6) schema1 schema2 slave(5.7) schema1 schema2 slave(5.6) schema1 schema2 slave(5.6) schema1 schema2 slave(8.0) schema1 schema2 schema3 58/147

Slide 60

Slide 60 text

上げて master(5.6) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.6) schema1 schema2 slave(8.0) schema1 schema2 schema3 59/147

Slide 61

Slide 61 text

上げて master(5.6) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 60/147

Slide 62

Slide 62 text

開発が終わり master(5.6) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 61/147

Slide 63

Slide 63 text

データコンバートのリハーサルがされ master(5.6) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 62/147

Slide 64

Slide 64 text

カットーバー当日 master(5.6) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 63/147

Slide 65

Slide 65 text

データのコンバートが終わってから master(5.6) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 64/147

Slide 66

Slide 66 text

ガシャッ master(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 65/147

Slide 67

Slide 67 text

やった5.7から8.0ならレプリケーションが上手く… master(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 66/147

Slide 68

Slide 68 text

:(;゙゚’ω゚’): な んか俺が考えて たのと違う 67/147

Slide 69

Slide 69 text

今もこのまま動いています master(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(5.7) schema1 schema2 slave(8.0) schema1 schema2 schema3 68/147

Slide 70

Slide 70 text

この過程で気が付い たMySQL 8.0の良 いところ/悪いとこ ろをそっと伝えます 69/147

Slide 71

Slide 71 text

Why MySQL 8.0? iPhoneと同じで、 深い意味はないけど最新が使いたい ‐ リグレッションはあるかも知れないけれどそれで8割方は良い体験が 得られる ‐ 一度最新を使うともう過去には戻れない ‐ 70/147

Slide 72

Slide 72 text

MySQL 8.0に期待していたこと SELECT .. FOR UPDATE SKIP LOCKED JSON_TABLE 関数 Window関数 CTE(WITH句) 式インデックス 71/147

Slide 73

Slide 73 text

MySQL 8.0で危ういと思っていたこと 新しいデータディクショナリー SQLパーザーのリファクタリング SET PERSIST utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト化 72/147

Slide 74

Slide 74 text

MySQL 8.0の予想外に良かったところ Instant ADD COLUMN ROLE 73/147

Slide 75

Slide 75 text

MySQL 8.0でこれからに期待しているなうよ CHECK制約 パラレルIndex READ 式デフォルト Cloneぷらぎん!!!1 74/147

Slide 76

Slide 76 text

MySQL 8.0に期待していたこと SELECT .. FOR UPDATE SKIP LOCKED JSON_TABLE 関数 Window関数 CTE(WITH句) 式インデックス 75/147

Slide 77

Slide 77 text

SELECT .. FOR UPDATE SKIP LOCKED mysql80 28> SELECT * FROM t1 ORDER BY num LIMIT 1 FOR UPDATE; +-----+------+ | num | val | +-----+------+ | 1 | one | +-----+------+ 1 row in set (0.00 sec) mysql80 29> SELECT * FROM t1 ORDER BY num LIMIT 1 FOR UPDATE; ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction mysql80 29> SELECT * FROM t1 ORDER BY num LIMIT 1 FOR UPDATE SKIP LOCKED; +-----+------+ | num | val | +-----+------+ | 2 | two | +-----+------+ 1 row in set (0.00 sec) 76/147

Slide 78

Slide 78 text

SELECT .. FOR UPDATE SKIP LOCKED キュー的な処理向き Q4Mのようにwaitしてくれる訳ではなくて、自前でスピン する必要がある InnoDBの特性をそのまま使えるのはすごく良いんだけれど この令和の時代にMySQLでキューを新しく実装することが あるんだろうか…? 77/147

Slide 79

Slide 79 text

イマイチ 78/147

Slide 80

Slide 80 text

MySQL 8.0に期待していたこと SELECT .. FOR UPDATE SKIP LOCKED JSON_TABLE 関数 Window関数 CTE(WITH句) 式インデックス 79/147

Slide 81

Slide 81 text

JSON_TABLE関数 SELECT DISTINCT tweet_id, LEFT(REPLACE(text, '\n', '\\n'), 16) AS text FROM t2, JSON_TABLE(t2.j, '$.statuses[*]' COLUMNS ( tweet_id NUMERIC(32) PATH '$.id', text VARCHAR(300) PATH '$.text' ) ) AS json; +---------------------+----------------------+ | tweet_id | text | +---------------------+----------------------+ | 1131026738492739584 | @ikaneko MySQLメイ | | 1131025041070497792 | LAMP環境\n\nLinux, | | 1131024962121281536 | RT @OracleDev_JP | | 1131026921276317697 | RT @sirius_gener | +---------------------+----------------------+ 4 rows in set (0.00 sec) 80/147

Slide 82

Slide 82 text

JSON_TABLE関数 今までのJSON関数と違うのは、「JSONの配列型の部分を行 として扱ってFROM句サブクエリーにできること」 JSON型は使ってるけど、飽くまでアプリケーション側でシ リアライズするよなぁ… 固定の要素をカラムに切り出すだけならgenerated columnで十分だ し ‐ 81/147

Slide 83

Slide 83 text

イマイチ 82/147

Slide 84

Slide 84 text

MySQL 8.0に期待していたこと SELECT .. FOR UPDATE SKIP LOCKED JSON_TABLE 関数 Window関数 CTE(WITH句) 式インデックス 83/147

Slide 85

Slide 85 text

Window関数 たくさんあるたまごパックの在庫から、賞味期限が古い方か ら順番に100個使う mysql80 51> SELECT * FROM t1 LIMIT 3; +---------+------------+----------------+ | pack_id | egg_amount | expiration_day | +---------+------------+----------------+ | 1 | 4 | 2019-05-23 | | 2 | 1 | 2019-05-25 | | 3 | 4 | 2019-05-25 | +---------+------------+----------------+ 3 rows in set (0.00 sec) 84/147

Slide 86

Slide 86 text

Window関数 たくさんあるたまごパックの在庫から、賞味期限が古い方か ら順番に100個使う mysql80 51> SELECT pack_id, egg_amount, expiration_day, SUM(egg_a mount) OVER (ORDER BY expiration_day, pack_id) AS egg_total FROM t1 LIMIT 3; +---------+------------+----------------+-----------+ | pack_id | egg_amount | expiration_day | egg_total | +---------+------------+----------------+-----------+ | 1 | 4 | 2019-05-23 | 4 | | 27 | 2 | 2019-05-23 | 6 | | 33 | 4 | 2019-05-23 | 10 | +---------+------------+----------------+-----------+ 3 rows in set (0.01 sec) 85/147

Slide 87

Slide 87 text

Window関数 たくさんあるたまごパックの在庫から、賞味期限が古い方か ら順番に100個使う mysql80 51> WITH list AS (SELECT pack_id, egg_amount, expiration_day, SUM(egg_amoun t) OVER (ORDER BY expiration_day, pack_id) AS egg_total FROM t1), -> last_one AS (SELECT * FROM list WHERE egg_total >= 100 ORDER BY eg g_total LIMIT 1) -> SELECT * FROM list WHERE egg_total < 100 -> UNION ALL -> SELECT * FROM last_one; +---------+------------+----------------+-----------+ | pack_id | egg_amount | expiration_day | egg_total | +---------+------------+----------------+-----------+ | 1 | 4 | 2019-05-23 | 4 | | 27 | 2 | 2019-05-23 | 6 | | 33 | 4 | 2019-05-23 | 10 | .. | 489 | 3 | 2019-05-23 | 96 | | 491 | 5 | 2019-05-23 | 101 | +---------+------------+----------------+-----------+ 41 rows in set (0.04 sec) 86/147

Slide 88

Slide 88 text

Window関数 MySQLには、Window関数がなかったから、あんまり使い 方が思い浮かばないんじゃないか説 有効期限のあるものを古い方からn個…みたいなユースケー スがあって、それにベストマッチした あとはランキング(同着ありとかなしとか)で使えそう Window関数の結果カラムで絞り込みたい場合はCTEと併用 する 87/147

Slide 89

Slide 89 text

88/147

Slide 90

Slide 90 text

MySQL 8.0に期待していたこと SELECT .. FOR UPDATE SKIP LOCKED JSON_TABLE 関数 Window関数 CTE(WITH句) 式インデックス 89/147

Slide 91

Slide 91 text

CTE(WITH句) FROM句にいっぱい書き連ねるようなクエリーを WITH で先 頭にくくりだせる SELECT MAX(txt), MIN(txt) FROM ( SELECT concat(cte2.txt, cte3.txt) as txt FROM ( SELECT CONCAT(cte1.txt,'is a ') as txt FROM ( SELECT 'This ' as txt ) as cte1 ) as cte2, ( SELECT 'nice query' as txt UNION SELECT 'query that rocks' UNION SELECT 'query' ) as cte3 ) as cte4; 90/147

Slide 92

Slide 92 text

CTE(WITH句) FROM句にいっぱい書き連ねるようなクエリーを WITH で先 頭にくくりだせる WITH cte1(txt) AS (SELECT "This "), cte2(txt) AS (SELECT CONCAT(cte1.txt,"is a ") FROM cte1), cte3(txt) AS (SELECT "nice query" UNION SELECT "query that rocks" UNION SELECT "query"), cte4(txt) AS (SELECT concat(cte2.txt, cte3.txt) FROM cte2, cte3) SELECT MAX(txt), MIN(txt) FROM cte4; 91/147

Slide 93

Slide 93 text

CTE(WITH句) 管理画面とか分析的なクエリーは見通しが良くなった しかしまあそういう分析的なクエリーってMySQL遅いよ ね… 書けるようになったし速度も改善されているんだけど、やっぱりそこ まで劇的に速くなったわけではない ‐ もともと分析クエリーをMySQLでさばいていたので、見通 しが良くなっただけでも良かったとしよう 92/147

Slide 94

Slide 94 text

まあまあ 93/147

Slide 95

Slide 95 text

MySQL 8.0に期待していたこと SELECT .. FOR UPDATE SKIP LOCKED JSON_TABLE 関数 Window関数 CTE(WITH句) 式インデックス 94/147

Slide 96

Slide 96 text

式インデックス 事前に計算できる(= NOW() とかはダメ)値に対して式を通し た値をインデックスにできる 5.7ではgenerated columnを作ってそれにインデックスを足してい たが、カラムなしでインデックスだけドスンと作れる ‐ mysql> ALTER TABLE t1 ADD KEY idx_exp ((age > 20)); mysql> EXPLAIN SELECT .. FROM t1 WHERE age > 20; +----+-------------+-------+------------+------+---------------+------+---------+------+-------+---- ------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | fil tered | Extra | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+---- ------+-------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 10195 | 33.33 | Using where | +----+-------------+-------+------------+------+---------------+------+---------+------+-------+---- ------+-------------+ 1 row in set, 1 warning (0.00 sec) 95/147

Slide 97

Slide 97 text

( ゚д゚) 96/147

Slide 98

Slide 98 text

式インデックス…? mysql> EXPLAIN SELECT .. FROM t1 WHERE age > 20; +----+-------------+-------+------------+------+---------------+- -----+---------+------+-------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------+------------+------+---------------+- -----+---------+------+-------+----------+-------------+ | 1 | SIMPLE | t1 | NULL | ALL | NULL | NULL | NULL | NULL | 10195 | 33.33 | Using where | +----+-------------+-------+------------+------+---------------+- -----+---------+------+-------+----------+-------------+ 1 row in set, 1 warning (0.00 sec) 97/147

Slide 99

Slide 99 text

式インデックス オプティマイザーが選ばないインデックスは使われない 不等号とかIN演算子でもインデックス作れるのが良いところだと 思ったのに… ‐ ちょっとコスト計算キツすぎませんかね… ‐ 8.0.12では選ばれたのに… テスト環境では選ばれたのに… その他その他 98/147

Slide 100

Slide 100 text

イマイチ 99/147

Slide 101

Slide 101 text

MySQL 8.0に期待していたこと SELECT .. FOR UPDATE SKIP LOCKED JSON_TABLE 関数 Window関数 CTE(WITH句) 式インデックス 100/147

Slide 102

Slide 102 text

MySQL 8.0で危ういと思っていたこと 新しいデータディクショナリー SQLパーザーのリファクタリング SET PERSIST utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト化 101/147

Slide 103

Slide 103 text

新しいデータディクショナリー どのテーブルはどのファイルに格納されてて、カラムのデー タ型は何で…という情報を一元管理するサブシステム ここが平ファイルベースからInnoDBベース( mysql.ibd ファイルに格納される)にガラっと変わった アトミックDDL(DDLに失敗したら完全に元の状態に戻る) が実装されたのもこれのおかげ 102/147

Slide 104

Slide 104 text

新しいデータディクショナリー 全てのテーブルへのアクセスのベースになるので、 「新機 能 使わなければ 大丈夫」 といった五七五が効かない 何かあった時に回避が難しい ‐ ド新規で作ったテーブルはちゃんとテストされているだろう けど、特にMySQL 5.7未満からアップグレードを重ねてき たMySQLには㌧でもないテーブル定義が埋まっていたりす る 何故かテーブルコメントがSJISで書かれたテーブル ‐ lower_case_table_names= 1と相性が悪い… ‐ 103/147

Slide 105

Slide 105 text

新しいデータディクショナリー 「8.0ではちゃんとエラーになるような」ものが、バリデー ションが弱かった5.7とそれ以前の時点で格納されちゃって いて発火するケースが多数 インプレースアップグレードがエラーになったり ‐ mysqldumpからリストアできなかったり ‐ 逆を言うと、ド新規で8.0から作っていく場合、エラーになるからこ のケースに激突する可能性は低いと思う ‐ 体感でどんどんバグは直っていく 基本は最新を! 特にアップグレード! ‐ 104/147

Slide 106

Slide 106 text

新しいデータディクショナリー 例えば俺が苦しめられたこのバグは lower_case_table_names= 1かつパーティショニング環境 で発火する エラーログにゴミを吐くくらいならそれでもいいんだけれど、この条 件に合致するとMySQL 8.0へのインプレースアップグレードがコア ダンプして死ぬ 8.0.17で修正されました ‐ MySQL Bugs: #95576: MySQL 8.0.16 partition table report error log 105/147

Slide 107

Slide 107 text

予想通り 106/147

Slide 108

Slide 108 text

MySQL 8.0で危ういと思っていたこと 新しいデータディクショナリー SQLパーザーのリファクタリング SET PERSIST utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト化 107/147

Slide 109

Slide 109 text

SQLパーザーのリファクタリング 地味に(?)リファクタしたらしい MySQL 8.0: Refactoring and Improving the Parser | MySQL Server Blog ‐ それはそれで良いんだけど、これも全アクセスの礎になって 回避しようがない部分… Window関数やCTEの追加でごりっと手を入れるからついで に(?)リファクタなのかなあ 5.7の時もパーザーのリファクタはやりたいって言ってたしなあ ‐ 108/147

Slide 110

Slide 110 text

SQLパーザーのリファクタリング 拍子抜けするくらい何もなかった パーザーとは関係ないところで、今まで通ってた管理用のクエリーが 通らなくなった(廃止になった構文がある)とか予約語が増えたとか はある ‐ 偉いぞ 109/147

Slide 111

Slide 111 text

よかった 110/147

Slide 112

Slide 112 text

MySQL 8.0で危ういと思っていたこと 新しいデータディクショナリー SQLパーザーのリファクタリング SET PERSIST utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト化 111/147

Slide 113

Slide 113 text

SET PERSIST SET GLOBAL は現在の設定値を更新するだけで mysqld を再起 動すると揮発する 永続化させたければ自分で my.cnf を更新しないといけない ‐ SET PERSIST は現在の設定値を更新した上で $datadir/ mysqld-auto.cnf に変更内容を記録する SQLインターフェイスだけで設定の永続化までやってくれる ‐ 112/147

Slide 114

Slide 114 text

SET PERSIST /etc/my.cnf と $datadir/mysqld-auto.cnf に同じパラメー ターに対する設定があった場合、優先されるのはどっち? my.cnf 系が読み込まれた後に mysqld-auto.cnf が読まれる ‐ MySQLのパラメーター設定は 後勝ち ‐ つまり mysqld-auto.cnf の方が強い ‐ 「my.cnf編集して再起動したんですけど、 max_connections増えてない…」「それ、mysqld- auto.cnfから読んでるんじゃ?」みたいなことはありそう 113/147

Slide 115

Slide 115 text

SET PERSIST MySQL開発チームの中の人とかは、「my.cnfを編集できな い、SQLインターフェイスしかないマネージドなMySQLで も設定変更を可能に」的なことを言っていたけど そもそも SET GLOBAL や SET PERSIST に必要なSuper権限を認めてい ないマネージドMySQLとか ‐ 提供している側からすれば「どっちが優先されるの問題」でエンド ユーザーに混乱を招く原因になりかねないとか ‐ 稼働中にいきなり着火する系ではないのが救い 114/147

Slide 116

Slide 116 text

イマイチ 115/147

Slide 117

Slide 117 text

MySQL 8.0で危ういと思っていたこと 新しいデータディクショナリー SQLパーザーのリファクタリング SET PERSIST utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト化 116/147

Slide 118

Slide 118 text

utf8mb4_0900_ai_ci character_set_server のデフォルトが latin1 から utf8mb4 に こっちはそのまま使ってる日本人は少ないと思うので別にいいと思う けど ‐ character_set_server= utf8mb4 の時のデフォルトの照合順 序が変更になった utf8mb4_general_ci から utf8mb4_0900_ai_ci に ‐ 117/147

Slide 119

Slide 119 text

utf8mb4_0900_ai_ci collation mysql = MySQL ハハ != パパ びょういん ! = びようい ん != MySQL = M ySQL = != ≠ utf8mb4 _genera l_ci o o o x x o utf8mb4 _0900_ ai_ci o x x o o x utf8mb4 _ja_090 0_as_cs x o o o o o utf8mb4 _bin x o o o x o 118/147

Slide 120

Slide 120 text

utf8mb4_0900_ai_ci kamipoのハハ=パパ問題 ActiveRecordでデフォルトの照合順序を変更する \- Qiita ‐ びょういん=びよういん問題 MySQL Bugs: #79977: utf8mb4_unicode_520_ci don’t make sense for Japanese FTS ‐ イコールイコールノットイコール問題 MySQL Bugs: #92899: Incorrect uniqueness determination with equality symbols ‐ 問題 https://twitter.com/tmtms/status/546925668424896512 ‐ MySQL Bugs: #76553: Sushi\-Beer issue of MySQL with utf8mb4 ‐ 119/147

Slide 121

Slide 121 text

utf8mb4_0900_ai_ci 問題になりそうな場合は collation_server の変更を忘れず に 個人的には utf8mb4_bin, メールアドレスとかで大文字小文字を握り つぶしたいなら utf8mb4_general_ci かなぁ… ‐ これはMySQL 8.0の最初期から言ってきたことなので、み んな既に知っていることだといいな… 120/147

Slide 122

Slide 122 text

気を付け てね! 121/147

Slide 123

Slide 123 text

MySQL 8.0で危ういと思っていたこと 新しいデータディクショナリー SQLパーザーのリファクタリング SET PERSIST utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト 化 122/147

Slide 124

Slide 124 text

caching_sha2_password認証プラグイン 新規導入の認証プラグインがデフォルトになるというなかな かデカい これも稼働中に着火する系ではないのが救い ‐ MySQL 5.7.22とそれ以前のバージョンのクライアントには この認証プラグインが存在しない 古いバージョンのライブラリー && デフォルトの設定だと接続がで きない ‐ 123/147

Slide 125

Slide 125 text

caching_sha2_password認証プラグイン これも結構前から言ってきたし、だいたいにしてエラーにな るのでだいぶ浸透している感はある 日々の覚書: MySQL 8.0.4におけるデフォルト認証形式の変更 ‐ しかし接続できないことより罠いのは、「少なくとも最初の 1回はセキュアな方法で接続しなければならない」というク ライアントライブラリーの仕様 日々の覚書: MySQL 8.0のcaching_sha2_password + 非SSL接続 が転ける ‐ 124/147

Slide 126

Slide 126 text

気を付け てね! 125/147

Slide 127

Slide 127 text

MySQL 8.0で危ういと思っていたこと 新しいデータディクショナリー SQLパーザーのリファクタリング SET PERSIST utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト化 126/147

Slide 128

Slide 128 text

MySQL 8.0の予想外に良かったところ Instant ADD COLUMN ROLE 127/147

Slide 129

Slide 129 text

Instant ADD COLUMN MySQL 5.6とそれ以降の「オンラインALTER TABLE」とは 違うもの オンラインで(= テーブルへの書き込みを許容しながら)実行できる 点は一緒 ‐ 「既存の行の再構築を行わずにメタデータの調整だけでカラ ムを追加する」という超絶技術 128/147

Slide 130

Slide 130 text

Instant ADD COLUMN 100万行, 100MBくらいのテーブルに対して mysql80 20> ALTER TABLE t1 ADD c1 int, ALGORITHM= INSTANT; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql80 20> ALTER TABLE t1 ADD c2 int, ALGORITHM= INPLACE; Query OK, 0 rows affected (3.43 sec) Records: 0 Duplicates: 0 Warnings: 0 129/147

Slide 131

Slide 131 text

INSTANT ADD COLUMN ALGORITHM = INSTANT ----system---- ----total-cpu-usage---- -dsk/total- ---system-- ------mem ory-usage----- --io/total- | time | usr sys idl wai hiq siq | read writ | int csw | used buff cach free | read writ | | 20-11 16:44:56 | 2 1 97 1 0 0 | 0 6409k | 877 996 | 692M 0 172M 127M | 0 222 | | 20-11 16:44:57 | 3 1 96 0 0 0 | 128k 394k | 1545 2509 | 692M 0 172M 127M | 8.00 63.0 | | 20-11 16:44:58 | 2 0 98 0 0 0 | 0 6410k | 901 982 | 692M 0 172M 127M | 0 225 | | 20-11 16:44:59 | 2 1 97 1 0 0 | 3260k 972k | 908 927 | 692M 0 175M 124M | 54.0 41.0 | | 20-11 16:45:00 | 2 0 98 0 0 0 | 0 0 | 641 772 | 692M 0 175M 124M | 0 0 | 17338 buffer_pages_written 2018-11-20 16:44:56 17347 buffer_pages_written 2018-11-20 16:44:57 17547 buffer_pages_written 2018-11-20 16:44:58 17577 buffer_pages_written 2018-11-20 16:44:59 17577 buffer_pages_written 2018-11-20 16:45:00 130/147

Slide 132

Slide 132 text

INSTANT ADD COLUMN ALGORITHM = INPLACE ----system---- ----total-cpu-usage---- -dsk/total- ---system-- ------memory-usage----- --io/total- | time | usr sys idl wai hiq siq | read writ | int csw | used buff ca ch free | read writ | | 20-11 16:45:00 | 2 0 98 0 0 0 | 0 0 | 641 772 | 692M 0 17 5M 124M | 0 0 | | 20-11 16:45:01 | 35 5 49 10 0 0 | 14M 78M | 14k 34k | 692M 0 17 5M 124M | 897 2150 | | 20-11 16:45:02 | 13 5 49 32 0 0 | 37M 51M | 9577 16k | 701M 0 20 5M 85.1M | 1213 3318 | | 20-11 16:45:03 | 19 8 49 23 0 0 | 14M 51M | 12k 18k | 693M 0 20 6M 91.7M | 245 5287 | | 20-11 16:45:04 | 3 2 85 10 0 0 | 6028k 31M | 6985 13k | 693M 0 21 1M 87.7M | 142 3098 | | 20-11 16:45:05 | 2 0 98 0 0 0 | 0 419k | 681 817 | 693M 0 21 1M 87.7M | 0 20.0 | 17577 buffer_pages_written 2018-11-20 16:45:00 18047 buffer_pages_written 2018-11-20 16:45:01 19139 buffer_pages_written 2018-11-20 16:45:02 21147 buffer_pages_written 2018-11-20 16:45:03 21591 buffer_pages_written 2018-11-20 16:45:04 21604 buffer_pages_written 2018-11-20 16:45:05 131/147

Slide 133

Slide 133 text

INSTANT ADD COLUMN どういう黒魔術使ってるんだってくらい速い MySQL 8.0: InnoDB now supports Instant ADD COLUMN | MySQL Server Blog ‐ Tencent Gamesがパッチを寄贈したらしい ぼく「さすが自分たちで使い倒している企業は俺たちが欲しいものをよくわかって いる」 ‐ バッファプールも全然触らなくてすごい 楽しくて笑えてくるレベル ‐ ENUM型の定義変更も ALGORITHM = INSTANT でできるらしい ですよ!!!1 132/147

Slide 134

Slide 134 text

これはいい ものだ 133/147

Slide 135

Slide 135 text

MySQL 8.0の予想外に良かったところ Instant ADD COLUMN ROLE 134/147

Slide 136

Slide 136 text

ROLE IPアドレス単位でアカウント作ってる人にはわかってもらえ るかしらん MySQL側ではホスト部を指定せずに、セキュリティーグループとか で接続元を絞ってる場合はそんなに嬉しくないと思う ‐ mysql> CREATE USER apuser@apserver1; mysql> GRANT ALL ON ap_db.* TO apuser@apserver1; mysql> CREATE USER apuser@apserver2; mysql> GRANT ALL ON ap_db.* TO apuser@apserver2; mysql> CREATE USER apuser@apserver3; mysql> GRANT ALL ON ap_db.* TO apuser@apserver3; .. 135/147

Slide 137

Slide 137 text

ROLE 「すいません、新機能はスキーマを分けて開発することに なったので、既存のアカウントが新スキーマにもアクセスで きるように設定してください」 ( ゚д゚) えっ mysql> GRANT ALL ON new_db.* TO apuser@apserver1; mysql> GRANT ALL ON new_db.* TO apuser@apserver2; mysql> GRANT ALL ON new_db.* TO apuser@apserver3; .. 136/147

Slide 138

Slide 138 text

ROLE 「すいません、新機能はサーバーもわけることになりまし た。既存のアカウントは今まで通りap_dbだけ、新サーバー 用のアカウントはap_dbの読み取りとnew_dbの読み書き権 限を」 ( ゚д゚) えっえっ mysql> REVOKE ALL ON new_db.* FROM apuser@apserver1; mysql> REVOKE ALL ON new_db.* FROM apuser@apserver2; mysql> REVOKE ALL ON new_db.* FROM apuser@apserver3; .. mysql> CREATE USER apuser@apserver11; mysql> GRANT ALL ON new_db.* TO apuser@apserver11; mysql> GRANT SELECT ON ap_db.* TO apuser@apserver11; .. 137/147

Slide 139

Slide 139 text

ROLE 「すいませんやっぱりスキーマの名前をへんk」 ( д ) ゚ ゚ ファー 138/147

Slide 140

Slide 140 text

ROLE mysql> CREATE ROLE ap_rw; mysql> GRANT ALL ON ap_db.* TO ap_rw; mysql> CREATE USER apuser@apserver1 DEFAULT ROLE ap_rw; mysql> CREATE USER apuser@apserver2 DEFAULT ROLE ap_rw; mysql> CREATE USER apuser@apserver3 DEFAULT ROLE ap_rw; .. 139/147

Slide 141

Slide 141 text

ROLE mysql> GRANT ALL ON new_db.* TO ap_rw; mysql> REVOKE ALL ON new_db.* FROM ap_rw; mysql> CREATE ROLE ap_ro; mysql> GRANT SELECT ON ap_db.* TO ap_ro; mysql> CREATE ROLE new_rw; mysql> GRANT ALL ON new_db.* TO new_rw; mysql> GRANT ap_ro TO new_rw; mysql> CREATE USER apuser@apserver11 DEFAULT ROLE new_rw; .. 140/147

Slide 142

Slide 142 text

ROLE IPアドレス単位でアカウントを作成している現場にはとても 便利だと思う MySQLアカウントのIPアドレスの制限をせずに、セキュリティーグ ループとかで制限する環境には特に嬉しくもないかも ‐ デフォルトロールのみだと「アカウントのグルーピング」に 留まるけれども ロールの継承 ‐ SET ROLE による sudo ちっくな動き ‐ この辺りを上手く使うと、ワンタイム権限の払い出しが楽になるかも ‐ 141/147

Slide 143

Slide 143 text

積極的に使っ ていきたい 142/147

Slide 144

Slide 144 text

MySQL 8.0の予想外に良かったところ Instant ADD COLUMN ROLE 143/147

Slide 145

Slide 145 text

MySQL 8.0でこれからに期待しているなうよ(冒頭のや つ) CHECK制約 パラレルIndex READ 式デフォルト Cloneぷらぎん!!!1 144/147

Slide 146

Slide 146 text

まとめ Window関数 CTE(WITH句) 新しいデータディクショナリー utf8mb4_0900_ai_ci caching_sha2_password 認証プラグインのデフォルト化 Instant ADD COLUMN ROLE Cloneぷらぎん!!!1 145/147

Slide 147

Slide 147 text

あなたと マイエスキューエル 今すぐ アップグレー ド 146/147

Slide 148

Slide 148 text

Any Questions and/or Suggestions? 147/147