2020想进大厂你不得不了解的MySQL意外事件的查询技巧

导读:数据库是导致应用系统运行缓慢的常见原因。面对数据库引性能问题,很多开发者或者DBA却束手无策。本文作者经过多年的实际经验,整理了一些材料,将Linux环境下MySQL性能突发事件问题排查技巧分享给大家。

作者介绍:崔虎龙,云和恩墨-开源架构部-MySQL技术顾问,长期服务于数据中心(金融,游戏,物流)行业,熟悉数据中心运营管理的流程及规范,自动化运维 等方面。擅长MySQL,Redis,MongoDB 数据库高可用设计 和 运维故障处理,备份恢复,升级迁移,性能优化 。

经过多年的实际经验,整理了一些材料,将Linux环境下MySQL性能突发事件问题排查技巧分享给大家。

作为DBA在面对性能上突发问题的时候,是否出现过束手无策,无从下手的经历。 其实性能无非问题点在于存储、操作系统, 应用程序,数据库 等方面。

性能分析问题 并没有想象的那么难,当了解到一些常用的Linux 系统命令和MySQL的基础排查命令的时候,所有问题点都可以定位到。

先上一个Linux性能工具图谱图,Brendan D. Gregg动态追踪工具 DTrace 的作者。

有点复杂,不用太care,只要你理解了下面的常用命令和分析点,那就可以确定绝大数性能上问题。

Linux 平台基础常用的性能收集工具:

1. top — Linux 系统进程监控

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。并且它也是 Linux 系统管理员经常使用的监控系统性能的工具。Top命令可以定期显示所有正在运行和实际运行并且更新到列表中,它显示出 CPU 的使用、内存的使用、交换内存、缓存大小、缓冲区大小、过程控制、用户和更多命令。它也会显示内存和 CPU 使用率过高的正在运行的进程。

2. vmstat — 虚拟内存统计

vmstat 命令是用于显示虚拟内存、内核线程、磁盘、系统进程、I/O 模块、中断、CPU 活跃状态等更多信息。

3. lsof — 打开文件列表

lsof 命令对于很多 Linux/Unix 系统都可以使用,主要以列表的形式显示打开的文件和进程。打开的文件主要包括磁盘文件、网络套接字、管道、设备和进程。这个命令很容易看出哪些文件正在使用。

4. tcpdump — 网络数据包分析器

tcpdump 是一种使用最广泛的命令行网络数据包分析,将网络中传送的数据包完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤 并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

包可通过tcpdump命令解析,也可以保存成后缀为pcap的文件,使用wireshark等软件进行查看。

3. netstat — 网络统计

netstat 命令是一个监控网络数据包传入和传出的统计界面的命令行工具。它对于许多系统管理员去监控网络性能和解决网络相关问题是一个非常有用的工具。

4. iostat — 输入/输出统计

iostat 是收集和展示系统输入和输出存储设备统计的简单工具。这个工具通常用于查找存储设备性能问题,包括设备、本地磁盘、例如 NFS 远程磁盘。

除了上述 还有 其他一些Linux 常用的工具sar,htop, IPTraf , iotop ,iftop ,iptraf 等。

MySQL常用性能突发事件分析命令:

1. SHOW PROCESSLIST; —当前MySQL数据库的运行的所有线程

2. INNODB_TRX; — 当前运行的所有事务

## 当前运行的所有事务 ,还有具体的语句

3. INNODB_LOCKS; — 当前出现的锁

## 当前事务出现的锁的语句信息

4. INNODB_LOCK_WAITS; — 锁等待的对应关系计

## 锁等待的对应关系

5. SHOW OPEN TABLES where In_use >0; — 当前打开表

查看哪些表在使用中,In_use列表示有多少线程正在使用某张表,Name_locked表示表名是否被锁,这一般发生在Drop或Rename命令操作这张表时。所以这条命令不能帮助解答我们常见的问题:当前某张表是否有死锁,谁拥有表上的这个锁等。

下面比较重点部分,请注意!

