這陣子在處理 MySQL 5.6 -> 5.7 -> 8.0 升級的事,踩到一些地雷;紀錄一下。
目前新版的 MySQL 5.7 & 8.0 在全新安裝時會隨機產生 root 的密碼,並把密碼寫在 log 裡面。
這行為在自動化佈署時會遇上點麻煩,而避免隨機產生 root 密碼的方式是在 script 作這樣的事:
...
mysqld --initialize-insecure
systemctl start mysqld
echo "ALTER USER 'root'@'localhost' IDENTIFIED WITH 'mysql_native_password' BY '##########';" | mysql
...
(5.7 -> 8.0)升級方面,第一個變化是 mysql_upgrade 不需要執行了;server 在啟動時會檢查,並自行升版。
原本在 5.7 版仍能使用的幾個 Server System Variables 在 8.0 版必須移除:
- query_cache_type = 0
- query_cache_size = 0
- innodb_large_prefix = 1
- innodb_file_format = Barracuda
expire_logs_days 也應移除,改用 binlog_expire_logs_seconds。
我另外在 8.0 版補上這兩個設定:
- mysqlx = 0
- default_authentication_plugin = mysql_native_password
5.7 -> 8.0 的預設語系/字元集有變化:
| character_set_server | collation_server |
MySQL 5.7 | latin1 | latin1_swedish_ci |
MySQL 8.0 | utf8mb4 | utf8mb4_0900_ai_ci |
特別提 8.0.20 是因為使用 Percona XtraBackup 時踩到地雷(Ref. percona-xtrabackup-80 does not work with mysql 8.0.20);原因是 Redo log 格式被更改了,Changes in MySQL 8.0.20 (2020-04-27, General Availability) 裡面有這段:
InnoDB: Redo log records for modifications to undo tablespaces increased in size in MySQL 8.0 due to a change in undo tablespace ID values, which required additional bytes. The change in redo log record size caused a performance regression in workloads with heavy write I/O. To address this issue, the redo log format was modified to reduce redo log record size for modifications to undo tablespaces. (Bug #29536710)
(有興趣深究的可以看看這個 commit)
Percona XtraBackup – Documentation 裡面也有這段說明:
Due to changes in MySQL 8.0.20 released by Oracle at the end of April 2020, Percona XtraBackup 8.0, up to version 8.0.11, is not compatible with MySQL version 8.0.20 or higher, or Percona products that are based on it: Percona Server for MySQL and Percona XtraDB Cluster.
另外一顆地雷是 Drupal 7 在連線初始化時會設定 SQL mode,但 NO_AUTO_CREATE_USER 在 8.0 被拿掉了;目前先用 這個 comment 裡面夾帶的 patch 作修正。
5 月 14 2023
Percona XtraBackup 8.0.32 released
其實 Percona XtraBackup 8.0.32 最初在 2023 年 2 月就有釋出,只是一直在忙,就沒寫 blog;最近處理了幾台 MySQL server,順道提一下…
特別寫這篇是因為 8.0.32-25 的 release note 有這段(我認為它很重要):
簡單說… 就是:「若 MySQL server 的版本已更新為 8.0.32,又使用 Percona XtraBackup 作備份,請搭配 8.0.32-25 版」
主因如下…
MySQL server 自 8.0.29 之後支援以下這組語法,若沒指定 ALGORITHM,預設就會是 INSTANT:
(ADD COLUMN 自 8.0.12 就開始支援,也成為預設;兩者在未調整前的預設 ALGORITHM 都是 INPLACE)
這樣的調整導致 Percona XtraBackup 在做備份時出錯,於是便有了 Percona XtraBackup 8.0.29 and INSTANT ADD/DROP Columns 這篇文章;我在留言處有留下解決方式(用 pt-online-schema-change)。
目前 MySQL server 的最新版本是 8.0.33,而 Percona XtraBackup 則是 8.0.32-26;目前這樣的搭配運作正常。
By Joe Horn • Database 0 • Tags: MySQL, Percona Toolkit, Percona XtraBackup