当前位置: 首页 > 工具软件 > Olivia > 使用案例 >

MySQL重要工具percona-toolkit常用功能介绍#Olivia丶长歌#

单于旭东
2023-12-01


    MySQL 一个重要分支 percona 的,名称叫做 percona-toolkit(一把锋利的瑞士军刀),它是一组命令的集合。工具包的下载地址:https://www.percona.com/downloads/percona-toolkit/LATEST/

安装过程

tar -zxvfpercona-toolkit-3.0.3_x86_64.tar.gz

二进制的包,解压完可以直接进到percona-toolkit-3.0.3/bin目录下使用。

1,pt-online-schema-change

      功能可以在线整理表结构,收集碎片,给大表添加字段和索引。避免出现锁表导致阻塞读写的操作。针对 MySQL 5.7 版本,就可以不需要使用这个命令,直接在线 online DDL 就可以了。

表里面数据的情况和表结构

mysql> select count(*) from lisi;

+----------+

| count(*) |

+----------+

|   100000 | 

+----------+

1 row in set (0.03 sec)

mysql> desc lisi;

+-------+------------------+------+-----+-------------------+-----------------------------+

| 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   |     |                   |                         

在线增加字段的过程:

[root@mysql bin]# ./pt-online-schema-change --user=root --password=root 

--host=localhost  --alter="ADD COLUMN city_id INT" D=test,t=lisi --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`.`lisi`...

Creating new table...

Created new table test._lisi_new OK.

Altering new table...

Altered `test`.`_lisi_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`.`_lisi_old` OK.

2017-08-10T14:54:00 Dropping triggers...

2017-08-10T14:54:00 Dropped triggers OK.

Successfully altered `test`.`lisi`.

查看结果新增了一个 city_id 的字段:

mysql> desc lisi;

+---------+------------------+------+-----+-------------------+-----------------------------+

| 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              |                             | 

+---------+------------------+------+-----+-------------------+-----------------------------+

2,pt-query-digest

功能:现在捕获线上TOP 10 慢 sql 语句。

如下:

可以根据时间间隔,来采样慢 sql 语句。since 是可以调整的 sql 语句

[root@node3 bin]# ./pt-query-digest --since=24h /data/mysql/slow.log > 1.log

查看 sql 报告,总结慢语句有哪些,并可以看针对时间的消耗。

cat 1.log

可以看到报告中,列举出了一些sql语句响应时间占比情况,和sql语句的执行时间情况。方便我们可以很直观的观察哪些语句有问题。(这里只列举了一条sql)

3,pt-heartbeat

功能监控主从延迟。监控从库落后主库大概多少时间。

4,pt-table-checksum

功能检查主从复制一致性

原理:在主上执行检查语句去检查 mysql主从复制的一致性,生成 replace 语句,然后通过复制传递到从库,再通过update 更新 master_src 的值。最后通过检测从上 this_src 和 master_src 的值从而判断复制是否一致。

5,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

需要在从库上面执行:

[root@node4 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

同步状态又恢复一致了。

6,pt-ioprofile

功能:方便定位IO问题,可通过IO吞吐量来定位。

[root@node3 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问题。

更多的percona-toolkit工具的使用请见官方网站:

https://www.percona.com/doc/percona-toolkit/LATEST/index.html



 类似资料: