数据库监控与调优【十八】—— Percona Toolkit调优神器安装与使用

news2024/11/25 16:34:23

Percona Toolkit调优神器安装与使用

Percona Toolkit安装

本文基于Percona Toolkit 3.2.0,理论支持所有版本。

Percona Toolkit是一款MySQL世界里面非常实用的工具套件,如何安装它。

Windows系统

不支持。详见https://forums.percona.com/discussion/52503/percona-toolkit-for-windows

Linux系统

支持的操作系统主要有:

  • Debian 7 (“wheezy”)
  • Debian 8 (“jessie”)
  • Ubuntu 14.04 LTS (Trusty Tahr)
  • Ubuntu 16.04 LTS (Xenial Xerus)
  • Ubuntu 16.10 (Yakkety Yak)
  • Ubuntu 17.04 (Zesty Zapus)
  • Red Hat Enterprise Linux or CentOS 6 (Santiago)
  • Red Hat Enterprise Linux or CentOS 7 (Maipo)
  • 可参考 https://blog.csdn.net/zyx_ly/article/details/88958352 的说明查看自己用的是哪个Linux发行版。

  • 官方宣称,理论上Percona Toolkit也能支持其他使用基于Deb或RPM的Linux操作系统,但只有上面这些系统经过了测试。详见 https://www.percona.com/doc/percona-toolkit/LATEST/installation.html

一、安装percona-release仓库

这一步主要是配置Percona的仓库,配置好之后,Percona的相关库都可以从该仓库里下载。

可以通过以下命令查看Linux发行版

cat /etc/issue

基于Deb的Linux操作系统

例如:Debain、Ubuntu等

  • 【可选】配置国内源,提升安装速度。这里使用中科大的源,也可使用其他源。
# 备份源配置文件
mv /etc/apt/sources.list /etc/apt/sources.list.bak

# 使用中科大源
echo 'deb http://mirrors.ustc.edu.cn/debian/ buster main
deb-src http://mirrors.ustc.edu.cn/debian/ buster main

deb http://mirrors.ustc.edu.cn/debian-security buster/updates main
deb-src http://mirrors.ustc.edu.cn/debian-security buster/updates main

deb http://mirrors.ustc.edu.cn/debian/ buster-updates main
deb-src http://mirrors.ustc.edu.cn/debian/ buster-updates main' > /etc/apt/sources.list

# 更新
apt-get update
  • 下载安装包
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
  • 安装
sudo dpkg -i percona-release_latest.generic_all.deb
  • 执行完如上命令后,即可在文件 /etc/apt/sources.list.d/percona-release.list 中找到Percona Toolkit仓库设置。

基于RPM的Linux操作系统

例如:Red Hat Enterprise Linux、CentOS等

  • 【可选】配置国内源,提升安装速度。参考 https://www.cnblogs.com/hester/p/12365068.html
  • 执行如下命令即可安装percona-release仓库
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
二、安装Percona Toolkit

基于Deb的Linux操作系统

sudo apt-get install percona-toolkit

基于RPM的Linux操作系统

sudo yum install percona-toolkit

macOS系统

brew install percona-toolkit

Percona Toolkit使用1-pt-query-digest

pt-query-digest

官方文档:pt-query-digest

  • 作用

分析日志(包括binlog、General log、slowlog)、processlist以及tcpdump中的查询,从而,帮助我们做SQL优化。就目前来说,很多企业用它来分析慢查询日志

  • 语法
pt-query-digest [OPTIONS] [FILES] [DSN]
  • 常用OPTIONS
--create-review-table			当使用--review参数把分析结果输出到表中时,如果没有表就自动创建
--create-history-table		当使用--history参数把分析结果输出到表中时,如果没有表就自动创建
--filter									输出符合条件的内容
--limit    								限制输出的百分比或数量。可指定百分比或数字,例如90%表示按响应时间从小到大排序,输出90%的结果;20表示输出最慢的20条
--host  									指定MySQL地址,也可用-h指定
--port										指定MySQL端口
--user  									指定MySQL用户名,也可用-u指定
--password  							指定MySQL密码,也可用-p指定
--history 								将分析结果保存到表中,分析结果比较详细,下次再使用--history时,如果存在相同的语句,且查询所在的时间区间和历史表中的不同,可通过查询同一CHECKSUM来比较某类型查询的历史变化
--review 									将分析结果保存到表中,从而方便未来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可以分析一段时间内的慢查询
  • 常用DSN
  A    指定字符集
  D    指定连接的数据库
  P    连接数据库端口
  S    连接Socket file
  h    连接数据库主机名
  p    连接数据库的密码
  t    使用--review或--history时把数据存储到哪张表里
  u    连接数据库用户名

