Mysql

將 mysql 5.7 升級到 8.0 後,mysql innodb 轉儲恢復速度變慢

  • January 5, 2022

我最近兩天在以下問題上苦苦掙扎:

在 mysql 5.7 伺服器上僅使用 innodb 表恢復 ~1GB 數據庫轉儲大約需要 5 分鐘。將同一台伺服器升級到 mysql 8.0(.13) 後大約需要 40 分鐘(配置完全相同)。mysql 8.0 中是否有任何可能導致性能不足的變化?

轉儲是使用以下命令在 mysql 5.7 伺服器上本地創建的:

$ mysqldump --opt -uuser -p database > database.sql

使用以下命令在本地恢復轉儲:

$ mysql -uuser -p database < database.sql

database.sql 的前幾行:

-- MySQL dump 10.13  Distrib 8.0.13, for Linux (x86_64)
--
-- Host: xx.xx.xx.xx    Database: xxx
-- ------------------------------------------------------
-- Server version       5.7.19-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8mb4 ;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,     FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO'        */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `xxx`
--
[...]

此問題在所有測試案例中具有完全相同的硬體和軟體配置的虛擬測試伺服器上進行測試:

OS: Debian 9.6
Disk: SSD
CPU: 4 CPU Cores
RAM: 10 GB

mysql 5.7 和 mysql 8.0(.13) 伺服器的 my.cnf 相同:

[mysqld]
user                    = mysql
pid-file                = /var/run/mysqld/mysqld.pid
socket                  = /var/run/mysqld/mysqld.sock
port                    = 3306
basedir                 = /usr
datadir                 = /var/lib/mysql
tmpdir                  = /tmp
language                = /usr/share/mysql/english
skip-external-locking
skip-name-resolve

innodb_buffer_pool_size         = 2048M
innodb_log_buffer_size          = 128M
innodb_log_file_size            = 265M
innodb_flush_log_at_trx_commit  = 2
innodb_flush_method             = O_DIRECT

max_allowed_packet      = 64M
key_buffer_size         = 2048M

thread_stack            = 192K
thread_cache_size       = 8
myisam-recover-options  = BACKUP

server-id               = 7
log_bin                 = /var/log/mysql/mysql-bin.log
expire_logs_days        = 10
max_binlog_size         = 100M
binlog_format           = MIXED

lc_messages                     = de_DE
default_authentication_plugin   = mysql_native_password

character-set-client-handshake  = FALSE
character-set-server            = utf8mb4
collation-server                = utf8mb4_unicode_ci

sql_mode        = "ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

有什麼建議麼?謝謝各位!

innodb_log_buffer_size不應超過 RAM 的 1%。

key_buffer_size應該只有 30M,假設您沒有任何活動的 MyISAM 表。

這些更改將使您增加到innodb_buffer_pool_size7G,這可能會有所幫助。

你有FULLTEXT索引SPATIAL嗎? FOREIGN KEYs? 儲存程序(可能不是,因為您沒有要求轉儲它們)?

如果這些沒有幫助,請使用https://bugs.mysql.com送出錯誤

您的 innodb_log_buffer_size 和 innodb_log_file_size 是 BACKWARDS。buffer_size 應始終小於 file_size。

引用自:https://dba.stackexchange.com/questions/224383