查看配置:
//查看慢查询时间
show variables like "long_query_time";默认10s
//查看慢查询配置情况
show status like "%slow_queries%";
//查看慢查询日志路径
show variables like "%slow%";
修改配置文件
在my.ini中加上下面两句话
log-slow-queries = E:\mysql\mysql_slow_query.log
long_query_time=5
第一句使用来定义慢查询日志的路径(因为是windows,所以不牵涉权限问题)
第二句使用来定义查过多少秒的查询算是慢查询,我这里定义的是5秒
第二步:查看关于慢查询的状态
执行如下SQL语句来查看mysql慢查询的状态
show variables like '%slow%';
执行结果会把是否开启慢查询、慢查询的秒数、慢查询日志等信息打印在屏幕上。
第三步:执行一次慢查询操作
其实想要执行一次有实际意义的慢查询比较困难,因为在自己测试的时候,就算查询有20万条数据的海量表,也只需要0.几秒。我们可以通过如下语句代替:
SELECT SLEEP(10);
第四步:查看慢查询的数量
通过如下sql语句,来查看一共执行过几次慢查询:
show global status like '%slow%';
mysql日志的配置(需要重启):
#记录所有sql语句
log=E:/mysqllog/mysql.log
#记录数据库启动关闭信息,以及运行过程中产生的错误信息
log-error=E:/mysqllog/myerror.log
# 记录除select语句之外的所有sql语句到日志中,可以用来恢复数据文件
log-bin=E:/mysqllog/bin
#记录查询慢的sql语句
log-slow-queries=E:/mysqllog/slow.log
#慢查询时间
long_query_time=0.5
sql卡死问题:首先通过SHOW FULL PROCESSLIST;查询目前有哪些进程在操作,找出有问题的sql
Waiting for table metadata lock:
1、问题相关查询,是在进行一些alter table等DDL操作时,如果该表上有正在进行的操作(包括读),则无法获取metadata 独占锁,会阻塞。
2、未提交事务,阻塞DDL,继而阻塞所有同表的后续操作。通过show processlist看不到TableA上有任何操作,但实际上存在有未提交的事务,可以在 information_schema.innodb_trx中查看到。在事务没有完成之前,TableA上的锁不会释放,alter table同样获取不到metadata的独占锁。
处理方法:通过 select * from information_schema.innodb_trx\G, 找到未提交事物的sid, 然后 kill 掉,让其回滚。
3、通过show processlist看不到TableA上有任何操作,在information_schema.innodb_trx中也没有任何进行中的事务。这很可能是因为在一个显式的事务中,对TableA进行了一个失败的操作(比如查询了一个不存在的字段),这时事务没有开始,但是失败语句获取到的锁依然有效,没有释放。从performance_schema.events_statements_current表中可以查到失败的语句。
alter table的语句是很危险的(其实他的危险其实是未提交事物或者长事务导致的),在操作之前最好确认对要操作的表没有任何进行中的操作、没有未提交事务、也没有显式事务中的报错语句。如果有alter table的维护任务,在无人监管的时候运行,最好通过lock_wait_timeout设置好超时时间,避免长时间的metedata锁等待。
附:知识点介绍
information_schema数据库是MySQL自带的,它提供了访问数据库元数据的方式。什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。
在MySQL中,把 information_schema 看作是一个数据库,确切说是信息数据库。其中保存着关于MySQL服务器所维护的所有其他数据库的信息。如数据库名,数据库的表,表栏的数据类型与访问权 限等。在INFORMATION_SCHEMA中,有数个只读表。它们实际上是视图,而不是基本表,因此你将无法看到与之相关的任何文件。
可以参考:http://dev.mysql.com/doc/refman/5.5/en/information-schema.html
MySQL中information_schema 简略的介绍了Mysql中元数据信息库的各个表的作用,可以大致了解各个表的作用。这里主要介绍下Innodb事务锁相关的三个表:INNODB_TRX表、INNODB_LOCKS表、INNODB_LOCK_WAITS表。通过查看这三个表可以事务加锁的情况以及事务锁等待的情况,从而可以更简单地监控当前事务并分析可能存在的锁问题,例如分析死锁。
分享到:
相关推荐
MySQL在进行alter table等DDL操作时,有时会出现Waiting for table metadata lock的等待场景。而且,一旦alter table TableA的操作停滞在Waiting for table metadata lock的状态,后续对TableA的任何操作(包括读)...
想必玩过mysql的人对Waiting for table metadata lock肯定不会陌生,一般都是进行alter操作时被堵住了,导致了我们在show processlist 时,看到线程的状态是在等metadata lock。本文会对MySQL表结构变更的Metadata ...
7. **State**:这是线程执行SQL语句的具体阶段,例如Waiting for table metadata lock(等待表元数据锁)、Sending data(发送数据)或Locked(锁定)。这些状态可以帮助分析查询的执行流程。 8. **Info**:展示...
这种情况通常表现为在`SHOW PROCESSLIST`命令中看到查询状态为“Waiting for table metadata lock”。这表明另一个线程正在请求或持有表的MDL(Metadata Lock)写锁,从而阻止了读取操作,如简单的`SELECT`语句。在...
使用 show processlist 命令查看 Waiting for table metadata lock 的示意图。 这个状态表示的是,现在有一个线程正在表 t 上请求或者持有 MDL 写锁,把 select 语句堵住了。在第 6 篇文章《全局锁和表锁:给表加个...
`STATE`列显示了每个线程当前的活动状态,如`Waiting for table metadata lock`、`Sending data`等,有助于诊断阻塞和性能问题。 17. 松散索引和紧凑索引 松散索引(也称为非聚簇索引)不包含主键数据,只存储索引...
当你看到 waiting for table metadata lock 时,那就是遇到MDL元数据锁了。本篇文章将会介绍MDL锁的产生与排查过程。 1.什么是MDL锁 MDL全称为metadata lock,即元数据锁。MDL锁主要作用是维护表元数据的数据一致性...
1. **Waiting for table metadata lock:** - **含义:**表明当前线程正在等待获取表的元数据锁。 - **解决方法:** - 检查是否有其他线程正在对同一张表进行结构修改(如ALTER TABLE)。 - 尽量减少对表结构的...
3. `SELECT * FROM A` - 同样处于`Waiting for table metadata lock`状态,表示查询A表时,需要的MDL锁被其他操作持有。 4. `SHOW TABLE STATUS [like 'A']` - 也是一个等待状态,表明试图获取表A的元数据信息时,...
SHOW FULL PROCESSLIST WHERE State = 'Waiting for table metadata lock'; -- 强制结束指定ID的进程 KILL [process_id]; ``` 请注意,以上操作应谨慎执行,尤其是KILL命令,因为它可能会导致未保存的数据丢失或...
如果某个会话处于等待状态(Waiting for table metadata lock),这表明它正在等待另一个会话释放元数据锁。 2. 通过`information_schema.innodb_trx`表:这个内部表包含了所有活跃的InnoDB事务信息。通过查询此表...
7. **State**:线程执行SQL语句的具体状态,如Waiting for table metadata lock(等待表元数据锁)或Sending data(发送数据)等,这些状态提供了关于查询执行进度的线索。 8. **Info**:显示正在执行的SQL语句,但...
- `State`列中的各种状态可以帮助识别潜在的问题,比如长时间的`Waiting for table metadata lock`可能表明有锁定问题,`Copying to tmp table on disk`可能表示内存不足,导致数据需写入磁盘临时表。 5. **优化和...