Slide 1

Slide 1 text

MySQLを学ぶ技術 はんなり豆腐は如何にしてMySQLを学んだか(仮) 2020/01/17 yoku0825 DevelopersNight 01

Slide 2

Slide 2 text

免責事項 生存バイアスがめちゃめちゃかかってると思います ところどころCMが入ります 1/60

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

\こんばんは/ yoku0825@ とある企業のDBA GMOメディア オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter: @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ GMO Media, Inc. ‐ 3/60

Slide 5

Slide 5 text

TL;DR ドキュメントを読もう エラーメッセージを読もう 試そう 知識をアップデートしよう 4/60

Slide 6

Slide 6 text

TL;DR ドキュメントを読もう エラーメッセージを読もう 試そう 知識をアップデートしよう 5/60

Slide 7

Slide 7 text

ドキュメントを読もう MySQL :: MySQL Documentation 6/60

Slide 8

Slide 8 text

ドキュメントを読もう MySQL :: MySQL Documentation 7/60

Slide 9

Slide 9 text

ドキュメントを読もう MySQL :: MySQL Documentation 8/60

Slide 10

Slide 10 text

ドキュメントを読もう 取っ掛かりとしてはMySQL 5.6の日本語版 PDFならスマホでも読める これを一通り読んでればたぶんMySQL 5.7の認定試験も通る 一通り #とは ‐ 9/60

Slide 11

Slide 11 text

ドキュメントを読もう …と思ったら 10/60

Slide 12

Slide 12 text

( ゚д゚) 11/60

Slide 13

Slide 13 text

ドキュメントを読もう MySQL Bugs: #98232: MySQL 5.6 Japanese Doc PDF is broken 12/60

Slide 14

Slide 14 text

ドキュメントを読もう 「暗記しよう」とは言ってない MySQL 5.6日本語版はA4で3482ページ :-P ‐ 人間、「こんなのあったようななかったような」というのは調べられるけれども、 存在すら知らないものを検索だけでたどり着くのは(まだ)難しい 13/60

Slide 15

Slide 15 text

ドキュメントを読もう MySQL 5.6日本語版は「MySQL 5.6.23まで」 MySQL 5.6.23は2015/2/2 :-P ‐ MySQL 5.6の情報でさえ日本語情報を鵜呑みにするのは危険 ‐ 日本語で調べて、URLから「自分が本当に調べたいバージョンの英語版リファレン ス」に飛ぶ MySQL :: MySQL 5.6 リファレンスマニュアル :: 14.11 InnoDB とオンライン DDL https://dev.mysql.com/doc/refman/5.6/ja/innodb-online-ddl.html ‐ MySQL :: MySQL 8.0 Reference Manual :: 15.12 InnoDB and Online DDL https://dev.mysql.com/doc/refman/8.0/en/innodb-online-ddl.html ‐ 14/60

Slide 16

Slide 16 text

ドキュメントを読もう リファレンスマニュアル本編の他に “What Is New” と “Release Notes” MySQL :: MySQL 8.0 Reference Manual :: 1.4 What Is New in MySQL 8.0 ‐ MySQL :: MySQL 8.0 Release Notes ‐ 15/60

Slide 17

Slide 17 text

What Is New MySQLのバージョン番号は、本当はずっと “メジャーバージョン.マイナーバー ジョン.バージョン番号” “メジャーバージョン.マイナーバージョン” の2桁を取って “リリースシリーズ” と読んでいる MySQL :: MySQL 8.0 Reference Manual :: 2.1.1 Which MySQL Version and Distribution to Install ‐ ドキュメントは “リリースシリーズ” 単位で分冊 実質 “リリースシリーズ” がメジャーバージョンみたいな感じ( だった ) 今はメンテナンスリリースにリリースシリーズ変更ばりの新機能をぶち込んできやがる… ‐ リリースシリーズをまたいだ新機能や非互換のリストはここに多くが含まれている 簡単な説明と、本編へのハイパーリンクが含まれているのでインデックスとして便利 ‐ 16/60