6. SHOW ENGINE INNODB STATUS \G; —Innodb状态

显示除了大量的内部信息,输出内容比较复杂难懂,输出内容中包含了一些平均值的统计信息,这些平均值是自上次输出结果生成以来的统计数。

具体分析如下:

①.Header

这部分简单的打印,输出的时间,以及自从上次输出的间隔时间。

②.BACKGROUND THREAD

参数

说明

Srv_master_thread loops

Master线程的循环次数,master线程在每次loop过程中都会sleep,sleep的时间为1秒。而在每次loop的过程中会选择active、shutdown、idle中一种状态执行。Master线程在不停循环,所以其值是随时间递增的。

Srv_active

Master线程选择的active状态执行。Active数量增加与数据表、数据库更新操作有关,与查询无关,例如:插入数据、更新数据、修改表等。

Srv_shutdown

这个参数的值一直为0,因为srv_shutdown只有在mysql服务关闭的时候才会增加。

Srv_idle

这个参数是在master线程空闲的时候增加,即没有任何数据库改动操作时。

Log_flush_and_write

Master线程在后台会定期刷新日志,日志刷新是由参数innodb_flush_log_at_timeout参数控制前后刷新时间差。

注:Background thread部分信息为统计信息,即mysql服务启动之后该部分值会一直递增,因为它显示的是自mysqld服务启动之后master线程所有的loop和log刷新操作。通过对比active和idle的值,可以获知系统整体负载情况。Active的值越大,证明服务越繁忙。

③. SEMAPHORES 信号量

OS WAIT ARRAY INFO 操作系统等待数组的信息,它是一个插槽数组,innodb使用了多少次操作系统的等待

保留统计(reservation count)显示了innodb分配插槽的频度

信号计数(signal count) 衡量的是线程通过数组得到信号的频度

RW-shared spins:#这行显示读写的共享锁的计数器

RW-excl spins:#这行显示读写的排他锁的计数器

RW-sx spins:#这行显示共享排它锁计数器

*备注:5.7.2增加了一种新的读写锁类型称为SX共享排他锁

锁的拥有则可以读表中的任何数据,如果在相应的行上能够获得X锁,则可以修改该行。

S

SX

X

S

o

o

x

SX

o

x

x

X

x

x

x

④. TRANSACTIONS

包含Innodb 事务(transactions)的统计信息,还有当前活动的事务列表。

transaction id: 这个ID是一个系统变量随时每次新的transaction产生而增加。

Purge done:正在进行清空(purge)操作的transaction ID。你可以通过查看第transaction id和第Purge done ID的区别,明白没有被purge的事务落后的情况。

History listlength:记录了undo spaces内unpurged的事务的个数。

⑤. FILE I/O

显示了I/O Helper thread的状态,包括一些统计信息

pending operations, pending的log和buffer pool thread的fsync调用

399 OS file:行显示了reads, writes, and fsync调用次数。

0.00 reads/s…… : 显示了每秒的统计信息

备注:“aio”表示“ 异步I/O(asynchronous I/O).”

⑥. INSERT BUFFER AND ADAPTIVE HASH INDEX

Ibuf:insertbuffer的一些信息,包括free list, segment size

Hash table:显示了hash table的一些信息最后一行显示了每秒进行了多少次hash搜索,以及非hash搜索

⑦. LOG

Log sequence number表示的是redo log buffer中的lsn

Log flushed up to表示的是redo log file中的lsn

Pages flushed up to表示的缓冲池最旧脏页的lsn

Last checkpoint at 指的就是最近一个物理页刷新到磁盘时,它的fil_page_lsn的变量值。

⑧. BUFFER POOL AND MEMORY

当前内存使用状态

Pages read ahead:显示了每秒线性预读跟随机预读的次数

备注:InnoDB 提供了两种预读的方式,一种是 Linear read ahead,由参数innodb_read_ahead_threshold控制,当你连续读取一个 extent 的 threshold 个 page 的时候,会触发下一个 extent 64个page的预读。另外一种是Random read-ahead,由参数innodb_random_read_ahead控制,当你连续读取设定的数量的page后,会触发读取这个extent的剩余page。InnoDB 的预读功能是使用后台线程异步完成。