DSN使用key=value的形式配置;多个DSN使用,分隔

  • 使用示例
# 展示slow.log中最慢的查询的报表
pt-query-digest slow.log

# 分析最近12小时内的查询
pt-query-digest --since=12h slow.log

# 分析指定范围内的查询
pt-query-digest slow.log --since '2020-06-20 00:00:00' --until '2020-06-25 00:00:00'

# 把slow.log中查询保存到query_history表
pt-query-digest --user=root --password=root123 --review h=localhost,D=test,t=query_history --create-review-table slow.log

# 连上localhost,并读取processlist,输出到slowlog
pt-query-digest --processlist h=localhost --user=root --password=root123 --interval=0.01 --output slowlog

# 利用tcpdump获取MySQL协议数据,然后产生最慢查询的报表
# tcpdump使用说明:https://blog.csdn.net/chinaltx/article/details/87469933
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txt
pt-query-digest --type tcpdump mysql.tcp.txt

# 分析binlog
mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql
pt-query-digest  --type=binlog mysql-bin000093.sql

# 分析general log
pt-query-digest  --type=genlog  localhost.log
  • 结果可视化:

在Percona官方 https://www.percona.com/blog/2012/08/31/visualization-tools-for-pt-query-digest-tables/ 有介绍两款工具:

  • Query Digest UI
  • Box Anemometer
  • 但两款工具都已N多年不维护了,如果感兴趣也可以搭建玩一玩,个人不建议用于生产。此外,Box Anemometer安装教程可参考https://www.cnblogs.com/lixigang/articles/5011055.html

具体操作

查看慢SQL设置
## 开启慢SQL日志
set global slow_query_log = 'ON';
set global log_output = 'FILE,TABLE';
set global long_query_time = 0.001;

## 查询慢SQL日志是否开启,以及慢SQL日志文件存放位置
SHOW VARIABLES LIKE '%slow%'; 
-- slow_query_log	ON
-- slow_query_log_file	/var/lib/mysql/es23-slow.log
SHOW VARIABLES LIKE 'log_output';
-- log_output	FILE,TABLE
使用pt-query-digest分析
## 进入文件目录
cd /var/lib/mysql/
## 使用pt-query-digest
pt-query-digest es23-slow.log

生成了以下的报表

*******************************************************************
 Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
 is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
 possibly with SSL_ca_file|SSL_ca_path for verification.
 If you really don't want to verify the certificate and keep the
 connection open to Man-In-The-Middle attacks please set
 SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************
  at /usr/bin/pt-query-digest line 12058.
*******************************************************************
 Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client
 is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER
 possibly with SSL_ca_file|SSL_ca_path for verification.
 If you really don't want to verify the certificate and keep the
 connection open to Man-In-The-Middle attacks please set
 SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.
*******************************************************************
  at /usr/bin/pt-query-digest line 12058.

# A software update is available:

-- 报表该有的信息
# 110ms user time, 30ms system time, 29.68M rss, 243.06M vsz
-- 分析时间
# Current date: Thu Jun  1 19:08:31 2023
-- 分析机器
# Hostname: es23
-- 分析文件
# Files: es23-slow.log
-- 分析总SQL,唯一的SQL条数
# Overall: 145 total, 40 unique, 0.00 QPS, 0.00x concurrency _____________
# Time range: 2023-03-26T22:08:18 to 2023-04-07T17:49:49
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
-- 执行时间 
# Exec time             6s   336us      6s    44ms     7ms   453ms     1ms
-- 锁持有时间
# Lock time          316us       0    28us     2us     5us     3us     1us
-- 向客户端发送的数据量
# Rows sent          6.02M       0   4.86M  42.52k  487.09 400.07k   16.81
-- 扫描的数据量
# Rows examine       6.40M       0   5.15M  45.22k   1.53k 419.77k  964.41
-- 查询大小
# Query size        17.04k      11     570  120.37  212.52  104.38   97.36

-- 查询排序
# Profile
-- 针对SQL生成的唯一标识 SQL花费总时间 这条SQL执行时间占用总时间百分比 执行次数 平均每次花费时间 这条SQL执行时间趋向平均值的方差,越小表示该条SQL越稳定 该SQL
# Rank Query ID           Response time Calls R/Call V/M   Item
# ==== ================== ============= ===== ====== ===== ===============
#    1 0xE418612AF8CD4C2D  5.5196 85.6%     1 5.5196  0.00 SELECT employees.employees employees.salaries
#    2 0x633F5856DF702BD1  0.5233  8.1%     3 0.1744  0.00 SELECT employees
#    3 0x24D0922230C4DAE5  0.1483  2.3%     1 0.1483  0.00 SELECT employees.employees
# MISC 0xMISC              0.2593  4.0%   140 0.0019   0.0 <37 ITEMS>