Slide 18

Slide 18 text

Release Notes 開発初期はそのバージョンで実装された新機能が載ったりするけど、一般リリース 以降はバグフィックスノートが主 ( のはずなんだけどなぁ ) MySQL 8.0系は 何故か メンテナンスリリースで機能が増えるので、粒度が小さい “What Is New” みたいになってる… バグフィックスノートには対応するバグ番号が載ったりもする 自分でレポートしたのが載ってるとテンション上がる ‐ 5桁のバグ番号は オープンなバグトラッキングシステム のもの、8桁のバグ番号は開発者の内 部BTSのもの ‐ 17/60

Slide 19

Slide 19 text

ドキュメントを読もう ドキュメントは適宜更新される ドキュメントに誤りが見つかった時 ‐ 新しい機能が追加された時 ‐ 18/60

Slide 20

Slide 20 text

ドキュメントを読もう ドキュメントは適宜更新される ドキュメントに誤りが見つかった時 バグトラッキングシステム には「Category: Docs」がある ドキュメントの間違いもレポートすればMySQLへの貢献 ‐ 新しい機能が追加された時 ‐ 19/60

Slide 21

Slide 21 text

ドキュメントを読もう mysql> HELP START SLAVE; Name: 'START SLAVE' Description: Syntax: START SLAVE [thread_types] [until_option] [connection_options] [channel_option] thread_types: [thread_type [, thread_type] ... ] thread_type: IO_THREAD | SQL_THREAD .. URL: http://dev.mysql.com/doc/refman/8.0/en/start-slave.html MySQLのHELP構文ってやつ - そろばんのしょ(第3版第2刷) 20/60

Slide 22

Slide 22 text

ドキュメントを読もう σ(゚∀゚ ) しばらく実機を使って半年とかしてから取説を全部読むのが好きな人 「おう、お前そんな機能あったのな」というのに出会えるのが楽しい タフな基礎体力をつける一番の近道だと思う(個人差があります) 21/60

Slide 23

Slide 23 text

TL;DR ドキュメントを読もう エラーメッセージを読もう 試そう 知識をアップデートしよう 22/60

Slide 24

Slide 24 text

エラーメッセージを読もう 2018-07-12T00:00:46.520037+09:00 9 [ERROR] [MY-010584] [Repl] Slave SQL for channel '': E rror 'You have an error in your SQL syntax; check the manual that corresponds to your MyS QL server version for the right syntax to use near 'rank, app_id ) VALUES ( 1, 0, 1, 8660 )' at line 1' on query. Default database: 'xxx'. Query: 'REPLACE INTO t1 ( ki nd, genre, rank, id ) VALUES ( 1, 0, 1, 8660 )', Error_code: MY-001064 23/60

Slide 25

Slide 25 text

エラーメッセージを読もう Slave SQL for channel ‘’: Error You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 24/60

Slide 26

Slide 26 text

エラーメッセージを読もう Slave SQL for channel ‘’: Error ’’ (空文字列) というチャンネルのSQLスレッドでなんかエラーが起きた ‐ You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near SQL構文にエラーがあります。近くで使用する正しい構文については、MySQLサーバーのバー ジョンに対応するマニュアルを確認してください translated by Google翻訳 ‐ 25/60

Slide 27

Slide 27 text

エラーメッセージを読もう Slave SQL for channel ‘’: Error ’’ (空文字列) というチャンネルのSQLスレッドでなんかエラーが起きた チャンネル .. マルチソースレプリケーション実装(5.7)以降に導入された概念でデフォルトは ‘’ (空文字列) SQLスレッド .. レプリケーションスレーブで動作するスレッド、SQLを実行する役割がある。対義語(?)はI/Oス レッド ‐ You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near SQL構文にエラーがあります。近くで使用する正しい構文については、MySQLサーバーのバー ジョンに対応するマニュアルを確認してください translated by Google翻訳 ‐ 26/60

Slide 28

Slide 28 text

