GA

2024/03/15

MySQL 8.0からMySQL 8.3までの変更点まとめ

 【2024/03/15 09:19】

現在までの8.0~8.3の新機能/Removal/Deperecatedまとめ。8.4が出たらたぶん足す。


What Is New in .. のページを軸にしているので細かいリリースノートは見てない。8.2で変わったのが8.3にもリストされていたり、8.1で変わったのは8.2にリストされていなかったり、たぶん直前のInnovation Releaseとの差だけ記載しているっぽいのでUNION DISTINCTしてある。

Enterprise限定機能はパス。記載基準は独断と偏見。

VersionFeatureComment
8.0New Data Dictionary(InnoDB)使おうと思っても嫌だと思っても選択肢はない
8.0Atomic DDL(クラッシュリカバリ可能DDL)Good
8.0mysql_upgrade deprecated8.0.16とそれ以降, 特に影響ないはずだけどupgrade処理が走った直後はmysqld再起動推奨(これはmysql_upgrade時代も俺は推奨していた)
8.0Atomic CREATE USER / GRANT(クラッシュリカバリ可能)可もなく不可もなく…
8.0default_authentication_plugin=caching_sha2_password仕様を知らないと開発環境でハマるかも
8.0sha2_password deprecatedConnector/Jとかからつないでると試すだけ試そうとしてエラーログがうるさくなる
8.0ROLENew, ..けど地雷は埋まってる
8.0deprecated SUPER priv以後、色々分割されてる
8.0partial_revokesまあ便利だけどハマった
8.0password_history使ったことない
8.0ALTER INSTANCE RELOAD TLS使ったことない
8.0Support TLS1.38.0.16とそれ以降, ただしリンクされてるOpenSSLのバージョンによる
8.0Remove TLS1, TLS1.18.0.28とそれ以降
8.0Add Resource Group自分でSETしないといけなくて使いにくい
8.0default_table_encryptionGood
8.0auto_incrementの値の永続化5.7までは最後の番号を歯抜けにしておくと再利用されちゃった
8.0innodb_memcachedがmgetサポート誰が喜ぶのか謎
8.0deprecated innodb_memcached↑とこれが一緒にリストされているのが8.0っぽい
8.0innodb_deadlock_detect=OFFで高負荷環境のCPUがマシになることもただしデッドロック検出エラーがなくなるのでinnodb_lock_wait_timeoutで制御が必要
8.0InnoDB Temporary Tableがibtmp1から*.ibtファイルに(8.0.13とそれ以降)これで「あふれたら必ず再起動」ではなくなった
8.0REDOログ, UNDOログ, binlogの暗号化サポートGood
8.0SELECT .. FOR {SHAREUPDATE} SKIP LOCKED 追加Good
8.0パーティション操作のいくつかがオンラインALTER TABLEに対応もともとADDとDROPしかしないのであんまり実感ない
8.0UNDOテーブルスペースの切り出しがデフォルト化innodb_undo_truncationもデフォルトON
8.0innodb_autoinc_lock_mode=2がデフォルト化binlog_format=MIXED以下の場合、旧デフォルトのinnodb_autoinc_lock_mode=1にしないとおかしなことになるかも
8.0innodb_dedicated_server support使ってない…
8.0.frm replaced .SDI files慣れれば見やすい、InnoDBの場合は ibd2sdiコマンドで見る
8.0innodb_directoriesサポート.ibdファイルをdatadirの外に置けるようにはなったけどもうそういうケースってどれだけあるんだろう
8.0Log writer threadが分離よほどCPUが強いマシンでない限り性能が劣化するアレ。innodb_log_writer_threadでOFFにできるのは8.0.22とそれ以降
8.0ALGORITHM=INSTANT, 第1弾(末尾のADDのみ)は8.0.12, 第2弾(どこでもADD + DROP)は8.0.29これをまたいだinplace-updateは鬼門
8.0暗黙のテンポラリテーブルに対するTempTableストレージエンジン結構パフォーマンス問題が大きく取り上げられた。tmptable_max_mmap導入の8.0.23で落ち着いたかと思いきや、8.0.28でtmp_table_sizeもこの動作に影響するように変更されてまたひと悶着
8.0innodb_buffer_pool_in_core_file supportedGood
8.0Parallel Table ScanMySQLがパラレルって言いだすとろくなことがない…
8.0HistgramのサポートMySQLerはこれよりも複合インデックス作りがち
8.0Separated Doublewrite bufferibdata1から切り離された
8.0Transaction algorithm FIFO to CATSあんまり差を感じたことはない
8.0ALTER INSTANCE DISABLE INNODB REDO_LOGインポートはちょっぱや。ENABLEに戻さずにmysqldが異常終了すると起動しなくなる
8.0innodb_validate_tablepace_paths8.0.21とそれ以降で大量に.ibdを持っている環境だと起動が遅くなった。なんか今はパラレル化されたみたいでマシになった
8.0CREATE TABLE .. SELECT ..がGTID環境下でサポートこれができてgtid_mode=ONにできるようになった環境がある。Good
8.0Add innodb_doublewrite=DETECT_ONLY8.0.30とそれ以降
8.0innodb_redo_log_capacity8.0.30とそれ以降。さよならib_logfile
8.0default_character_set latin1 to utf8mb4日本人は困らないけど英語圏の人たちがパフォーマンスに悩まされたらしい
8.0Add JSON_TABLE自分で使うぶんには便利だけど、いざ誰かが使っているのを(パフォーマンス含め)トラブルシュートするのは結構大変
8.0Add INVISIBLE INDEXDROP INDEX前の切り戻しが楽
8.0降順INDEX昇順のままでもパフォーマンスはそんなに変わらない。ORDER BY .. ASC, .. DESCのケースはこれでしか対応できない
8.0Functional Index地味にオプティマイザがちゃんと選んでくれないケースが多発, 個人的にはgenerated column + indexでgenerated columnを指定する方が安定する
8.0全体的なsemijionの改良思ったより賢くなっててびっくり
8.0HASH JOINおとなしくインデックスを貼りましょう
8.0WITH (RECURSIVE) Clause見やすくなるけど別に速いとは言ってない
8.0Window Function速くなるとは言ってない
8.0ICU Regexp support便利になったけど遅くはなってるし地味に非互換
8.0MY-xxxxx in error-logORA-xxxxx 的な感じになった
8.0LOCK INSTANCE FOR BACKUP知らずに使うと不思議な感じになるかも主にxtrabackupでお目にかかる
8.0JSON系関数が増えた。JSON_SCHEMA_VALIDでバリデーションすらできる~それならカラムに切り出した方が
8.0Multi-valued indexes1対多のインデックスが作れる。JSON型専用。鬼門
8.0Clone Pluginいいぞ便利だ
8.0EXPLAIN ANALYZEいまいち情報が足りないと思ってしまうけど慣れてる人には便利らしい
8.0タイムゾーンオフセット記法。 2024-03-15:10:32:00+0900とかUTCで入れてるとなじみがない
8.0SELECT .. INTO ..のINTOが変なところに入るとエラー一応非互換
8.0オプティマイザヒントの拡充便利なのが増えた
8.0Dual password地味に便利
8.0optimizer_switchの拡充賢くなったのはこれが一端
8.0TIMESTAMPのなんちゃって64bit拡張timestampデータ型じゃなくてTIMESTAMP関数の話
8.0expire_logs_days -> binlog_expire_logs_secondsでも日付単位 24 60 * 60で設定しちゃう
8.0GIPK特定のケースで便利だったけどふとauto_incrementを足そうと思った時にぶつかる可能性あり
8.0INTERSECTとEXPECTのサポートついに!!! (速いくなるとは言ってない)
8.0performance_schema.error_log直近5MBぶんのエラーログがシェルなしでも確認可能
8.0GRANT .. ON d% のワイルドカード非推奨partial_grantsと合わせると8.0時点でも死ぬ
8.0deprecate character_set_client_handshakeutf8系に統一してれば怖くない
8.0deprecated mysql_native_passwordここで非推奨ということはいつか消えるってことだ…
8.0FLOATまたはDOUBLE型でのauto_incrementの非推奨むしろこんなことできることを知っていた人が少ない気がする
8.0int系の桁数指定およびZEROFILLまあ整数型をそういうことに使ってはいけない…
8.0SQL_CALC_FOUND_ROWS deprecatedORDER BY .. LIMITの最適化を殺すやつ。意外と現役は多い気がする
8.0FLUSH HOSTSの非推奨TRUNCATE performance_schema.host_cacheに変えろ殿こと。skip_name_resolve環境ではそもそも関係なし
8.0deprecated relay_log_info_repository = FILE / master_info_repository = FILE既にFILEを使用する必要は全くないはず
8.0depreacted MYSQL_PWD env variablemysqlコマンドラインクライアントのワーニングを黙らせるのに有効だった手順が一つ消えた。 .mylogin.cnf使えってさ
8.0deprecate default_authentication_plugin消えて指定できなくなるとは言ってないけど代わりにauthentication_policyというので指定しろと
8.0replica_parallel_type deprecatedいずれLOGICAL_CLOCKオンリーに
8.0replica_parallel_workers=0 deprecateddeprecatedになったのは=0だけ。変わらずシングルスレッドでやらせたいなら=1
8.0innodb_log_files_in_group, innodb_log_file_size deprecatedinnodb_redo_log_capacityに取って変わられた。お馴染みのオプションなのでちょっと寂しい
8.0予約語が増えたMySQL Shellのアップグレードチェッカー使いましょう。binlog_format=ROWだと「レプリケーションつないでるから更新クエリが通ることは保証される」ということはないです
8.0binlog_format deprecated今後はROWしか選ばせてくれないつもりらしい
8.0mysqlpump deprecatedmysqldumpじゃないよ、mysqlpumpだよ
8.0binlog_transaction_dependency_trackingGroupReplication経験者は記憶にあるかもなアレ。WRITESETがデフォルトになるらしいけどCASCADEのFKと相性が悪いバグがある(直ったのかどうか不明)
8.0InnoDB系のinformation_schemaのテーブル名が変わってる自分でユーティリティーを作っているタイプの人がハマるやつ
8.0GRANT USAGE ON . TO ..でCREATE USERの代わりにするできなくなった
8.0IDENTIFIED BY PASSWORD ‘*..’できなくなった。代替は IDENTIFIED WITH mysql_native_password AS ‘*..’
8.0PASSWORD function removed代替は SELECT CONCAT(‘*’, UPPER(SHA1(UNHEX(SHA1(‘mypass’)))))
8.0Query cache removedさよならクエリキャッシュ
8.0tx_isolation -> transaction_isolationクライアントのバージョンによって死ぬことgああったやつ
8.0log_warnings -> log_error_verbosity5.7でお馴染みの
8.0GROUP BY c1 ASCこの謎記法が消えた
8.0EXPLAIN EXTENDED removedデフォルトがEXTENDED相当になったので記法が消えた。実質困らないけど手癖で打ってエラることが
8.0GIS系の関数の名前がごっそり入れ替わる大変だったらしい
8.0—ssl removed代わりに —ssl-mode
8.0datadirの中の #mysql50# から始まるディレクトリ5.0とそれ以降に変な文字が入ったデータベースをCREATEすると出来上がる
8.0mysql_install_db代わりにmysqld —initialize(-insecure). 5.7で非推奨になったのが削除された
8.0SELECT .. INTO @val 記法の非推奨これからは SET @val := ..を使うらしい
8.1EXPLAIN format=JSON INTO @valNew
8.1mysql —comment made defaultLittle
8.1source_retry_count 86400 -> 10Little
8.1group_replication_set_as_primary vs DDLMiddle?
8.1Extend “version-specific comment”-
8.1More logging during shutdown sequenceNew
8.1SHOW PARSE_TREE statementNew
8.1tls_certificates_enforced_validationNew
8.1Group Replication status variables addedNew
8.1—some-option=NULL is prohibitedLittle
8.2More logging startup/shutdown sequenceNew
8.2optimizer_switch: hash_set_operationsNew
8.2SET_USER_ID is devided to SET_ANY_DEFINER and ALLOW_NONEXISTENT_DEFINERLittle
8.2EXPLAIN FOR SCHEMANew
8.2START REPLICA UNTIL SQL_AFTER_GTIDS in MultiThreadApplierNew
8.2mysqldump —output-as-versionNew
8.2Remove WAIT_UNTIL_SQL_THREAD_AFTER_GTIDSMiddle
8.2Remove expire_logs_daysLittle
8.3SET gtid_next = ::New
8.3Another EXPLAIN format, SET explain_json_format_version = 2New
8.3Default binlog_transaction_dependency_tracking = WRITESETMiddle
8.3SHOW STATUS LIKE ‘Deprecated_use_i_s_processlist%’New
8.3Incompatible changes in libmysqlclient.soHigh
8.3Remove FLUSH HOSTSLittle
8.3Remove slave_rows_search_algorithms, relay_log_info_file, relay_log_info_repository, master_info_file, master_info_repositoryLittle
8.3Remove group_replication_ip_whitelistLittle
8.3Remove skip_host_cacheLittle
8.3Remove skip_character_set_client_handshakeMiddle?
8.3Unsupport binlog_format=MIXED vs binlog_transaction_dependency_tracking=WRITESETMiddle?

2024/03/11

SET_USER_ID権限がないアカウントでViewのDEFINERになっているアカウントをDROP USERしようとするとOperation DROP USER failed for .. as it is referenced as a definer account in a viewのエラーが出るようになった

TL;DR

  • タイトルがすべてを物語っている。 SET_USER_ID権限 があるとこのオペレーションは成功する

  • エラーコードは4006


MySQL error code MY-004006 (ER_CANNOT_USER_REFERENCED_AS_DEFINER): Operation %s failed for %.256s as it is referenced as a definer account in %s.

実験。
DROP USER用を試すダミーのアカウントを作ってVIEWのDEFINERに設定する。

mysql80 9> CREATE USER view_dummy;
Query OK, 0 rows affected (0.00 sec)

mysql80 9> CREATE DEFINER=view_dummy VIEW d1.v1 AS SELECT * FROM d1.t1;
Query OK, 0 rows affected (0.02 sec)

root@localhost ( SET_USER_ID 権限を持っている ) で DROP VIEW した場合はワーニングどまり (4005番なのでこれも新顔のはず, このワーニングは5.7では出ない)

mysql80 9> DROP USER view_dummy;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql80 9> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------------+
| Level   | Code | Message                                                             |
+---------+------+---------------------------------------------------------------------+
| Warning | 4005 | User 'view_dummy'@'%' is referenced as a definer account in a view. |
+---------+------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

テストのためにもう一回同じ名前でCREATE USERする(この時点でd1.v1は存在していてDEFINERになっているのでもう一度ワーニングは出た)

mysql80 10> CREATE USER view_dummy;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql80 10> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------------+
| Level   | Code | Message                                                             |
+---------+------+---------------------------------------------------------------------+
| Warning | 4005 | User 'view_dummy'@'%' is referenced as a definer account in a view. |
+---------+------+---------------------------------------------------------------------+
1 row in set (0.00 sec)

今度は SET_USER_ID 権限を持っていないアカウントでログインする。よく見ないとわからないけどよく見ると SET_USER_ID privはない。

mysql80 12> SHOW GRANTS\G
*************************** 1. row ***************************
Grants for yoku0825@%: GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `yoku0825`@`%`
*************************** 2. row ***************************
Grants for yoku0825@%: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,TELEMETRY_LOG_ADMIN,XA_RECOVER_ADMIN ON *.* TO `yoku0825`@`%`
2 rows in set (0.00 sec)

で、 DROP USER はエラーになる。

mysql80 12> DROP USER view_dummy;
ERROR 4006 (HY000): Operation DROP USER failed for 'view_dummy'@'%' as it is referenced as a definer account in a view.
​