我正在为我们的分布式web应用程序构建性能测试工具。我使用JMeter从web端模拟应用程序性能不佳的部分来驱动它。我已经将MySQL设置为登录到general_log表。现在,我希望JMeter将标记消息发送到general_log中,这样,在识别出性能不佳的段之后,我可以获取围绕该段的标记之间运行的所有查询,以便进行进一步的分析。
我试着在表上发送一个INSERT查询,但是它总是返回Error : You can't use locks with log tables.,并且没有创建我的行(但是插入查询本身就会出现)。我希望能发送一条定制的信息,但这不管用。
那么,如何将测试运行特定的消息插入到general_log中?另外,还有别的解决办法吗?我正在考虑添加一个类似于general_log表的表供我使用,但是我们有各种各样的部署,并且能够在其中任何一个上运行这个测试都是理想的。
发布于 2015-07-01 18:38:08
由于您已经将mysql.general_log转换为MyISAM并进行了索引,我建议您根据时间戳范围制作该表的快照。我所说的快照是一个临时表,它只包含希望标记的事件。
假设您想记录最后10分钟的条目。这个动态SQL应该为您执行以下操作:
SET sql_log_bin = 0; ## Do this so it does not replicate to slaves
CREATE DATABASE IF NOT EXISTS myloggingdatabase;
USE myloggingdatabase
SET @now = NOW();
SET @ten_minutes_ago = @now - INTERVAL 10 MINUTE;
SET @snapshot = CONCAT('general_log_',DATE_FORMAT(@now(),'%Y%m%d_%H%M%00'));
SET @sql = CONCAT('DROP TABLE IF EXISTS ',@snapshot);
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
SET @sql = CONCAT('CREATE TABLE ',@snapshot,' LIKE mysql.general_log');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
SET @sql = CONCAT('INSERT INTO ',@snapshot,' SELECT * FROM mysql.general_log');
SET @sql = CONCAT(@sql,' WHERE event_time>=',QUOTE(@ten_minutes_ago));
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;如果你想要昨天发生的所有事情,就这么做。
SET sql_log_bin = 0; ## Do this so it does not replicate to slaves
CREATE DATABASE IF NOT EXISTS myloggingdatabase;
USE myloggingdatabase
SET @now = NOW();
SET @midnight_today = DATE(@now) + INTERVAL 0 SECOND;
SET @midnight_yesterday = @midnight_today - INTERVAL 1 DAY;
SET @snapshot = CONCAT('general_log_',DATE_FORMAT(@midnight_today(),'%Y%m%d_%H%M%00'));
SET @sql = CONCAT('DROP TABLE IF EXISTS ',@snapshot);
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
SET @sql = CONCAT('CREATE TABLE ',@snapshot,' LIKE mysql.general_log');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;
SET @sql = CONCAT('INSERT INTO ',@snapshot,' SELECT * FROM mysql.general_log');
SET @sql = CONCAT(@sql,' WHERE event_time>=',QUOTE(@midnight_yesterday));
SET @sql = CONCAT(@sql,' AND event_time<',QUOTE(@midnight_today));
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;您将通过简单的运行来时不时地丢弃那些临时表。
DROP DATABASE IF EXISTS myloggingdatabase;https://dba.stackexchange.com/questions/105697
复制相似问题