lrx182125 发表于 2018-10-8 10:57:41

mysql排错 (一)

  一,线程阻塞
  1) show processlist 显示前100条线程:
  stat有sleeping等待用户输入,updating正在更新数据,sending update等在把结果发给用户,lock查询被锁。
  2) show engine innodb status
  3)show innodb status只是其一种模式的直接展现,并且只能交互式开启,无法自动循环捕获信息
  innodb状态信息输出到 err 日志   在如何 库 下都可以,推荐在 test数据库下创建如下表
  mysql> create table innodb_monitor(a int) engine=innodb;
  Query OK, 0 rows affected (0.09 sec)
  创建表后innodb会每过15秒输出一次innodb状态信息到error log,通过删除表停止该monitor功能。
  4)通过日志排错:
  1.错误日志文件:log_errorobal variables like 'log_error';
  +---------------+-----------------------------------------+
  | Variable_name | Value
  | log_error   | /mydata/data1/localhost.localdomain.err |
  +---------------+-----------------------------------------+
  2.临时打开通用日志:(打开以后所有查询指令都会保存下来,默认关闭)
  mysql> set global general_log='on';
  Query OK, 0 rows affected (0.00 sec)
  这是mysql会在数据目录下生成mydb3.log 文件,记录查询语句
  # ls
  auto.cnf      ib_logfile2mydb3-relay-bin.000014mysql               test         wwang
  ib_buffer_poolmaster.infomydb3-relay-bin.000015performance_schemauxallowance

  ibdata1         mydb3.err    mydb3-relay-bin.index>  ib_logfile0   mydb3.log    mydb3-slow.log          set               uxscan
  ib_logfile1   mydb3.pid    myslave               show                uxstatistic
  # cat mydb3.log
  /usr/local/mysql/bin/mysqld, Version: 5.6.28 (MySQL Community Server (GPL)). started with:
  Tcp port: 3306Unix socket: /tmp/mysql.sock

  Time                >  1605187:42:05   187 Query   SET PROFILING=1
  187 Query   SHOW STATUS
  3.在有些时候,你会遇到其他人员反映程序执行慢,你怀疑可能是sql 执行慢导致,而又不知道具体的是那一条sql执行导致的,这个时候你可以临时开启慢查询日志,一般情况下慢查询都是开启的
  mysql> set global slow_query_log=on;
  Query OK, 0 rows affected (0.00 sec)
  5)事物相关
  查看正在锁的事务
  SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
  查看等待锁的事务
  SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS
  kill
  INNODB_TRX表主要是包含了正在InnoDB引擎中执行的所有事务的信息,包括waiting for a lock和running的事务
  INNODB_LOCKS表主要包含了InnoDB事务锁的具体情况,包括事务正在申请加的锁和事务加上的锁。
  INNODB_LOCK_WAITS表包含了blocked的事务的锁等待的状态

页: [1]
查看完整版本: mysql排错 (一)