-- 针对某条SQL分析
-- ID
# Query 1: 0 QPS, 0x concurrency, ID 0xE418612AF8CD4C2D at byte 11646 ____
# This item is included in the report because it matches --limit.
-- 方差
# Scores: V/M = 0.00
# Time range: all events occurred at 2023-04-07T11:23:38
-- 详细信息
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count          0       1
# Exec time     85      6s      6s      6s      6s      6s       0      6s
# Lock time      0     3us     3us     3us     3us     3us       0     3us
# Rows sent     80   4.86M   4.86M   4.86M   4.86M   4.86M       0   4.86M
# Rows examine  80   5.15M   5.15M   5.15M   5.15M   5.15M       0   5.15M
# Query size     2     450     450     450     450     450       0     450
# String:
-- 数据库
# Databases    employees
-- 数据库实例
# Hosts        192.168.218.1
-- 哪个用户执行
# Users        imooc
-- 执行时间分布
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms
#    1s  ################################################################
#  10s+
-- 该SQL相关的表
-- 同时pt-query-digest贴心地展示了SHOW和EXPLAIN语句,这样,如果这条SQL性能瓶颈又想查看表的状态就可以直接COPY执行
# Tables
#    SHOW TABLE STATUS FROM `employees` LIKE 'employees'\G
#    SHOW CREATE TABLE `employees`.`employees`\G
#    SHOW TABLE STATUS FROM `employees` LIKE 'salaries'\G
#    SHOW CREATE TABLE `employees`.`salaries`\G
# EXPLAIN /*!50100 PARTITIONS*/
-- 原始的SQL
select '10001' AS `emp_no`,'1953-09-02' AS `birth_date`,'Georgi' AS `first_name`,'Facello' AS `last_name`,'M' AS `gender`,'1986-06-26' AS `hire_date`,'0' AS `first_name_hash`,`employees`.`s`.`emp_no` AS `emp_no`,`employees`.`s`.`salary` AS `salary`,`employees`.`s`.`from_date` AS `from_date`,`employees`.`s`.`to_date` AS `to_date` from `employees`.`employees` `e` left join `employees`.`salaries` `s` on((`employees`.`s`.`emp_no` = 10001)) where true\G

-- 另一条SQL
# Query 2: 0.00 QPS, 0.00x concurrency, ID 0x633F5856DF702BD1 at byte 8552
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.00
# Time range: 2023-03-26T22:11:49 to 2023-04-07T10:34:39
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count          2       3
# Exec time      8   523ms   165ms   192ms   174ms   189ms    12ms   163ms
# Lock time      2     7us     1us     3us     2us     2us       0     2us
# Rows sent     14 878.98k 292.99k 292.99k 292.99k 292.99k       0 292.99k
# Rows examine  13 878.98k 292.99k 292.99k 292.99k 292.99k       0 292.99k
# Query size     0      69      23      23      23      23       0      23
# String:
# Databases    employees
# Hosts        192.168.218.1
# Users        imooc
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms  ################################################################
#    1s
#  10s+
# Tables
#    SHOW TABLE STATUS FROM `employees` LIKE 'employees'\G
#    SHOW CREATE TABLE `employees`.`employees`\G
# EXPLAIN /*!50100 PARTITIONS*/
select * from employees\G

# Query 3: 0 QPS, 0x concurrency, ID 0x24D0922230C4DAE5 at byte 23865 ____
# This item is included in the report because it matches --limit.
# Scores: V/M = 0.00
# Time range: all events occurred at 2023-04-07T15:15:24
# Attribute    pct   total     min     max     avg     95%  stddev  median
# ============ === ======= ======= ======= ======= ======= ======= =======
# Count          0       1
# Exec time      2   148ms   148ms   148ms   148ms   148ms       0   148ms
# Lock time      1     5us     5us     5us     5us     5us       0     5us
# Rows sent      4 292.99k 292.99k 292.99k 292.99k 292.99k       0 292.99k
# Rows examine   4 292.99k 292.99k 292.99k 292.99k 292.99k       0 292.99k
# Query size     0      33      33      33      33      33       0      33
# String:
# Databases    employees
# Hosts        192.168.218.1
# Users        imooc
# Query_time distribution
#   1us
#  10us
# 100us
#   1ms
#  10ms
# 100ms  ################################################################
#    1s
#  10s+
# Tables
#    SHOW TABLE STATUS FROM `employees` LIKE 'employees'\G
#    SHOW CREATE TABLE `employees`.`employees`\G
# EXPLAIN /*!50100 PARTITIONS*/
SELECT * FROM employees.employees\G
总结

怎么使用上面的报表呢?

首先,可以使用概要信息,主要关注R/Call,指这条SQL平均每次花费时间;Calls,这个值越多表示调用越频繁,调用越频繁的慢SQL优化的价值就越大;Response time,比例越大说明这条SQL越重要,优化价值越高。找到需要优化的SQL的Query ID再在报表中查找就可针对分析。

把日志分析结果存入表中(存在小坑)

pt-query-digest --user=imooc --password=Imooc@123456 --review h=localhost,D=test,t=query_history --create-review-table es23-slow.log
小坑报错

无法连接数据库,并报类似如下的异常:

DBI connect(';host=localhost;mysql_read_default_group=client','root',...) failed: Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory at /usr/bin/pt-query-digest line 1001.

高版本的MySQL使用caching_sha2_password,由于目前Percona Toolkit中的部分工具暂不支持caching_sha2_password导致的。

解决方案有两种
  • 方法一、连接数据,并输入类似如下命令:
mysql> ALTER USER 你的用户@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

例如:

ALTER USER root@'localhost' IDENTIFIED WITH mysql_native_password BY 'root123';
  • 方法二、修改mysql配置文件 my.cnf ,在其中添加如下内容,并重启。
[mysqld] default_authentication_plugin=mysql_native_password
使用navicat查看test数据库

在这里插入图片描述

总结

将日志分析结果存入表中的好处:可以每一个月执行一次这个命令,后续做统计

Percona Toolkit使用2-pt-index-usage

pt-index-usage

官方文档:pt-index-usage

  • 作用

通过日志文件分析查询,并分析查询如何使用索引

  • 原理
    • 清点数据库中所有的表与索引,并将库中现有的索引和日志中的查询所使用的索引进行比较
    • 对日志中的每个查询运行EXPLAIN(这一步使用单独的数据库连接清点表并执行EXPLAIN)
    • 对于无用的索引,展示删除的语句
  • 语法
pt-index-usage [OPTIONS] [FILES]
  • 常用OPTIONS
--drop					打印建议删除的索引,取值primary、unique、non-unique、all。默认值non-unique,只会打印未使用的二级索引
--databases			只分析指定数据库的索引,多个库用,分隔
--tables				只分析指定表的索引,多张表用,分隔
--progress			打印执行进度
--host  				指定MySQL地址,也可用-h指定
--port					指定MySQL端口
--user  				指定MySQL用户名,也可用-u指定
--password  		指定MySQL密码,也可用-p指定

DSN使用key=value的形式配置;多个DSN使用,分隔

  • 常用DSN
  A    指定字符集
  D    指定连接的数据库
  h    连接数据库主机名
  p    连接数据库的密码
  P    连接数据库端口
  S    连接Socket file
  u    连接数据库用户名
  • 使用示例
# 读取slow.log,并连上localhost,去分析有哪些索引是可以删除的
pt-index-usage slow.log --user=root --password=root123 --host=localhost --port=
# 读取slow.log,并连上localhost,只分析employees库中,有有哪些索引是可以删除的
pt-index-usage slow.log --user=root --password=root123 --host=localhost --databases=employees
  • 注意点

    • 此工具使用MySQL资源比较多,因此,在使用此工具时候:

      • 如果有条件,尽量不要直接在生产环境执行,而应在有相同表结构的数据库环境执行;
      • 如果必须在生产环境执行,请避开高峰期,比如在凌晨低谷期执行
    • 此工具分析大文件比较慢,使用时需注意这点,并做一定处理(比如把遗留的超大的慢查询日志先删除,而可以新建一个慢查询日志,并运行一段时间后用pt-index-usage分析)

    • 由于pt-index-usage只会扫描慢查询,而非所有的查询,所以有可能某个索引在慢查询日志中未使用,但其实还是被使用了的(只是使用这个索引的SQL并非慢查询)。因此:

      • 正式删除之前,应当先review下,确保可以删除该索引后再操作,避免发生问题

      • 对于MySQL 8.0及更高版本,善用“不可见索引”,进一步降低风险。

        • 不可见索引是不会被MySQL优化器使用的,可以把要删除的索引设置为不可见索引,优化器就会忽略该索引,避免误删需要的索引

        • 具体操作:

          -- 设置成不可见
          ALTER TABLE `employees` ALTER INDEX `employees_first_name_last_name_index` invisible;
          -- 设置成可见
          ALTER TABLE `employees` ALTER INDEX `employees_first_name_last_name_index` visible;
          

