Slide 1

Slide 1 text

罠と呼ぶには大したことない (フィクションの)MySQL 8.0のはなし みんなこういうのが好きなんでしょ? 2019/12/01 yoku0825 PHP Conference Japan 2019

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

罠と言うほど大したものはありませんが © tomomo1015 -san 2/31

Slide 4

Slide 4 text

binlog_expire_logs_seconds 3/31

Slide 5

Slide 5 text

binlog_expire_logs_seconds expire_logs_days (単位は “日”) が非推奨、 binlog_expire_logs_seconds (単位は “秒”, デフォルト2592000秒=30日)に 「明示的に指定してないからbinlog消えない設定になってる」「ざんねーん、8.0 ちゃんでしたー」 4/31

Slide 6

Slide 6 text

default_authentication_plugin 5/31

Slide 7

Slide 7 text

default_authentication_plugin MySQL 5.6とそれ以前には存在しない認証( caching_sha2_password )がデフォル トに 「最近のクライアント使えば通るでしょ」 「最初の1回はSSLかソケット接続でないと転ける」 「なにそれ」 日々の覚書: MySQL 8.0.4におけるデフォルト認証形式の変更 日々の覚書: MySQL 8.0のcaching_sha2_password + 非SSL接続が転ける 6/31

Slide 8

Slide 8 text

collation_server 7/31

Slide 9

Slide 9 text

collation_server MySQL 8.0から character_set_server のデフォルトが utf8mb4 に変更 ついでに utf8mb4 のデフォルトコレーションも utf8mb4_0900_ai_ci に変更 「コレーションって何…」 8/31

Slide 10

Slide 10 text

collation_server collation mysql = MySQL ハハ != パパ びょういん != び よういん != MySQL = MyS QL = != ≠ utf8mb4_ge neral_ci o o o x x o utf8mb4_09 00_ai_ci o x x o o x utf8mb4_ja_ 0900_as_cs x o o o o o utf8mb4_bin x o o o x o 9/31

Slide 11

Slide 11 text

information_schema_stats_expiry 10/31

Slide 12

Slide 12 text

information_schema_stats_expiry SHOW TABLE STATUS の結果をキャッシュするよ! デフォルトは 86400 秒 = 1日だよ! 「誰得」 日々の覚書: MySQL 8.0のSHOW TABLE STATUSが全然更新されない件 11/31

Slide 13

Slide 13 text

innodb_autoinc_lock_mode 「デフォルトが2になった」 「なるとどうなるの?」 「同時に INSERT INTO .. や LOAD DATA INFILE .. で連番を払い出そうとすると混 じる」 「マジか」 日々の覚書: innodb_autoinc_lock_mode = 1 vs 2 でバルクインサートが競合し た時のAUTO_INCREMENTの挙動が違うはなし 12/31

Slide 14

Slide 14 text

internal_tmp_disk_storage_engine 13/31

Slide 15

Slide 15 text

internal_tmp_disk_storage_engine 「パラメーターなくなった」 「ということは?」 「TempテーブルがDiskに落ちると必ずInnoDB」 「うわあ」 「InnoDBのテンポラリーテーブルはあふれると死ぬ」 「ぎゃあ」 日々の覚書: MySQL 5.7.6以降では暗黙のテンポラリーテーブルがあふれると死ぬ 14/31

Slide 16

Slide 16 text

local_infile 15/31

Slide 17

Slide 17 text

local_infile 「 LOAD DATA LOCAL INFILE を使うには local_infile = 1 を明示的に設定しない といけなくなった」 「面倒」 「しかもこれ mysql コマンドラインクライアント側でも有効にする必要がある」 「何それ」 「両方とも同じ名前の別のパラーメーター」 日々の覚書: MySQL 8.0でLOAD DATA LOCAL INFILEが “ERROR 1148 (42000): The used command is not allowed with this MySQL version” で失 敗する時 16/31

Slide 18

Slide 18 text

log_error_verbosity 17/31

Slide 19

Slide 19 text

log_error_verbosity 「バージョンアップしてからログ出力減ったな…」「デフォルトではワーニング以 上しか出さなくなったからね」「マ!?」 18/31

Slide 20

Slide 20 text

log_slave_updates 19/31

Slide 21

Slide 21 text

log_slave_updates 「バージョンアップしてからスレーブの容量が大きくなった?」 「log_slave_updatesデフォルトになったからね」「マ!?」 20/31

Slide 22

Slide 22 text

master_info_repository, relay_log_info_repository 21/31

Slide 23

Slide 23 text

master_info_repository, relay_log_info_repository 「バージョンアップしてから master.info と relay-log.info が消えた…」 「 mysql スキーマの slave_master_info テーブルと slave_relay_log_info テーブ ルに記録されてるで」 「オフラインで参照するのが難しくなった…」 22/31

Slide 24

Slide 24 text

mysqlx 23/31

Slide 25

Slide 25 text

mysqlx 「バージョンアップしてから何故か3306と33060ポートをLISTENしている…」 「Xプロトコルを喋るためのポートを自動でLISTENするで」 「しかもドキュメントに無効化する方法が書いてない…」 「 mysqlx = OFF でできる」 24/31

Slide 26

Slide 26 text

GROUP BYによる 暗黙のソートがなく なる 25/31

Slide 27

Slide 27 text

GROUP BYによる暗黙のソートがなくなる 「ORDER BYのないGROUP BYは5.7とそれ以前と結果が変わるかも知れない」 「…フツーでは?」 「フツーなんだけどさ」 日々の覚書: MySQL 8.0では「GROUP BYによる暗黙のソート」がされなくなるよ 26/31

Slide 28

Slide 28 text

GROUP BYによる暗黙のソートがなくなる 27/31

Slide 29

Slide 29 text

増える予約 語 28/31

Slide 30

Slide 30 text

増える予約語 「ADMINがダメになったんだっけ?」 「そういうレベルでなく「増えてる」」 version 予約語 8.0.0 ROLE 8.0.1 GROUPING, RECURSIVE, OF, CUBE 8.0.2 ROW, CUME_DIST, DENSE_RANK, FIRST_VALUE, GROUPS, LAG, LAST_VALUE, LEAD, NTH_VALUE, NTILE, OVER, PERCENT_RANK, RANK, ROW_NUMBER, WINDOW 8.0.14 LATERAL 8.0.17 ARRAY, MEMBER 29/31

Slide 31

Slide 31 text

増える予約語 増えるだけじゃなくてたまに「減ってる」 心のMockだけじゃなくて 本物のMySQLを使った回帰テストを書くのが超オスス メ 個人的には「英2単語以上を “_” 区切り」ならそうそう食らわないし ‐ どうしても1単語にするなら先頭に “_” をつけておくと回避率が高い ‐ SELECT * FROM information_schema.keywords WHERE reserved = 1 の結果を比較したい… と思ったら “ARRAY” を information_schema.keywords にリストするの忘れた、とかいうバグ修正があって草w ww https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-18.html ‐ 30/31

Slide 32

Slide 32 text

Any Questions and/or Suggestions? 31/31