关键词:
这款工具是 MySQL 一个重要分支 percona 的,名称叫做 percona-toolkit(一把锋利的瑞士军刀),它呢是一组命令的集合。今儿给大家介绍几个我们在生产环境中最长用到的。
工具包的下载地址:https://www.percona.com/downloads/percona-toolkit/LATEST/
安装过程很简单,先解压:
tar -zxvf percona-toolkit-3.0.3_x86_64.tar.gz
由于是二进制的包,解压完可以直接进到percona-toolkit-3.0.3/bin目录下使用。
锦囊妙计一:
pt-online-schema-change
功能可以在线整理表结构,收集碎片,给大表添加字段和索引。避免出现锁表导致阻塞读写的操作。针对 MySQL 5.7 版本,就可以不需要使用这个命令,直接在线 online DDL 就可以了。
展现过程如下:
由于是测试环境,就不创建一张数据量特大的表,主要让大家理解这个过程。
这是表里面数据的情况和表结构
mysql> select count(*) from su;
+----------+
| count(*) |
+----------+
| 100000 |
+----------+
1 row in set (0.03 sec)
mysql> desc su;
+-------+------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+-------------------+-----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| c1 | int(11) | NO | | 0 | |
| c2 | int(11) | NO | | 0 | |
| c3 | int(11) | NO | | 0 | |
| c4 | int(11) | NO | | 0 | |
| c5 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| c6 | varchar(200) | NO | | | |
在线增加字段的过程:
[[email protected] bin]# ./pt-online-schema-change --user=root --password=root123
--host=localhost --alter="ADD COLUMN city_id INT" D=test,t=su --execute
No slaves found. See --recursion-method if host node3 has slaves.
Not checking slave lag because no slaves were found and --check-slave-lag was not specified.
Operation, tries, wait:
analyze_table, 10, 1
copy_rows, 10, 0.25
create_triggers, 10, 1
drop_triggers, 10, 1
swap_tables, 10, 1
update_foreign_keys, 10, 1
Altering `test`.`su`...
Creating new table...
Created new table test._su_new OK.
Altering new table...
Altered `test`.`_su_new` OK.
2017-08-10T14:53:59 Creating triggers...
2017-08-10T14:53:59 Created triggers OK.
2017-08-10T14:53:59 Copying approximately 100163 rows...
2017-08-10T14:54:00 Copied rows OK.
2017-08-10T14:54:00 Analyzing new table...
2017-08-10T14:54:00 Swapping tables...
2017-08-10T14:54:00 Swapped original and new tables OK.
2017-08-10T14:54:00 Dropping old table...
2017-08-10T14:54:00 Dropped old table `test`.`_su_old` OK.
2017-08-10T14:54:00 Dropping triggers...
2017-08-10T14:54:00 Dropped triggers OK.
Successfully altered `test`.`su`.
查看结果新增了一个 city_id 的字段:
mysql> desc su;
+---------+------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+-------------------+-----------------------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| c1 | int(11) | NO | | 0 | |
| c2 | int(11) | NO | | 0 | |
| c3 | int(11) | NO | | 0 | |
| c4 | int(11) | NO | | 0 | |
| c5 | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| c6 | varchar(200) | NO | | | |
| city_id | int(11) | YES | | NULL | |
+---------+------------------+------+-----+-------------------+-----------------------------+
锦囊妙计二:
pt-query-digest
功能:现在捕获线上TOP 10 慢 sql 语句。
大家都知道数据库大多数的性能问题是 sql 语句造成的,所以我们要抓住它们这些犯罪分子。及时做相关的优化处理。
展现过程如下:
可以根据时间间隔,来采样慢 sql 语句。since 是可以调整的 sql 语句
[[email protected] bin]# ./pt-query-digest --since=24h /data/mysql/slow.log > 1.log
查看 sql 报告,总结慢语句有哪些,并可以看针对时间的消耗。
如下只是部分报告过程
cat 1.log
# Profile
# Rank Query ID Response time Calls R/Call V/M Item
# ==== ================== ============= ===== ======= ===== ==============
# 1 0x040ADBE3A1EED0A2 16.8901 87.2% 1 16.8901 0.00 CALL insert_su
# 2 0x8E44F4ED46297D4C 1.3013 6.7% 3 0.4338 0.18 INSERT SELECT test._su_new test.su
# 3 0x12E7CAFEA3145EEF 0.7431 3.8% 1 0.7431 0.00 DELETE su
# MISC 0xMISC 0.4434 2.3% 3 0.1478 0.0 <3ITEMS>
# Query 1: 0 QPS, 0x concurrency, ID 0x040ADBE3A1EED0A2 at byte 19060 ____
# Scores: V/M = 0.00
# Time range: all events occurred at 2017-08-02 12:12:07
# Attribute pct total min max avg 95% stddev median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count 2 1
# Exec time 47 18s 18s 18s 18s 18s 0 18s
# Lock time 0 103us 103us 103us 103us 103us 0 103us
# Rows sent 0 0 0 0 0 0 0 0
# Rows examine 0 0 0 0 0 0 0 0
# Query size 0 21 21 21 21 21 0 21
# String:
# Databases test
# Hosts localhost
# Users root
# Query_time distribution
# 1us
# 10us
# 100us
# 1ms
# 10ms
# 100ms
# 1s
# 10s+ ################################################################
call insert_su(50000)\G
可以看到报告中,列举出了一些sql语句响应时间占比情况,和sql语句的执行时间情况。方便我们可以很直观的观察哪些语句有问题。(这里只列举了一条sql)
锦囊妙计三:
pt-heartbeat
功能监控主从延迟。监控从库落后主库大概多少时间。
环境介绍:192.168.56.132主库,192.168.56.133从库
操作如下:
在主库上执行:
[[email protected] bin]# ./pt-heartbeat --database test --update
--create-table --daemonize -uroot -proot123
test为我监控同步的库,在该库下创建一张监控表heartbeat,后台进程会时时更新这张表。
在从库上执行监控主从同步延迟时间的语句:
master-server-id是主库的server-id, -h(主库ip)
[[email protected] bin]# ./pt-heartbeat --master-server-id=1323306
--monitor --database test -uzs -p123456 -h 192.168.56.132
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
0.00s [ 0.00s, 0.00s, 0.00s ]
时间是0s,目前没有延迟的出现。
锦囊妙计四:
pt-table-checksum
功能检查主从复制一致性
原理:在主上执行检查语句去检查 mysql主从复制的一致性,生成 replace 语句,然后通过复制传递到从库,再通过update 更新 master_src 的值。最后通过检测从上 this_src 和 master_src 的
值从而判断复制是否一致。
比较test库的差异情况,在主库上面执行:
[[email protected] bin]# ./pt-table-checksum --no-check-binlog-format --nocheck-replication-filters
--databases=test --replicate=test.checksums --host=192.168.56.132 -uzs -p123456
TS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE
08-10T16:01:02 0 0 1 1 0 0.013 test.heartbeat
08-10T16:01:02 0 0 0 1 0 0.015 test.su
08-10T16:01:02 0 0 0 1 0 0.011 test.t
可见diff都为0,证明主从的test库没有差异情况。
比较test库哪些表有差异(需要添加replicate-check-only),在主库上面执行:
[[email protected] bin]# ./pt-table-checksum --no-check-binlog-format
--nocheck-replication-filters --databases=test --replicate=test.checksums
--replicate-check-only --host=192.168.56.132 -uzs -p123456
Differences on node4
TABLE CHUNK CNT_DIFF CRC_DIFF CHUNK_INDEX LOWER_BOUNDARY UPPER_BOUNDARY
test.t 1 1 1
可见test库下面t这张表主从数据不一致。
锦囊妙计五:
pt-slave-restart
功能:监控主从错误,并尝试重启MySQL主从
注意事项:跳过错误这个命令,解决从库多数据的现象(错误代码1062)。如果从库少数据,还跳过错误,就不能从根儿上解决主从同步的问题了(错误代码1032),就需要先找到缺少的数据是什么了,如果缺少的特别多,建议重新搭建主从环境。
从库出现1062的错误:
Slave_IO_Running: Yes
Slave_SQL_Running: No
Last_Errno: 1062
Last_Error: Could not execute Write_rows event on table test.t;
Duplicate entry ‘1‘ for key ‘PRIMARY‘,
Error_code: 1062; handler error HA_ERR_FOUND_DUPP_KEY;
the event‘s master log mysql-bin.000006, end_log_pos 757482
需要在从库上面执行:
[[email protected] bin]# ./pt-slave-restart -uroot -proot123 --error-numbers=1062
2017-08-10T16:28:12 p=...,u=root node4-relay-bin.000002 751437 1062
跳过错误之后,检查主从结果:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
同步状态又恢复一致了。
锦囊妙计六:
pt-ioprofile
功能:方便定位IO问题,可通过IO吞吐量来定位。
[[email protected] bin]# ./pt-ioprofile
Thu Aug 10 16:33:47 CST 2017
Tracing process ID 3907
total read pwrite write fsync filename
13.949355 0.839006 0.000000 0.286556 12.823793 /data/mysql/mysql-bin.000006
7.454844 0.000000 2.913702 0.000000 4.541142 /data/mysql/ib_logfile0
0.000193 0.000000 0.000000 0.000193 0.000000 /data/mysql/slow.log
read:从文件中读出数据。要读取的文件用文件描述符标识,数据读入一个事先定义好的缓冲区。
write:把缓冲区的数据写入文件中。
pread:由于lseek和read调用之间,内核可能会临时挂起进程,所以对同步问题造成了问题,调用pread相当于顺序调用了lseek和read,这两个操作相当于一个捆绑的原子操作。
pwrite:由于lseek和write调用之间,内核可能会临时挂起进程,所以对同步问题造成了问题,
调用pwrite相当于顺序调用了lseek 和write,这两个操作相当于一个捆绑的原子操作。
fsync:确保文件所有已修改的内容已经正确同步到硬盘上,该调用会阻塞等待直到设备报告IO完成。
filename:与磁盘交互的文件名称
通过这个报告我们可以看到,哪个文件占用IO的时间比较多,跟磁盘交互最为繁忙,便于锁定IO问题。
因为这个工具集命令很多,今儿先给大家介绍这些比较常用的,其他的一些大家感兴趣可以私下去研究下。
官方地址:https://www.percona.com/doc/percona-toolkit/LATEST/index.html
软件工程师必备书单
...合作者及团队多年的软件开发实践经验,通过50+条锦囊妙计、100+个案例,帮你轻松理解和掌握编程技能。本书分享的实用技巧可以帮助你编写鲁棒、可靠且易于团队成员理解 查看详情
jvm技术专题精心准备了一套jvm分析工具的锦囊「上篇」(代码片段)
...概要本文主要了解以下内容:JDK自带的几款在线监控工具(JPS、jstat、jstack、jmap),用户实时监控JVM运行装填。【官方文档】JVM离线分析工具(VisualVM),用于分析dump下来的堆内存文件,远程监控JVM状态。第... 查看详情
mysql索引面试题必备(代码片段)
MySQL索引必问面试题1.什么是索引2.索引分类3.索引的基本操作主键索引的创建普通索引的创建唯一索引的创建复合索引的创建4.索引的底层原理5.聚簇索引和非聚簇索引6.无法利用索引的情况参考:https://www.bilibili.com/video/BV19y4y... 查看详情
高并发系统设计的15个锦囊(代码片段)
前言大家好。记得很久之前,去面试过字节跳动。被三面的面试官问了一道场景设计题目:如何设计一个高并发系统。当时我回答得比较粗糙,最近回想起来,所以整理了设计高并发系统的15个锦囊,相信大家... 查看详情
高并发系统设计的15个锦囊(代码片段)
前言大家好。记得很久之前,去面试过字节跳动。被三面的面试官问了一道场景设计题目:如何设计一个高并发系统。当时我回答得比较粗糙,最近回想起来,所以整理了设计高并发系统的15个锦囊,相信大家... 查看详情
策略模式精讲(代码片段)
...替换。下面使用穷举法举几个简单理解的例子:1.诸葛亮的锦囊妙计,每一个锦囊就是一个策略.2.旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。 3.固定算法的封装等等。4.网上购物买东西选择支付... 查看详情
30个前端开发人员必备的顶级工具(代码片段)
关注公众号 前端开发博客,领27本电子书回复加群,自助秒进前端群在本文中,我为前端Web开发人员汇总了30种顶级工具,从代码编辑器和代码游乐场到CSS生成器,JS库等等。目录CSS代码生成器CSS3Generator终极CS... 查看详情
必备的几个小工具(代码片段)
今天给大家推荐写博客必备的几个工具,也是我自己每次写文章用到的。一.小书匠这个工具是345大神告诉我的,非常好用的MakeDown编辑器,比较常见的网站都支持,例如:csdn,简书。官网下载页面传送门... 查看详情
jvm调优工具锦囊:jdk自带工具与arthas线上分析工具对比(代码片段)
Arthas线上分析诊断调优工具以前我们要排查线上问题,通常使用的是jdk自带的调优工具和命令。最常见的就是dump线上日志,然后下载到本地,导入到jvisualvm工具中。这样操作有诸多不变,现在阿里团队开发的Arhtas... 查看详情
网安入门必备的12个kalilinux工具(代码片段)
kaliLinux工具帮你评估Web服务器的安全性,并帮助你执行黑客渗透测试。注意:这里不是所提及的所有工具都是开源的。1.NmapNmap(网络映射器)是一款用于网络发现和安全审计的网络安全工具.主机发现,端口扫描,版... 查看详情
爬虫进阶必备scrapy入门使用(深度好文)(代码片段)
Scrapy的入门使用1.安装scrapy2.scrapy项目开发流程3.创建项目4.创建爬虫5.完善爬虫5.1修改爬虫.py文件5.2定位元素以及提取数据、属性值的方法5.3response响应对象的常用属性6.保存数据6.1在pipelines.py文件中定义对数据的操作6.2在settings.p... 查看详情
ctf比赛必备常用工具(代码片段)
...于大家下载使用,快速上手。CTF常用工具下载CTF比赛必备常用工具一、什么是CTF二、比赛中工具的重要性三、常用MISC(杂项)工具1.Audacity(提取莫斯密码辅助工具)2.stegsolve(图片隐写分析工具)3.QR_ 查看详情
锦囊妙计(代码片段)
话说上回讲到海东集团面临内外交困,公司的元老也只剩下XHD夫妇二人了。显然,作为多年拼搏的商人,XHD不会坐以待毙的。一天,当他正在苦思冥想解困良策的时候,突然想到了自己的传家宝,那是公司成立的时候,父亲作为... 查看详情
jvm技术专题精心准备了一套jvm分析工具的锦囊「中篇」(代码片段)
堆转储快照分析工具jvisualvm也是JDK自带的命令,虽然后面独立发展了。这两种方式都可以使用。VisualVM链接:https://visualvm.github.io/使用VisualVM分析上面jmap导出的堆栈转储文件,导入后如下:离线分析工具(VisualVM)Visu... 查看详情
图文并茂说mysql索引——入门进阶必备(代码片段)
本篇是我阅读《MySQL是怎样运行的》一书的笔记,我简化了一些概念,删除了一些不容易新手入门理解的内容,增加了第八节MRR说明,在这里分享给大家。文章目录1.索引介绍2.当你插入记录,页中有什么变化... 查看详情
ctf必备取证神器(volatilityptf取证大师magnetaxiom)(代码片段)
在CTF比赛中好的工具往往能让解题变得顺利,在取证题中更是如此,神器让flag无处可藏接下来会分别介绍几个取证工具安装和使用volatilityPTF取证大师MagnetAXIOMvolatilityVolatility是一款开源内存取证框架,能够对导出的内... 查看详情
linux面试必备20个常用命令(代码片段)
文章目录第一章什么是linux第二章linux的基础命令1.pwd命令2.ls命令3.cd命令4.man命令5.grep命令6.find命令7.chmod命令8.ps命令9.kill命令10.tail命令11.netstat命令8.date查看当前系统时间10.echo打印选项-e11.ping地址检测是否与主机连通第三章文件... 查看详情
数据分析必备工具jupyternotebook使用(代码片段)
Jupyternotebook使用Jupyternotebook使用常用快捷键:命令模式(按Esc键):编辑模式:注意事项:Jupyternotebook使用常用快捷键:命令模式(按Esc键):Enter:转入编辑模式Shift-Enter 查看详情