MySQL管理工具---Percona Toolkit

MySQL管理工具---Percona Toolkit

什么是PT工具

Mysql PT工具是一组高级的命令行工具,用来管理 MySQL 和系统任务,主要包括:

1、验证主节点和复制数据的一致性

2、有效的对记录行进行归档

3、找出重复的索引

4、总结 MySQL 服务器

5、从日志和 tcpdump 中分析查询

6、问题发生时收集重要的系统信息

PT工具的安装

下载rpm包 直接本地yum安装

[root@db01 ~]# yum -y localinstall percona-toolkit-3.0.11-1.el6.x86_64.rpm 

PT工具的参数

[root@db01 ~]# pt-slave-restart --version
pt-slave-restart 3.0.11
[root@db01 ~]# pt
pt-align                  pt-ioprofile              pt-slave-find
pt-archiver               pt-kill                   pt-slave-restart
ptaskset                  pt-mext                   pt-stalk
pt-config-diff            pt-mongodb-query-digest   pt-summary
pt-deadlock-logger        pt-mongodb-summary        pt-table-checksum
pt-diskstats              pt-mysql-summary          pt-table-sync
pt-duplicate-key-checker  pt-online-schema-change   pt-table-usage
pt-fifo-split             pt-pmp                    pt-upgrade
pt-find                   pt-query-digest           pt-variable-advisor
pt-fingerprint            pt-secure-collect         pt-visual-explain
pt-fk-error-logger        pt-show-grants            ptx
pt-heartbeat              pt-sift                   
pt-index-usage            pt-slave-delay            
1.pt-archive ----MySQL的在线归档,无影响生产

2.pt-kill -----自定义查杀。确保慢查询及恶性攻击对生产无影响

3.pt-online-schema-change ----在线DDL操作,对上亿的大表加索引加字段且对生产无影响

4.pt-query-digest -----慢查询Log的分析。

5.pt-slave-delay ---就是指定从库比主库延迟多长时间

6.pt-table-checksum & pt-table-sync-----检查主从是否一致性-----检查主从不一致之后用这个工具进行处理 这两个一搬是搭配使用

7. pt-find ---找出几天之前建立的表

8. pt-slave-restart -----主从报错,跳过报错

9.pt-summary ---整个系统的的概述

10.pt-mysql-summary ---MySQL的表述,包括配置文件的描述

11.pt-duplicate-key-checker ---检查数据库重复索引

参数的使用

1.pt-archiver解释使用:[归档] 用此操作的表必须有主键。

1.归档历史数据;

2.在线删除大批量数据;

3.数据导出和备份;

4.数据远程归档;

5.数据清理

pt-archiver –help    # 参数,用这可以help一下
--charset=UTF8mb4    # 指定表的字符集
--where 'xid<5'      # 指定范围
--progress 10000     # 指定最大范围
--limit=10000        # 指定最大大小 取10000行
--statistics         # 统计归档 (只要不加上--quiet,默认情况下pt- archive都会输出执行过程的)
--no-delete          # 不删除源数据
--no-version-check   # 不进行版本检查

例:将10.0.0.51服务器中3306端口数据库中的student表中的数据归档导出到本地家目录下

mysql> select * from mm;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+

[root@db01 ~]# pt-archiver --source h=10.0.0.51,P=3306,u=msy,p='123',D=m,t=mm --file '/root/1.log' --where "id<4" --no-check-charset --no-delete --charset=utf8

[root@db01 ~]# cat 1.log 
1
2
3

2.pt-kill 解释使用:kill掉你想Kill的任何语句

出现大量的阻塞,死锁,某个有问题的sql导致mysql负载很高黑客攻击。当有很多语句时你不可能用show processlist去查看,当QPS很高时,你根本找不到你找的语句或ID,这时就可以用Pt-kill来完成;他可以根据运行时间,开源IP,用户名,数据库名。SQL语句,sleep,running 等状态进行匹配然后kill

--daemonize      # 放在后台以守护进程的形式运行;

--interval       # 多久运行一次,单位可以是s,m,h,d等默认是s –不加这个默认是5秒

--victims        # 默认是oldest,只杀最古老的查询。这是防止被查杀是不是真的长时间运行的查询,他们只是长期等待 这种种匹配按时间查询,杀死一个时间最高值。

--all            # 杀掉所有满足的线程

--kill-query     # 只杀掉连接执行的语句,但是线程不会被终止

--print          # 打印满足条件的语句

--busy-time      # 批次查询已运行的时间超过这个时间的线程;

--idle-time      # 杀掉sleep 空闲了多少时间的连接线程,必须在--match-command sleep时才有效—也就是匹配使用 -- –match-command 匹配相关的语句。

----ignore-command # 忽略相关的匹配。 这两个搭配使用一定是ignore-commandd在前 match-command在后,

--match-db cdelzone # 匹配哪个库

例:

# 杀掉空闲链接sleep 5秒的 SQL 并把日志放到/home/pt-kill.log文件中
pt-kill  --user=用户名 --password=密码 --match-command Sleep  --idle-time 5 --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

# 查询SELECT 超过1分钟路
pt-kill --user=用户名 --password=密码 --busy-time 60  --match-info "SELECT|select" --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

# Kill掉 select IFNULl.*语句开头的SQL
pt-kill --user=用户名 --password=密码 --victims all --busy-time=0 --match-info="select IFNULl.*" --interval 1 -S /tmp/mysqld.sock --kill --daemonize --pid=/tmp/ptkill.pid --print --log=/home/pt-kill123.log &