pt-duplicate-key-checker :可以帮助我们找到重复的索引或外键,使用方式基本类似。

具体操作

pt-index-usage es23-slow.log --user=imooc --password=Imooc@123456 --host=localhost
ALTER TABLE `employees`.`employees` DROP KEY `employees_first_name_last_name_index`; -- type:non-unique
ALTER TABLE `employees`.`salaries` DROP KEY `salaries_emp_no_salary_index`; -- type:non-unique

可以看到结果中对冗余索引生成了删除语句

Percona Toolkit使用3-其他工具

pt-variable-advisor

官方文档:pt-variable-advisor

  • 作用

分析MySQL变量,并对可能出现的问题提出建议

  • 原理

执行 SHOW VARIABLES ,并分析哪些变量的值设置不合理,给出建议

  • 语法
pt-variable-advisor [OPTIONS] [DSN]
  • 常用OPTIONS
--source-of-variable			指定变量来源,可选mysql/none或者文件
--user  									指定MySQL用户名,也可用-u指定
--password  							指定MySQL密码,也可用-p指定
  • 常用DSN
  A    指定字符集
  D    指定连接的数据库
  h    连接数据库主机名
  p    连接数据库的密码
  P    连接数据库端口
  S    连接Socket file
  u    连接数据库用户名

DSN使用key=value的形式配置;多个DSN使用,分隔

  • 使用示例
# 连接上localhost:3306,并分析变量
pt-variable-advisor localhost --user=root --password=root123
pt-variable-advisor P=3306,u=root,p=root123 localhost:3306

# 先将show global variables生成文件,然后用pt-variable-advisor分析文件
mysql -uroot -proot123 -e'show global variables' > /root/vars.txt
pt-variable-advisor --source-of-variables /root/vars.txt

具体操作

# 分析数据库变量
pt-variable-advisor localhost --user=imooc --password=Imooc@123456
# WARN delay_key_write: MyISAM index blocks are never flushed until necessary.

# WARN key_buffer_size: The key buffer size is set to its default value, which is not good  for most production systems.

# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.

# WARN expire_logs_days: Binary logs are enabled, but automatic purging is not enabled.

# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.

# NOTE innodb_flush_method: Most production database servers that use InnoDB should set innodb_flush_method to O_DIRECT to avoid double-buffering, unless the I/O system is very low performance.

-- 直接将log_output设置输出到表是很影响性能的
# WARN log_output: Directing log output to tables has a high performance impact.

# WARN myisam_recover_options: myisam_recover_options should be set to some value such as BACKUP,FORCE to ensure that table corruption is noticed.
# 先将show global variables生成文件,然后用pt-variable-advisor分析文件
mysql -uimooc -pImooc@123456 -e'show global variables' > /root/vars.txt
pt-variable-advisor --source-of-variables /root/vars.txt
# WARN delay_key_write: MyISAM index blocks are never flushed until necessary.

# WARN key_buffer_size: The key buffer size is set to its default value, which is not good  for most production systems.

# NOTE sort_buffer_size-1: The sort_buffer_size variable should generally be left at its default unless an expert determines it is necessary to change it.

# WARN expire_logs_days: Binary logs are enabled, but automatic purging is not enabled.

# NOTE innodb_data_file_path: Auto-extending InnoDB files can consume a lot of disk space that is very difficult to reclaim later.

# NOTE innodb_flush_method: Most production database servers that use InnoDB should set innodb_flush_method to O_DIRECT to avoid double-buffering, unless the I/O system is very low performance.

# WARN log_output: Directing log output to tables has a high performance impact.

# WARN myisam_recover_options: myisam_recover_options should be set to some value such as BACKUP,FORCE to ensure that table corruption is noticed.

这也可以告诉我们哪些变量是不合理的,和上面一样

pt-online-schema-change

  • 官方文档:pt-online-schema-change

  • MySQL从5.6开始,已支持online r功能,pt-online-schema-change越来越弱化了。

    • 有关Online DDL,可详见 Online DDL Operations
    • 有关online DDL和pt-online-schema-change之间的对比详见《 MySQL ONLINE DDL 和PT-ONLINE-SCHEMA-CHANGE对比 》
  • 作用

在线修改表结构,无需锁表地ALTER表结构

  • 原理
    • 创建一张一模一样的表,表名一般是_new后缀
    • 在新表上执行更改字段操作
    • 在原表上加三个触发器,分别对应于DELETE/UPDATE/INSERT操作,并将原表中要执行的语句也在新表中执行
    • 将原表的数据拷贝到新表中
    • 使用原子的RENAME TABLE操作同时重命名原始表和新表,完成此操作后,删除原始表。
  • 语法
