MySQLを学ぶ技術

0deae06ab5d86b39feeec2e23a30b88a?s=47 yoku0825
January 17, 2020

 MySQLを学ぶ技術

2020/01/17 DevelopersNight 01
https://gmo.connpass.com/event/160796/

0deae06ab5d86b39feeec2e23a30b88a?s=128

yoku0825

January 17, 2020
Tweet

Transcript

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

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

  3. \こんばんは/ yoku0825@とある企業のDBA オラクれない ‐ ポスグれない ‐ マイエスキューエる ‐ 生息域 Twitter:

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

    生息域 Twitter: @yoku0825 ‐ Blog: 日々の覚書 ‐ 日本MySQLユーザ会 ‐ MySQL Casual ‐ GMO Media, Inc. ‐ 3/60
  5. TL;DR ドキュメントを読もう エラーメッセージを読もう 試そう 知識をアップデートしよう 4/60

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

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

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

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

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

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

  12. ( ゚д゚) 11/60

  13. ドキュメントを読もう MySQL Bugs: #98232: MySQL 5.6 Japanese Doc PDF is

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

  15. ドキュメントを読もう 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
  16. ドキュメントを読もう リファレンスマニュアル本編の他に “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
  17. What Is New MySQLのバージョン番号は、本当はずっと “メジャーバージョン.マイナーバー ジョン.バージョン番号” “メジャーバージョン.マイナーバージョン” の2桁を取って “リリースシリーズ” と読んでいる

    MySQL :: MySQL 8.0 Reference Manual :: 2.1.1 Which MySQL Version and Distribution to Install ‐ ドキュメントは “リリースシリーズ” 単位で分冊 実質 “リリースシリーズ” がメジャーバージョンみたいな感じ( だった ) 今はメンテナンスリリースにリリースシリーズ変更ばりの新機能をぶち込んできやがる… ‐ リリースシリーズをまたいだ新機能や非互換のリストはここに多くが含まれている 簡単な説明と、本編へのハイパーリンクが含まれているのでインデックスとして便利 ‐ 16/60
  18. Release Notes 開発初期はそのバージョンで実装された新機能が載ったりするけど、一般リリース 以降はバグフィックスノートが主 ( のはずなんだけどなぁ ) MySQL 8.0系は 何故か

    メンテナンスリリースで機能が増えるので、粒度が小さい “What Is New” みたいになってる… バグフィックスノートには対応するバグ番号が載ったりもする 自分でレポートしたのが載ってるとテンション上がる ‐ 5桁のバグ番号は オープンなバグトラッキングシステム のもの、8桁のバグ番号は開発者の内 部BTSのもの ‐ 17/60
  19. ドキュメントを読もう ドキュメントは適宜更新される ドキュメントに誤りが見つかった時 ‐ 新しい機能が追加された時 ‐ 18/60

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

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

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

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

    :: MySQL 8.0 Reference Manual :: MySQL Glossary ‐ 27/60
  29. エラーメッセージを読もう 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
  30. エラーメッセージを読もう Invalid (old?) table or database name 無効な(古い?)テーブルまたはデータベース名 translated by

    Google翻訳 ‐ 29/60
  31. エラーメッセージを読もう 読んで、意味を何となく理解して初めて、「いや、それは違う」と言える 無効な名前じゃない、だって8.0.13とそれ以前はちゃんと動いてたんだから ‐ MySQL Bugs: #94519: Wrong messages in

    error-log when using partition with lower- case-table-names=1 ‐ 30/60
  32. エラーメッセージを読もう 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
  33. エラーメッセージを読もう MySQLのユーザー名またはパスワード情報をマスター情報リポジトリに保存する ことは安全ではないため、お勧めしません。 START SLAVEのUSERおよび PASSWORD接続オプションの使用を検討してください。 詳細については、 MySQLマニュアルの「START SLAVE Syntax」を参照してください。

    translated by Google翻訳 ‐ 32/60
  34. Google翻訳 すごい 33/60

  35. エラーメッセージを読もう 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
  36. エラーメッセージを読もう 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
  37. ワーニングも読もう 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
  38. ワーニングも読もう ‘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
  39. ワーニングも読もう 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
  40. ワーニングも読もう ‘utf8mb3’ is deprecated and will be removed in a

    future release. Please use utf8mb4 instead 「utf8mb3」は非推奨であり、将来のリリースで削除される予定です。 代わりにutf8mb4を使 用してください translated by Google翻訳 ‐ 39/60
  41. ワーニングも読もう ワーニングメッセージはクエリーを実行した直後だけしか参照できない アプリケーションから実行したクエリーのワーニングはアプリケーションが他のクエリーを実 行する前に SHOW WARNINGS を押し込んでやらないといけない ‐ 人口に膾炙しているORMでそこまで面倒を見てくれるものなのかどうか謎 ‐

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

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

  44. 試そう 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
  45. 試そう 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
  46. 試そう 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
  47. 試そう 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
  48. 試そう ex. “information_schema.tables の data_length + index_length と実際の .ibd ファイルはどれくらい違いがありますか?”

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

    But “information_schema.tables の data_length + index_length と実際 の .ibdファイルの違いはどこを見ればわかりますか?” 48/60
  50. 試そう $ 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
  51. 試そう 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
  52. 試そう 問題の解答はキャッシュみたいなもの 状況が変わればキャッシュを更新しないといけない キャッシングももちろん良いことだけど、キャッシュの再構築方法を押さえるのも もっと良い 51/60

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

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

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

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

  57. 知識をアップデートしよう 詳解MySQL 5.7 止まらぬ進化に乗り遅れないためのテクニカルガイド (NEXT ONE) | 奥野 幹也 |本

    | 通販 | Amazon 実践ハイパフォーマンスMySQL 第3版 | Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, 菊池 研自, 株式会社クイープ |本 | 通販 | Amazon SQLアンチパターン | Bill Karwin, 和田 卓人, 和田 省二, 児島 修 |本 | 通販 | Amazon 56/60
  58. 知識をアップデートしよう Yoshiaki Yamasaki(@yyamasaki1)さん / Twitter 私市智美 Tomomi Kisaichi(@kisaichi)さん / Twitter

    lefred(@lefred)さん / Twitter 57/60
  59. 知識をアップデートしよう MySQL Casual - connpass Join mysql-casual on Slack! ‐

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

  61. Any Questions and/or Suggestions? 60/60