Mysql
將 mysql 5.7 升級到 8.0 後,mysql innodb 轉儲恢復速度變慢
我最近兩天在以下問題上苦苦掙扎:
在 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_size
7G,這可能會有所幫助。你有
FULLTEXT
索引SPATIAL
嗎?FOREIGN KEYs
? 儲存程序(可能不是,因為您沒有要求轉儲它們)?如果這些沒有幫助,請使用https://bugs.mysql.com送出錯誤
您的 innodb_log_buffer_size 和 innodb_log_file_size 是 BACKWARDS。buffer_size 應始終小於 file_size。