pt-online-schema-change [OPTIONS] DSN
  • 常用OPTIONS
--dry-run											创建并修改新表的结构,但不会创建触发器、拷贝旧表数据也不会替换旧表
--execute											如果指定该选项,则会修改表结构,否则只会做一些安全检查
--charset											指定编码
--alter												修改表结构的语句(其实就是你alter table语句,去掉alter table后剩下的部分),多条语句使用,分隔。该选项有一些限制,详见 https://www.percona.com/doc/percona-toolkit/3.0/pt-online-schema-change.html#cmdoption-pt-online-schema-change-alter 
--no-version-check						是否检查版本
--alter-foreign-keys-method		处理带有外键约束的表,以保证它们可以引用到正确的表。取值:auto(自动选择最佳策略)、rebuild_constraints(适用于删除和重新添加引用新表的外键约束)、drop_swap(禁用外键检查,然后在重命名新表之前将其删除)、none(无)
  • 常用DSN
  A    指定字符集
  D    指定连接的数据库
  h    连接数据库主机名
  p    连接数据库的密码
  P    连接数据库端口
  S    连接Socket file
  t    想要alter的表
  u    连接数据库用户名

DSN使用key=value的形式配置;多个DSN使用,分隔

  • 使用示例
# 为employees库的employees表添加字段my_test_column
pt-online-schema-change -uroot -proot123 --alter='add column my_test_column int' --alter-foreign-keys-method=rebuild_constraints --execute D=employees,t=employees --charset=utf8mb4

# 修改字段
pt-online-schema-change -uroot -proot123 --alter='modify column my_test_column bigint(25)' --alter-foreign-keys-method=rebuild_constraints --execute D=employees,t=employees --charset=utf8mb4

# 添加索引
pt-online-schema-change -uroot -proot123 --alter='add key indx_my_test_column(my_test_column)' --alter-foreign-keys-method=rebuild_constraints --execute D=employees,t=employees

# 删除索引
pt-online-schema-change -uroot -proot123 --alter='drop key indx_my_test_column' --alter-foreign-keys-method=rebuild_constraints --execute D=employees,t=employees

# 删除字段
pt-online-schema-change -uroot -proot123 --alter='drop column my_test_column int' --alter-foreign-keys-method=rebuild_constraints --execute D=employees,t=employees
  • 注意点
    • 尽管用pt-online-schema-change 在线修改表结构不会锁表,但是对性能还是有一定的影响的。这是因为在执行过程中会做全表扫描,所以大表应在业务低峰期执行该操作;
    • 对于主从复制架构,考虑到主从的一致性,应在主库上执行pt-online-schema-change操作。

其他工具

# 展示系统概要信息
pt-summary

# 展示MySQL相关的概要信息
pt-mysql-summary --user=root --password=root123 --host=localhost --port=3306

# 把explain的结果转换成树形展示(在早期MySQL中,没有explain format=tree时,比较有用,可以增强explain的可读性)
mysql -uroot -proot123 -e "explain select * from employees.employees" > test-explain.sql
pt-visual-explain --host=localhost --user=root --password=root123 test-explain.sql

遇到的问题

无法连接数据库,并报类似如下的异常:

DBI connect(';host=localhost;mysql_read_default_group=client','root',...) failed: Plugin caching_sha2_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/caching_sha2_password.so: cannot open shared object file: No such file or directory at /usr/bin/pt-query-digest line 1001.

这是由于目前Percona Toolkit中的部分工具暂不支持caching_sha2_password导致的。

解决方案有两种:

  • 方法一、连接数据,并输入类似如下命令:
mysql> ALTER USER 你的用户@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';

例如:

ALTER USER root@'localhost' IDENTIFIED WITH mysql_native_password BY 'root123';
  • 方法二、修改mysql配置文件 my.cnf ,在其中添加如下内容,并重启。
[mysqld] default_authentication_plugin=mysql_native_password