⑨. ROW OPERATIONS

0 queries inside InnoDB, 0 queries in queue:显示了有多少线程在Innodb内核

read views open inside InnoDB:显示了有多少read view被打开了,一个read view是一致性保证的MVCC “snapshot”

备注:innodb多版本并发(MVCC)通过read view来确定一致性读时的数据库snapshot, innodb的read view确定一条记录能否看到,

在RC隔离级别下,是每个SELECT都会获取最新的read view;

在RR隔离级别下,则是当事务中的第一个SELECT请求才创建read view

7. SHOW STATUS LIKE ‘innodb_row_lock_%‘; — 锁性能状态

查看当前锁性能状态

解释如下:

Innodb_row_lock_current_waits:当前等待锁的数量

Innodb_row_lock_time:系统启动到现在、锁定的总时间长度

Innodb_row_lock_time_avg:每次平均锁定的时间

Innodb_row_lock_time_max:最长一次锁定时间

Innodb_row_lock_waits:系统启动到现在、总共锁定次数

8. SQL语句EXPLAIN; — 查询优化器

EXPLAIN执行计划部分,略过(后续专题分享)

作为一个DBA,问题排查技巧是每个工程师都需要掌握的核心技能。

原文地址:https://www.cnblogs.com/CQqfjy/p/12320740.html

时间: 2024-12-11 10:06:47

2020想进大厂你不得不了解的MySQL意外事件的查询技巧的相关文章

我要进大厂!

出自公众号:大飞码字 "怎样才能进大厂?" "我是一个二本计算机专业的学生,怎样才能进大厂?" "我是一个非计算机专业的学生,有机会可以进大厂吗?" 我收到不少咨询如何进大厂的问题,以上是一些比较典型的提问. "怎么可以进大厂" 这个问题,跟"怎么可以在30岁前赚到1000万" 和 "怎么可以在40岁前赚到一个亿"本质是一样的,不存在一个明确指引,可以指引一个人一定可以成功,如果有这种武

进大厂也就这回事,工作后2到3年进大厂操作指南

在BAT这种大厂里,只要肯吃苦,技术和工资进步的速度会超出你想象,我在上海,按当前价格算,一般在大厂里干个三四年,好歹房子的首付应该能有,而且这种房子还不是太偏远太小的. 进大厂确实需要一定的实力,但如果单单技术好,没有其它的技巧,估计确实也有些难度.不过话说来,哪怕是二本出身,哪怕技术一般,只要肯上心加方法得当,工作后3年进大厂应该不是难事.在本文里,就将针对起点一般技术一般的同学,给出具体的进大厂操作指南. 1 先从战略上藐视,进大厂也就这回事 大厂里也有只有2,3年开发经验的初级开发,而且

如果无法进入想进的模式,那么请先确保进入的方式是否正确

在刷机的过程中可能不会是一帆风顺的,至少我是这样的,总是会遇到这样或者那样的问题,以下是我为大家总结一些问题和解决的方法,希望能对大家有所帮助. 一.电量问题     刷机和系统更新有一个共同的前提保障,要想让过程能够顺利进行,我们需要保证有充足的电量(50%以上),所以在刷机和更新前都需要充好电.但是如果遗忘了,如果能及时发现就请赶快连接充电器吧! 二.模式问题     如果无法进入想进的模式,那么请先确保进入的方式是否正确.就拿我的手机(红米2A)来说吧:按住上下音量(按着不放),再按电源键

“2019,别进大厂了!”