エラーメッセージを読もう 用語は押さえておく必要がある 英語版ドキュメントに一通り目を通して(とまでは言わない、3割くらい対訳っぽく参照したこ とがあればなんとなくわかる希ガス) 分からない単語を逐次調べていれば だいたい一度はあた ると思う ‐ 一応用語集もあるからここに載ってればきっとMySQL用語 MySQL :: MySQL 8.0 Reference Manual :: MySQL Glossary ‐ 27/60

Slide 29

Slide 29 text

エラーメッセージを読もう 2020-01-15T11:45:24.621792+09:00 0 [ERROR] [MY-010520] [Server] Invalid (old?) table or d atabase name 'user_info#p#pmax' 28/60

Slide 30

Slide 30 text

エラーメッセージを読もう Invalid (old?) table or database name 無効な(古い?)テーブルまたはデータベース名 translated by Google翻訳 ‐ 29/60

Slide 31

Slide 31 text

エラーメッセージを読もう 読んで、意味を何となく理解して初めて、「いや、それは違う」と言える 無効な名前じゃない、だって8.0.13とそれ以前はちゃんと動いてたんだから ‐ MySQL Bugs: #94519: Wrong messages in error-log when using partition with lower- case-table-names=1 ‐ 30/60

Slide 32

Slide 32 text

エラーメッセージを読もう 2019-05-10T17:24:32.227759+09:00 225846 [Warning] [MY-010897] [Repl] Storing MySQL user n ame or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. 31/60

Slide 33

Slide 33 text

エラーメッセージを読もう MySQLのユーザー名またはパスワード情報をマスター情報リポジトリに保存する ことは安全ではないため、お勧めしません。 START SLAVEのUSERおよび PASSWORD接続オプションの使用を検討してください。 詳細については、 MySQLマニュアルの「START SLAVE Syntax」を参照してください。 translated by Google翻訳 ‐ 32/60

Slide 34

Slide 34 text

Google翻訳 すごい 33/60

Slide 35

Slide 35 text

エラーメッセージを読もう 2018-07-12T00:00:46.520037+09:00 9 [ERROR] [MY-010584] [Repl] Slave SQL for channel '': E rror 'You have an error in your SQL syntax; check the manual that corresponds to your MyS QL server version for the right syntax to use near 'rank, app_id ) VALUES ( 1, 0, 1, 8660 )' at line 1' on query. Default database: 'xxx'. Query: 'REPLACE INTO t1 ( ki nd, genre, rank, id ) VALUES ( 1, 0, 1, 8660 )', Error_code: MY-001064 事象である “MySQL レプリケーション 止まる” だと原因が多すぎてググラビリ ティは低い “MySQL シンタックスエラー レプリケーション” だと一発でたどり着けた MySQL :: MySQL 5.6 リファレンスマニュアル :: 17.4.1.25 レプリケーションと予約語 ‐ ちなみにこれ RANK が予約語になった影響で転けたやーつ ‐ 34/60

Slide 36

Slide 36 text

エラーメッセージを読もう 2018-07-12T00:00:46.520037+09:00 9 [ERROR] [MY-010584] [Repl] Slave SQL for channel '': E rror 'You have an error in your SQL syntax; check the manual that corresponds to your MyS QL server version for the right syntax to use near 'rank, app_id ) VALUES ( 1, 0, 1, 8660 )' at line 1' on query. Default database: 'xxx'. Query: 'REPLACE INTO t1 ( ki nd, genre, rank, id ) VALUES ( 1, 0, 1, 8660 )', Error_code: MY-001064 エラー番号は案外情報が欠落するのでググるにはやりにくい MY-* 形式のメッセージが出るようになったのは8.0から 運良く8.0を使って同じエラーを踏んだ人が日本語で情報を書いていることに期待できるかどうか ‐ 1064 はシンタックスエラーの方のエラー番号で、 10584 の方がスレーブでエラーが発生したエ ラー番号(SQLスレッドとI/Oスレッドの区別はない) 二種類混じってることにぱっと見気付けるかどうか… ‐ 35/60

