首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将标记消息写入MySQL general_log?

如何将标记消息写入MySQL general_log?
EN

Database Administration用户
提问于 2015-07-01 17:20:48
回答 1查看 213关注 0票数 1

我正在为我们的分布式web应用程序构建性能测试工具。我使用JMeter从web端模拟应用程序性能不佳的部分来驱动它。我已经将MySQL设置为登录到general_log表。现在,我希望JMeter将标记消息发送到general_log中,这样,在识别出性能不佳的段之后,我可以获取围绕该段的标记之间运行的所有查询,以便进行进一步的分析。

我试着在表上发送一个INSERT查询,但是它总是返回Error : You can't use locks with log tables.,并且没有创建我的行(但是插入查询本身就会出现)。我希望能发送一条定制的信息,但这不管用。

那么,如何将测试运行特定的消息插入到general_log中?另外,还有别的解决办法吗?我正在考虑添加一个类似于general_log表的表供我使用,但是我们有各种各样的部署,并且能够在其中任何一个上运行这个测试都是理想的。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2015-07-01 18:38:08

由于您已经将mysql.general_log转换为MyISAM并进行了索引,我建议您根据时间戳范围制作该表的快照。我所说的快照是一个临时表,它只包含希望标记的事件。

假设您想记录最后10分钟的条目。这个动态SQL应该为您执行以下操作:

代码语言:javascript
复制
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;

如果你想要昨天发生的所有事情,就这么做。

代码语言:javascript
复制
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;

您将通过简单的运行来时不时地丢弃那些临时表。

代码语言:javascript
复制
DROP DATABASE IF EXISTS myloggingdatabase;

试试看!

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/105697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档