所有工具官方文档

  • pt-align :对齐其他工具的输出
  • pt-archiver :将数据归档到其他表或文件
  • pt-config-diff :比较配置文件和变量
  • pt-deadlock-logger :记录MySQL死锁
  • pt-diskstats :交互式IO监控工具
  • pt-duplicate-key-checker :找到重复的索引或外键
  • pt-fifo-split :模拟分割文件并输出
  • pt-find :查找表,并执行命令
  • pt-fingerprint :将查询转换成fingerprint
  • pt-fk-error-logger :记录外键错误信息
  • pt-heartbeat :监控MySQL复制延迟
  • pt-index-usage :通过日志分析查询,并分析查询如何使用索引
  • pt-ioprofile :监控进程IO并打印IO活动表
  • pt-kill :kill掉符合条件查询
  • pt-mext :并行查询SHOW GLOBAL STATUS的样本信息
  • pt-mongodb-query-digest :通过汇总来自MongoDB查询分析器(query profiler)的查询来报告查询使用情况统计信息
  • pt-mongodb-summary :收集有关MongoDB集群的信息,它从多个来源收集信息从而提供集群的概要信息
  • pt-mysql-summary :展示MySQL相关的概要信息
  • pt-online-schema-change :在线修改表结构。无需锁表地ALTER表结构
  • pt-pg-summary :收集有关PostgreSQL集群的信息
  • pt-pmp :针对指定程序,聚合GDB的stack traces
  • pt-query-digest :从日志、processlist以及tcpdump中分析MySQL查询
  • pt-secure-collect :收集、清理、打包、加密数据
  • pt-show-grants :规范化打印MySQL授权
  • pt-sift :浏览由pt-stalk创建的文件
  • pt-slave-delay :使MySQL从属服务器滞后于其Master
  • pt-slave-find :查找和打印MySQL slave的复制层级树
  • pt-slave-restart :监控MySQL slave,并在发生错误后重启
  • pt-stalk :发生问题时收集有关MySQL的诊断数据
  • pt-summary :展示系统概要信息
  • pt-table-checksum :验证MySQL主从复制的一致性
  • pt-table-sync :高效同步表数据
  • pt-table-usage :分析查询是如何使用表的
  • pt-upgrade :验证不同服务器上的查询结果是否相同
  • pt-variable-advisor :分析MySQL变量,并对可能出现的问题提出建议
  • pt-visual-explain :将explain的结果格式化成树形展示

参考文档

  • percona toolkit 学习记录
  • Percona Toolkit 实战
  • Percona Toolkit(pt)的安装与使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701546.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue 一直运行 /sockjs-node/info?t=解决办法

sockjs-node介绍 sockjs-node 是一个JavaScript库&#xff0c;提供跨浏览器JavaScript的API&#xff0c;创建了一个低延迟、全双工的浏览器和web服务器之间通信通道。 服务端&#xff1a;sockjs-node&#xff08;https://github.com/sockjs/sockjs-node&#xff09;客户端&…

短视频抖音账号矩阵系统源码开发者自研(二)

一、短视频账号矩阵系统源码开发储存集群化开发运转更快 短视频账号矩阵系统源码开发采用储存集群化开发&#xff0c;可以显著提高系统的运转速度和效率。通过优化储存结构和算法&#xff0c;系统能够更快地处理短视频账号数据&#xff0c;确保用户能够流畅地浏览和观看短视频…

6.4 原子引用

1、什么是原子引用 原子引用以cas的方式实现控制多线程之前的同步&#xff0c;从而保证多线程的安全性 原子引用主要有以下三个类 AtomicReferenceAtomicStampReferenceAtomicMarkableReference 2、demo演示 Slf4j(topic "c.Test35") public class Test35 {pub…

C++day2

一、类和结构体的区别 成员访问权限&#xff1a;类中的成员默认是私有的&#xff0c;需要使用访问修饰符&#xff08;如public、private、protected&#xff09;来显式指定访问权限。而结构体中的成员默认是公共的&#xff0c;即可以直接访问。 继承&#xff1a;类支持继承&am…

面向对象高级实战演练之银行系统

面向对象高级实战演练之银行系统 实现功能&#xff1a; 1. 银行管理员(使用管理员密码)查看所有用户信息 2. 进入银行系统提示功能 3. 用户密码管理 4. 账户开户/销户 5. 存款/取款 6. 用户间转账 7. 用户余额查询 8. 常见错误检查和提示代码实现&#xff1a; import random…

【LeetCode】动态规划 刷题训练(六)

文章目录 123. 买卖股票的最佳时机 III题目解析零笔交易一笔交易两笔交易 状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 188. 买卖股票的最佳时机 IV题目解析状态转移方程f[i][j]状态转移方程g[i][j]状态转移方程 初始化完整代码 53. 最大子数组和状态转…

vhost-net-原理-初始化流程-数据传输流程

文章目录 1.vhost net2.vhost-net的初始化流程vhost net设置vhost dev设置vhost vring设置 3.数据收发流程分析3.1 数据发送3.2 数据接收 4ioventfd和irqfd的通知机制4.1ioeventfdqemu侧kvm侧总体效果 4.2irqfdqemu侧kvm侧总体效果 参考&#xff1a; 1.vhost net 传统的virtio…

深入理解Java虚拟机jvm-垃圾收集器日志参数