Slide 37

Slide 37 text

ワーニングも読もう mysql80 11> CREATE DATABASE d2 CHARSET utf8; Query OK, 1 row affected, 1 warning (0.11 sec) mysql80 11> SHOW WARNINGS; +---------+------+----------------------------------------------------------------------- ----------------------------------------------------------------------------------------- -------------+ | Level | Code | Message | +---------+------+----------------------------------------------------------------------- ----------------------------------------------------------------------------------------- -------------+ | Warning | 3719 | 'utf8' is currently an alias for the character set UTF8MB3, but will b e an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous. | +---------+------+----------------------------------------------------------------------- ----------------------------------------------------------------------------------------- -------------+ 1 row in set (0.00 sec) 36/60

Slide 38

Slide 38 text

ワーニングも読もう ‘utf8’ is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous. 「utf8」は現在、文字セットUTF8MB3のエイリアスですが、将来のリリースではUTF8MB4の エイリアスになります。 明確にするためにUTF8MB4の使用を検討してください translated by Google翻訳 ‐ 37/60

Slide 39

Slide 39 text

ワーニングも読もう mysql80 11> CREATE DATABASE d3 CHARSET utf8mb3; Query OK, 1 row affected, 1 warning (0.01 sec) mysql80 11> SHOW WARNINGS; +---------+------+----------------------------------------------------------------------- ----------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------------------------- ----------------------+ | Warning | 1287 | 'utf8mb3' is deprecated and will be removed in a future release. Pleas e use utf8mb4 instead | +---------+------+----------------------------------------------------------------------- ----------------------+ 1 row in set (0.00 sec) 38/60

Slide 40

Slide 40 text

ワーニングも読もう ‘utf8mb3’ is deprecated and will be removed in a future release. Please use utf8mb4 instead 「utf8mb3」は非推奨であり、将来のリリースで削除される予定です。 代わりにutf8mb4を使 用してください translated by Google翻訳 ‐ 39/60

Slide 41

Slide 41 text

ワーニングも読もう ワーニングメッセージはクエリーを実行した直後だけしか参照できない アプリケーションから実行したクエリーのワーニングはアプリケーションが他のクエリーを実 行する前に SHOW WARNINGS を押し込んでやらないといけない ‐ 人口に膾炙しているORMでそこまで面倒を見てくれるものなのかどうか謎 ‐ 40/60

Slide 42

Slide 42 text

エラーメッセージを読もう 怖くないよ、Google翻訳があれば なくても怖くはないけど(当方英検3級) ※感じ方には個人差があります ‐ 「たったそれだけ」のことだけれど、エラーメッセージを読んだり理解しようとし ない人は多い 41/60

Slide 43

Slide 43 text

TL;DR ドキュメントを読もう エラーメッセージを読もう 試そう 知識をアップデートしよう 42/60

Slide 44

Slide 44 text

試そう ex. “information_schema.tables の data_length + index_length と実際の .ibd ファイルはどれくらい違いがありますか?” $ ll /usr/mysql/8.0.19/data/sbtest/sbtest1.ibd -h -rw-r----- 1 yoku0825 yoku0825 29M Jan 17 12:41 /usr/mysql/8.0.19/data/sbtest/sbtest1.ibd mysql80 19> SELECT table_schema, table_name, format_bytes(data_length + index_length) AS size FROM information_schema.tables WHERE table_schema = 'sbtest'; +--------------+------------+-----------+ | TABLE_SCHEMA | TABLE_NAME | size | +--------------+------------+-----------+ | sbtest | sbtest1 | 23.06 MiB | +--------------+------------+-----------+ 1 row in set (0.01 sec) 43/60

Slide 45

Slide 45 text

