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
    • 最新
    • 标签
主页 / dba / 问题 / 39221
Accepted
Ruchit Rami
Ruchit Rami
Asked: 2013-04-05 02:57:19 +0800 CST2013-04-05 02:57:19 +0800 CST 2013-04-05 02:57:19 +0800 CST

使用 MySQL 中的常规日志捕获的查询对 MySQL 进行压力测试

  • 772

是否有任何工具可以使用 MySQL 通用日志创建的日志文件进行压力测试?在谷歌上大量搜索后,我发现很少有压力测试工具只使用一些基准进行压力测试。一种解决方案是使用 Apache JMeter,但它不会从 MySQL 日志文件创建测试计划,并且为我拥有的所有查询创建自定义测试计划太耗时了。
或者是否有至少可以从 MySQL 日志创建 .sql 文件的工具?

mysql logs
  • 2 2 个回答
  • 6374 Views

2 个回答

  • Voted
  1. RolandoMySQLDBA
    2013-04-05T11:45:40+08:002013-04-05T11:45:40+08:00

    这是使用蛮力 mysql 的更直接的方法:将一般设置为 MyISAM 表。安装时,您会发现该表mysql.general_log为 CSV 表。

    与其重新发明轮子并进行大量打字,请阅读我过去的帖子:

    • Nov 16, 2011:记录 MySQL DB 更改查询和用户
    • Feb 11, 2012: MySQL 通用日志
    • Jan 08, 2012:如何启用 MySQL 通用日志?

    一旦您mysql.general_log转换为 MyISAM 并记录查询,只需像访问任何其他 MyISAM 表一样访问日志。

    这是MyISAM版本的结构mysql.general_log

    mysql> show create table mysql.general_log\G
    *************************** 1. row ***************************
           Table: general_log
    Create Table: CREATE TABLE `general_log` (
      `event_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `user_host` mediumtext NOT NULL,
      `thread_id` int(11) NOT NULL,
      `server_id` int(10) unsigned NOT NULL,
      `command_type` varchar(64) NOT NULL,
      `argument` mediumtext NOT NULL,
      KEY `event_time` (`event_time`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    

    从这里,只需编写以查询开头的所有内容:

    SQLSTMT="SELECT argument FROM mysql.general_log"
    SQLSTMT="${SQLSTMT} WHERE LEFT(argument,6) IN"
    SQLSTMT="${SQLSTMT} ('INSERT','UPDATE','DELETE','SELECT')"
    mysql -uroot -p -ANe"${SQLSTMT}" > SQLCommands.sql
    

    你去吧。

    试试看 !!!

    • 5
  2. Best Answer
    Cristian Porta
    2013-04-05T03:39:08+08:002013-04-05T03:39:08+08:00

    这只是一个跟踪而不是一个完整的解决方案,“你的”解决方案是基于你的幻想(和一些工作);)

    我已经完成了这种由通用查询日志生成的测试捕获和清理查询,并在编写自己的文件后使用sysbench 0.5lua,您可以在官方源代码中找到一些示例,在我的数据库(硬件和模式/数据的镜像)上-快照,以便我可以立即恢复数据的原始状态-)。

    然后你可以运行这样的命令:

    ./sysbench --mysql-table-engine=myisam --mysql-db=<yourdb> --mysql-user=<user> --mysql-host=<host> --mysql-password=<pass> --test=tests/db/<yourlua>.lua --num-threads=8 --max-requests=8 run

    收集并绘制结果、更改并发和请求,并监控您的数据库和硬件状态。

    我的lua文件包含大约 80.000 个查询,它由插入、更新和删除组成

    更新#1

    您可以尝试的一个很好的起点是开始(简单地)编写您的lua文件,如下所示:

    pathtest = string.match(test, "(.*/)") or ""
    
    dofile(pathtest .. "common.lua")
    
    function thread_init(thread_id)
       set_vars()
    
       if (db_driver == "mysql" and mysql_table_engine == "myisam") then
          -- begin_query = "LOCK TABLES ".. table_name .." WRITE"
          -- commit_query = "UNLOCK TABLES"
          begin_query = "SELECT 1>0"
          commit_query = "SELECT 1>0"
       else
          begin_query = "BEGIN"
          commit_query = "COMMIT"
       end
    end
    
    function event(thread_id)
        local table_name
        db_query(begin_query)
        rs = db_query("INSERT INTO .....")
        rs = db_query("INSERT INTO .....")
        rs = db_query("SELECT ... FROM ...")
        rs = db_query("DELETE ...")
        db_query(commit_query)
    end
    

    将您的查询放入db_query("")函数中,为此类过程清理您的一般查询日志需要一些工作

    这里是一个“个人”lua文件的简单输出,就像上面一样,有 9 个查询,7 个插入和 2 个选择,+2 BEGIN/COMMIT:

    sysbench 0.5:  multi-threaded system evaluation benchmark
    
    Running the test with following options:
    Number of threads: 8
    Random number generator seed is 0 and will be ignored
    
    
    Threads started!
    
    OLTP test statistics:
        queries performed:
            read:                            32
            write:                           56
            other:                           0
            total:                           88
        transactions:                        0      (0.00 per sec.)
        deadlocks:                           0      (0.00 per sec.)
        read/write requests:                 88     (7728.11 per sec.)
        other operations:                    0      (0.00 per sec.)
    
    General statistics:
        total time:                          0.0114s
        total number of events:              8
        total time taken by event execution: 0.0252s
        response time:
             min:                                  2.87ms
             avg:                                  3.15ms
             max:                                  3.65ms
             approx.  95 percentile:               3.65ms
    
    Threads fairness:
        events (avg/stddev):           1.0000/0.00
        execution time (avg/stddev):   0.0032/0.00
    

    希望这可以帮助

    • 2

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

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

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    授予用户对所有表的访问权限

    • 5 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve