GA

2024/03/21

#ya8 2024 - ヤパチー 令和六年最新版(仮) に参加してきました

Ya8 2024 - ヤパチー 令和六年最新版(仮) - connpass

1日目の金曜日に参加してきました。

中でもほとんどの時間をTrack Aで過ごしました。

第33回 中国地方DB勉強会 in やぱちー(東京) - connpass

第33回 中国地方DB勉強会 in やぱちー(練馬) 関連っぽいツイートをまとめています - Togetter

この中国地方DB勉強会(東京でやっても中国地方DB勉強会。既に何度も東京開催されている…)で珍しかったのは Oracle Databaseに詳しい人 である @wrcsus4 さんがたっぷり2時間近くOracle, MySQL, PostgreSQL, SQLServerなどの違いを教えてくれたことでしょうか。

主要RDBMS製品の比較 | コーソルDatabaseエンジニアのBlog

「いやMySQLでもそれはできる」とか「MySQLにはこういう時代背景もあった!」みたいな話をリアルタイムでやっていたので、明日使える豆知識としてゆるく聞いていただけたんじゃないでしょうか。 db tech showcase の控室ばりのリラックスぶりでした。そもそも JPOUG とかに参加しない限り、野生のOracle Databaseに詳しい人を捕まえる機会がそうそうない……

そーだいさんと私は後半戦もあって、

MySQLとPostgresSQLがキャッキャウフフする 令和最新版(1)_コピー_20240316 · Issue #5 · hachiojipm/ya8-2024-cfp

相変わらず「ウチの子はこうだけどおたくの子はどうなのよ」とか「ウチの子かわいい、かわいいよ」みたいな話をしていました。いかにもカンファレンスの廊下っぽい感じですね!

2人とも既に出来上がっていたので「それはアプリで処理すべき」 (アプリとはPostgreSQLのバックグラウンドプロセスのことである) 「そこはフロントエンドで吸収する」 (フロントエンドとはMySQLが結果セットをクライアントに返却する箇所である) みたいなスコープの壊れた話をしていましたね。。


最近…といっても2019年の3月くらいからここ4年ばかりオフラインカンファレンスに参加していなかったので、とても楽しかったです。

提供の @uzulla さんありがとうございました!!!!

ところで、4年ぶりと書いていて初めて気が付いたんですが、4年って俺のMySQLerのキャリアの1/3くらい(MySQLerまる12年くらいなので)を占めるじゃないか…結構な長い期間でした。

なお、COVID-19騒動前の最後のカンファレンス参加は奇しくも同じ会場同じ部屋の↓でした!

MySQLにWEBアプリのログを保存しているケースの8割くらいが幸せになる方法 by yoku0825 | トーク | PHPerKaigi 2019 #phperkaigi - fortee.jp

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?