試そう ex. “information_schema.tables の data_length + index_length と実際の .ibd ファイルはどれくらい違いがありますか?” $ ll /usr/mysql/8.0.19/data/sbtest/sbtest*.ibd -h -rw-r----- 1 yoku0825 yoku0825 29M Jan 17 12:42 /usr/mysql/8.0.19/data/sbtest/sbtest1.ibd -rw-r----- 1 yoku0825 yoku0825 29M Jan 17 12:43 /usr/mysql/8.0.19/data/sbtest/sbtest2.ibd -rw-r----- 1 yoku0825 yoku0825 29M Jan 17 12:43 /usr/mysql/8.0.19/data/sbtest/sbtest3.ibd mysql80 21> SELECT table_schema, table_name, format_bytes(data_length + index_length) AS size FROM information_schema.tables WHERE table_schema = 'sbtest'; +--------------+------------+-----------+ | TABLE_SCHEMA | TABLE_NAME | size | +--------------+------------+-----------+ | sbtest | sbtest1 | 23.06 MiB | | sbtest | sbtest2 | 23.06 MiB | | sbtest | sbtest3 | 16.00 KiB | +--------------+------------+-----------+ 3 rows in set (0.01 sec) 44/60

Slide 46

Slide 46 text

試そう ex. “information_schema.tables の data_length + index_length と実際の .ibd ファイルはどれくらい違いがありますか?” mysql80 21> ANALYZE TABLE sbtest.sbtest3; +----------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+---------+----------+----------+ | sbtest.sbtest3 | analyze | status | OK | +----------------+---------+----------+----------+ 1 row in set (0.04 sec) mysql80 21> SELECT table_schema, table_name, format_bytes(data_length + index_length) AS size FROM information_schema.tables WHERE table_schema = 'sbtest'; +--------------+------------+-----------+ | TABLE_SCHEMA | TABLE_NAME | size | +--------------+------------+-----------+ | sbtest | sbtest1 | 23.06 MiB | | sbtest | sbtest2 | 23.06 MiB | | sbtest | sbtest3 | 23.06 MiB | +--------------+------------+-----------+ 3 rows in set (0.00 sec) 45/60

Slide 47

Slide 47 text

試そう ex. “information_schema.tables の data_length + index_length と実際の .ibd ファイルはどれくらい違いがありますか?” $ ll /usr/mysql/8.0.19/data/sbtest/sbtest*.ibd -h -rw-r----- 1 yoku0825 yoku0825 240M Jan 17 12:45 /usr/mysql/8.0.19/data/sbtest/sbtest1.ib d mysql80 23> SELECT table_schema, table_name, format_bytes(data_length + index_length) AS size FROM information_schema.tables WHERE table_schema = 'sbtest'; +--------------+------------+------------+ | TABLE_SCHEMA | TABLE_NAME | size | +--------------+------------+------------+ | sbtest | sbtest1 | 214.70 MiB | +--------------+------------+------------+ 1 row in set (0.04 sec) 46/60

Slide 48

Slide 48 text

試そう ex. “information_schema.tables の data_length + index_length と実際の .ibd ファイルはどれくらい違いがありますか?” このケースだと2割くらい? ‐ ただし ANALYZE TABLE 前のようなよくわからない状態になったりもする これはInnoDBの統計情報を更新するスレッドがバックグラウンドで非同期で動いているからなんですがそれは置い ておいて ‐ 47/60

Slide 49

Slide 49 text

試そう Not “information_schema.tables の data_length + index_length と実際 の .ibdファイルはどれくらい違いがありますか?” But “information_schema.tables の data_length + index_length と実際 の .ibdファイルの違いはどこを見ればわかりますか?” 48/60

Slide 50

Slide 50 text