# kill掉state Locked
pt-kill --user=用户名 --password=密码  --victims all --match-state='Locked' --victim all --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

# kill掉 qz_business_servic 库,web为110.59.2.37的链接
pt-kill  --user=用户名 --password=密码 --victims all  --match-db='qz_business_service' --match-host='10.59.2.37' --kill --daemonize --interval 10 -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

# 指定哪个用户kill
pt-kill   --user=用户名 --password=密码 --victims all --match-user='root' --kill  --daemonize --interval 10 -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

# kill掉 command query | Execute
pt-kill --user=用户名 --password=密码 --victims all  --match-command= "query|Execute" --interval 5 --kill --daemonize -S /home/zb/data/my6006/socket/mysqld.sock --pid=/tmp/ptkill.pid --print --log=/home/pt-kill.log &

  注:上面都是说针对手动或紧急情况下处理的事

3.pt-online-schema-change简称 pt-osc 在线更改表结构

MySQL 大字段的DDL操作:加减字段、索引、修改字段属性

被操作的表如果有 触发器,或外键不可用

工作原理:

1.创建一个和要执行 alter 操作的表一样的新的空表结构(是alter之前的结构)

2.在新表执行alter table 语句(速度应该很快)

3.在原表中创建触发器3个触发器分别对应insert,update,delete操作

4.以一定块大小从原表拷贝数据到临时表,拷贝过程中通过原表上的触发器在原表进行的写操作都会更新到新建的临时表

5.Rename 原表到old表中,在把临时表Rename为原表

# 参数查询
[root@db01 ~]#   pt-online-schema-change --help

--max-load      # 默认为Threads_running=25。每个chunk拷贝完后,会检查SHOW GLOBAL STATUS的内容,检查指标是否超过了指定的阈值。如果超过,则先暂停。这里可以用逗号分隔,指定多个条件,每个条件格式: status指标=MAX_VALUE或者status指标:MAX_VALUE。如果不指定MAX_VALUE,那么工具会这只其为当前值的120%。

--critical-load # 默认为Threads_running=50。用法基本与--max-load类似,如果不指定MAX_VALUE,那么工具会这只其为当前值的200%。如果超过指定值,则工具直接退出,而不是暂停

--socket: -S    # 连接的套接字文件

--statistics    # 打印出内部事件的数目,可以看到复制数据插入的数目。

--dry-run       # 创建和修改新表,但不会创建触发器、复制数据、和替换原表。并不真正执行,可以看到生成的执行语句,了解其执行步骤与细节。

--dry-run与--execute # 必须指定一个,二者相互排斥。和--print配合最佳。

--execute       # 确定修改表,则指定该参数。真正执行。

--dry-run与--execute # 必须指定一个,二者相互排斥。

--print         # 打印SQL语句到标准输出。指定此选项可以让你看到该工具所执行的语句,和--dry-run配合最佳。

--progress      # 复制数据的时候打印进度报告,二部分组成:第一部分是百分比,第二部分是时间。

--quiet -q      # 不把信息标准输出。

例:

# 对t=learn_tracedb  对learn_tracedb 表的updateTime 列添加索引

pt-online-schema-change --user=root --password=‘密码' --port=6006 --host=127.0.0.1 --critical-load Threads_running=100 --alter "ADD INDEX index_updateTime (updateTime)" D=acc_tasktrace,t=learn_tracedb --print --execute

# 对cware_user_point 添加periodid列

pt-online-schema-change --user=root --password=‘密码' --port=6006 --host=127.0.0.1 --critical-load Threads_running=200 --alter "ADD COLUMN periodID int(11)" D=acc_cwaretiming,t=cware_user_point --print –execute

4.pt-query-digest -----慢查询Log的分析

pt-query-digest --help  # 参数

--create-review-table   # 当使用--review参数把分析结果输出到表中时,如果没有表就自动创建。

--create-history-table  # 当使用--history参数把分析结果输出到表中时,如果没有表就自动创建。

--filter                # 对输入的慢查询按指定的字符串进行匹配过滤后再进行分析

--limit                 # 限制输出结果百分比或数量,默认值是20,即将最慢的20条语句输出,如果是50%则按总响应时间占比从大到小排序,输出到总和达到50%位置截止。

--host  mysql           # 服务器地址

--host  mysql           # 服务器地址

--user  mysql           # 用户名

--password  mysql       # 用户密码

--history               # 将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表中的不同,则会记录到数据表中,可以通过查询同一CHECKSUM来比较某类型查询的历史变化。

--review                # 将分析结果保存到表中,这个分析只是对查询条件进行参数化,一个类型的查询一条记录,比较简单。当下次使用--review时,如果存在相同的语句分析,就不会记录到数据表中。

--output                # 分析结果输出类型,值可以是report(标准分析报告)、slowlog(Mysql slow log)、json、json-anon,一般使用report,以便于阅读。

--since                 # 从什么时间开始分析,值为字符串,可以是指定的某个”yyyy-mm-dd [hh:mm:ss]”格式的时间点,也可以是简单的一个时间值:s(秒)、h(小时)、m(分钟)、d(天),如12h就表示从12小时前开始统计。

--until                 # 截止时间,配合—since可以分析一段时间内的慢查询。

**5.Pt-summary **

打印出来的信息包括:CPU、内存、硬盘、网卡等信息,还包括文件系统、磁盘调度和队列大小、LVM、RAID、网络链接信息、netstat 的统计,以及前10的负载占用信息和vmstat信息

posted @ 2019-12-19 16:50  干瘪的柠檬  阅读(418)  评论(0)    收藏  举报