赞
踩
业务代码bug
,编写的SQL
语句报错;
Error updating database. Cause: java.sql.SQLException: Field 'category_name' doesn't have a default value
可根据异常信息百度解决;偶发的SQL
执行缓慢的情况;
慢查询日志:
查看慢查询日志:show variables like 'slow_query_log_file';
排查SQL执行缓慢的原因:
SQL
信息,并根据Look_time
耗时判断是不是由于并发事物导致的长时间阻塞,如果不是则使用explain
执行分析工具,判断索引情况;部署MySQL
的及其故障,如磁盘、内存、CPU100%
、MySQL
自身故障等;
Mysql
版本不匹配,或超时时间过小,可能导致连接中断;
Mysql、JAVA
程序所部署的机器不在同一网段,导致两者之间可能存在网络通信故障;
MyCat、MySQL-Proxy
这类代理中间件,记得检查中间件的白名单、超时时间配置。MySQL
没有资源分配给新连接;
MySQL
的情况时,可以去查看部署Mysql服务的机器的硬件使用情况,若出现异常则说明是机器问题;MySQL会默认开启死锁检测算法,当运行期间出现死锁问题时,会主动介入并解除死锁,具体可参考Mysql锁机制中的死锁介绍,但其指标不治本,死锁现象是由于业务代码不合理造成的,极大可能反复出现;
定位死锁问题:可通过SHOW ENGINE INNODB STATUS\G;
查看InnoDB
的运行状态日志,其中包含InnoDB
运行期间所有的状态日志,其中死锁日志在LATEST DETECTED DEADLOCK
这块区域;
*** (n) TRANSACTION
:产生死锁的事物和具体sql*** (2) WAITING FOR THIS LOCK TO BE GRANTED
: 指明了发生死锁冲突的地点位于order
库中order_salesorder
表的uk_tenant_store_order
索引上,第二个事务正在等待获取插入意向锁,但是由于第一个事务持有了表级的共享锁,并且也在等待获取插入意向锁; *** WE ROLL BACK TRANSACTION (2)
:解决方案是回滚了第二个事物;排查思路:
top
;top -Hp [PID]
;具体步骤:
通过top
命令查看占用CPU
最高的进程(这里假设mysql占用率最高):
top - 16:02:11 up 623 days, 23:46, 1 user, load average: 0.24, 0.22, 0.19 Tasks: 139 total, 1 running, 138 sleeping, 0 stopped, 0 zombie %Cpu(s): 1.5 us, 0.1 sy, 0.0 ni, 98.2 id, 0.0 wa, 0.2 hi, 0.0 si, 0.0 st MiB Mem : 15469.9 total, 152.1 free, 6837.6 used, 8480.2 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 8314.0 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 3093986 admin 20 0 6576080 1.4g 18008 S 5.3 9.6 2:50.12 java 3057999 admin 20 0 6335928 1.2g 16864 S 0.7 8.1 4:42.53 java 13699 root 20 0 1722052 283200 5076 S 0.3 1.8 3126:16 /usr/local/clou 106781 admin 20 0 5079784 1.0g 2612 S 0.3 6.9 3184:01 java 765635 mysql 20 0 2653408 1.4g 10140 S 0.3 9.0 54062:02 mysqld 2836690 admin 20 0 273680 9612 2008 S 0.3 0.1 356:23.41 redis-server 3054745 admin 20 0 4696200 815644 16600 S 0.3 5.1 3:24.90 java 3499020 root 10 -10 89768 13020 9316 S 0.3 0.1 66:17.11 AliYunDun 3499031 root 10 -10 133384 24060 12164 S 0.3 0.2 126:29.57 AliYunDunMonito 1 root 20 0 111468 6140 3204 S 0.0 0.0 8:14.12 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:13.04 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp
之后可以通过top -Hp [PID]
命令查询进程中CPU
占用率最高的线程;
top - 16:09:44 up 623 days, 23:54, 2 users, load average: 0.00, 0.05, 0.11
Threads: 53 total, 0 running, 53 sleeping, 0 stopped, 0 zombie
%Cpu(s): 5.1 us, 0.3 sy, 0.0 ni, 94.2 id, 0.0 wa, 0.3 hi, 0.1 si, 0.0 st
MiB Mem : 15469.9 total, 179.2 free, 6847.7 used, 8443.0 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 8303.9 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3096811 mysql 20 0 2653408 1.4g 10140 S 0.7 9.0 0:00.02 mysqld
765637 mysql 20 0 2653408 1.4g 10140 S 0.3 9.0 2:54.55 mysqld
3087933 mysql 20 0 2653408 1.4g 10140 S 0.3 9.0 0:01.49 mysqld
3096213 mysql 20 0 2653408 1.4g 10140 S 0.3 9.0 0:00.03 mysqld
765635 mysql 20 0 2653408 1.4g 10140 S 0.0 9.0 0:04.38 mysqld
765636 mysql 20 0 2653408 1.4g 10140 S 0.0 9.0 0:00.00 mysqld
765638 mysql 20 0 2653408 1.4g 10140 S 0.0 9.0 3:08.71 mysqld
查看OS线程ID与MySQL线程ID关系(MySQL5.7及以上),通过查询performance_schema
库中的threads
表SELECT * FROM threads where THREAD_OS_ID = 3096811;
THREAD_ID
:Mysql内部线程IdPROCESSLIST_USER
:数据库连接的客户端用户PROCESSLIST_HOST
:数据库连接的客户端地址PROCESSLIST_DB
:访问的库PROCESSLIST_INFO
:当前线程正在执行的sqlTHREAD_OS_ID
:操作系统的线程ID得到当前线程正在执行的sql,则可以从代码层面着手优化;
IO
占用过高的原因:
Redis
减小读压力,引入MQ
进行流量削峰;BufferPool
缓冲池大小;SQl
语句上优化,撰写SQL
语句时尽量减少多张大表联查,不要频繁的使用和销毁临时表;MySQL5.6
引入,主要记录:数据库整体的监控信息,比如事务监控信息、最近执行的SQL信息、最近连接的客户端信息、数据库各空间的使用信息等,基于这个库可以在线上构建出一个完善的MySQL监控系统:
Statements/execution stages
:MySQL统计的一些消耗资源较高的SQL语句。Table and Index I/O
:MySQL统计的那些表和索引会导致I/O负载过高。Table Locks
:MySQL统计的表中数据的锁资源竞争信息。Users/Hosts/Accounts
:消耗资源最多的客户端、IP机器、用户。Network I/O
:MySQL统计的一些网络相关的资源情况。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。