Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

今から備えるMySQL最新バージョン5.7

24,154 views

Published on

2015/06/10 db tech showcase 2015 Tokyo

ログを貼り付けている部分が見にくくなっていますので、
http://yoku0825.blogspot.jp/search/label/5.7
などでも同じような内容が見られたりします

Published in: Technology

今から備えるMySQL最新バージョン5.7

  1. 1. 今から備えるMySQL最新バージョン 5.7 とあるイルカの最新情報 2015/06/10 yoku0825 db tech showcase 2015 Tokyo
  2. 2. MySQLといえば(都内のDBA1.000⼈に訊きました) 軽量 ⾼速 バカ イメージですので実物とは異なる場合があります 1/94
  3. 3. 気付いてい ますか︖ 2/94
  4. 4. これ、MyISAMの特徴ですよね 軽量 データのキャッシュはOSまかせ- ⾼速 テーブルスキャンに無駄に強いデータパック- バカ むずかしいこと、できない- 3/94
  5. 5. InnoDBの特徴といえば︖ 軽量でもない 5.7.7のバイナリーなんてmysqldだけで200MB超えた- ⾼速なのはハマった時だけ バッファプール上でインデックスのみで綺麗に仕留めれば速い- バカ 統計情報がねー。。- 4/94
  6. 6. これからのMySQL MyISAMの時代はもうずいぶん前に終わって InnoDB優遇時代 サードパーティーのストレージエンジンはどうなっていくの やら オプティマイザーの向上により、バカの汚名は返上されるん じゃないか Semi-joinだって5.6で実装されたんだよ GTIDによる より「使い捨て」 の時代がやってくる かも し れない 5/94
  7. 7. \こんにちは/ yoku0825@とある企業のDBA オラクれない- ポスグれない- マイエスキューエる- これでもOracle ACE- 家に帰ると 妻の夫- せがれの⽗- ムスメの⽗- Twitter: @yoku0825 Blog: ⽇々の覚書 MyNA ML: ⽇本MySQLユーザ会 6/94
  8. 8. MySQL 5.7について 2013年4⽉に5.7.1-m11(Development Milestone Release, ベータ版) 2015年4⽉に5.7.7-rc(Realease Candidate, リリース候補 版) 2015/06/10現在、GA(General Available, ⼀般公開版)は まだ 5.6のGA時点で「Oracleとしては18〜24か⽉で次のメジ ャーバージョンをリリースする予定」と⾔っていたので、ズ レこんでいるのは確か 7/94
  9. 9. TL;DR 8/94
  10. 10. 最低限これだけは知ってほしい5.7 16桁ハッシュのパスワードのサポートが廃⽌ mysql.user.passwordカラムの廃⽌ default̲password̲lifetimeの設定 SET PASSWORD, GRANT, SHOW GRANTS周りの変更 sql̲modeの盛⼤な変更 log̲error̲verbosityとlog̲warningsの間の中途半端な状態 明⽰, 暗黙のテンポラリーテーブルにInnoDBがデフォルト で使われる log̲timestamps変数によるログ上のタイムスタンプのUTC 化 9/94
  11. 11. ⼀応知っておいてほしい5.7 binlog̲formatの暗黙のデフォルトがSTATEMENTから ROWに mysql̲install̲dbが非推奨, データベースの初期化は mysqld –initializeに sync̲binlogのデフォルトが 0 => 1 に InnoDBバッファプールの暖気がデフォルトON(しかも25% )に sysスキーマの標準バンドル secure̲file̲privの変更 廃⽌されたオプション スローログ関連の閾値が⼤幅に変更される かも 10/94
  12. 12. これを知っているとちょっと得する5.7 オプションの前⽅⼀致補完の廃⽌ GTIDのオンライン有効化がサポート innodb̲buffer̲pool̲sizeのオンライン変更がサポート 11/94
  13. 13. 勝⼿に性能が良くなったりするのは本家に譲ります InnoDB Online DDLの適⽤範囲拡⼤(OPTIMIZE TABLEも できるようになった) エラーログのsyslog出⼒ InnoDB Native PartitioningでICPやTransportable Table Spaceが使えるように。 Binlog dump threadのロック競合を軽減 マスターにたくさん(開発元の資料だと100くらいまで)スレーブをぶ ら下げても性能の劣化がほとんど起こらない - マルチユーザーレベルロック get̲lock関数のアレ- InnoDB Pagesize 圧縮⾯で有利に- 12/94
  14. 14. 勝⼿に性能が良くなったりするのは本家に譲ります クエリーリライトプラグイン mysqldの中にプロキシが組み込まれているようなイメージ- オフラインモード 今⽣きているクエリー(not トランザクション)は⽣かしつつ、それ以 外の全ての操作に対してError: 3032 (ER̲SERVER̲OFFLINE̲MODE)を返す - そこまで⾒てくれるロードバランサーを使っているならgraceful shutdownの夢が⾒られる かも - innodb̲undo̲log̲truncate ibdata1肥⼤化の主要因だったundoセグメントが解放できるように- InnoDBテーブルスペース作成時にinnodb̲undo̲tablespacesを2以 上にしておかないといけない - マルチトリガーのサポート 13/94
  15. 15. 勝⼿に性能が良くなったりするのは本家に譲ります generated columnの追加 JSON型と合わせてドキュメントストアの夢を⾒るのか- mysqlbinlogが–rewrite-dbをサポート マルチソースレプリケーションが実装。 ngramとMeCabのフルテキストパーサーをサポート。 ngramは兎も角、MeCabは完全に⽇本特化の機能を⼊れてきた。- mysql̲ssl̲rsa̲setupコマンドで簡単にSSL証明書作成 ALTER TABLE .. RENAME INDEX構⽂のサポート。 CHANGE REPLICATION FILTER構⽂のサポート。 replicate̲do̲table, replicate̲ignore̲dbなどの設定がオンライン で可能。 - 14/94
  16. 16. 勝⼿に性能が良くなったりするのは本家に譲ります マルチスレッドスレーブの強化 スキーマ単位で別れていなくても並列実⾏可能に- オプティマイザーさんが賢くなった 本当に賢くなっていてびっくり。- 「MySQLでこういうクエリーはダメだよ」って資料を作っている時 に、5.7だといい実⾏計画選んでくれちゃってテーマが成⽴しなくな るくらい予想外にいい。 - メタデータロックの競合を減らす改良。 InnoDBのREAD ONLY Transactionのデフォルト化による 並列性能の向上。 InnoDB memcached pluginで効果を発揮。- サーバーサイドステートメントタイムアウトのサポート。 15/94
  17. 17. 参考URL MySQL :: MySQL 5.7 Reference Manual :: 1.4 What Is New in MySQL 5.7 MySQL :: MySQL 5.7 Release Notes 16/94
  18. 18. 16桁ハッシュのパスワードのサポートが廃⽌ mysql̲old̲passwordプラグインの消失(=16桁ハッシュの パスワードはもうログインできない) OLD̲PASSWORD関数もなくなる- secure̲auth= 0, skip̲secure̲authは設定できない。とい うかsecure̲authというオプションそのものに意味がなくな った。 16桁ハッシュのパスワードでもログインできるようにするオプション- old̲passwords= 1も設定できなくなったが、 old̲passwords= 2というオプションは存在する。 パスワードハッシュ形式にSHA-256を使⽤するようにするオプショ ン。 - その名前でいいのかって誰も突っ込まなかったのか。- 17/94
  19. 19. 余談(old̲passwords= 2) mysql57> SET old_passwords= 1; ERROR 1231 (42000): Variable 'old_passwords' can't be set to the value of '1' mysql57> SET old_passwords= 0; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql57> SELECT PASSWORD('abc'); +-------------------------------------------+ | PASSWORD('abc') | +-------------------------------------------+ | *0D3CED9BEC10A777AEC23CCC353A8C08A633045E | +-------------------------------------------+ 1 row in set, 1 warning (0.00 sec) mysql57> SET old_passwords= 2; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql57> SELECT password('abc'); +----------------------------------------------------------------------+ | password('abc') | +----------------------------------------------------------------------+ | $5$}SrJ-Kn|v#bF3m$ptR5EesAdYAcWIuJ1mTUcp91UdPT1YOMau96B76C4Y. | +----------------------------------------------------------------------+ 1 row in set, 1 warning (0.04 sec) 18/94
  20. 20. 16桁ハッシュのパスワード mysql55> SELECT user, host, password FROM user; +--------------+------+------------------------------------------ -+ | user | host | passwor d | +--------------+------+------------------------------------------ -+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC2 9 | | old_password | % | 378b243e220ca49 3 | +--------------+------+------------------------------------------ -+ 2 rows in set (0.00 sec) 19/94
  21. 21. 5.6の時点で新しく16桁ハッシュのユーザーは作成できな い mysql56> SELECT @@old_passwords; +-----------------+ | @@old_passwords | +-----------------+ | 1 | +-----------------+ 1 row in set (0.00 sec) mysql56> GRANT usage ON *.* TO old_password IDENTIFIED BY 'test'; ERROR 1827 (HY000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD () function. mysql56> GRANT USAGE ON *.* TO 'old_password'@'%' IDENTIFIED BY PASSWOR D '378b243e220ca493'; ERROR 1827 (HY000): The password hash doesn't have the expected format. Check if the correct password algorithm is being used with the PASSWORD () function. 20/94
  22. 22. 16桁ハッシュのユーザーが存在する状態でアップグレー ドした場合のみ $ bin/mysql_upgrade .. Warning 1642 Pre-4.1 password hash found. It is deprecated and will be remove d in a future release. Please upgrade it to a new format. .. mysql56> SELECT user, host, password FROM user; +--------------+------+-------------------------------------------+ | user | host | password | +--------------+------+-------------------------------------------+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | | old_password | % | 378b243e220ca493 | +--------------+------+-------------------------------------------+ 2 rows in set (0.00 sec) 21/94
  23. 23. 5.6の時点でデフォルトでは16桁ハッシュのユーザーは接 続できなくなっている $ mysql -S /usr/mysql/5.6.25/data/mysql.sock -uold_password -ptest Warning: Using a password on the command line interface can be insecure. ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication prot ocol refused (client option 'secure_auth' enabled) $ mysql56 -uold_password -ptest --skip-secure-auth Warning: Using a password on the command line interface can be insecure. ERROR 1275 (HY000): Server is running in --secure-auth mode, but 'old_pa ssword'@'localhost' has a password in the old format; please change the password to the new format mysql56> SET GLOBAL secure_auth= 0; $ mysql56 -uold_password -ptest --skip-secure-auth 22/94
  24. 24. 5.7へのアップグレード時に残っている16桁ハッシュのユ ーザーは認証できなくなる $ 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 and wi ll be removed in a future release. Please upgrade it to a new format. .. mysql57> SELECT user, host, authentication_string FROM user; +--------------+------+-------------------------------------------+ | 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 23/94
  25. 25. mysql.user.passwordカラムの廃⽌ mysql56> SELECT user, host, password, authentication_string FROM user; +--------------+------+-------------------------------------------+-----------------------+ | user | host | password | authentication_string | +--------------+------+-------------------------------------------+-----------------------+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | NULL | | old_password | % | 378b243e220ca493 | NULL | +--------------+------+-------------------------------------------+-----------------------+ 2 rows in set (0.00 sec) mysql57> SELECT user, host, password, authentication_string FROM user; ERROR 1054 (42S22): Unknown column 'password' in 'field list' mysql57> SELECT user, host, authentication_string FROM user; +--------------+------+-------------------------------------------+ | user | host | authentication_string | +--------------+------+-------------------------------------------+ | new_password | % | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 | | old_password | % | NULL | +--------------+------+-------------------------------------------+ 2 rows in set (0.03 sec) 24/94
  26. 26. default̲password̲lifetimeの設定 暗黙のデフォルトで360に設定されており、 password̲last̲changedから360⽇以上経過するとそのア カウントでログインできなくなる。 mysql57> SELECT user, host, plugin, authentication_string, password_expired, password_last_changed, pas sword_lifetime, account_locked FROM mysql.user WHERE user= 'yoku0825'G *************************** 1. row *************************** user: yoku0825 host: % plugin: mysql_native_password authentication_string: *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA 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 change it using a client that support s expired passwords. 25/94
  27. 27. default̲password̲lifetimeの値の変更 SET GLOBALでオンライン変更可能, 単位は “⽇” 0を指定することで、default̲password̲lifetimeを利⽤し なくなる。 mysql57> SET GLOBAL default_password_lifetime= 36500; Query OK, 0 rows affected (0.00 sec) $ mysql57 -uyoku0825 -p -e "SELECT current_user()" Enter password: +----------------+ | current_user() | +----------------+ | yoku0825@% | +----------------+ mysql57> SET GLOBAL default_password_lifetime= 0; Query OK, 0 rows affected (0.00 sec) $ mysql57 -uyoku0825 -p -e "SELECT current_user()" Enter password: +----------------+ | current_user() | +----------------+ | yoku0825@% | +----------------+ 26/94
  28. 28. ALTER USERによるEXPIREの制御 PASSWORD EXPIRE NEVERで無効化。 mysql.user.password̲lifetimeは0になる。- mysql57> ALTER USER yoku0825 PASSWORD EXPIRE NEVER; Query OK, 0 rows affected (0.00 sec) mysql57> SELECT user, host, plugin, authentication_string, password_expired, password_last_change d, password_lifetime, account_locked FROM mysql.user WHERE user= 'yoku0825'G *************************** 1. row *************************** user: yoku0825 host: % plugin: mysql_native_password authentication_string: *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA password_expired: N password_last_changed: 1999-07-31 00:00:00 password_lifetime: 0 account_locked: N 1 row in set (0.00 sec) $ mysql57 -uyoku0825 -p -e "SELECT current_user()" Enter password: +----------------+ | current_user() | +----------------+ | yoku0825@% | +----------------+ 27/94
  29. 29. ALTER USERによるEXPIREの制御 PASSWORD EXPIRE DEFAULTで default̲password̲lifetimeを使って評価するようになる。 mysql.user.password̲lifetimeがNULLになる。- mysql57> ALTER USER yoku0825 PASSWORD EXPIRE DEFAULT; Query OK, 0 rows affected (0.00 sec) mysql57> SELECT user, host, plugin, authentication_string, password_expired, password_last_ch anged, password_lifetime, account_locked FROM mysql.user WHERE user= 'yoku0825'G *************************** 1. row *************************** user: yoku0825 host: % plugin: mysql_native_password authentication_string: *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA 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 -uyoku0825 -p -e "SELECT current_user()" Enter password: ERROR 1862 (HY000): Your password has expired. To log in you must change it using a client th at supports expired passwords. 28/94
  30. 30. ALTER USERによるEXPIREの制御 PASSWORD EXPIRE INTERVAL .. DAYでパスワードのラ イフタイムを明⽰的に指定。 password̲lifetimeには整数値が⼊る。- 飽くまでpassword̲last̲changedからの基準。- mysql57> ALTER USER yoku0825 PASSWORD EXPIRE INTERVAL 36000 DAY; Query OK, 0 rows affected (0.00 sec) red, password_last_changed, password_lifetime, account_locked FROM mysql.user WHERE user= 'yoku0825'G *************************** 1. row *************************** user: yoku0825 host: % plugin: mysql_native_password authentication_string: *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA password_expired: N password_last_changed: 1999-07-31 00:00:00 password_lifetime: 36000 account_locked: N 1 row in set (0.00 sec) $ mysql57 -uyoku0825 -p -e "SELECT current_user()" Enter password: +----------------+ | current_user() | +----------------+ | yoku0825@% | +----------------+ 29/94
  31. 31. SET 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) Syntax Errorになってしまうのは5.7.7で修正され、実⾏は できるけどワーニングに変更。 30/94
  32. 32. SHOW GRANTSの出⼒結果 mysql56> SHOW GRANTS FOR 'sample_user'@'localhost'; Grants for sample_user@localhost GRANT USAGE ON *.* TO 'sample_user'@'localhost' IDENTIFIED BY PAS SWORD '*3BF184F64D4B52EF240062F6F73405B620FFF8FE' GRANT ALL PRIVILEGES ON `db`.* TO 'sample_user'@'localhost' 2 rows in set (0.00 sec) mysql57> SHOW GRANTS FOR 'sample_user'@'localhost'; Grants for sample_user@localhost GRANT USAGE ON *.* TO 'sample_user'@'localhost' GRANT ALL PRIVILEGES ON `db`.* TO 'sample_user'@'localhost' 2 rows in set (0.00 sec) パスワードハッシュの値が出⼒されなくなった。 31/94
  33. 33. IDENTIFIED BY周りの変更 mysql57> GRANT ALL ON db.* TO grant_style@localhost IDENTIFIED BY 'test '; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql57> SHOW WARNINGSG *************************** 1. row *************************** Level: Warning Code: 1287 Message: Using GRANT for creating new user is deprecated and will be rem oved in future release. Create new user with CREATE USER statement. 1 row in set (0.00 sec) mysql57> CREATE USER create_style@localhost IDENTIFIED BY 'test'; Query OK, 0 rows affected (0.01 sec) mysql57> GRANT ALL ON db.* TO create_style@localhost; Query OK, 0 rows affected (0.04 sec) 32/94
  34. 34. IDENTIFIED BY周りの変更 IDENTIFIED BY PASSWORD ʻ*..ʼ(ʻ*..ʼは41桁ハッシュさ れたパスワード)の構⽂でもワーニングが出る。 ワーニングは出るけれど取り敢えずまだ使える。 IDENTIFIED WITH mysql̲native̲password AS ʻ*..ʼ構⽂ を使う(Authentication Pluginとか使ってて他のプラグイン 使う場合はプラグイン名読み替える) 最終的な推奨としては、CREATE USER .. IDENTIFIED WITH mysql̲native̲password AS ʻ*..ʼ ちなみにASはBYでもいいらしい。ワーニングメッセージに 合わせてみただけ。 33/94
  35. 35. IDENTIFIED BY周りの変更 mysql57> GRANT ALL ON db.* TO grant_style@localhost IDENTIFIED BY PASSWO RD '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql57> SHOW WARNINGSG *************************** 1. row *************************** Level: Warning Code: 1287 Message: 'IDENTIFIED BY PASSWORD' is deprecated and will be removed in a future release. Please use IDENTIFIED WITH <plugin> AS <hash> instead *************************** 2. 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. 2 rows in set (0.00 sec) 34/94
  36. 36. IDENTIFIED BY周りの変更 mysql57> GRANT ALL ON db.* TO grant_style@localhost IDENTIFIED WI TH mysql_native_password AS '*94BDCEBE19083CE2A1F959FD02F964C7AF4 CFC29'; 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) 35/94
  37. 37. IDENTIFIED BY周りの変更 mysql57> CREATE USER create_style@localhost IDENTIFIED BY PASSWOR D '*94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29'; 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) 36/94
  38. 38. sql̲mode の盛⼤な変更 37/94
  39. 39. sql̲modeのデフォルト mysql56> SELECT @@sql_modeG *************************** 1. row *************************** @@sql_mode: NO_ENGINE_SUBSTITUTION 1 row in set (0.00 sec) mysql57> SELECT @@sql_modeG *************************** 1. row *************************** @@sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE _USER,NO_ENGINE_SUBSTITUTION 1 row in set (0.00 sec) ただし、STRICT̲TRANS̲TABLESの中に ERROR̲FOR̲DIVISION̲BY̲ZEROと NO̲ZERO̲IN̲DATEが含まれるようになっている 38/94
  40. 40. 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 39/94
  41. 41. ERROR̲FOR̲DIVISION̲BY̲ZERO mysql56> INSERT INTO t2 VALUES (2/0); Query OK, 1 row affected (0.00 sec) mysql56> SET sql_mode= CONCAT_WS(',', @@sql_mode, 'ERROR_FOR_DIVI SION_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> SET sql_mode= CONCAT_WS(',', @@sql_mode, 'STRICT_TRANS_T ABLES'); Query OK, 0 rows affected, 1 warning (0.00 sec) mysql56> INSERT INTO t2 VALUES (2/0); ERROR 1365 (22012): Division by 0 ERRORっていいながらWARNINGなところがかわいい(?) 40/94
  42. 42. 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) NO̲ZERO̲DATEとは別物 41/94
  43. 43. NO̲ZERO̲IN̲DATE + strict̲mode 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 ワーニングがエラーにエスカレーションされる。 42/94
  44. 44. ONLY̲FULL̲GROUP̲BY 何故MySQLは今までこんなクエリーを許していたのかよく わからない感じのものが 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) 43/94
  45. 45. 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 ONLY̲FULL̲GROUP̲BYはsql̲modeから取り除かれ、標準 動作になる予定 44/94
  46. 46. 誰得ANY̲VALUE関数 5.7の⽅がちょっとエラーメッセージが親切 そして何故そんな関数を作ろうと思っちゃったのか。 mysql57> SELECT @@sql_modeG *************************** 1. row *************************** @@sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION 1 row in set (0.00 sec) mysql57> SELECT val, num, COUNT(*) AS c FROM t1 GROUP BY val ORDER BY c DESC LIMIT 5; ERROR 1055 (42000): Expression #2 of SELECT list is not in GROUP BY clause and contains nonag gregated column 'd1.t1.num' which is not functionally dependent on columns in GROUP BY claus e; this is incompatible with sql_mode=only_full_group_by mysql57> SELECT val, ANY_VALUE(num), COUNT(*) AS c FROM t1 GROUP BY val ORDER BY c DESC LIMI T 5; +--------------------------------------+----------------+---+ | val | ANY_VALUE(num) | c | +--------------------------------------+----------------+---+ | 人 類 は ス ト ラ ト ス | 16 | 8 | | 僕 は 友 達 が 巨 人 | 333 | 7 | | ア ウ ト ブ レ イ ク ス ト ラ ト ス | 46 | 7 | | さ ん を つ け ろ よ マ ス タ ー | 39 | 7 | | 電 波 女 と 衰 退 し ま し た | 140 | 7 | +--------------------------------------+----------------+---+ 5 rows in set (0.01 sec) 45/94
  47. 47. NO̲AUTO̲CREATE̲USER 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) NO̲AUTO̲CREATE̲USERもsql̲modeから取り除かれ、標 準動作になる予定 46/94
  48. 48. sql̲modeが空でも mysql56> SELECT @@sql_mode; +------------+ | @@sql_mode | +------------+ | | +------------+ 1 row in set (0.00 sec) mysql56> CREATE TABLE t1 (num int default null, PRIMARY KEY(num)); Query OK, 0 rows affected (0.16 sec) mysql57> SELECT @@sql_mode; +------------+ | @@sql_mode | +------------+ | | +------------+ 1 row in set (0.00 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 NUL L in a key, use UNIQUE instead MySQL 5.7.3 m13 does not allow DEFAULT NULL for primary key ・ Issue #13203 ・ rails/rails 47/94
  49. 49. カジュアルに桁を切り詰 めてワーニングで済ませ てもdisられ、strictにし たらしたでdisられる MySQLかわいい(棒) 48/94
  50. 50. 5.6以降なら、 performance̲schema.events̲statements̲history を有効にすれば、アプリが握りつぶしているワーニングの 数もわかる 49/94
  51. 51. ここからオプ ション周りの はなし 50/94
  52. 52. log̲error̲verbosityとlog̲warningsの間の中途半端 な状態 今までのlog̲warningsはワーニング も 出⼒するイメージ 5.6までの動作はこんな value notes warnings errors log-warnings = 0 YES No Yes log-warnings >= 1 YES Yes Yes 51/94
  53. 53. log̲error̲verbosityと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が混在していた場合、通常のオプションと同じ く 後勝ち で設定される。 - 古いlog̲warningsの記述はmy.cnfから取り除いておくべき- 52/94
  54. 54. log̲error̲verbosityと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 53/94
  55. 55. 明⽰, 暗黙のテンポラリーテーブルにInnoDBがデフォル トで使われる CREATE TEMPORARY TABLE時のデフォルトは default̲tmp̲storage̲engine変数で制御(MySQL 5.6〜) 暗黙のテンポラリーテーブル(Using temporary)は internal̲tmp̲disk̲storage̲engine 変数の新設, 暗黙のデ フォルトはInnoDB テンポラリーテーブルとして利⽤する場合、REDOログは必要ない(他 のスレッドからそのテーブルは⾒えない, クラッシュ時にはクリアさ れる) REDOログ処理をかっ⾶ばす 専⽤のibtmp1ファイル を作成する 暗黙のデフォルトは innodb_temp_data_file_path= ibtmp1:12M:autoextend - バッファプールの共有によるメモリー利⽤効率の向上- 54/94
  56. 56. 明⽰, 暗黙のテンポラリーテーブルにInnoDBがデフォル トで使われる ibdata1と同じく、データとインデックス, UNDOログが書 き込まれる mysqldの再起動時に毎回再作成される, mysqldが再起動さ れるまでは再作成されない ⼀度容量を確保してしまうと、mysqldを再起動するまで ibtmp1は⼤きくなったまま MyISAMなテンポラリーテーブルはDiskがあふれた場合にクエリーが エラーになってテンポラリーテーブル領域がクリアされた - innodb̲temp̲data̲file̲pathに autoextendでない設定を しておいた⽅がいい 55/94
  57. 57. 明⽰, 暗黙のテンポラリーテーブルに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 56/94
  58. 58. 明⽰, 暗黙のテンポラリーテーブルにInnoDBがデフォル トで使われる InnoDBを使⽤した暗黙のテンポラリーテーブルがあふれた 場合 mysql57> SELECT * FROM (SELECT * FROM t1 WHERE val LIKE 'abc%') AS t1, (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(): F ailed to preallocate data for file ./ibtmp1, desired size 67108864 byte s. Operating system error number 28. Check that the disk is not full or a disk quota exceeded. Make sure the file system supports this functio n. Some operating system error numbers are described at http://dev.mysq l.com/doc/refman/5.7/en/operating-system-error-codes.html 2015-04-30T15:04:22.590070+09:00 87 [Warning] InnoDB: 1048576 bytes shou ld have been written. Only 794624 bytes written. Retrying again to writ e the rem 57/94
  59. 59. 明⽰, 暗黙のテンポラリーテーブルに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% / 58/94
  60. 60. log̲timestamps変数によるログ上のタイムスタンプの UTC化 こんなクエリーがあるじゃろ︖ (AA略) mysql57> SET SESSION binlog_format= STATEMENT; Query OK, 0 rows affected (0.00 sec) mysql57> SELECT NOW(); INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1; +---------------------+ | NOW() | +---------------------+ | 2015-03-09 14:01:02 | +---------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected, 3 warnings (0.00 sec) Records: 0 Duplicates: 0 Warnings: 3 59/94
  61. 61. log̲timestamps変数によるログ上のタイムスタンプの UTC化 エラーログ $ tail data/error.log .. 2015-03-09T05:01:02.713955Z 14 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. The statement is uns afe because it uses a LIMIT clause. This is unsafe because the set of rows inclu ded cannot be predicted. Statement: INSERT INTO t1 SELECT * FROM t1 ORDER BY RAN D() LIMIT 1 2015-03-09T05:01:02.713987Z 14 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is unsafe because it uses a system function that may return a different value on the slav e. Statement: INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1 2015-03-09T05:01:02.714000Z 14 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writing t o a table with an auto-increment column after selecting from another table are u nsafe because the order in which rows are retrieved determines what (if any) row s will be written. This order cannot be predicted and may differ on master and t he slave. Statement: INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1 60/94
  62. 62. log̲timestamps変数によるログ上のタイムスタンプの UTC化 スローログ $ 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; # Time: 2015-03-09T05:01:06.197098Z # User@Host: root[root] @ localhost [] Id: 14 # Query_time: 0.000168 Lock_time: 0.000000 Rows_sent: 0 Rows_ex amined: 0 SET timestamp=1425877266; SHOW WARNINGS; 61/94
  63. 63. log̲timestamps変数によるログ上のタイムスタンプの UTC化 ジェネラルログ $ tail data/general.log .. 2015-03-09T05:01:02.713098Z 14 Query SELECT NOW() 2015-03-09T05:01:02.713567Z 14 Query INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1 2015-03-09T05:01:06.196974Z 14 Query SHOW WARNINGS 62/94
  64. 64. log̲timestamps変数によるログ上のタイムスタンプの UTC化 log̲timestamps変数の取りうる値は”UTC”(暗黙のデフォル ト)または”SYSTEM” SET GLOBAL log_timestamps= SYSTEM; でオンライン変更も 可能。 バイナリーログは影響を受けない。 MySQL :: MySQL 5.7 Reference Manual :: 5.1.4 Server System Variables 63/94
  65. 65. log̲timestamps変数によるログ上のタイムスタンプの UTC化 +09:00がオフセットとして追加される。 $ tail data/error.log .. 2015-03-09T14:03:16.606892+09:00 14 [Warning] Unsafe statement written to the bi nary log using statement format since BINLOG_FORMAT = STATEMENT. The statement i s unsafe because it uses a LIMIT clause. This is unsafe because the set of rows included cannot be predicted. Statement: INSERT INTO t1 SELECT * FROM t1 ORDER B Y RAND() LIMIT 1 2015-03-09T14:03:16.606932+09:00 14 [Warning] Unsafe statement written to the bi nary log using statement format since BINLOG_FORMAT = STATEMENT. Statement is un safe because it uses a system function that may return a different value on the slave. Statement: INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1 2015-03-09T14:03:16.606948+09:00 14 [Warning] Unsafe statement written to the bi nary log using statement format since BINLOG_FORMAT = STATEMENT. Statements writ ing to a table with an auto-increment column after selecting from another table are unsafe because the order in which rows are retrieved determines what (if any ) rows will be written. This order cannot be predicted and may differ on master and the slave. Statement: INSERT INTO t1 SELECT * FROM t1 ORDER BY RAND() LIMIT 1 64/94
  66. 66. log̲timestamps変数によるログ上のタイムスタンプの UTC化 +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; 65/94
  67. 67. log̲timestamps変数によるログ上のタイムスタンプの UTC化 +09:00がオフセットとして追加される。 $ tail data/general.log .. 2015-03-09T14:03:16.606054+09:00 14 Query SELECT NOW() 2015-03-09T14:03:16.606477+09:00 14 Query INSERT INTO t1 SE LECT * FROM t1 ORDER BY RAND() LIMIT 1 66/94
  68. 68. binlog̲formatの暗黙のデフォルトがSTATEMENTから ROWに バイナリーログ容量の増加 スレーブ側ではTRIGGERが実⾏されない(マスターとスレー ブで違うトリガーを設定している場合に問題化) mysqlbinlog -vv はちょっと読みにくいなぁ。。 67/94
  69. 69. binlog以外のオプション周りの 変更はちょっと初⼼者殺しすぎ ないか(前述の default̲password̲lifetime, slowlog関連プロポーザル含め て) 68/94
  70. 70. インスト ール周り 69/94
  71. 71. 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作らなくなりました :) 70/94
  72. 72. mysql̲install̲db せっかくバイナリーになったのに、あっという間に deprecated になった 5.7.6以降ではmysqld –initializeを使う。- まだしばらくはmysql̲install̲dbも使えそうだけど、いずれ置き換え られる。 - 5.6までは root@localhost, root@127.0.0.1, root@::1, root@hostnameが黙って作成された。 5.7では(デフォルトは)root@localhostのみ。 –admin-user, –admin-host で初期ユーザー名を制御できる。- Windowsかつ–skip-name-resolve環境では注意 MySQL Bugs: #75656: 5.7.5 skip̲name̲resolve stops all connection attempts - mysql.sock.lockの登場によりソケットの上書きリスクは減ったもの の、root@127.0.0.1は⼿で作っておいてもいいかも。 - 71/94
  73. 73. mysqld –initialize mysql̲install̲dbを置き換えるものとして –datadirは必ず指定してやらないといけない(mysql̲install̲dbには 暗黙のデフォルトがあった) - 初期パスワードは 標準エラー出⼒ に吐く log-errorが設定されてるなら標準エラー出⼒がそっちに向く rpmで突っ込んだ場合は/var/log/mysqld.logからgrepして取り出すことになるか と。 ~/.mysql̲secretは作らない - $ 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 .. 72/94
  74. 74. sync̲binlogのデフォルトが 0 => 1 に InnoDBのクラッシュリカバリーの中でバイナリーログを使 う箇所がある sync̲binlog= 0は危険な設定に- binlogへの書き出しが失敗した際に、⼀貫性を保つためmysqldをダウ ンさせるオプションが有効になっている MySQL :: MySQL 5.7 Reference Manual :: 17.1.6.4 Binary Logging Options and Variables - 実は5.6から既にそうなんだけど。- 73/94
  75. 75. InnoDBバッファプールの暖気がデフォルトON(しかも 25%)に mysqld再起動直後にI/O読み込みがガリガリ発⽣するけどあ わてないで。 この処理が終わるまでの間にトラフィックが突っ込んでくるとかなり 悲惨。 - $ grep "Buffer pool" data/error.log 2015-06-09T04:21:59.557870Z 0 [Note] InnoDB: Buffer pool(s) loa d completed at 150609 13:21:59 暗黙のデフォルトでは正常終了時にバッファプール全体の 25%のページ番号をテキストファイルに書き出し、起動時 にそのページ番号をバッファプールに読み込む。 パーセンテージはinnodb̲buffer̲pool̲dump̲pct変数で指定可能。- 74/94
  76. 76. sysスキーマの標準バンドル performance̲schemaの情報を⾒やすくするためのビ ュー, ストアドプロシージャの集合 ストアドプロシージャの⽅はあまり本家で語られることがないけれ ど、ps̲setup̲saveとか便利。 - SHOW DATABASESするとsysがいますが、気にしないでくださ い。 75/94
  77. 77. secure̲file̲privの変更 SELECT .. INTO OUTFILE .. や LOAD DATA INFILE .., LOAD̲FILE関数の動作を制限。 指定されていない場合 .. mysqldの実効ユーザー権限で全てのファイ ルにアクセス可能 5.6までの暗黙のデフォルト, 5.7でもビルド⽅法によってはこれ(バイナリー の.tar.gz, ソースからのコンパイルはここ) - 指定されている場合 .. 指定されたディレクトリ以下のみ、FILE権限 を利⽤する操作が可能。 rpm, debなどのパッケージものの場合、5.7から暗黙のデフォルトが/var/lib/ mysql-filesに設定される - (new) NULLが指定されている場合 .. FILE権限を利⽤する操作は全て 不可能。 - MySQL :: MySQL 5.7 Reference Manual :: 5.1.3 Server Command Options 76/94
  78. 78. secure̲file̲privの変更 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) 77/94
  79. 79. secure̲file̲privの変更 secure̲file̲privが設定されていない場合はワーニングを出 ⼒するようになった。 2015-02-17T07:09:49.446585Z 0 [Warning] Insecure configuration fo r --secure-file-priv: Current value does not restrict locatio n of generated files. Consider setting it to a valid, non-empty p ath. NULLと”“(空⽩値)の区別がつかない件は5.7.8で修正される そう。 MySQL Bugs: #76401: Canʼt distinguish secure̲file̲priv = NULL and “” - 78/94
  80. 80. 廃⽌されたオプション すべてを網羅はしていない。unknown variableって⾔われ たらたぶんなくなってます。 skip̲innodb 無視される。- 2015-06-09T16:00:25.164846+09:00 0 [Warning] The use of InnoDB i s mandatory since MySQL 5.7. The former options like '--innodb =0/1/OFF/ON' or '--skip-innodb' are ignored. log general̲logがかつてこんなオプションだったんですよ。- 79/94
  81. 81. 廃⽌されたオプション innodb̲additional̲mem̲pool̲size innodb̲mirrored̲log̲groups innodb̲use̲sys̲malloc thread̲concurrency これ、Solaris専⽤なんだぜ。- 80/94
  82. 82. オプションの前⽅⼀致保管 今までは、たとえば–sockから–socketを保管してくれてい た mysqldに限らず、他のコマンドラインクライアント類も同様。- $ bin/mysqld_safe --no-defaults --sock=/tmp/mysql.sock & .. 2015-06-08 14:57:11 0 [Warning] Using unique option prefix sock instead of socket is deprecated and will be removed in a future release. Please use the full name instead. .. 5.7ではunknown variableとしてエラーになる $ bin/mysqld_safe --no-defaults --sock=/tmp/mysql.sock & .. 2015-06-08T05:58:16.223276Z 0 [ERROR] unknown variable 'sock=/tmp/mysql.sock' .. 81/94
  83. 83. スローログ関連の閾値が⼤幅に変更される かも 5.7.7-rc現在でまだ “プロポーザル” だが、最初のプロポー ザルから既にいくつも新しいデフォルトとして反映されてい るので要チェック。 Proposal to change additional defaults in MySQL 5.7 Master MySQL - Proposal to change additional defaults in MySQL 5.7 (February Edition) Master MySQL - log̲slow̲admin̲statements log̲slow̲slave̲statements long̲query̲time(10 => 2) log̲queries̲not̲using̲indexes min̲examined̲row̲limit(0 => 1000) 82/94
  84. 84. 既に変更された暗黙のデフォルト(5.7.7-rc現在) binlog̲error̲action(IGNORE̲ERROR => ABORT̲SERVER) binlog̲format(STATEMENT => ROW) sync̲binlog(0 => 1) slave̲net̲timeout(3600 => 60) innodb̲buffer̲pool̲dump̲at̲shutdown(OFF => ON) innodb̲buffer̲pool̲load̲at̲startup(OFF => ON) innodb̲checksum̲algorithm(innodb => crc32) innodb̲file̲format(Antelope => Barracuda) innodb̲file̲format̲max(Antelope => Barracuda) innodb̲large̲prefix(OFF => ON) 83/94
  85. 85. GTIDのオンライン有効化がサポート 5.6ではマスターとスレーブで同じgtid-modeを持たなけれ ばならず、gtid̲modeはオンライン変更不可能だった。 masterslave gtid-mode= OFF gtid-mode= ON gtid-mode= OFF ○ × gtid-mode= ON × ○ 84/94
  86. 86. GTIDのオンライン有効化がサポート 5.7ではOFF̲PERMISSIVEとON̲PERMISSIVEが追加さ れ、かつ、オンラインでgtid̲modeを変更できるようにな った。 masterslave OFF OFF̲PERMISSIVE ON̲PERMISSIVE ON OFF ○ ○ ○ × OFF̲PERMIS SIVE ○ ○ ○ × ON̲PERMISS IVE × ○ ○ ○ ON × ○ ○ ○ 85/94
  87. 87. GTIDのオンライン有効化がサポート enforce̲gtid̲consistencyの取りうる値がON, OFF, WARNの3種類に。 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 | Message | +---------+------+---------------------------------------------------------------+ | Warning | 1786 | Statement violates GTID consistency: CREATE TABLE ... SELECT. | +---------+------+---------------------------------------------------------------+ 1 row in set (0.00 sec) ON̲PERMISSIVE以上のgtid̲modeではエラーになるステ ートメントがワーニングで出⼒される。 86/94
  88. 88. innodb̲buffer̲pool̲sizeのオンライン変更がサポート 理屈的には、 バッファプールを⼤きくするとき innodb̲buffer̲pool̲chunk̲size ごとに新しいページを確保しながらゴニョゴニョ やる この処理中は バッファプールへの全てのアクセスがブロックされる トランザクションをブロックしないと思いました︖ :-P - バッファプールを⼩さくするとき innodb̲buffer̲pool̲chunk̲size ごとにページを追い出しながらゴニョゴニョやる 常にバッファプールミスヒットが起こり続けるイメージでだいたい合ってる。 - ⽌めてバッファプールの暖気をしなおすよりは速くて便利だけど、本 当にオンラインでやるべきではない。 - 87/94
  89. 89. 最後にお知ら せ&お願い 88/94
  90. 90. MySQLのダウンロードページ 89/94
  91. 91. 間違って(?)ユ ーザー登録し ちゃった⼈ 90/94
  92. 92. 今こそそのアカウントを有効利⽤できます 91/94
  93. 93. さあ気になる バグはみんな でAffects Me 92/94
  94. 94. そして5.7が最初の MySQLとかいう⼈が悲し いことにならないために も、⽇本語の情報とかブ ログとかお願いします 93/94
  95. 95. Questions and/or Suggestions? 94/94

×