試そう $ ll /usr/mysql/8.0.19/data/sbtest/sbtest*.ibd -h -rw-r----- 1 yoku0825 yoku0825 29M Jan 17 14:11 /usr/mysql/8.0.19/data/sbtest/sbtest1.ibd -rw-r----- 1 yoku0825 yoku0825 29M Jan 17 14:12 /usr/mysql/8.0.19/data/sbtest/sbtest2.ibd -rw-r----- 1 yoku0825 yoku0825 29M Jan 17 14:12 /usr/mysql/8.0.19/data/sbtest/sbtest3.ibd mysql80 27> ANALYZE TABLE sbtest.sbtest2; +----------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+---------+----------+----------+ | sbtest.sbtest2 | analyze | status | OK | +----------------+---------+----------+----------+ 1 row in set (0.01 sec) mysql80 26> SELECT table_schema, table_name, format_bytes(data_length + index_length) AS size FROM information_sche ma.tables WHERE table_schema = 'sbtest'; +--------------+------------+-----------+ | TABLE_SCHEMA | TABLE_NAME | size | +--------------+------------+-----------+ | sbtest | sbtest1 | 23.06 MiB | | sbtest | sbtest2 | 32.00 KiB | | sbtest | sbtest3 | 23.06 MiB | +--------------+------------+-----------+ 3 rows in set (0.01 sec) 49/60

Slide 51

Slide 51 text

試そう mysql80 28> SELECT COUNT(*) FROM sbtest.sbtest2; +----------+ | COUNT(*) | +----------+ | 0 | +----------+ 1 row in set (0.00 sec) mysql80 28> SELECT table_schema, table_name, format_bytes(data_length + index_length + da ta_free) AS size FROM information_schema.tables WHERE table_schema = 'sbtest'; +--------------+------------+-----------+ | TABLE_SCHEMA | TABLE_NAME | size | +--------------+------------+-----------+ | sbtest | sbtest1 | 25.06 MiB | | sbtest | sbtest2 | 25.03 MiB | | sbtest | sbtest3 | 25.06 MiB | +--------------+------------+-----------+ 3 rows in set (0.00 sec) 50/60

Slide 52

Slide 52 text

試そう 問題の解答はキャッシュみたいなもの 状況が変わればキャッシュを更新しないといけない キャッシングももちろん良いことだけど、キャッシュの再構築方法を押さえるのも もっと良い 51/60

Slide 53

Slide 53 text

試そう 最低限、すぐに触れて自分の好きにできる mysqld が必要 Linuxの方が( mysqld の外側から取れる)情報(のノウハウ)は多いからLinuxの方が良い気はする ‐ そういう用途ではパッケージもの(rpm, dpkg)が便利だと思う MySQL :: Download MySQL Yum Repository ‐ MySQL :: Download MySQL APT Repository ‐ 52/60

Slide 54

Slide 54 text

試そう 外側から得られる情報が少なくても良ければWindows, Dockerでも十分 MySQL :: Download MySQL Installer ‐ mysql/mysql-server - Docker Hub ‐ 53/60

Slide 55

Slide 55 text

TL;DR ドキュメントを読もう エラーメッセージを読もう 試そう 知識をアップデートしよう 54/60

Slide 56

Slide 56 text

知識をアップデートしよう 机上の理論から実践への飛躍 What Is New のように、「新しいバージョンの知識」 MySQL 5.6日本語ドキュメントをベースにしてその次に行く候補 55/60

Slide 57

Slide 57 text

知識をアップデートしよう 詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE) | 奥野 幹也 |本 | 通販 | Amazon 実践ハイパフォーマンスMySQL 第3版 | Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, 菊池 研自, 株式会社クイープ |本 | 通販 | Amazon SQLアンチパターン | Bill Karwin, 和田 卓人, 和田 省二, 児島 修 |本 | 通販 | Amazon 56/60

Slide 58

Slide 58 text

知識をアップデートしよう Yoshiaki Yamasaki(@yyamasaki1)さん / Twitter 私市智美 Tomomi Kisaichi(@kisaichi)さん / Twitter lefred(@lefred)さん / Twitter 57/60

Slide 59

Slide 59 text

知識をアップデートしよう MySQL Casual - connpass Join mysql-casual on Slack! ‐ MySQL Weekly 58/60

Slide 60

Slide 60 text

One more things 英語でググろう ブログを書こう 59/60

Slide 61

Slide 61 text

Any Questions and/or Suggestions? 60/60