垃圾收集器日志参数 查看GC基本信息查看GC详细信息查看GC前后的堆、方法区可用容量变化查看GC过程中用户线程并发时间以及停顿的时间查看收集器Ergonomics机制&#xff08;自动设置堆空间各分代区域大小、收集目标等内容&#xff0c;从Parallel收集器开始支持&#xff09;自动调…

windows下nginx location root路径问题

Windows版本nginx的多级路径问题 windows 下 nginx location root路径为多级目录的问题解决方案&#xff1a;使用双反斜杠--\\Windows版本的nginx常用命令一览&#xff1a; windows 下 nginx location root路径为多级目录的问题 nginx的windows版本中location路径为多级目录 需…

Git客户端:Tower for Mac 注册版

Tower是一款Mac OS X系统上的Git客户端软件&#xff0c;它提供了丰富的功能和工具&#xff0c;帮助用户更加方便地管理和使用Git版本控制系统。以下是Tower的一些特点&#xff1a; 1. 界面友好&#xff1a;Tower的界面友好&#xff0c;使用户能够轻松地掌握软件的使用方法。 …

【vs2022】MSVCRTD.lib 4098: 默认库“libcmtd.lib”与其他库的使用冲突

verbose-print- 整理&#xff1a;warning LNK4098: 默认库“LIBCMT”与其他库的使用冲突&#xff1b;请使用 /NODEFAULTLIB:library 讲解的非常详细&#xff1a; Linker 加入命令行选项 To set this linker option in the Visual Studio development environment Open the p…

Chapter 1: Introduction - Why Program? | Python for Everybody 讲义_En

文章目录 Python for Everybody课程简介Python for Everybody (Why Program?)Why should you learn to write programs?Creativity and motivationComputer hardware architectureUnderstanding programmingWords and sentencesConversing with PythonTerminology: Interpret…

MyBatis全篇

文章目录 MyBatis特性下载持久化层技术对比 搭建MyBatis创建maven工程创建MyBatis的核心配置文件创建mapper接口创建MyBatis的映射文件测试功能加入log4j日志功能加入log4j的配置文件 核心配置文件的完善与详解MyBatis的增删改查测试功能 MyBatis获取参数值在IDEA中设置中配置文…

Java Web HTMLCSS(2)23.6.28

2&#xff0c;CSS 2.1 概述 CSS 是一门语言&#xff0c;用于控制网页表现。我们之前介绍过W3C标准。W3C标准规定了网页是由以下组成&#xff1a; 结构&#xff1a;HTML表现&#xff1a;CSS行为&#xff1a;JavaScript CSS也有一个专业的名字&#xff1a;Cascading Style Sh…

Springboot 如何自动上传秒杀商品数据到Redis中上架商品

一、概述 如下图秒杀活动&#xff1a; 在这个秒杀活动中&#xff0c;需要自动上架一定时间段的商品&#xff0c;我们如何实现自动上传呢&#xff1f; 我们可以通过定时任务来实现的。在秒杀活动开始前&#xff0c;需要将商品信息存储到数据库中&#xff0c;并设置好库存和价格…

Linux学习之进程的通信方式信号:kill命令

kill -l可以看到可以使用信号量。 把下边的内容使用编辑器&#xff0c;比如vim写到./a.sh。 #!/bin/bashecho $$ while : # 无限循环 do: donecat a.sh看一下文件里边的内容。 chmod ur,ux a.sh给当前用户赋予a.sh文件的写和执行权限。 在第一个端口里边&#xff0c;使用./a…

在 TypeScript 中有效地使用 keyof 和 typeof 来表示类型

在本文中&#xff0c;我们将学习如何通过组合类型运算符和枚举来提取和声明常量类型typeof&#xff0c;以使您的代码库得到优化。keyof 先决条件 为了获得更好的编码体验&#xff0c;您应该在 IDE 中安装 TypeScript&#xff0c;例如VSCode。它将为您提供许多基本功能&#xff…

Linux——进程通信之共享内存

目录 一. 回顾上文 二.共享内存 1.定义 2.特点&#xff1a; 3.实现步骤&#xff1a; 如下为成功链接共享内存使用权的完整步骤&#xff1a; 4.函数介绍 4.1shmget函数 4.1.2参数介绍 4.2ftok函数&#xff1a; 4.2.1参数介绍 关于ftok(); shmget();函数的代码实验…

基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用

查看原文>>>基于当量因子法、InVEST、SolVES模型等多技术融合在生态系统服务功能社会价值评估中的应用及论文写作、拓展分析 本文将讲述用于评估生态系统服务价值的当量因子法、InVEST模型、SolVES模型及其原理&#xff0c;您将学会三种模型的原理与运行方法&#xf…