Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

MySQL 5.7にやられないためにおぼえておいてほしいこと

119 189 vues

Publié le

2015/10/03 phpcon 2015
updated at 2016/01/13 about default_password_lifetime's default will be 0

Publié dans : Technologie
  • Relationship guru Justin Sinclair reveals his secret tactics to help get your Ex back! Learn how ♥♥♥ http://scamcb.com/exback123/pdf
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • DOWNLOAD FULL BOOKS, INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici
  • DOWNLOAD FULL BOOKS, INTO AVAILABLE FORMAT ......................................................................................................................... ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. PDF EBOOK here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. EPUB Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... 1.DOWNLOAD FULL. doc Ebook here { https://tinyurl.com/y6a5rkg5 } ......................................................................................................................... ......................................................................................................................... ......................................................................................................................... .............. Browse by Genre Available eBooks ......................................................................................................................... Art, Biography, Business, Chick Lit, Children's, Christian, Classics, Comics, Contemporary, Cookbooks, Crime, Ebooks, Fantasy, Fiction, Graphic Novels, Historical Fiction, History, Horror, Humor And Comedy, Manga, Memoir, Music, Mystery, Non Fiction, Paranormal, Philosophy, Poetry, Psychology, Religion, Romance, Science, Science Fiction, Self Help, Suspense, Spirituality, Sports, Thriller, Travel, Young Adult,
       Répondre 
    Voulez-vous vraiment ?  Oui  Non
    Votre message apparaîtra ici

MySQL 5.7にやられないためにおぼえておいてほしいこと

  1. 1. MySQL 5.7にやられないためにおぼ えておいてほしいこと 安⼼してください。履いてますよ。 2015/10/03 yoku0825 phpcon 2015
  2. 2. 免責事項 MySQLの話をします PHPの話は⼀切出てきません 個⼈の⾒解であり、所属する組織または所属しない組織の意 ⾒を代表するわけがありません アップデートはありますが、過去のスライドと内容カブって ます。 今から備えるMySQL最新バージョン5.7- MySQL 5.7の罠があなたを狙っている- 光のMySQL 5.7- 資料は公開しますので、 となりのセッションに移動する なら今です - 1/172
  3. 3. MySQL 5.7にどんなイメージを持っていますか︖ 光︖ 闇︖ まっさら︖ 2/172
  4. 4. なお、MySQL 5.7の闇の正体はこんな感じです https://twitter.com/tmtms/status/636104524164296708 3/172
  5. 5. なお、MySQL 5.7の闇の正体はこんな感じです MySQL を好きな⼈が、MySQLのちょっと変なところ を、少しばかり強調しておもしろおかしく伝えている⾯ はあるので、その変な部分だけが⼀⼈歩きして多くの⼈ に理解されてしまうことを危惧はしていますが http://sakaik.hateblo.jp/entry/20150823/yapc2015 4/172
  6. 6. お世辞抜きでMySQL 5.7楽しいですよ :) お世辞抜きで地雷も多いけど 5/172
  7. 7. ところで皆様 お気付きでし ょうか 6/172
  8. 8. このスライドなん と表紙を抜いて 171枚あります 7/172
  9. 9. 1枚10秒 です 8/172
  10. 10. 資料はslideshareで公開 します ってか既にしてます http:// www.slideshare.net/yoku0825/ mysql-57-53449734 9/172
  11. 11. MySQL 5.7とは 2年半ぶりの メジャーバージョンアップ PHPさんは5.6の次を7にしましたが、MySQLは5.6 => 5.7 => 次は5.8っぽいです - 新しい機能を使わないぶんには 、 “まあまあ良いMySQL” バギーってほどバギーではない( バグの流量を⾒る限 り、 今のところは ) - 罠オプションがいっぱい 5.5やそれ以前の情報をアテにして本番に突っ込むと痛い 目を⾒る - それでもなお、アップグレードしたいバージョン 新しい機能がてんこもり- 10/172
  12. 12. \こんにちは/ yoku0825@とある企業のDBA オラクれない- ポスグれない- マイエスキューエる- 家に帰ると 妻の夫- せがれの⽗- ムスメの⽗- Twitter: @yoku0825 Blog: ⽇々の覚書 MyNA ML: ⽇本MySQLユーザ会 11/172
  13. 13. MySQLの系譜 2008/11 MySQL 5.1 2010/12 MySQL 5.5 2013/02 MySQL 5.6 2015/xx MySQL 5.7 2015年8⽉に5.7.8-rc2(Realease Candidate, リリース 候補版) - 5.6のGA時点で「Oracleとしては18〜24か⽉で次のメジ ャーバージョンをリリースする予定」と⾔っていたの で、ズレこんでいるのは確か - 12/172
  14. 14. 本編に⼊る前に、過去のスライドを⾒てくれた⽅へのお知 らせです show_compatibility_56= OFF問題 performance_schema.{session|global}_{status| variables}はSEELCT権限なくてもSELECTできるようにな りました。 - performance_schema= OFFの時には show_compatibility_56= OFFでもinformation̲schema を⾒に⾏くようになりました。 - 13/172
  15. 15. updated at 2016/01/13 MySQL 5.7.11でdefault̲password̲lifetimeの暗黙のデフ ォルトは0になりました。それ以降のバージョンであれば 360⽇におびえる必要はありません。 ⽇々の覚書: MySQL 5.7.11で default̲password̲lifetimeのデフォルトが0になるらし い︕ - 14/172
  16. 16. 最低限これだけは知ってほしい5.7 16桁ハッシュのパスワードの廃⽌ default̲password̲lifetime sql̲modeのデフォルト値変更 log̲error̲verbosity vs. log̲warnings テンポラリーテーブルがInnoDBに 15/172
  17. 17. ⼀応知っておいてほしい5.7 mysql.user.passwordカラムの廃⽌ 認証周りの構⽂の変更 secure̲file̲priv log̲timestamps mysql̲install̲db mysqld –initialize InnoDBバッファプールの暖気がデフォルトでONに binlog̲formatのデフォルト変更 rpmパッケージではvalidate̲passwordプラグインがデフォ ルトで有効 innodb̲default̲row̲formatの注意 16/172
  18. 18. これを知っているとちょっと得する5.7 sysスキーマ GTIDのオンライン有効化がサポート MySQLネイティブの全⽂検索が⽇本語対応 InnoDB UNDO logのシュリンク サーバーサイドステートメントタイムアウト generated columnで関数インデックス SSL関連いろいろ JSONデータ型 マルチスレッドスレーブの機能向上 17/172
  19. 19. 知っておいても損はない5.7 innodb̲buffer̲pool̲sizeのオンライン変更がサポート sync̲binlogのデフォルト変更 マルチソースレプリケーション ダイナミックレプリケーションフィルター InnoDBの新しい圧縮 1テーブルに複数トリガー設定可能 mysql p ump log-syslog オフラインモード GET̲LOCK関数で複数のロックを取れる Query Rewrite Plugin 18/172
  20. 20. 参考URL MySQL :: MySQL 5.7 Reference Manual :: 1.4 What Is New in MySQL 5.7 MySQL :: MySQL 5.7 Release Notes Complete list of new features in MySQL 5.7 中の⼈が作った「新機能完全リスト」- MySQL 5.7の新機能完全リスト | Yakst ↑をがんばって⽇本語に訳したヤーツ- 昨⽇アップデートした- ⽇々の覚書: 5.7 19/172
  21. 21.   最低限これだけは知ってほしい5.7 ⼀応知っておいてほしい5.7 これを知っているとちょっと得する5.7 知っておいても損はない5.7 20/172
  22. 22. 16桁ハッシュのパスワードの廃⽌ old̲passwords, skip̲secure̲authというオプションに⼼ 当たりはありませんか︖ 16桁ハッシュのパスワードでもログインできるようにす るオプション - MySQL 4.1(10年前)に非推奨 MySQL 5.6でもデフォルトではログインできないなど風当 たりが強くなり(16桁ハッシュのユーザーが存在する状態で アップグレードした場合のみ16桁ハッシュのユーザーが存 在) MySQL 5.7からは全く使えなくなります 21/172
  23. 23. 16桁ハッシュのパスワード #とは 対義語は41桁ハッシュ mysql55> SELECT user, host, password FROM user WHERE user <> 'roo t'; +--------------+------+------------------------------------------ -+ | user | host | passwor d | +--------------+------+------------------------------------------ -+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC2 9 | | old_password | % | 378b243e220ca49 3 | +--------------+------+------------------------------------------ -+ 2 rows in set (0.00 sec) 22/172
  24. 24. MySQL 5.6へのアップグレード ワーニングは出たけど、アップグレードはできた。 ユーザー情報としては残ってるけど、実際にログインするに はskip̲secure̲authを駆使しないといけない。 $ /usr/mysql/5.6.23/bin/mysql_upgrade .. Warning 1642 Pre-4.1 password hash found. It is deprecated and will be re moved in a future release. Please upgrade it to a new format. .. mysql56> SELECT user, host, password FROM user WHERE user <> 'root'; +--------------+------+-------------------------------------------+ | user | host | password | +--------------+------+-------------------------------------------+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | | old_password | % | 378b243e220ca493 | +--------------+------+-------------------------------------------+ 2 rows in set (0.00 sec) 23/172
  25. 25. MySQL 5.7へのアップグレード ワーニングなのは相変わらずだけど、ちゃんと移⾏されてな い。 $ /usr/mysql/5.7.7/bin/mysql_upgrade -S /usr/mysql/5.7.7/data/mysql.sock -uroot .. mysql_upgrade: [Warning] 1642: Pre-4.1 password hash found. It is deprecated an d will be removed in a future release. Please upgrade it to a new format. .. mysql57> SELECT user, host, authentication_string FROM user WHERE user <> 'root '; +--------------+------+-------------------------------------------+ | user | host | authentication_string | +--------------+------+-------------------------------------------+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | | old_password | % | NULL | +--------------+------+-------------------------------------------+ 2 rows in set (0.00 sec) $ mysql57 -uold_password -ptest ERROR 1524 (HY000): Plugin 'mysql_old_password' is not loaded 24/172
  26. 26. default̲password̲lifetime 暗黙のデフォルトで360に設定されており、 password̲last̲changedから360⽇以上経過するとそのア カウントでログインできなくなる。 吊るしのまま使うとMySQL 5.7へのバージョンアップから 360⽇後に突然アプリケーションからつなげなくなるよ。 MySQL 5.7.11から先はデフォルトが0になっているのでこ の罠はない 、 それ以前の場合は注意。 25/172
  27. 27. default̲password̲lifetime mysql57> SELECT user, host, password_expired, password_last_changed, pas sword_lifetime, account_locked FROM mysql.user WHERE user= 'yoku0825'G *************************** 1. row *************************** user: yoku0825 host: % password_expired: N password_last_changed: 1999-07-31 00:00:00 password_lifetime: NULL account_locked: N 1 row in set (0.00 sec) mysql57> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.04 sec) $ mysql57 -uyoku0825 -p -e "SELECT current_user()" Enter password: ERROR 1862 (HY000): Your password has expired. To log in you must chang e it using a client that supports expired passwords. 26/172
  28. 28. 回避⽅法 my.cnfの[mysqld]セクションに default_password_lifetime= 0 SET GLOBALでオンライン変更も可能。- 0を指定することで、default̲password̲lifetimeを利⽤し なくなる。 全くEXPIREされなくなるのが嫌なら、⼤きな値にしても 良い。 - 0より⼤きな値を指定する場合、単位は”⽇”- 27/172
  29. 29. 回避⽅法 mysql57> SET GLOBAL default_password_lifetime= 0; Query OK, 0 rows affected (0.00 sec) $ vim /etc/my.cnf [mysqld] default_password_lifetime= 0 28/172
  30. 30. sql̲modeのデフォルト値変更 5.5まで ““(指定なし) 5.6 “NO̲ENGINE̲SUBSTITUTION”(存在しないストレー ジエンジンを指定してCREATE TABLEするとエラーになる) 場合によっては/usr/my.cnfの罠 で”STRICT̲TRANS̲TABLES,NO̲ENGINE̲SUBSTITU TION” - 29/172
  31. 31. 5.7のデフォルトのsql̲mode ONLY̲FULL̲GROUP̲BY STRICT̲TRANS̲TABLES NO̲ZERO̲IN̲DATE NO̲ZERO̲DATE ERROR̲FOR̲DIVISION̲BY̲ZERO NO̲AUTO̲CREATE̲USER NO̲ENGINE̲SUBSTITUTION sql̲modeの変更は5.6でもエミュレートできるので、デフ ォルトのまま⾏くなら5.6でも確認しておける 30/172
  32. 32. 圧倒的で はないか 31/172
  33. 33. ONLY̲FULL̲GROUP̲BY 何故MySQLは今までこんなクエリーを許していたのかよく わからない感じのものが(valとnumが⼀意に紐づくかどうか がDBMSには判断できないはず) mysql56> SELECT val, num, COUNT(*) AS c FROM t1 GROUP BY val ORDE R BY c DESC LIMIT 5; +--------------------------------------+-----+---+ | val | num | c | +--------------------------------------+-----+---+ | 人類はストラトス | 16 | 8 | | 僕は友達が巨人 | 333 | 7 | | アウトブレイクストラトス | 46 | 7 | | さんをつけろよマスター | 39 | 7 | | 電波女と衰退しました | 140 | 7 | +--------------------------------------+-----+---+ 5 rows in set (0.04 sec) 32/172
  34. 34. ONLY̲FULL̲GROUP̲BY ちゃんとエラーになる。 mysql56> SET sql_mode= CONCAT_WS(',', @@sql_mode, 'ONLY_FULL_GROU P_BY'); Query OK, 0 rows affected (0.00 sec) mysql56> SELECT val, num, COUNT(*) AS c FROM t1 GROUP BY val ORDE R BY c DESC LIMIT 5; ERROR 1055 (42000): 'd1.t1.num' isn't in GROUP BY 33/172
  35. 35. ONLY̲FULL̲GROUP̲BY 今までと同じ、「何が返ってくるかわからなくてもいいよ」 を表現するためのANY̲VALUE関数が追加された。 mysql57> SELECT val, ANY_VALUE(num), COUNT(*) AS c FROM t1 GROUP BY val ORDER BY c DESC LIMIT 5; +--------------------------------------+----------------+---+ | val | ANY_VALUE(num) | c | +--------------------------------------+----------------+---+ | 人類はストラトス | 16 | 8 | | 僕は友達が巨人 | 333 | 7 | | アウトブレイクストラトス | 46 | 7 | | さんをつけろよマスター | 39 | 7 | | 電波女と衰退しました | 140 | 7 | +--------------------------------------+----------------+---+ 5 rows in set (0.01 sec) 34/172
  36. 36. STRICT̲TRANS̲TABLES ⼀部のワーニングをワーニング(警告だけど成功)ではなく エラーにする。 ⼀般的には「勝⼿に桁を切り詰める」「勝⼿に⽂字列型を整 数型にキャストする」がエラーになるやつ。 35/172
  37. 37. STRICT̲TRANS̲TABLES mysql56> INSERT INTO t1 VALUES (1, REPEAT('a', 33)); Query OK, 1 row affected, 1 warning (0.01 sec) mysql56> SHOW WARNINGS; +---------+------+------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------+ | Warning | 1265 | Data truncated for column 'val' at row 1 | +---------+------+------------------------------------------+ 1 row in set (0.00 sec) ); Query OK, 0 rows affected (0.02 sec) mysql56> INSERT INTO t1 VALUES (1, REPEAT('a', 33)); ERROR 1406 (22001): Data too long for column 'val' at row 1 36/172
  38. 38. NO̲ZERO̲IN̲DATE sql_mode= NO_ZERO_DATEとは別物。 DATE, DATETIME型の「⽉」「⽇」に0を⼊れようとする と、ワーニングを発して ʻ0000-00-00 00:00:00ʼに切り 詰める 。 37/172
  39. 39. NO̲ZERO̲IN̲DATE mysql56> SET sql_mode= CONCAT_WS(',', @@sql_mode, 'NO_ZERO_IN_DATE'); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql56> INSERT INTO t1 VALUES ('2015-00-31'); Query OK, 1 row affected, 1 warning (0.01 sec) mysql56> SHOW WARNINGS; +---------+------+---------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------+ | Warning | 1264 | Out of range value for column 'dt' at row 1 | +---------+------+---------------------------------------------+ 1 row in set (0.00 sec) mysql56> SELECT * FROM t1; +---------------------+ | dt | +---------------------+ | 0000-00-00 00:00:00 | +---------------------+ 1 row in set (0.00 sec) 38/172
  40. 40. NO̲ZERO̲IN̲DATE + strict̲mode STRICT̲TRANS̲TABLESまたはSTRICT̲ALL̲TABLESと ⼀緒に使うためのもの。 mysql56> SET sql_mode= CONCAT_WS(',', @@sql_mode, 'STRICT_TRANS_T ABLES'); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql56> INSERT INTO t1 VALUES ('2015-00-31'); ERROR 1292 (22007): Incorrect datetime value: '2015-00-31' for co lumn 'dt' at row 1 39/172
  41. 41. NO̲ZERO̲DATE DATE, DATETIME型にʼ0000-00-00ʼを⼊れようとするとワ ーニングにしてくれるもの。 NO̲ZERO̲IN̲DATEと⼀緒で直接エラーではなくワーニン グなので、strict̲modeと⼀緒に使う。 40/172
  42. 42. ERROR̲FOR̲DIVISION̲BY̲ZERO 未指定時は0で除算するとNULLになる mysql56> INSERT INTO t2 VALUES (2/0); Query OK, 1 row affected (0.00 sec) mysql56> SELECT * FROM t2; +------+ | num | +------+ | NULL | +------+ 1 row in set (0.00 sec) 41/172
  43. 43. ERROR̲FOR̲DIVISION̲BY̲ZERO 指定時は ワーニング になってNULLが⼊る。 mysql56> SET sql_mode= CONCAT_WS(',', @@sql_mode, 'ERROR_FOR_DIVISION_BY_ZERO'); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql56> INSERT INTO t2 VALUES (2/0); Query OK, 1 row affected, 1 warning (0.01 sec) mysql56> SHOW WARNINGS; +---------+------+---------------+ | Level | Code | Message | +---------+------+---------------+ | Warning | 1365 | Division by 0 | +---------+------+---------------+ 1 row in set (0.00 sec) mysql56> SELECT * FROM t2; +------+ | num | +------+ | NULL | | NULL | +------+ 2 rows in set (0.00 sec) 42/172
  44. 44. ERROR̲FOR̲DIVISION̲BY̲ZERO + strict̲mode strict̲modeと合わせて初めてエラーになる。 mysql56> SELECT @@sql_mode; +------------------------------------------------+ | @@sql_mode | +------------------------------------------------+ | STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO | +------------------------------------------------+ 1 row in set (0.00 sec) mysql56> INSERT INTO t2 VALUES (2/0); ERROR 1365 (22012): Division by 0 43/172
  45. 45. NO̲AUTO̲CREATE̲USER パスワードなしのユーザーをCREATE USERせずに直接GRANTが ワーニングになるのはコイツのせい。 mysql56> GRANT replication slave ON *.* TO u1; Query OK, 0 rows affected (0.00 sec) mysql56> SET sql_mode= CONCAT_WS(',', @@sql_mode, 'NO_AUTO_CREATE_USER' ); Query OK, 0 rows affected (0.00 sec) mysql56> GRANT replication slave ON *.* TO u2; ERROR 1133 (42000): Can't find any matching row in the user table mysql56> CREATE USER u2; Query OK, 0 rows affected (0.00 sec) mysql56> GRANT replication slave ON *.* TO u2; Query OK, 0 rows affected (0.00 sec) 44/172
  46. 46. sql̲modeが空でも多少の違いがあるっぽい mysql56> CREATE TABLE t1 (num int default null, PRIMARY KEY(num) ); Query OK, 0 rows affected (0.16 sec) mysql57> CREATE TABLE t1 (num int default null, PRIMARY KEY(num) ); ERROR 1171 (42000): All parts of a PRIMARY KEY must be NOT NULL; if you need NULL in a key, use UNIQUE instead MySQL 5.7.3 m13 does not allow DEFAULT NULL for primary key ・ Issue #13203 ・ rails/rails 45/172
  47. 47. log̲error̲verbosity vs. log̲warnings 今までのlog̲warningsはワーニング も 出⼒するイメージ 5.6までの動作はこんな sql̲print̲warning()の外側で判定されてるんだぜコイ ツ。。 - value notes some warnings other warnings errors log- warnings = 0 YES No Yes Yes log-warnings >= 1 YES Yes Yes Yes 46/172
  48. 48. log̲error̲verbosity vs. log̲warnings 5.7のlog̲error̲verbosityはいわゆる普通のログレベルの制 御。 下⼿にlog̲warningsと⼲渉するため、意図しない値が設 定されることがある。 log_warnings + 1の値が勝⼿にlog_error_verbosityに セットされる。 log_warnings= 1が記述してあると、 log_error_verbosity= 2(Noteを出⼒しない)になって しまう log_warningsとlog_error_verbosityが混在していた場 合、通常のオプションと同じく 後勝ち で設定される。 - 47/172
  49. 49. log̲error̲verbosity vs. log̲warnings value notes warnings errors log-warnings = 0 log-error- verbosity = 1 No No Yes log-warnings = 1 log-error- verbosity = 2 No Yes Yes log-warnings >= 2 log-error- verbosity >= 3 Yes Yes Yes MySQL Bugs: #74963: changes in 5.7.5 logging verbosity seem surprising and unexpected 48/172
  50. 50. テンポラリーテーブルがInnoDBに CREATE TEMPORARY TABLE時のデフォルトは default̲tmp̲storage̲engine変数で制御(MySQL 5.6〜) 暗黙のテンポラリーテーブル(Using temporary)は internal̲tmp̲disk̲storage̲engine 変数の新設, 暗黙のデ フォルトはInnoDB テンポラリーテーブルとして利⽤する場合、REDOログや 排他ロックは必要ない(他のスレッドからそのテーブルは ⾒えない, クラッシュ時にはクリアされる) その辺の処理をかっ⾶ばす 専⽤のibtmp1ファイル を 作成する 暗黙のデフォルトは innodb_temp_data_file_path= ibtmp1:12M:autoextend - 49/172
  51. 51. テンポラリーテーブルがInnoDBに ibdata1と同じく、データとインデックス, UNDOログが書 き込まれる mysqldの再起動時に毎回再作成される, mysqldが再起動さ れるまでは再作成されない ⼀度容量を確保してしまうと、mysqldを再起動するまで ibtmp1は⼤きくなったまま MyISAMなテンポラリーテーブルはDiskがあふれた場合 にクエリーがエラーになってテンポラリーテーブル領域 がクリアされた - 50/172
  52. 52. テンポラリーテーブルがInnoDBに MyISAMを使⽤した暗黙のテンポラリーテーブルがあふれた 場合 mysql57> SELECT * FROM (SELECT * FROM t1 WHERE val LIKE 'abc%') A S t1, (SELECT * FROM t1 WHERE val LIKE 'def%') AS t2 ORDER BY t1. num; ERROR 126 (HY000): Incorrect key file for table '/tmp/#sql_2974_ 0.MYI'; try to repair it $ tail error.log .. 2015-04-30T14:59:45.558360+09:00 87 [ERROR] /usr/mysql/5.7.7/bin/ mysqld: Incorrect key file for table '/tmp/#sql_2974_0.MYI'; try to repair it 2015-04-30T14:59:45.573411+09:00 87 [ERROR] Got an error from unk nown thread, /home/yoku0825/mysql-5.7.7-rc/storage/myisam/mi_writ e.c:223 51/172
  53. 53. テンポラリーテーブルがInnoDBに InnoDBを使⽤した暗黙のテンポラリーテーブルがあふれた 場合 mysql57> SELECT * FROM (SELECT * FROM t1 WHERE val LIKE 'abc%') AS t 1, (SELECT * FROM t1 WHERE val LIKE 'def%') AS t2 ORDER BY t1.num; ERROR 1114 (HY000): The table '/tmp/#sql_2974_0' is full $ tail error.log .. 2015-04-30T15:04:22.549484+09:00 87 [ERROR] InnoDB: posix_fallocate (): Failed to preallocate data for file ./ibtmp1, desired size 671088 64 bytes. Operating system error number 28. Check that the disk is no t full or a disk quota exceeded. Make sure the file system supports t his function. Some operating system error numbers are described at ht tp://dev.mysql.com/doc/refman/5.7/en/operating-system-error-codes.htm l 2015-04-30T15:04:22.590070+09:00 87 [Warning] InnoDB: 1048576 bytes s hould have been written. Only 794624 bytes written. Retrying again t o write the rem 52/172
  54. 54. テンポラリーテーブルがInnoDBに ⼀度利⽤したibtmp1上の領域は再起動するまで解放されな い。 $ ll /usr/mysql/5.7.7/data/ibtmp1 -rw-r----- 1 yoku0825 yoku0825 485236736 4月 30 15:04 2015 /us r/mysql/5.7.7/data/ibtmp1 $ df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/vg_00-lv_root 42G 40G 17M 100% / 53/172
  55. 55. Disk Fullは簡単 にデータがぶっ壊 れます (特にbinlog) 54/172
  56. 56. 対策 internal_tmp_disk_storage_engineはオンラインでSET GLOBALでも変更できる $ vim my.cnf [mysqld] innodb_temp_data_file_path= ibtmp1:256M ## autoextendしなけれ ば、このサイズで打ちどまる ## or internal_tmp_disk_storage_engine= MyISAM ## 今までどおりMyISAM を使わせる mysql57> SET GLOBAL internal_tmp_disk_storage_engine= MyISAM; 55/172
  57. 57. 最低限これだけは知ってほしい5.7 16桁ハッシュのパスワードの廃⽌ default̲password̲lifetime sql̲modeのデフォルト値変更 log̲error̲verbosity vs. log̲warnings テンポラリーテーブルがInnoDBに 56/172
  58. 58.   最低限これだけは知ってほしい5.7 ⼀応知っておいてほしい5.7 これを知っているとちょっと得する5.7 知っておいても損はない5.7 57/172
  59. 59. mysql.user.passwordカラムの廃⽌ MySQL 5.6とそれ以前は、パスワードハッシュは mysql.user.passwordに格納されていた。 今まで存在はしたものの何もデータが⼊らなかった mysql.user.authentication̲stringというカラムに⼊ってい る。 58/172
  60. 60. MySQL 5.6ではこうだったのが mysql56> SELECT user, host, password, authentication_string FROM user WHERE user <> 'root'; +--------------+------+------------------------------------------ -+-----------------------+ | user | host | passwor d | authentication_string | +--------------+------+------------------------------------------ -+-----------------------+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC2 9 | NULL | | old_password | % | 378b243e220ca49 3 | NULL | +--------------+------+------------------------------------------ -+-----------------------+ 2 rows in set (0.00 sec) 59/172
  61. 61. MySQL 5.7では、こう mysql57> SELECT user, host, password, authentication_string FROM user WHERE user <> 'root'; ERROR 1054 (42S22): Unknown column 'password' in 'field list' mysql57> SELECT user, host, authentication_string FROM user WHER E user <> 'root'; +--------------+------+------------------------------------------ -+ | user | host | authentication_strin g | +--------------+------+------------------------------------------ -+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC2 9 | | old_password | % | NUL L | +--------------+------+------------------------------------------ -+ 2 rows in set (0.03 sec) 60/172
  62. 62. 認証周りの構⽂の変更 SET PASSWORD= PASSWORD('..')が非推奨、SET PASSWORD= '..'の構⽂に変更 この構⽂は5.6までは逆にエラー”ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number”になる。 - 61/172
  63. 63. SET PASSWORD= PASSWORD('..')が非推奨 mysql57> SET PASSWORD = PASSWORD('test'); Query OK, 0 rows affected, 1 warning (0.04 sec) *************************** 1. row *************************** Level: Warning Code: 1287 Message: 'SET PASSWORD = PASSWORD('<plaintext_password>')' is dep recated and will be removed in a future release. Please use SET P ASSWORD = '<plaintext_password>' instead 1 row in set (0.00 sec) mysql57> SET PASSWORD = 'root'; Query OK, 0 rows affected (0.00 sec) 62/172
  64. 64. 認証周りの構⽂の変更 SHOW GRANTSの出⼒結果からパスワードハッシュが取り除か れた。 最近の5.5でもSUPERでないユーザーだとʼ<secret>ʻに マスクされるようになった。 - 63/172
  65. 65. SHOW GRANTSの出⼒結果からパスワードハッシュが取り除 かれた mysql56> SHOW GRANTS FOR yoku0825G *************************** 1. row *************************** Grants for yoku0825@%: GRANT USAGE ON *.* TO 'yoku0825'@'%' IDENT IFIED BY PASSWORD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29' 1 row in set (0.00 sec) mysql57> SHOW GRANTS FOR yoku0825G *************************** 1. row *************************** Grants for yoku0825@%: GRANT USAGE ON *.* TO 'yoku0825'@'%' 1 row in set (0.00 sec) 64/172
  66. 66. 認証周りの構⽂の変更 CREATE USERせずにいきなりGRANTを叩くとワーニングまたは エラー。 パスワードなしでいきなりGRANTはエラー。- sql_mode= NO_AUTO_CREATE_USERがデフォルトに設定され ている。 - 65/172
  67. 67. CREATE USERせずにいきなりGRANTを叩くとワーニングまた はエラー mysql57> GRANT USAGE ON *.* TO new_user; ERROR 1133 (42000): Can't find any matching row in the user table mysql57> GRANT USAGE ON *.* TO new_user IDENTIFIED BY 'test'; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql57> SHOW WARNINGSG *************************** 1. row *************************** Level: Warning Code: 1287 Message: Using GRANT statement to modify existing user's properties othe r than privileges is deprecated and will be removed in future release. U se ALTER USER statement for this operation. 1 row in set (0.00 sec) 66/172
  68. 68. 認証周りの構⽂の変更 IDENTIFIED BY PASSWORD '..'構⽂の非推奨 IDENTIFIED WITH mysql_native_password AS '..'が代替 構⽂ - 67/172
  69. 69. IDENTIFIED BY PASSWORD '..'構⽂の非推奨 mysql57> CREATE USER new_user IDENTIFIED BY PASSWORD '*94BDCEBE19 083CE2A1F959FD02F964C7AF4CFC29'; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql57> SHOW WARNINGSG *************************** 1. row *************************** Level: Warning Code: 1287 Message: 'IDENTIFIED BY PASSWORD' is deprecated and will be remov ed in a future release. Please use IDENTIFIED WITH <plugin> AS <h ash> instead 1 row in set (0.00 sec) mysql57> CREATE USER new_user IDENTIFIED WITH mysql_native_passwo rd AS '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'; Query OK, 0 rows affected (0.00 sec) 68/172
  70. 70. 認証周りの構⽂の変更 ALTER USERステートメント 今まではGRANTステートメントで上書きしていたアカウン トに紐付く属性の上書き PASSWORD, REQUIRE SSL, MAX̲QUERIES̲PER̲HOUR, .. - 5.6ではEXPIRE PASSWORDしかできなかった⼦が今後の標 準になるっぽい - 69/172
  71. 71. ALTER USERステートメント mysql57> GRANT USAGE ON *.* TO yoku0826 WITH MAX_USER_CONNECTION S 10; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql57> SHOW WARNINGSG *************************** 1. row *************************** Level: Warning Code: 1287 Message: Using GRANT statement to modify existing user's properti es other than privileges is deprecated and will be removed in fut ure release. Use ALTER USER statement for this operation. 1 row in set (0.00 sec) mysql57> ALTER USER yoku0827 WITH MAX_USER_CONNECTIONS 10; Query OK, 0 rows affected (0.00 sec) 70/172
  72. 72. secure̲file̲priv File̲priv持ちのユーザーのSELECT .. INTO OUTFILE ..ステ ートメントやLOAD DATA INFILE ..ステートメント、 LOAD_FILE関数の動作を制限。 指定されていない場合、mysqldの実効ユーザー権限で全 てのファイルにアクセス可能 - 相変わらずオンラインで変更は できない 71/172
  73. 73. secure̲file̲privの動作⾃体は変わっていない mysql56> SELECT @@global.secure_file_priv; +--------------------+ | @@secure_file_priv | +--------------------+ | /tmp/ | +--------------------+ 1 row in set (0.00 sec) mysql56> SELECT 1 INTO OUTFILE '/home/mysql/test.txt'; ERROR 1290 (HY000): The MySQL server is running with the --secure-file-p riv option so it cannot execute this statement mysql56> SELECT LOAD_FILE('/etc/hosts'); +-------------------------+ | LOAD_FILE('/etc/hosts') | +-------------------------+ | NULL | +-------------------------+ 1 row in set (0.02 sec) 72/172
  74. 74. secure̲file̲priv変更点 rpm, debなどのパッケージものの場合、5.7から暗黙のデフ ォルトが /var/lib/mysql-files に設定される secure_file_priv= NULLが指定されている場合、FILE権限を 利⽤する操作は全て不可能。 secure̲file̲privが設定されていない場合はワーニングを出 ⼒するようになった。 73/172
  75. 75. secure̲file̲priv未設定のワーニング 2015-02-17T07:09:49.446585Z 0 [Warning] Insecure configuration fo r --secure-file-priv: Current value does not restrict location o f generated files. Consider setting it to a valid, non-empty pat h. MySQL :: MySQL 5.7 Reference Manual :: 5.1.3 Server Command Options 74/172
  76. 76. log̲timestamps デフォルトではスローログ, エラーログ, ジェネラルログの タイムスタンプがUTC になってしまう。 暗黙のデフォルトはUTC。”UTC”または”SYSTEM”のどちら かしか取れない。 SET GLOBAL log_timestamps= SYSTEM; でオンライン変更 も可能。 - my.cnfの[mysqld]セクションにlog_timestamps= SYSTEM 推奨。 - バイナリーログは影響を受けない。 MySQL :: MySQL 5.7 Reference Manual :: 5.1.4 Server System Variables 75/172
  77. 77. log̲timestamps たとえばスローログ $ tail data/slow.log .. # Time: 2015-03-09T05:01:02.714121Z # User@Host: root[root] @ localhost [] Id: 14 # Query_time: 0.000633 Lock_time: 0.000215 Rows_sent: 0 Rows_ex amined: 0 SET timestamp=1425877262; INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1; 76/172
  78. 78. log̲timestamps log_timestamps= SYSTEMすると+09:00がオフセットとして 追加される。 $ tail data/slow.log .. # Time: 2015-03-09T14:03:16.607072+09:00 # User@Host: root[root] @ localhost [] Id: 14 # Query_time: 0.000671 Lock_time: 0.000226 Rows_sent: 0 Rows_ex amined: 0 SET timestamp=1425877396; INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1; 77/172
  79. 79. fluent-plugin- mysqlslowquery さんは⼤丈夫だろ うか 78/172
  80. 80. mysql̲install̲db パスがscripts/mysql̲install̲dbからbin/mysql̲install̲db に変わっている バイナリー.tar.gz, ソースビルド派のみ scriptsからbinに移動されている 5.5までshell script 5.6ではPerl script 5.7でCになってscriptじゃなくなったからだろうか。 - rpmは相変わらず/usr/bin/mysql_install_dbにあるので パスの変更は気にしなくていい。 - /usr/my.cnf作らなくなりました :) 79/172
  81. 81. mysql̲install̲db せっかくバイナリーになったのに、あっという間に deprecated になった 5.7.6以降ではmysqld --initializeを使う。- まだしばらくはmysql_install_dbも使えそうだけど、い ずれ置き換えられる。 - 80/172
  82. 82. mysql̲install̲db $ mysql_install_db --datadir=./ 2015-09-29 20:10:13 [WARNING] mysql_install_db is deprecated. Ple ase consider switching to mysqld --initialize 2015-09-29 20:10:17 [WARNING] The bootstrap log isn't empty: 2015-09-29 20:10:17 [WARNING] mysqld: [Warning] --bootstrap is de precated. Please consider using --initialize instead OpenSSL 1.0.1e-fips 11 Feb 2013 server-cert.pem: OK client-cert.pem: OK 81/172
  83. 83. mysql̲install̲dbの作成するユーザー 5.6までは root@localhost, root@127.0.0.1, root@::1, root@hostnameが黙って作成された。 5.7では(デフォルトは) root@localhostのみ 。 --skip-name-resolveな状態で は”root@localhost”と”root@127.0.0.1”は別⼈なの で、 Windows環境では注意 MySQL Bugs: #75656: 5.7.5 skip̲name̲resolve stops all connection attempts - mysql.sock.lockの登場によりソケットの上書きリスクは 減ったものの、root@127.0.0.1は⼿で作っておいてもい いかも。 - 82/172
  84. 84. mysqld –initialize mysql̲install̲dbを置き換えるものとして –datadirは必ず指定してやらないといけない (mysql̲install̲dbには暗黙のデフォルトがあった) - 初期パスワードは 標準エラー出⼒ に吐く --log-errorが設定されてるなら標準エラー出⼒がそっ ちに向く rpmで突っ込んだ場合は/var/log/mysqld.logから grepして取り出すことになるかと。 ~/.mysql̲secretは作らない - 83/172
  85. 85. mysqld –initialize $ bin/mysqld --initialize .. 2015-02-17T02:07:18.782831Z 1 [Note] Creating the system database 2015-02-17T02:07:18.782984Z 1 [Warning] A temporary password is g enerated for root@localhost: wokeG8n=Joia 2015-02-17T02:07:18.783207Z 1 [Note] Creating the system tables .. 84/172
  86. 86. InnoDBバッファプールの暖気がデフォルトでONに mysqld再起動直後にI/O読み込みがガリガリ発⽣するけどあ わてないで。 この処理が終わるまでの間にトラフィックが突っ込んで くるとかなり悲惨。 - 暗黙のデフォルトでは正常終了時にバッファプール全体の 25%のページ番号をテキストファイルに書き出し、起動時 にそのページ番号をバッファプールに読み込む。 パーセンテージはinnodb̲buffer̲pool̲dump̲pct変数 で指定可能、5.6では100%固定だったものが5.7ではデ フォルト25%に。 - 個⼈的にはinnodb_buffer_pool_dump_at_shutdown= ON, innodb_buffer_pool_load_at_startup= OFFがいい。 85/172
  87. 87. binlog̲formatのデフォルト変更 今までのSTATEMENT(5.1の⼀時期だけMIXED)からROW に バイナリーログ容量の増加 ここに1クエリーで100万⾏更新しているバッチがあるじ ゃろ︖ (AA略) - スレーブ側ではTRIGGERが実⾏されない(マスターとスレー ブで違うトリガーを設定している場合に問題化) mysqlbinlog -vv はちょっと読みにくいなぁ。。 86/172
  88. 88. binlog̲format= STATEMENT $ mysqlbinlog bin.000002 # at 294 #150929 20:12:51 server id 1 end_log_pos 396 CRC32 0x3fcab02a Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1443525171/*!*/; INSERT INTO t1 VALUES (1, 'one') /*!*/; .. # at 567 #150929 20:12:56 server id 1 end_log_pos 665 CRC32 0x5d3a9895 Query thread_id=4 exec_time=0 error_code=0 SET TIMESTAMP=1443525176/*!*/; DELETE FROM t1 WHERE num = 1 /*!*/; 87/172
  89. 89. binlog̲format= ROW $ mysqlbinlog -vv bin.000003 # at 289 p: `d1`.`t1` mapped to number 108 # at 335 ws: table id 108 flags: STMT_END_F BINLOG ' QnIKVhMBAAAALgAAAE8BAAAAAGwAAAAAAAEAAmQxAAJ0MQACCA8CIAACPJfzhg== QnIKVh4BAAAAMAAAAH8BAAAAAGwAAAAAAAEAAgAC//wBAAAAAAAAAANvbmVriXRQ '/*!*/; ### INSERT INTO `d1`.`t1` ### SET ### @1=1 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2='one' /* VARSTRING(32) meta=32 nullable=1 is_null=0 */ # at 549 p: `d1`.`t1` mapped to number 108 # at 595 ows: table id 108 flags: STMT_END_F BINLOG ' RHIKVhMBAAAALgAAAFMCAAAAAGwAAAAAAAEAAmQxAAJ0MQACCA8CIAACi6wgiw== RHIKViABAAAAMAAAAIMCAAAAAGwAAAAAAAEAAgAC//wBAAAAAAAAAANvbmVo4g21 '/*!*/; ### DELETE FROM `d1`.`t1` ### WHERE ### @1=1 /* LONGINT meta=0 nullable=0 is_null=0 */ ### @2='one' /* VARSTRING(32) meta=32 nullable=1 is_null=0 */ 88/172
  90. 90. rpmパッケージではvalidate̲passwordプラグインがデ フォルトで有効 デフォルトでは8⽂字以上、英⼤⽂字⼩⽂字数字記号の4種 類 これを満たしていないとSET PASSWORDが転けるしSHOW VARIABLESさえ⾒られない。 Do̲you̲love̲MySQL57? でこれを満たせるのでどうぞ ご活⽤ください( Do̲you̲love̲PHP7? でもいいです よ :-P 89/172
  91. 91. validate̲passwordプラグイン mysql> SHOW VARIABLES LIKE 'validate%'; ERROR 1820 (HY000): You must reset your password using ALTER USER statement befo re executing this statement. mysql> SET PASSWORD= 'unsafe_password'; ERROR 1819 (HY000): Your password does not satisfy the current policy requiremen ts mysql> SET PASSWORD= 'Do_you_love_MySQL57?'; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'validate%'; +--------------------------------------+--------+ | Variable_name | Value | +--------------------------------------+--------+ | validate_password_dictionary_file | | | validate_password_length | 8 | | validate_password_mixed_case_count | 1 | | validate_password_number_count | 1 | | validate_password_policy | MEDIUM | | validate_password_special_char_count | 1 | +--------------------------------------+--------+ 6 rows in set, 1 warning (0.00 sec) 90/172
  92. 92. innodb̲default̲row̲formatの注意 innodb_file_format= Barracuda, innodb_large_prefix= ON と合わせて、innodb_default_row_format= Dynamicがデフォ ルトに。 InnoDBのセカンダリーキー767bytes制限、1⾏のデータ 8000bytes制限を⾶び越えるための設定(5.5から使えた) がデフォルト化。 91/172
  93. 93. innodb̲default̲row̲formatの注意 ただし、オンラインALTER TABLEにちょっとだけ影響を及 ぼす。 ADD INDEXには影響ないです。- ADD COLUMNの場合、オンラインはオンラインなんだけど 同時にROW̲FORMATの暗黙の変換が(場合によって) ⾏われるので、テーブルを再構築し始める(オンライン はオンラインでできる) - 既にROW̲FORMATが明⽰されている場合は暗黙の変換は 起こらない。 92/172
  94. 94. ⼀応知っておいてほしい5.7 mysql.user.passwordカラムの廃⽌ 認証周りの構⽂の変更 secure̲file̲priv log̲timestamps mysql̲install̲db mysqld –initialize InnoDBバッファプールの暖気がデフォルトでONに binlog̲formatのデフォルト変更 rpmパッケージではvalidate̲passwordプラグインがデフォ ルトで有効 innodb̲default̲row̲formatの注意 93/172
  95. 95.   最低限これだけは知ってほしい5.7 ⼀応知っておいてほしい5.7 これを知っているとちょっと得する5.7 知っておいても損はない5.7 94/172
  96. 96. sysスキーマ performance̲schemaの情報を⾒やすくするためのビ ュー, ストアドプロシージャの集合 ストアドプロシージャの⽅はあまり本家で語られること がないけれど、ps̲setup̲saveとか便利。 - SHOW DATABASESするとsysがいますが、気にしないでくださ い。 95/172
  97. 97. sys.metrics 監視に良さそうな項目の詰め合わせ。 Type= InnoDB Metricsも詰め合わせてある。SHOW ENGINE INNODB STATUSをパースしなくてもそのままfluentdに⾷わせ てKibanaに送ったらいいんじゃないか疑惑 in 俺の中。 96/172
  98. 98. sys.metrics mysql> SELECT * FROM metrics LIMIT 10; +----------------------------+----------------+---------------+---------+ | Variable_name | Variable_value | Type | Enabled | +----------------------------+----------------+---------------+---------+ | aborted_clients | 4963 | Global Status | YES | | aborted_connects | 1 | Global Status | YES | | binlog_cache_disk_use | 0 | Global Status | YES | | binlog_cache_use | 14779017 | Global Status | YES | | binlog_stmt_cache_disk_use | 0 | Global Status | YES | | binlog_stmt_cache_use | 502 | Global Status | YES | | bytes_received | 21737114595 | Global Status | YES | | bytes_sent | 33296720984 | Global Status | YES | | compression | OFF | Global Status | YES | | com_admin_commands | 5827 | Global Status | YES | +----------------------------+----------------+---------------+---------+ 10 rows in set (0.02 sec) 97/172
  99. 99. sys.schema̲index̲statistics どのインデックスを使ってどれだけハンドラーが呼ばれた か、そのレイテンシーの合計は…というのが⾒られる。 あんまり使われてないインデックスをあぶりだすのは後述の sys.schema_unused_indexesビューでもいける。 98/172
  100. 100. sys.schema̲index̲statistics mysql> SELECT * FROM schema_index_statistics LIMIT 1G *************************** 1. row *************************** table_schema: xxxxxxxx table_name: table_1 index_name: PRIMARY rows_selected: 14113184 select_latency: 5.21 m rows_inserted: 0 insert_latency: 0 ps rows_updated: 13327613 update_latency: 39.57 m rows_deleted: 0 delete_latency: 0 ps 1 row in set (0.01 sec) 99/172
  101. 101. sys.schema̲unused̲indexes 名前そのものズバリ、使われてない(統計開始から⼀度も使 われていない)インデックスを⼀覧してくれる。 ただし、performance_schema.setup_actors, performance_schema.setup_objects, performance_schema.setup_instruments= 'wait/io/table/ sql/handler'あたりの設定に依存する。吊るしで使ってるな らフツーのテーブルではmysqldの起動時から全部統計が有効 になっている。 100/172
  102. 102. sys.schema̲unused̲indexes mysql> SELECT * FROM sys.schema_unused_indexes LIMIT 3G *************************** 1. row *************************** object_schema: xxxxxxx object_name: table_1 index_name: idx_number_1 *************************** 2. row *************************** object_schema: xxxxxxx object_name: table_1 index_name: idx_number_2 *************************** 3. row *************************** object_schema: xxxxxxx object_name: table_1 index_name: idx_number_3 3 rows in set (0.01 sec) 101/172
  103. 103. sys.statement̲analysis sys.format_statementというストアドファンクションを噛ん でいるせいで、queryカラムが切り詰められる。 performance_schema.events_statements_summary_by_diges t.digest_textに切り詰められていないステートメントがあ るので、USING (digest)でJOINしてやるとpt-query- digestっぽい出⼒が得られる。 102/172
  104. 104. sys.statement̲analysis mysql> SELECT * FROM sys.statement_analysis LIMIT 1G *************************** 1. row *************************** query: UPDATE `table_21` SET `bo ... RE `table_21` . `column_1` = ? db: xxxxxxx full_scan: exec_count: 13263309 err_count: 0 warn_count: 0 total_latency: 1.40 h max_latency: 18.38 ms avg_latency: 378.83 us lock_latency: 20.10 m rows_sent: 0 rows_sent_avg: 0 rows_examined: 13263309 rows_examined_avg: 1 rows_affected: 13263227 rows_affected_avg: 1 tmp_tables: 0 tmp_disk_tables: 0 rows_sorted: 0 sort_merge_passes: 0 digest: a73db02641a1215f4e54093763bde706 first_seen: 2015-06-24 17:46:51 last_seen: 2015-09-28 11:10:24 103/172
  105. 105. sys.statements̲with̲errors̲or̲warnings カジュアルに桁切り詰めワーニングを無視してるステートメ ントとか⼀網打尽にできる。 --gtid-enforce-consistency= WARNと組み合わせて使うと夢 が広がる。 DBAからの攻めの⼀⼿にどうぞ。 104/172
  106. 106. sys.statements̲with̲errors̲or̲warnings mysql> SELECT * FROM sys.statements_with_errors_or_warnings LIMI T 1G *************************** 1. row *************************** query: SELECT IF ( ( `locate` ( ? , ` ... . `COMPRESSED_SI ZE` ) ) DESC db: sys exec_count: 1 errors: 1 error_pct: 100.0000 warnings: 0 warning_pct: 0.0000 first_seen: 2015-09-28 10:36:27 last_seen: 2015-09-28 10:36:27 digest: 97b93c349004ed5d8774479aecc83eda 1 row in set (0.02 sec) 105/172
  107. 107. 危険なヤツら sys.innodb̲buffer̲stats̲by̲schema sys.innodb̲buffer̲stats̲by̲table sys.schema̲table̲statistics̲with̲buffer これ注意。 迂闊に触ると死ぬ ことがある。 内部的にinformaition̲schema.innodb̲buffer̲pageを⾒ ているので、でかいバッファプール(経験則だと20GB超) でやるとたまに突き刺さる。 特にCtrl + Cでクエリーを殺すと突き刺さる率が俺の中 では⾼い - 106/172
  108. 108. 名前で判りそうなやつら sys.statements̲with̲temp̲tables sys.statements̲with̲full̲table̲scans sys.statements̲with̲runtimes̲in̲95th̲percentile sys.statements̲with̲sorting sys.statements̲with̲temp̲tables 107/172
  109. 109. sysスキーマのストアドプロシージャ/ファンクション mysql> SELECT routine_name, routine_type FROM information_schema.routine s WHERE routine_schema= 'sys'; +-------------------------------------+--------------+ | routine_name | routine_type | +-------------------------------------+--------------+ .. | ps_setup_disable_background_threads | PROCEDURE | | ps_setup_disable_consumer | PROCEDURE | | ps_setup_disable_instrument | PROCEDURE | | ps_setup_disable_thread | PROCEDURE | | ps_setup_enable_background_threads | PROCEDURE | | ps_setup_enable_consumer | PROCEDURE | | ps_setup_enable_instrument | PROCEDURE | | ps_setup_enable_thread | PROCEDURE | | ps_setup_reload_saved | PROCEDURE | | ps_setup_reset_to_default | PROCEDURE | | ps_setup_save | PROCEDURE | .. +-------------------------------------+--------------+ 36 rows in set (0.01 sec) 108/172
  110. 110. GTIDのオンライン有効化がサポート 5.6ではマスターとスレーブで同じgtid-modeを持たなけれ ばならず、gtid̲modeはオンライン変更不可能だった。 masterslave gtid-mode= OFF gtid-mode= ON gtid-mode= OFF ○ × gtid-mode= ON × ○ 109/172
  111. 111. GTIDのオンライン有効化がサポート 5.7ではOFF̲PERMISSIVEとON̲PERMISSIVEが追加さ れ、かつ、オンラインでgtid̲modeを変更できるようにな った。 masterslave OFF OFF̲PERMISSIVE ON̲PERMISSIVE ON OFF ○ ○ ○ × OFF̲PERMIS SIVE ○ ○ ○ × ON̲PERMISS IVE × ○ ○ ○ ON × ○ ○ ○ 110/172
  112. 112. GTIDのオンライン有効化 slave> SET GLOBAL gtid_mode= OFF_PERMISSIVE; master> SET GLOBAL gtid_mode= OFF_PERMISSIVE; slave> SET GLOBAL gtid_mode= ON_PERMISSIVE; master> SET GLOBAL gtid_mode= ON_PERMISSIVE; slave> SET GLOBAL enforce_gtid_consistency= ON; master> SET GLOBAL enforce_gtid_consistency= ON; slave> SET GLOBAL gtid_mode= ON; master> SET GLOBAL gtid_mode= ON; 111/172
  113. 113. GTIDのオンライン有効化がサポート enforce_gtid_consistencyの取りうる値がON, OFF, WARN の3種類に。 enforce_gtid_consistency= WARNだと、ON̲PERMISSIVE 以上のgtid̲modeではエラーになるステートメントがワー ニングで出⼒される。 sys.statements_with_errors_or_warningsで拾っていく スタイル。 - 112/172
  114. 114. enforce̲gtid̲consistency= WARN mysql57> SELECT @@enforce_gtid_consistency; +----------------------------+ | @@enforce_gtid_consistency | +----------------------------+ | WARN | +----------------------------+ 1 row in set (0.00 sec) mysql57> CREATE TABLE t2 AS SELECT * FROM t1; Query OK, 1 row affected, 1 warning (0.04 sec) Records: 1 Duplicates: 0 Warnings: 1 mysql57> SHOW WARNINGS; +---------+------+-------------------------------------------------------------- -+ | Level | Code | Messag e | +---------+------+-------------------------------------------------------------- -+ | Warning | 1786 | Statement violates GTID consistency: CREATE TABLE ... SELEC T. | +---------+------+-------------------------------------------------------------- -+ 1 row in set (0.00 sec) 113/172
  115. 115. GTIDのオンライン有効化がサポート 今まではレプリケーションの系全体を⼀度シャットダウンし ないといけなかった。 mysqlfailoverやmysqlfabricはGTIDの有効化が条件になっ ている。 MHA for MySQLがrelay_log_info_repository= TABLE (クラッシュセーフスレーブの条件)で上⼿く動かなか ったので、どうにかしたかった。。 - これから流⾏る…といいな。 114/172
  116. 116. MySQLネイティブの全⽂検索が⽇本語対応 Not Only InnoDB. WITH PARSER句で利⽤するフルテキストパーサーを指定でき る(指定⾃体は5.5からできる) Ngram(デフォルトで有効)とMeCab(バンドルされてい るが、⾃分でmecabrcを編集してINSTALL PLUGIN) ざっとベンチした感じ、「MeCab」かつ「ファイルソート が気にならないレベルの⾏数」なら使えるかと。 115/172
  117. 117. MeCab FTパーサーの有効化 $ vim /etc/my.cnf [mysqld] loose-mecab-rc-file= /usr/lib64/mysql/mecab/etc/mecabrc mysql57> INSTALL PLUGIN mecab SONAME 'libpluginmecab.so'; Query OK, 0 rows affected (0.02 sec) 116/172
  118. 118. MySQLの全⽂検索で検索 mysql57> CREATE TABLE t1 (num serial, val varchar(32), FULLTEXT K EY(val) WITH PARSER mecab) CHARSET utf8; Query OK, 0 rows affected (0.16 sec) mysql57> SELECT * FROM t1 WHERE match(val) against ('がんばらな い' IN BOOLEAN MODE); +-----+--------------------------------------+ | num | val | +-----+--------------------------------------+ | 4 | 魔法少女@がんばらない | | 25 | ささみさん@がんばらない | | 85 | テラ@がんばらない | +-----+--------------------------------------+ 3 rows in set (0.00 sec) 117/172
  119. 119. InnoDB UNDO logのシュリンク 前提としてinnodb-undo-tablespaces >= 2が必要(UNDOロ グがibdata1ではなくてundo001とかに書かれている必要があ る) ibdata1が作成される時点で指定されていなければならな いので、mysql_install_db(or mysqld --initialize)の時 点でmy.cnfに書き込んでおかないといけない。 - SET GLOBAL innodb_undo_log_truncation= 1で有効化。 innodb_max_undo_log_sizeを超えているundoログがある場 合、デフォルトではパージ処理が128回(これが最⼤値)呼 ばれるたびにundo001とかのシュリンクが⾛ってしまうの で、⼩さくなったのが確認できたら無効に戻しておく⽅が良 い。 118/172
  120. 120. サーバーサイドステートメントタイムアウト 5.7.7までの書き⽅と変わっている セッション変数(と暗黙のデフォルトとしてのグローバル変 数)でも指定可能。 単位はミリ秒。 SELECTステートメントでだけ有効。安⼼してください。 119/172
  121. 121. サーバーサイドステートメントタイムアウト mysql57> SELECT /*+ MAX_EXECUTION_TIME(1000) */ * FROM t1; ERROR 3024 (HY000): Query execution was interrupted, maximum stat ement execution time exceeded mysql57> SET SESSION max_execution_time= 1000; Query OK, 0 rows affected (0.00 sec) mysql57> SELECT * FROM t1; ERROR 3024 (HY000): Query execution was interrupted, maximum stat ement execution time exceeded 120/172
  122. 122. generated columnで関数インデックス 「実カラムの値を計算した結果」を格納する専⽤のカラムを 作成できる STOREDタイプはALTER TABLE時に値が計算されてDisk に固定化 - VIRTUALタイプはSELECT時に都度計算- どちらのタイプもセカンダリーインデックスを作成でき る(セカンダリーインデックスはどちらのタイプでも Diskに固定化される) - 121/172
  123. 123. generated column mysql> SELECT * FROM t1; +------+------------+ | num | val | +------+------------+ | 1 | one | | 99 | ninty-nine | +------+------------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE t1 ADD is_over_20 TINYINT AS (num > 20) NOT NU LL; Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0 122/172
  124. 124. generated column mysql> SELECT * FROM t1; +------+------------+------------+ | num | val | is_over_20 | +------+------------+------------+ | 1 | one | 0 | | 99 | ninty-nine | 1 | +------+------------+------------+ 2 rows in set (0.00 sec) mysql> ALTER TABLE t1 ADD KEY (is_over_20); Query OK, 0 rows affected (0.03 sec) Records: 0 Duplicates: 0 Warnings: 0 123/172
  125. 125. generated columnで関数インデックス ⽣成された列にNOT NULL制約、UNIQUE制約もかけられる (疑似チェック制約が作れる) 直接値を投⼊することはできないが、「カラム」としては定 義されるのでSELECT *とかINSERT INTO .. VALUESに注意。 124/172
  126. 126. SSL関連いろいろ オレオレ証明書を⼀発で作ってくれるmysql_ssl_rsa_setup コマンド どこで実⾏してもdatadirに出⼒されるので、出⼒先を変 える時は--datadirオプションを渡す - $ mysql_ssl_rsa_setup .. writing RSA key $ ll *.pem -rw------- 1 mysql mysql 1675 Sep 29 20:22 ca-key.pem -rw-r--r-- 1 mysql mysql 1078 Sep 29 20:22 ca.pem -rw-r--r-- 1 mysql mysql 1086 Sep 29 20:22 client-cert.pem -rw------- 1 mysql mysql 1679 Sep 29 20:22 client-key.pem -rw------- 1 mysql mysql 1679 Sep 29 20:22 private_key.pem -rw-r--r-- 1 mysql mysql 451 Sep 29 20:22 public_key.pem -rw-r--r-- 1 mysql mysql 1086 Sep 29 20:22 server-cert.pem -rw------- 1 mysql mysql 1679 Sep 29 20:22 server-key.pem 125/172
  127. 127. SSL関連いろいろ クライアントにSSL接続を強要する require_secure_transportオプション mysql57> SET GLOBAL require_secure_transport= 1; Query OK, 0 rows affected (0.00 sec) $ mysql57 --protocol=tcp --skip-ssl ERROR 3159 (HY000): Connections using insecure transport are proh ibited while --require_secure_transport=ON. 126/172
  128. 128. JSONデータ型 データ型としてのJSONであり、基本的にはデータのバリデ ーションのみ⾏ってくれる(バイナリーパックとかしている らしいけど、クライアントから⾒るとバリデーションの有無 だけがTEXT/BLOBに突っ込む時との違い) JSONの検索はgenerated columnによる関数インデックス で多少何とかできる。 基本的に、今まで(トランザクションの保護が欲しいとかの 理由で)TEXT/BLOBにJSONを突っ込んでいた⼈たちがち ょっと幸せになるための機能。 127/172
  129. 129. JSONデータ型 バリデーションに失敗した時のエラーが3000番台なのが新 しい。 mysql57> CREATE TABLE t2 (num serial, j json); Query OK, 0 rows affected (0.02 sec) mysql57> INSERT INTO t2 VALUES (1, 'aaa'); ERROR 3140 (22032): Invalid JSON text: "Invalid value." at positi on 0 in value (or column) 'aaa'. 128/172
  130. 130. JSON型のための関数 mysql> SELECT val FROM t1 LIMIT 1G *************************** 1. row *************************** val: {"dt": 1443603809, "id": 1850147, "cod": 200, "sys": {"id": 7619, " type": 1, "sunset": 1443601626, "country": "JP", "message": 0.0181, "sun rise": 1443558902}, "base": "stations", "main": {"temp": 294.52, "humidi ty": 49, "pressure": 1020, "temp_max": 295.37, "temp_min": 292.04}, "nam e": "Tokyo", "wind": {"deg": 200, "speed": 6.7}, "coord": {"lat": 35.6 9, "lon": 139.69}, "clouds": {"all": 75}, "weather": [{"id": 803, "icon ": "04n", "main": "Clouds", "description": "broken clouds"}], "visibilit y": 10000} 1 row in set (0.00 sec) mysql> SELECT json_extract(val, '$.dt') AS dt, json_extract(val, '$.sys. country') AS country FROM t1 LIMIT 1; +------------+---------+ | dt | country | +------------+---------+ | 1443603809 | "JP" | +------------+---------+ 1 row in set (0.00 sec) 129/172
  131. 131. マルチスレッドスレーブの機能向上 5.6まではスキーマが分かれていないとパラレルに動けなか った 5.7ではslave_parallel_type= {DATABASE|LOGICAL_CLOCK}で スキーマ単位のMTSと、 マスターで記録されたロジカルタ イムスタンプ を利⽤したMTSが選べる。 マスターはどのトランザクションとどのトランザクショ ンが 競合せずにCOMMITできたか を知っている - 競合せずにCOMMITできたトランザクション同⼠は、ス レーブでパラレルに実⾏されても競合することはない - gitでファイルAを更新したコミットとファイルBを更新し たコミットはコンフリクトしないから、どっちを先にマ ージしても構わない…というのと⼀緒(かな︖) - 130/172
  132. 132. これを知っているとちょっと得する5.7 sysスキーマ GTIDのオンライン有効化がサポート MySQLネイティブの全⽂検索が⽇本語対応 InnoDB UNDO logのシュリンク サーバーサイドステートメントタイムアウト generated columnで関数インデックス SSL関連いろいろ JSONデータ型 マルチスレッドスレーブの機能向上 131/172
  133. 133.   最低限これだけは知ってほしい5.7 ⼀応知っておいてほしい5.7 これを知っているとちょっと得する5.7 知っておいても損はない5.7 132/172
  134. 134. innodb̲buffer̲pool̲sizeのオンライン変更がサポート バッファプールを⼤きくするとき innodb̲buffer̲pool̲chunk̲size ごとに新しいページを 確保しながらゴニョゴニョやる - この処理中は バッファプールへの全てのアクセスがブロ ックされる - 133/172
  135. 135. innodb̲buffer̲pool̲sizeのオンライン変更がサポート バッファプールを⼩さくするとき innodb̲buffer̲pool̲chunk̲size ごとにページを追い出 しながらゴニョゴニョやる - 常にバッファプールミスヒットが起こり続けるイメージ でだいたい合ってる。 - ⽌めてバッファプールの暖気をしなおすよりは速くて便利だ けど、本当にオンラインでやるべきではない。 134/172
  136. 136. innodb̲buffer̲pool̲sizeのオンライン変更 非同期で裏でやるのでSET GLOBALはすぐ戻ってくる mysql57> SET GLOBAL innodb_buffer_pool_size= 2 * 1024 * 1024 * 1024; Query OK, 0 rows affected (0.00 sec) $ less error.log 2015-09-29T11:24:49.099855Z 0 [Note] InnoDB: Resizing buffer pool from 1 34217728 to 2147483648. (unit=134217728) 2015-09-29T11:24:49.100508Z 0 [Note] InnoDB: disabled adaptive hash inde x. 2015-09-29T11:24:49.274486Z 0 [Note] InnoDB: buffer pool 0 : 15 chunks (122880 blocks) were added. 2015-09-29T11:24:49.277227Z 0 [Note] InnoDB: buffer pool 0 : hash table s were resized. 2015-09-29T11:24:49.330346Z 0 [Note] InnoDB: Resized hash tables at lock _sys, adaptive hash index, dictionary. 2015-09-29T11:24:49.330397Z 0 [Note] InnoDB: Completed to resize buffer pool from 134217728 to 2147483648. 2015-09-29T11:24:49.333206Z 0 [Note] InnoDB: Re-enabled adaptive hash in dex. 135/172
  137. 137. sync̲binlogのデフォルト変更 InnoDBのクラッシュリカバリーの中でバイナリーログを使 う箇所がある より安全なsync_binlog= 1に変更…というか- sync_binlog= 0は 危険な設定 (クラッシュリカバリーが 失敗することがある) - binlogへの書き出しが失敗した際に、⼀貫性を保つため mysqldをダウンさせるオプションが有効になっている MySQL :: MySQL 5.7 Reference Manual :: 17.1.6.4 Binary Logging Options and Variables - 実は5.6から既にsync̲binlog= 0は危険 なんだけど。- 136/172
  138. 138. マルチソースレプリケーション マルチスレッドスレーブ(MTS)とは別物。 1つのI/Oスレッドは相変わらず1つのマスターにしか接続し ない。 今のところMTSと併⽤できない。 複数のMySQLから集約スレーブを作ってJOINJOIN。 ⽔平シャーディングしたサーバーの集約。 137/172
  139. 139. シングルソース、シングルスレッドレプリケーション 138/172
  140. 140. シングルソース、マルチスレッドレプリケーション 139/172
  141. 141. マルチソース、シングルスレッドレプリケーション 140/172
  142. 142. マルチソースレプリケーション 今までのレプリケーション関連コマンドの末尾にFOR CHANNEL 'channel_name'をつけるだけでOK mysql57> STOP SLAVE FOR CHANNEL 'node2'; mysql57> SHOW SLAVE STATUS FOR CHANNEL 'node2'G mysql57> START SLAVE FOR CHANNEL 'node2'; 141/172
  143. 143. ダイナミックレプリケーションフィルター --replicate-ignore-*オプションとか--replicate-do-*オプ ション相当の操作がSQLインターフェースで可能になった ただしSQLスレッドは停⽌する必要がある 142/172
  144. 144. ダイナミックレプリケーションフィルター mysql57> CHANGE REPLICATION FILTER replicate_ignore_db= (mysql, p erformance_schema); ERROR 3017 (HY000): This operation cannot be performed with a run ning slave sql thread; run STOP SLAVE SQL_THREAD first mysql57> STOP SLAVE sql_thread; mysql57> CHANGE REPLICATION FILTER replicate_ignore_db= (mysql, p erformance_schema); Query OK, 0 rows affected (0.00 sec) mysql57> START SLAVE sql_thread; 143/172
  145. 145. InnoDBの新しい圧縮 Transparent Page Compression 今までの圧縮はソフトウェア(InnoDB内)でページまるごと zlib圧縮 Transparent Page Compressionはページの中のデータ部 分だけ圧縮し、ページ内の空き領域の圧縮はファイルシステ ムとデバイスに任せる zlibとlz4が選べる 144/172
  146. 146. InnoDBの新しい圧縮 対応ディストリビューションが限定されている、Intel SSD でxfsだとデバイスに任せた⽅がむしろ遅かった、とか、⾃ 分でベンチした⽅が良さげ Fusion-ioとなら相性良いはず(今までとほぼ同じ圧縮率、 今までの無圧縮に数%のオーバーヘッドだけで済むとか⾔っ てる) Third day with InnoDB transparent page compression InnoDB Transparent Page Compression | MySQL Server Blog 145/172
  147. 147. 1テーブルに複数トリガー設定可能 {BEFORE|AFTER} {INSERT|UPDATE|DELETE}トリガー があったが、同じアクションに対するトリガーは1つしか定 義できなかった。 MySQL 5.7からはBEFORE INSERTトリガーを3つとか作れ る。 複数設定できるということは順番の概念が発⽣するので気を 付けて。 146/172
  148. 148. 1テーブルに複数トリガー設定可能 mysql57> CREATE TRIGGER before_insert_1 BEFORE INSERT ON t1 FOR EACH ROW INSERT INTO t2 SET num = NEW.num, val = NEW.val; Query OK, 0 rows affected (0.01 sec) mysql57> CREATE TRIGGER before_insert_2 BEFORE INSERT ON t1 FOR EACH ROW UPDATE t2 SET val = '残念だったな' WHERE num = NEW.nu m; Query OK, 0 rows affected (0.00 sec) mysql57> INSERT INTO t1 VALUES (1, 'one'); Query OK, 1 row affected (0.00 sec) mysql57> SELECT * FROM t2; +-----+--------------------+ | num | val | +-----+--------------------+ | 1 | 残念だったな | +-----+--------------------+ 1 row in set (0.00 sec) 147/172
  149. 149. mysql p ump mysql d umpの後継を狙っているらしい。論理バックアッ プのパラレル版。 mysqlpumpの中だけで圧縮(zlib, lz4) --userオプションでGRANTステートメントを出⼒してくれ たり --watch-progressオプションがデフォルト有効 インデックスの遅延ロード(--defer-table-indexes)がデフ ォルトで有効 まだ発展途上。これからに期待 148/172
  150. 150. log-syslog エラーログをloggerで出⼒する 今までもmysqld_safeには--syslogオプションがあったけ ど、アレはmysqld_safeのログだけ log_syslog_facility, log_syslog_tagオプションで読みやす くできる ちなみにこっちはlog_timestampsの影響を受けないので、エ ラーログは今後こっちが⾒やすいかも 149/172
  151. 151. log-syslog $ less /var/log/messages .. Sep 29 20:27:54 e23cb0f9dde9 mysqld[1683]: /usr/sbin/mysqld (mysq ld 5.7.8-rc-log) starting as process 1683 ... .. Sep 29 20:27:54 e23cb0f9dde9 mysqld[1683]: Event Scheduler: Loade d 0 events Sep 29 20:27:54 e23cb0f9dde9 mysqld[1683]: /usr/sbin/mysqld: read y for connections.#012Version: '5.7.8-rc-log' socket: '/var/lib/ mysql/mysql.sock' port: 3306 MySQL Community Server (GPL) 150/172
  152. 152. オフラインモード クエリーが終わったものから順番に切断(server has gone awayが返る) SUPER権限以外はそれ以降接続できなくなる エラーコードが3032でそれ⽤のものになっているので、こ のあたり上⼿くハンドルすればgraceful shutdownの夢を⾒ るか 151/172
  153. 153. オフラインモード mysql57-root> SET GLOBAL offline_mode= 1; Query OK, 0 rows affected (0.00 sec) mysql57-yoku0825> show databases; ERROR 2006 (HY000): MySQL server has gone away $ mysql57 -uyoku0825 ERROR 3032 (HY000): The server is currently in offline mode 152/172
  154. 154. GET̲LOCK関数で複数のロックを取れる 複数取れるってことは、デッドロックの可能性があるってこ とだ デッドロックしてもInnoDBのように他のロックをリリース はしてくれないから、コネクションを切断するか⾃分で release̲lockかrelease̲all̲locksしてやらないとダメ 153/172
  155. 155. GET̲LOCK関数でデッドロックさせてみる mysql57> SELECT GET_LOCK('yoku0825', 1); +-------------------------+ | GET_LOCK('yoku0825', 1) | +-------------------------+ | 1 | +-------------------------+ 1 row in set (0.00 sec) mysql57> SELECT GET_LOCK('yoku0826', 1); ERROR 3058 (HY000): Deadlock found when trying to get user-level lock; try rolling back transaction/releasing locks and restartin g lock acquisition. mysql57> SELECT RELEASE_ALL_LOCKS(); +---------------------+ | RELEASE_ALL_LOCKS() | +---------------------+ | 1 | +---------------------+ 1 row in set (0.00 sec) 154/172
  156. 156. Query Rewrite Plugin SQLをパースする前とパースした後にプラグインAPIの⼝が ⽤意されている MySQL Proxyがmysqldの中に⼊っちゃってる感じ パース前ならクエリー書き換え放題 パース後のAPIに上⼿く差し込むようにすれば監査ログを吐 き出せるようにできるかな 155/172
  157. 157. Query Rewrite Plugin 156/172
  158. 158. 知っておいても損はない5.7 innodb̲buffer̲pool̲sizeのオンライン変更がサポート sync̲binlogのデフォルト変更 マルチソースレプリケーション ダイナミックレプリケーションフィルター InnoDBの新しい圧縮 1テーブルに複数トリガー設定可能 mysql p ump log-syslog オフラインモード GET̲LOCK関数で複数のロックを取れる Query Rewrite Plugin 157/172
  159. 159. 変更された暗黙のデフォルト 5.6 defaultに合わせるようなmy.cnfを書くと、5.6コンパ チに近付けられる。 my.cnfだけじゃどうしようもないものもある (mysql.user.passwordカラムがなくなったやつとか) 158/172
  160. 160. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default binlog̲error̲action IGNORE̲ERROR ABORT̲SERVER binlog̲format STATEMENT ROW binlog̲group̲commit̲sy nc̲delay N/A 0 binlog̲group̲commit̲sy nc̲no̲delay̲count N/A 0 binlog̲gtid̲simple̲recov ery OFF ON check̲proxy̲users N/A OFF default̲authentication̲pl ugin N/A (mysql̲native̲password ) mysql̲native̲password default̲password̲lifeti me N/A(0) (<= 5.7.10は360) 0 159/172
  161. 161. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default disabled̲storage̲engine s N/A ”“(empty) eq̲range̲index̲dive̲lim it 10 200 gtid̲executed̲compressi on̲period N/A 1000 have̲statement̲timeout N/A YES innodb̲adaptive̲hash̲in dex̲parts N/A(1) 8 innodb̲additional̲me m̲pool̲size 8M N/A innodb̲buffer̲pool̲chun k̲size N/A 128M 160/172
  162. 162. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default innodb̲buffer̲pool̲dum p̲at̲shutdown OFF ON innodb̲buffer̲pool̲dum p̲pct N/A(100) 25 innodb̲buffer̲pool̲insta nces 8 1 innodb̲buffer̲pool̲load ̲at̲startup OFF ON innodb̲checksum̲algorit hm innodb CRC32 innodb̲default̲row̲for mat N/A(compact) dynamic innodb̲file̲format Antelope Barracuda innodb̲file̲format̲max Antelope Barracuda 161/172
  163. 163. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default innodb̲fill̲factor N/A(100) 100 innodb̲flush̲sync N/A ON innodb̲large̲prefix OFF ON innodb̲log̲buffer̲size 8M 16M innodb̲log̲checksum̲al gorithm N/A(none) CRC32 innodb̲log̲checksums N/A(OFF) ON innodb̲log̲write̲ahead ̲size N/A(0) 8k innodb̲mirrored̲log̲gro ups 1(N/A) N/A innodb̲max̲undo̲log̲si ze N/A 1G 162/172
  164. 164. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default innodb̲numa̲interleave N/A(OFF) OFF innodb̲page̲cleaners N/A(1) 1 innodb̲purge̲rseg̲trun cate̲frequency N/A 128 innodb̲purge̲threads 1 4 innodb̲strict̲mode OFF ON innodb̲temp̲data̲file̲p ath N/A ibtmp1:12M:autoextend innodb̲undo̲log̲truncat e N/A OFF innodb̲use̲sys̲malloc ON N/A(ON) internal̲tmp̲disk̲stor age̲engine N/A(MyISAM) InnoDB 163/172
  165. 165. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default log̲backward̲compatibl e̲user̲definitions N/A OFF log̲builtin̲as̲identified̲ by̲password N/A OFF log̲error̲verbosity N/A 3 log̲syslog N/A OFF log̲syslog̲facility N/A daemon log̲syslog̲include̲pid N/A ON log̲syslog̲tag N/A ”“(empty) log̲timestamps N/A(SYSTEM) UTC log̲warnings 1 2 max̲execution̲time N/A 0 max̲points̲in̲geometry N/A 65536 164/172
  166. 166. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default mysql̲native̲password̲ proxy̲users N/A OFF ngram̲token̲size N/A 2 offline̲mode N/A OFF optimizer̲switch snip snip performance̲schema̲* snip snip require̲secure̲transport N/A OFF secure̲file̲priv ”“(empty) /var/lib/mysql-files(rpm, dpkg only) show̲compatibility̲56 N/A OFF slave̲net̲timeout 3600 60 slave̲parallel̲type N/A DATABASE sql̲mode snip snip 165/172
  167. 167. 変更された暗黙のデフォルト variable̲name 5.6 default 5.7 default super̲read̲only N/A OFF sync̲binlog 0 1 table̲open̲cache̲instan ces 1 16 thread̲concurrency 10 N/A timed̲mutexes OFF N/A transaction̲write̲set̲ex traction N/A OFF 166/172
  168. 168. ⼼得 向こう1年くらいは新機能には⼿を出さない 新しいパラメーター、変更になったパラメーターは調べてお いた⽅がいい 5.5 => 5.6は⼀部を除いてそんなに影響はなかった (し、オンラインで変更できるものが多かった) - 5.6の時と同じペースなら、GAから1年後くらいにアーリー マジョリティーが出てくるかなってところ。 既存のものを置き換えるよりは、まっさらなサービスを作る タイミングで積極的に 地雷を踏み抜く 運⽤上の問題を洗い 出していく 踏み抜いた 罠 運⽤上の問題を共有してもらえれば、次の ⼈はうまくいく - 167/172
  169. 169. 罠 #とは 知らないところに置かれているといきなり⾷らって致命傷に なることがある 置いてある場所がわかって、どんな罠だかがわかって、解除 の⽅法を知っていれば致命傷にはならない みんなで知れば怖くない <censored> 168/172
  170. 170. 発⾒報告はたとえばこんなところに ⽇本MySQLユーザ会メーリングリスト メーリングリストに登録するだけで⽇本MySQLユーザ会 員なんですよ知ってました︖ - 中の⼈も⾒てたり、真⾯目成分多め- MySQL Casual Slack ユーザー成分多め- Qiita、ブログその他⾃⾝の情報発信場所 169/172
  171. 171. よろしくお 願いします 170/172
  172. 172. それでは、楽しい PHP 7 + MySQL 5.7ライフを :) 171/172
  173. 173. Questions and/or Suggestions? 172/172

×