是的. 对于一部分人来说,这是真的. 因为,无论是BAT三足鼎立的前些年,还是TMD日益壮大的2016年.2017年,或者是寒冬已至的2018年... 这些人每年都会说一次这样的话. 一部分人跟风焦虑,另一部分人默默牛逼 一些人对进大厂持悲观态度: “大专或高中学历进不了大厂!” “普通二本进不了大厂!” “工作不满3年进不了大厂!” ”非科班毕业的,进不了大厂!“ 进不了大厂就难拿高薪,拿不了高薪就买不起房养不起崽,大家变得很焦虑. 上述这些想法,每天都在一些人的脑海中回荡,其实这也很正常,任

想进BAT面试的Java程序员 看完这个你们还觉得offer很难拿吗???

阿里面试问些什么? 参加阿里的社招面试,而社招不同于校招,问题的范围其实是很随机的.因为能参加一些比较知名的互联网公司社招的人,70%以上都会有个3-5年的经验.这倒不是说一两年经验的同学没有机会进这些公司,而是因为这种公司,大部分情况下只招一些比较资深的开发和应届生,而不招那些处于中间阶段的人.而1-2年经验的同学,往往就刚好处于这个尴尬的阶段. 对于能有3-5年经验的这部分人中,每个人的经历又都不同,所擅长的点也不一样,因此这就会导致每个人的问题和范围都不太一样. 很少说有哪个知名的互联网公

想进BAT面试的Java程序员,看完这个你们还觉得offer很难拿吗?

第一个问题:阿里面试问些什么 参加阿里的社招面试,而社招不同于校招,问题的范围其实是很随机的.因为能参加一些比较知名的互联网公司社招的人,70%以上都会有个3-5年的经验.这倒不是说一两年经验的同学没有机会进这些公司,而是因为这种公司,大部分情况下只招一些比较资深的开发和应届生,而不招那些处于中间阶段的人.而1-2年经验的同学,往往就刚好处于这个尴尬的阶段. 对于能有3-5年经验的这部分人中,每个人的经历又都不同,所擅长的点也不一样,因此这就会导致每个人的问题和范围都不太一样. 很少说有哪个知名

2020年一线大厂月薪35K的Python开发要求

为什么程序员要在2020年学习Python? 如果你正在考虑学习 Python,但又不确定为什么要这样做的话,那么你可以看看以下的内容: 马蜂窝裁员竟然达到了40%, 前段时间猪厂.菊厂裁员被推到了风口浪尖.更是诞生了“毕业985,工作996,离职251,维权404”的裁员神评.这样的寒冬下程序员该何去何从......然而在寒冬裁员的浪潮下,唯独Python工程师非但没有受到冲击,反而在寒潮中,激流勇进,薪资越涨越高.知名互联网独角兽企业纷纷开出了25K-70K的月薪引进Python人才,仍然供

改变着全球化的框架和内容。但是要想进dz

闭幕式前,举行了市政协八届一次会议第三次全体会议,选举政协岳阳市第八届委员会主席.副主席.秘书长和常务委员.会议应到委员352名,实到345名,符合<政协章程>的规定.根据会议表决和选举办法的规定,大会选举徐新楚为政协岳阳市第八届委员会主席.选举刘晓英.罗陆平.黎四清.李平.方争奇.万五龙.秧励.孔福建为政协岳阳市第八届委员会副主席.选举张群望为政协岳阳市第八届委员会秘书长.选举丁卫平.丁湘平.方舒.方亚华.方奎明.毛伟华.王亚丹.王志龙.邓冬华.邓有根.付萍.冯元满.左钢.任茂辉.任浩波.刘

会用python把linux命令写一遍的人,进大厂有多容易?

看过这篇<2000字谏言,给那些想学Python的人,建议收藏后细看!>的读者应该都对一个命令有点印象吧?没错,就是 linux 中经常会用到的 ls 命令. 文章中我就提到如何提升自己的 python 能力呢?直接找项目写,但是作为零基础 / 小白 / 入门 的你来说做一个博客还要学 web 框架.html.css.js,又成为了阻碍你写实际项目的阻碍. 所以我就推荐了这个命令:ls.写一个 ls 非常简单,你只需要会一点 linux 的基础知识,知道 ls 能做什么就好了. 那今天就给大家