【问题标题】:Database performance drop, after upgrade to MySQL 8.0.20升级到 MySQL 8.0.20 后数据库性能下降
【发布时间】:2020-10-09 15:36:42
【问题描述】:

MySQL从5.7升级到8.0后,发现数据库性能明显下降。

升级 MySQL 前 CPU 使用率稳定在 30%+- 左右,升级后 CPU 使用率变得不稳定,经常出现较大的峰值。

最近我测试了一些非常有趣的东西,我一直运行相同的查询几次,发现所用的持续时间越来越长。如下图所示。

我已经阅读了很多文章和堆栈溢出帖子,但没有一个解决方案是真正得到帮助的。 所以希望有大神可以和我分享一些调优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

【问题讨论】:

  • 如果您希望改进特定查询,请为查询中的每个表添加SHOW CREATE TABLE {tablesname},并添加EXPLAIN {query}。 dba.stackexchange.com/ 将是一个更好的论坛。对于调优,请包括您的完整 my.ini/cnf 配置、硬件 RAM/CPU 以及 SHOW GLOBAL STATUS(可能作为外部链接)和 SHOW ENGINE INNODB STATUS
  • 欢迎来到stackoverflow。还请 - 正常运行 24 小时后,在 pastebin.com 上发布(并分享链接)显示全局变量的文本结果;用于工作量分析。您是否有任何 SSD 或 NVME 用于数据存储?
  • @danblack 我希望改进的是数据库整体性能,查询已经在 MySQL 5.7 中进行了微调。稍后我将在这里更新那些配置、硬件等。感谢您的建议,对语法错误感到抱歉。
  • @WilsonHauck,据我的服务器管理员了解,我们目前使用的是普通硬盘。
  • 感谢 SHOW GLOBAL STATUS;也请将 SHOW GLOBAL VARIABLES 的文本结果发布到 pastebin.com;并分享链接以进行工作负载分析。

标签: mysql mysql-8.0


【解决方案1】:

我找到了根本原因,发到https://dba.stackexchange.com/questions/271785/query-performance-become-slower-after-upgrade-to-mysql-8-0-20

非常感谢大家的回复和建议。欣赏它。

【讨论】:

    【解决方案2】:

    每秒速率 = 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,是由于索引不可用导致延迟。

    如需更多建议,请查看配置文件、联系信息的网络配置文件、常见问题解答、其他提示和可免费下载的实用程序脚本,以帮助进行性能调整。

    【讨论】:

    • 感谢您的建议,将在我的系统配置中考虑这些设置。
    【解决方案3】:

    [更新:解决了我们网站的问题]

    其实我目前有有一个非常相似的(也许是一样的?)问题。 我们有

    • Windows Server 2016,4 个 CPU,32 GB RAM
    • MySQL 8 社区版
    • 基于 Java / Apache Tomcat 的应用程序

    两周来,我们遇到了严重的应用程序问题,一旦应用程序交互发生,mysqld 进程就会占用 100% 的 CPU —— 导致服务器完全没有响应。

    在此降级之前对设置的最后一次更改是将 MySQL 从 8.0.18 更新到 8.0.20,原因是安全修复。

    查询监控显示相同(简单)查询的多次出现

    SELECT COUNT(1) FROM xxxxx;
    

    这需要 5-10 秒(虽然该表只有大约 3 行,所以它应该需要 5 毫秒!)。

    一个假设是这个 MySQL 问题:https://bugs.mysql.com/bug.php?id=99593 但是推荐的解决方法对我没有帮助。

    我们的解决方案:

    显然 MySQL Community Edition 中存在一个额外的错误,在 8.0.19 或 8.0.20 中引入。 将 MySQL 降级到 8.0.18 后一切正常!

    补充说明:

    Downgrading is not supported by MySQL! 其实为了在同一台机器上提供一个降级的数据库,我...

    • 已备份应用程序架构(使用 mysqldump 命令)
    • 手动安装 MySQL 8.0.18 二进制文件(无安装程序)
    • 创建了一个额外的 MySQL 实例(不同的data directory,不同的端口)
    • 将备份导入新实例(使用 mysql 命令)
    • 创建的角色和权限与“之前”完全相同
    • 将应用程序配置切换到新的 MySQL 端口

    【讨论】:

    • @user13860786,刚才我已经测试了安装 MySQL 8.0.21,但似乎问题仍然存在。稍后我也会尝试 MySQL 8.0.18,希望它真的是由“bug”引起的。顺便说一句,我也看到了这个bugs.mysql.com/bug.php?id=99593 并测试了提供的临时解决方案,但它不起作用。
    • 您是如何解决这个问题的?我目前有同样的问题。 ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 2014-08-07
    • 2023-03-24
    • 1970-01-01
    • 2021-08-08
    相关资源
    最近更新 更多