升级到 MySQL 8.0.20 后数据库性能下降
Database performance drop, after upgrade to MySQL 8.0.20
将 MySQL 从 5.7 版本升级到 8.0 后,我发现数据库性能显着下降。
升级前 MySQL CPU 使用率稳定在 30%+- 左右,但升级后 CPU 使用率变得不稳定并且经常出现大峰值。
最近我测试了一些非常有趣的东西,我运行 保持同一个查询几次,发现所花费的时间越来越长。如下图所示。
我看了很多关于stack overflow的文章post,但是none的解决办法确实是得不到帮助。
所以希望有人可以与我分享一些关于调整 MySQL8.0 的想法或经验。
非常感谢。
如果需要任何信息以供进一步调查,请告诉我。
配置my.ini:-
key_buffer_size = 2G
max_allowed_packet = 1M
;Added to reduce memory used (minimum is 400)
table_definition_cache = 600
sort_buffer_size = 4M
net_buffer_length = 8K
read_buffer_size = 2M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 2G
;Path to mysql install directory
basedir="c:/wamp64/bin/mysql/mysql8.0.20"
log-error="c:/wamp64/logs/mysql.log"
;Verbosity Value 1 Errors only, 2 Errors and warnings , 3 Errors, warnings, and notes
log_error_verbosity=2
;Path to data directory
datadir="c:/wamp64/bin/mysql/mysql8.0.20/data"
;slow_query_log = ON
;slow_query_log_file = "c:/wamp64/logs/slow_query.log"
;Path to the language
;See Documentation:
; http://dev.mysql.com/doc/refman/5.7/en/error-message-language.html
lc-messages-dir="c:/wamp64/bin/mysql/mysql8.0.20/share"
lc-messages=en_US
; The default storage engine that will be used when create new tables
default-storage-engine=InnoDB
; New for MySQL 5.6 default_tmp_storage_engine if skip-innodb enable
; default_tmp_storage_engine=MYISAM
;To avoid warning messages
secure_file_priv="c:/wamp64/tmp"
skip-ssl
explicit_defaults_for_timestamp=true
; Set the SQL mode to strict
sql-mode=""
;sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
;skip-networking
; Disable Federated by default
skip-federated
; Replication Master Server (default)
; binary logging is required for replication
;log-bin=mysql-bin
; binary logging format - mixed recommended
;binlog_format=mixed
; required unique id between 1 and 2^32 - 1
; defaults to 1 if master-host is not set
; but will not function as a master if omitted
server-id = 1
; Replication Slave (comment out master section to use this)
; New for MySQL 5.6 if no slave
skip-slave-start
; The InnoDB tablespace encryption feature relies on the keyring_file
; plugin for encryption key management, and the keyring_file plugin
; must be loaded prior to storage engine initialization to facilitate
; InnoDB recovery for encrypted tables. If you do not want to load the
; keyring_file plugin at server startup, specify an empty string.
early-plugin-load=""
;innodb_data_home_dir = C:/mysql/data/
innodb_data_file_path = ibdata1:12M:autoextend
;innodb_log_group_home_dir = C:/mysql/data/
;innodb_log_arch_dir = C:/mysql/data/
; You can set .._buffer_pool_size up to 50 - 80 %
; of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 4G
; Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 16M
innodb_log_buffer_size = 8M
innodb_thread_concurrency = 64
innodb_flush_log_at_trx_commit = 2
log_bin_trust_function_creators = 1;
innodb_lock_wait_timeout = 120
innodb_flush_method=normal
innodb_use_native_aio = true
innodb_flush_neighbors = 2
innodb_autoinc_lock_mode = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
; Remove the next comment character if you are not familiar with SQL
;safe-updates
[isamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer_size = 2M
write_buffer_size = 2M
[myisamchk]
key_buffer_size = 256M ;20M hys
sort_buffer_size_size = 20M
read_buffer_size = 2M
write_buffer_size = 2M
[mysqlhotcopy]
interactive-timeout
[mysqld]
port = 3306
skip-log-bin
default_authentication_plugin= mysql_native_password
max_connections = 400
max_connect_errors = 100000
innodb_read_io_threads = 32
innodb_write_io_threads = 8
innodb_thread_concurrency = 64
硬件:-
内存:16GB
CPU:4 核 3.0 Ghz
显示全局状态:
https://pastebin.com/FVZrgnTw
显示引擎 INNODB 状态:
https://pastebin.com/Rewp84Gi
显示全局变量:
https://pastebin.com/3v6cM6KZ
[更新:解决了我们站点的问题]
实际上我目前有一个非常相似(也许相同?)的问题。
我们有
- Windows 服务器 2016,4 CPUs,32 GB RAM
- MySQL 8 社区版
- Java / 基于 Apache Tomcat 的应用程序位于顶部
我们在 2 周内遇到了严重的应用程序问题,mysqld 进程在应用程序交互发生后立即占用 100% CPU -- 致使服务器完全无响应。
由于安全修复,此降级之前对设置的最后一次更改是 MySQL 从 8.0.18 更新到 8.0.20。
查询监控显示同一(简单)查询多次出现
SELECT COUNT(1) FROM xxxxx;
这需要 5-10 秒(虽然 table 只有大约 3 行,所以它应该需要 5 毫秒!)。
一个假设是这个 MySQL 问题:https://bugs.mysql.com/bug.php?id=99593
但是推荐的解决方法对我没有帮助。
我们的解决方案:
显然,在 8.0.19 或 8.0.20 中引入的 MySQL 社区版中还有一个错误。
将 MySQL 降级到 8.0.18 后一切正常!
补充说明:
Downgrading is not supported by MySQL!
实际上为了在同一台机器上提供降级的数据库,我...
- 备份了应用程序架构(使用 mysqldump 命令)
- 手动安装了 MySQL 8.0.18 二进制文件(无安装程序)
- 创建了一个额外的 MySQL 实例(不同的 data directory,不同的端口)
- 将备份导入新实例(使用 mysql 命令)
- 创建的角色和权限与“之前”完全一样
- 将应用程序配置切换到新的 MySQL 端口
每秒速率 = RPS
my.ini [mysqld] 部分的建议
在 my.ini 配置中有超过 1 个 [mysqld] 部分是不寻常的
你接近尾声的部分 my.ini 可以移到之前
[mysqldump] 避免混淆。
innodb_lru_scan_depth=100 # from 1024 to conserve 90% of CPU cycles used for function
key_buffer_size=16M # from 1G to conserve RAM - you are not using MyISAM data tables
read_rnd_buffer_size=64K # from 2M to reduce handler_read_rnd_next RPS of 1,872,921
innodb_io_capacity=900 # from 200 to more of your rotating drive IOPS capacity
您应该发现查询完成时间和 CPU 忙于这些更改。
select_scan 平均 41 RPS 是由于索引不可用,导致延迟。
如需其他建议,请查看配置文件、联系信息的网络配置文件、常见问题解答、其他提示和可免费下载的实用程序脚本以协助性能调整。
我找到了根本原因,post 它在 https://dba.stackexchange.com/questions/271785/query-performance-become-slower-after-upgrade-to-mysql-8-0-20 中。
非常感谢大家的回复和建议。欣赏一下。
将 MySQL 从 5.7 版本升级到 8.0 后,我发现数据库性能显着下降。
升级前 MySQL CPU 使用率稳定在 30%+- 左右,但升级后 CPU 使用率变得不稳定并且经常出现大峰值。
最近我测试了一些非常有趣的东西,我运行 保持同一个查询几次,发现所花费的时间越来越长。如下图所示。
我看了很多关于stack overflow的文章post,但是none的解决办法确实是得不到帮助。 所以希望有人可以与我分享一些关于调整 MySQL8.0 的想法或经验。
非常感谢。
如果需要任何信息以供进一步调查,请告诉我。
配置my.ini:-
key_buffer_size = 2G
max_allowed_packet = 1M
;Added to reduce memory used (minimum is 400)
table_definition_cache = 600
sort_buffer_size = 4M
net_buffer_length = 8K
read_buffer_size = 2M
read_rnd_buffer_size = 2M
myisam_sort_buffer_size = 2G
;Path to mysql install directory
basedir="c:/wamp64/bin/mysql/mysql8.0.20"
log-error="c:/wamp64/logs/mysql.log"
;Verbosity Value 1 Errors only, 2 Errors and warnings , 3 Errors, warnings, and notes
log_error_verbosity=2
;Path to data directory
datadir="c:/wamp64/bin/mysql/mysql8.0.20/data"
;slow_query_log = ON
;slow_query_log_file = "c:/wamp64/logs/slow_query.log"
;Path to the language
;See Documentation:
; http://dev.mysql.com/doc/refman/5.7/en/error-message-language.html
lc-messages-dir="c:/wamp64/bin/mysql/mysql8.0.20/share"
lc-messages=en_US
; The default storage engine that will be used when create new tables
default-storage-engine=InnoDB
; New for MySQL 5.6 default_tmp_storage_engine if skip-innodb enable
; default_tmp_storage_engine=MYISAM
;To avoid warning messages
secure_file_priv="c:/wamp64/tmp"
skip-ssl
explicit_defaults_for_timestamp=true
; Set the SQL mode to strict
sql-mode=""
;sql-mode="STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_AUTO_CREATE_USER"
;skip-networking
; Disable Federated by default
skip-federated
; Replication Master Server (default)
; binary logging is required for replication
;log-bin=mysql-bin
; binary logging format - mixed recommended
;binlog_format=mixed
; required unique id between 1 and 2^32 - 1
; defaults to 1 if master-host is not set
; but will not function as a master if omitted
server-id = 1
; Replication Slave (comment out master section to use this)
; New for MySQL 5.6 if no slave
skip-slave-start
; The InnoDB tablespace encryption feature relies on the keyring_file
; plugin for encryption key management, and the keyring_file plugin
; must be loaded prior to storage engine initialization to facilitate
; InnoDB recovery for encrypted tables. If you do not want to load the
; keyring_file plugin at server startup, specify an empty string.
early-plugin-load=""
;innodb_data_home_dir = C:/mysql/data/
innodb_data_file_path = ibdata1:12M:autoextend
;innodb_log_group_home_dir = C:/mysql/data/
;innodb_log_arch_dir = C:/mysql/data/
; You can set .._buffer_pool_size up to 50 - 80 %
; of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 4G
; Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 16M
innodb_log_buffer_size = 8M
innodb_thread_concurrency = 64
innodb_flush_log_at_trx_commit = 2
log_bin_trust_function_creators = 1;
innodb_lock_wait_timeout = 120
innodb_flush_method=normal
innodb_use_native_aio = true
innodb_flush_neighbors = 2
innodb_autoinc_lock_mode = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
; Remove the next comment character if you are not familiar with SQL
;safe-updates
[isamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer_size = 2M
write_buffer_size = 2M
[myisamchk]
key_buffer_size = 256M ;20M hys
sort_buffer_size_size = 20M
read_buffer_size = 2M
write_buffer_size = 2M
[mysqlhotcopy]
interactive-timeout
[mysqld]
port = 3306
skip-log-bin
default_authentication_plugin= mysql_native_password
max_connections = 400
max_connect_errors = 100000
innodb_read_io_threads = 32
innodb_write_io_threads = 8
innodb_thread_concurrency = 64
硬件:- 内存:16GB CPU:4 核 3.0 Ghz
显示全局状态: https://pastebin.com/FVZrgnTw
显示引擎 INNODB 状态: https://pastebin.com/Rewp84Gi
显示全局变量: https://pastebin.com/3v6cM6KZ
[更新:解决了我们站点的问题]
实际上我目前有一个非常相似(也许相同?)的问题。
我们有
- Windows 服务器 2016,4 CPUs,32 GB RAM
- MySQL 8 社区版
- Java / 基于 Apache Tomcat 的应用程序位于顶部
我们在 2 周内遇到了严重的应用程序问题,mysqld 进程在应用程序交互发生后立即占用 100% CPU -- 致使服务器完全无响应。
由于安全修复,此降级之前对设置的最后一次更改是 MySQL 从 8.0.18 更新到 8.0.20。
查询监控显示同一(简单)查询多次出现
SELECT COUNT(1) FROM xxxxx;
这需要 5-10 秒(虽然 table 只有大约 3 行,所以它应该需要 5 毫秒!)。
一个假设是这个 MySQL 问题:https://bugs.mysql.com/bug.php?id=99593 但是推荐的解决方法对我没有帮助。
我们的解决方案:
显然,在 8.0.19 或 8.0.20 中引入的 MySQL 社区版中还有一个错误。 将 MySQL 降级到 8.0.18 后一切正常!
补充说明:
Downgrading is not supported by MySQL! 实际上为了在同一台机器上提供降级的数据库,我...
- 备份了应用程序架构(使用 mysqldump 命令)
- 手动安装了 MySQL 8.0.18 二进制文件(无安装程序)
- 创建了一个额外的 MySQL 实例(不同的 data directory,不同的端口)
- 将备份导入新实例(使用 mysql 命令)
- 创建的角色和权限与“之前”完全一样
- 将应用程序配置切换到新的 MySQL 端口
每秒速率 = RPS
my.ini [mysqld] 部分的建议 在 my.ini 配置中有超过 1 个 [mysqld] 部分是不寻常的 你接近尾声的部分 my.ini 可以移到之前 [mysqldump] 避免混淆。
innodb_lru_scan_depth=100 # from 1024 to conserve 90% of CPU cycles used for function
key_buffer_size=16M # from 1G to conserve RAM - you are not using MyISAM data tables
read_rnd_buffer_size=64K # from 2M to reduce handler_read_rnd_next RPS of 1,872,921
innodb_io_capacity=900 # from 200 to more of your rotating drive IOPS capacity
您应该发现查询完成时间和 CPU 忙于这些更改。
select_scan 平均 41 RPS 是由于索引不可用,导致延迟。
如需其他建议,请查看配置文件、联系信息的网络配置文件、常见问题解答、其他提示和可免费下载的实用程序脚本以协助性能调整。
我找到了根本原因,post 它在 https://dba.stackexchange.com/questions/271785/query-performance-become-slower-after-upgrade-to-mysql-8-0-20 中。
非常感谢大家的回复和建议。欣赏一下。