免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5706 | 回复: 14
打印 上一主题 下一主题

mysql线程问题找高手求解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-20 22:04 |只看该作者 |倒序浏览
5可用积分
下面是在二进制里面找的一段记录
#091017 19:50:17 server id 1  end_log_pos 50866061         Query        thread_id=41119        exec_time=0        error_code=0
SET TIMESTAMP=1255780217/*!*/;
update UserTable set mapNum = 2,posX = 2448,posY
想问一下是否可以通过线程ID “thread_id=41119 ”,找到是哪个用户执行的这条update语句。
ps:
show processlist;只能看到目前正在运行的线程id所使用的用户。

最佳答案

查看完整内容

1. create table thread_log ( thread_id int,user_name char(50) )2. 在my.cnf中配置init_connection='insert into thread_log values(connection_id(),user())'很简单的两个配置,就可以做到thread_id和user_name的对应关系的记录了。

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
2 [报告]
发表于 2009-10-20 22:04 |只看该作者
1. create table thread_log ( thread_id int,user_name char(50) )
2. 在my.cnf中配置
init_connection='insert into thread_log values(connection_id(),user())'

很简单的两个配置,就可以做到thread_id和user_name的对应关系的记录了。

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
3 [报告]
发表于 2009-10-21 08:48 |只看该作者
应该没有办法追踪历史thread_id所对应的登录用户吧。
mysql本身不带有登录记录和审计的功能。

如果一定需要实现,可能需要实时的对mysql进行监控,每当有新连接时记录以下他所对应的thread。
给个思路,mysql有个参数 init_connect (好像是这个),可以设置每个用户连接后的自定义操作,可以在这里做些log的记录。

论坛徽章:
0
4 [报告]
发表于 2009-10-21 09:33 |只看该作者
这个thread_id是用户连接到MySQL后MySQLD创建的一个线程对本用户发起的连接进行处理的一个标识.也可以说是一个连接标识.

通过这个标识可以在show processlist中发现.但在日值中发现的的记录,也可能这个连接已经断开了.这个日值可以往上再看几行应该能发现有连接的用户名.

论坛徽章:
0
5 [报告]
发表于 2009-10-21 11:32 |只看该作者
看样子要追踪哪个用户执行的SQL语句很难的!

论坛徽章:
1
白银圣斗士
日期:2015-11-23 08:33:04
6 [报告]
发表于 2009-10-21 11:53 |只看该作者
不难的。用TABLE记录。。直接查就发现了。。。。。

论坛徽章:
0
7 [报告]
发表于 2009-10-21 12:12 |只看该作者
原帖由 枫影谁用了 于 2009-10-21 11:53 发表
不难的。用TABLE记录。。直接查就发现了。。。。。

枫影兄的意思是说,做一个job每隔一段时间(例如2s)将show processlist的线程和用户记入一张表中,通过这种方式来查!就怕这样很耗数据库资源。

论坛徽章:
0
8 [报告]
发表于 2009-10-21 12:13 |只看该作者
原帖由 枫影谁用了 于 2009-10-21 11:53 发表
不难的。用TABLE记录。。直接查就发现了。。。。。

枫影兄的意思是说,做一个job每隔一段时间(例如2s)将show processlist的线程和用户记入一张表中,通过这种方式来查!就怕这样很耗数据库资源。

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
9 [报告]
发表于 2009-10-21 12:16 |只看该作者
原帖由 leoxqing 于 2009-10-21 12:13 发表

枫影兄的意思是说,做一个job每隔一段时间(例如2s)将show processlist的线程和用户记入一张表中,通过这种方式来查!就怕这样很耗数据库资源。



按我说的方法,只会在thread每次connect之初,在数据库中插入一条记录,这些记录不会做修改操作,用archive或者myisam都可以,既节省空间,又不影响性能。

论坛徽章:
0
10 [报告]
发表于 2009-10-21 13:28 |只看该作者
原帖由 cenalulu 于 2009-10-20 22:04 发表
1. create table thread_log ( thread_id int,user_name char(50) )
2. 在my.cnf中配置
init_connection='insert into thread_log values(connection_id(),user())'

很简单的两个配置,就可以做到thread_ ...

另外那个记录表也可以考虑使用内存表:
create table thread_log ( thread_id int,user_name char(50) ) engine=memory;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP