type
status
date
slug
summary
tags
category
icon
password
以下非全部的更新內容,此為小弟查看官方文檔後所節錄,主要以可能使用到的功能、曾經遇到的 BUG 和重大 BUG 更新為主。
功能新增或變動
- ALTER TABLE ... RENAME COLUMN 支持且默認使用 ALGORITHM=INSTANT。
- tmp_table_size 是用來限制單個 internal tempoary table 占用的內存大小,在 8.0.28 之前限制的是 MEMORY 引擎,從 8.0.28 開始也限制 TempTable 引擎的 internal tempoary table。
在 8.0.13 版本之前,是使用 MEMORY 引擎來建立 internal tempoary table,其不足之處在於不支援可變長度的資料型態,這導致了以下問題:
1. 當欄位出現 TEXT、BLOB 型態會直接改為在 disk 上建立 tempoary table。
2. 對於 VARCHAR 型態總會映射為 CHAR 型態,導致內存浪費。
因此在 8.0.13 開始引進了 TempTable 引擎解決這些問題,且預設 internal tempoary table 使用 TempTable 引擎。
延伸閱讀:
MySQL · 引擎特性 · 临时表改进 (taobao.org)
MySQL · 源码分析 · 临时表与TempTable存储引擎Allocator (taobao.org)

參數調整方針:
- 此版本引入了 global 和 per-user 的內存分配監控和限制:
- 新增 status variable:Global_connection_memory ,此變數可以觀察所有 user 花費的 memory,但不包含 root 權限和系統進程。
- 新增 system variable:connection_memory_limit 用來限制單個 user connection 可以使用的最大內存量,如果任何 user connection 超過此用量,則後續的查詢會 ER_CONN_LIMIT 錯誤並拒絕。
- 新增 system variable:global_connection_memory_limit 用來限制所有 user connection 可以使用的總內存量,也就是不能超過 Global_connection_memory 的數量,如果超過後續的查詢,則來自所有 user 的查詢都會返回 ER_GLOBAL_CONN_LIMIT 並拒絕。
FROM_UNIXTIME()
、UNIX_TIMESTAMP()
和CONVERT_TZ()
從 8.0.28 開始在 64 位元版本下最大值由UTC 2038-01-19 03:14:07.999999
調整為UTC 3001-01-18 23:59:59.99999
。
需要注意的是
TIMESTAMP
型態的欄位最大值仍舊是 UTC 2038-01-19 03:14:07.999999
。BUG 修復
- 當包含了 JSON、TEXT 欄位的排序有時會耗盡 sort buffer,這會發生在如果 sort buffer size 沒有超過排序中最大的 row 大小的 15 倍。現在 sort buffer size 只要超過最大的 sort key 其 15 倍大小即可。(Bug #103325, Bug #105532)
- 當在有 partition 上的表使用 PK 外的索引查詢有時會導致過多的 CPU loading。 (Bug #104576)
補充:查看 bug report 的重現,看起來在欄位較多的表上較可能出現,案例上的數量是 300 個欄位,並在此文章中看到在修復前的避免方式:分區表欄位不要過多、避免用 SELECT * 語句。
- 修復 functional index 在 stored function 內的查詢中無法被使用。(BUG #102359)
- 修復查詢 SHOW PROCESSLIST、INFORMATION_SCHEMA.PROCESSLIST 在特定配置下會導致 server crash 的問題。
此狀況發生在 8.0.26、8.0.27 版本,當
terminology_use_previous
設置為 BEFORE_8_0_26
並且對 INFORMATION_SCHEMA.PROCESSLIST
訪問時就會導致服務 crash。在 MySQL 8.0.26 中進行了術語上的調整,例如: master → source 和 slave → replica ......等。為避免影響依賴原有舊名稱的監控工具無法正常使用,新增了
terminology_use_previous
參數,有預設值 NONE
和 BEFORE_8_0_26
兩種值,當設定為 BEFORE_8_0_26
時可以使用舊有的名稱。具體可參考: