AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 497672
Accepted
Vojtěch
Vojtěch
Asked: 2013-04-10 07:31:08 +0800 CST2013-04-10 07:31:08 +0800 CST 2013-04-10 07:31:08 +0800 CST

调优 1.3 G DB、8GB Ram、高 IO 等待的 MySQL

  • 772

我在 8 核虚拟机、8 GB 内存上有大小为 1.3 GB 的 MySQL 数据库,但我在优化配置时遇到了麻烦。有很多小行和很多连接正在进行。

我发现了这个工具:https ://tools.percona.com/wizard ,但它所建议的差异只会使结果恶化。他们主要建议将 InnoDB 缓冲池增加到 6 GB。目前我有 1 GB 缓冲池,但当我尝试增加它时,性能实际上更差。为什么会这样?

有没有办法强制 MySQL 将整个数据库缓存在内存中,这样它就不会卡在如此高的 IO 等待级别上?

其余设置似乎没有产生这种差异。

my.cnf的当前状态:https ://gist.github.com/knyttl/ac6efe5c0730dd34a5cc

mysql
  • 1 1 个回答
  • 4446 Views

1 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2013-04-10T10:36:55+08:002013-04-10T10:36:55+08:00

    看看你的 my.cnf,你有很多东西的默认值。您迫切需要的是对 InnoDB 基础设施的全面清理。单击此处查看 InnoDB 基础结构的图示。

    步骤 01) 运行此查询

    SELECT CEILING(Total_InnoDB_Bytes/POWER(1024,2)) RIBPS FROM
    (SELECT SUM(data_length+index_length) Total_InnoDB_Bytes
    FROM information_schema.tables WHERE engine='InnoDB') A;
    

    这将告诉您设置 innodb_buffer_pool_size 有多大(以 MB 为单位)。

    假设答案是 1024。

    步骤 02) 运行此查询

    SELECT CEILING(Total_MYI_Bytes/POWER(1024,2)) RKBS FROM
    (SELECT SUM(index_length) Total_MYI_Bytes FROM information_schema.tables
    WHERE engine='MyISAM' AND table_schema NOT IN
    ('information_schema','performance_schema','mysql')) A;
    

    这将告诉您设置 key_buffer_size 有多大(以 MB 为单位)。

    假设答案是 64。

    步骤 03:运行此查询

    SET GLOBAL innodb_fast_shutdown = 0;
    

    这将在关闭期间对事务日志中剩余的任何事务执行完整的事务提交。事务日志是

    • /var/lib/mysql/ib_logfile0
    • /var/lib/mysql/ib_logfile1

    第 04 步:将所有数据转储到文本文件中

    cd /root
    mkdir datadump
    cd datadump
    MYSQLDUMP_CONNECT="-uroot -ppassword"
    MYSQLDUMP_OPTIONS="--single-transaction --routines --triggers"
    MYSQLDUMP_OPTIONS="${MYSQLDUMP_OPTIONS} --flush-privileges --all-databases"
    mysqldump ${MYSQLDUMP_CONNECT} ${MYSQLDUMP_OPTIONS} > MySQLData.sql
    

    步骤 05:关闭 MySQL

    service mysql stop
    

    第 06 步:将以下内容添加到my.cnf

    如果您使用的是 MySQL 5.5(或启用了 InnoDB 插件的 MySQL 5.1),请添加这些

    [mysqld]
    key_buffer_size=64M
    innodb_file_per_table
    innodb_open_files=1000
    innodb_buffer_pool_size=1024M
    innodb_log_file_size=256M
    innodb_fast_shutdown=0
    innodb_read_io_threads=16
    innodb_write_io_threads=16
    join_buffer_size=4M
    read_buffer_size=4M
    read_rndbuffer_size=4M
    

    如果您使用的是 MySQL 5.0,请添加这些

    [mysqld]
    key_buffer_size=64M
    innodb_file_per_table
    innodb_open_files=1000
    innodb_buffer_pool_size=1024M
    innodb_log_file_size=256M
    innodb_fast_shutdown=0
    innodb_thread_concurrency=0
    join_buffer_size=4M
    read_buffer_size=4M
    read_rndbuffer_size=4M
    

    请注意我选择了innodb_log_file_size到innodb_buffer_pool_size的 25%

    步骤 07:为新的 InnoDB 文件腾出空间

    cd /var/lib/mysql
    mv ib_logfile0 ib_logfile0.bak
    mv ib_logfile1 ib_logfile`.bak
    mv ibdata1 ib_data1.bak
    

    步骤 08:启动 MySQL

    service mysql start
    

    STEP 09 : 加载数据

    mysql -uroot -p < /root/datadump/MySQLData.sql
    

    第 10 步:如果一切运行良好,则运行以下命令:

    rm -f ib_logfile0.bak
    rm -f ib_logfile1.bak
    rm -f ibdat1.bak
    

    全部通过 InnoDB Cleanup 完成。

    我之前曾多次建议过这样的 InnoDB 改进

    • Oct 29, 2010: Howto: 清理 mysql InnoDB 存储引擎?
    • Apr 13, 2011:如何缩放 my.cnf 设置和变量以从 16GB 服务器移动到 128GB
    • Feb 03, 2012: MySQL InnoDB表的定时优化
    • Mar 25, 2012:为什么InnoDB将所有数据库存储在一个文件中?
    • Apr 01, 2012: innodb_file_per_table 是否可取?
    • Jul 20, 2012:删除Magento MySQL数据库后回收磁盘空间

    试试看 !!!

    • 4

相关问题

  • 开源与专有关系 db mgt 系统的优缺点是什么?

  • 在 solaris 10 上为 mysql 设置 max_allowed_pa​​cket

  • 如何移动 MySQL 的数据目录?

  • 通过 VPN 连接什么是远程服务器 IP?

  • mysql崩溃

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve