Percona Toolkit的安装
# yum -y install perl-IO-Socket-SSL perl-DBI perl-DBD-MySQL perl-Time-HiRes
# yum -y install perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker perl-Digest-MD5
# cd /usr/local/src/
# wget -chttps://www.percona.com/downloads/percona-toolkit/2.2.16/tarball/percona-toolkit-2.2.16.tar.gz
# tar -zxvf percona-toolkit-2.2.16.tar.gz
# cd percona-toolkit-2.2.16
# perl Makefile.PL
# make
# make install
默认是安装在 /usr/local/bin 目录下
# cd /usr/local/bin/
# ls
pt-align pt-index-usage pt-slave-find
pt-archiver pt-ioprofile pt-slave-restart
pt-config-diff pt-kill pt-stalk
pt-deadlock-logger pt-mext pt-summary
pt-diskstats pt-mysql-summary pt-table-checksum
pt-duplicate-key-checker pt-online-schema-change pt-table-sync
pt-fifo-split pt-pmp pt-table-usage
pt-find pt-query-digest pt-upgrade
pt-fingerprint pt-show-grants pt-variable-advisor
pt-fk-error-logger pt-sift pt-visual-explain
pt-heartbeat pt-slave-delay
# pt-online-schema-change
# 在线变更数据表结构,且不锁定原表,不阻塞原表的 DML 操作。
# pt-archiver
# 将 MySQL 数据库中表的记录归档到另外一个表或者文件,该工具只是归档旧的数据,对线上数据的 OLTP 查询几乎没有影响。可以将数据插入另外一台服务器的其他表中。
# pt-query-digest
# 用于分析 MySQL 服务器的慢查询日志,并格式化输出以便于查看和分析。
工具的具体使用可以参照下面的地址:
# https://www.percona.com/doc/percona-toolkit/2.1/index.html
# https://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
Percona Toolkitpt-archiver
官网地址:
# https://www.percona.com/doc/percona-toolkit/LATEST/pt-archiver.html
# 删除tsys_log表operate_time
案例数据表:
CREATE TABLE tsys_log (
nbr varchar(32) NOT NULL,
link_url varchar(128) DEFAULT NULL,
ip_address varchar(32) DEFAULT NULL,
operator varchar(32) DEFAULT NULL,
operator_name varchar(64) DEFAULT NULL,
operate_time datetime DEFAULT NULL,
operate_platform varchar(32) DEFAULT NULL,
description varchar(512) DEFAULT NULL,
PRIMARY KEY (nbr),
KEY idx_optime (operate_time)
) ENGINE=InnoDB
统计数据表占用的存储空间:
# SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_log'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
查看物理空间的使用量:
# ls -lh| grep tsys_log.ibd
查看数据表的总记录数:
# select count(*) from tsys_log;
要删除的数据的总行数:
# select count(*) from tsys_log where operate_time
测试执行的SQL语句:
# pt-archiver --source h=localhost,u=root,p=root,P=3306,S=/usr/local/mysql/data/mysql.sock,D=pt_test,t=tsys_log --no-check-charset --where 'operate_time
解释说明:
--purge 清理数据 直接删除源表里的数据 谨慎使用
--where 指定删除条件必须的条件有字符串的要用引号括起来
--limit 表示一次要删除多少行数据这里设置为1000表示一次只删除一千行
--progress 每处理progress指定的行数后就打印一次信息
--statistics 结束的时候给出统计信息:开始的时间点,结束的时间点,查询的行数,归档的行数,删除的行数,以及各个阶段消耗的总的时间和比例,便于以此进行优化。
--no-delete 表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据。
--sleep 120 每次归档了limit个行记录后的休眠120秒(单位为秒)
--no-check-charset 不指定字符集
--local 不把optimize或analyze操作写入到binlog里面(防止造成主从延迟巨大)
--analyze=ds 操作结束后,优化表空间(d表示dest s表示source)
再次查看数据表所占用的存储空间:
# SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_log'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
观察物理文件的使用空间:
# 结果发现没变化
# alter table tsys_log engine=innodb
# 再次查看该表所占用的物理存储空间
# ls -lh| grep tsys_log.ibd
# 将tsys_log表中operate_time
# pt-archiver --source h=localhost,u=root,p=root,P=3306,S=/usr/local/mysql/data/mysql.sock,D=pt_test,t=tsys_log --dest h=localhost,u=root,p=root,P=3306,S=/usr/local/mysql/data/mysql.sock,D=pt_test,t=tsys_logold --no-check-charset --where 'operate_time
查看数据表所占用的存储空间:
# ALTER TABLE tsys_log engine=innodb;
# SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_log'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
# SELECT LOWER(TABLE_SCHEMA) AS TABLE_SCHEMA,
LOWER(TABLE_NAME) AS TABLE_NAME,
ROUND(SUM(data_length+index_length)/1024/1024) AS TOTAL_MB,
ROUND(SUM(data_length)/1024/1024) as DATA_MB
FROM information_schema.`TABLES`
WHERE TABLE_SCHEMA='pt_test' AND TABLE_NAME='tsys_logold'
GROUP BY TABLE_SCHEMA,TABLE_NAME;
# 查看物理空间的使用:
# ls -lh| grep tsys_log.ibd
# ls -lh| grep tsys_logold.ibd
领取专属 10元无门槛券
私享最新 技术干货