MySQL的瑞士军刀----percona-toolkit

在维护数据库时,有一个非常好的工具推荐给大家,可能会对大家有一定的帮助。

PT工具是由Percona公司开发的一款开源软件,大家可以去官网查看https://www.percona.com/

首先介绍一下PT工具的安装

PT工具的安装

$ yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL
$ yum -y install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
$ yum -y install percona-toolkit
$ pt-query-digest --version
pt-query-digest 3.0.13

  

安装时报错

error

$ rpm -qa | grep mysql 

compat

如果少了libs-compat就会报上述错误。然后去MySQL官网找到对应的libs-compat安装即可,不同版本的我不确定可不可以,可以自己尝试。

常用命令

1.检查冗余

# database如果省略,就是检查所有库 -h 省略就是检查本地
$ pt-duplicate-key-checker --socket=/var/lib/mysql/mysql.sock -uUSER -p'PASSWORD' --database=DATABASE_NAME -h IP
​
# ########################################################################
# qptreasurerecorddb.recorduserinout                                      
# ########################################################################
​
# IDX_AUTOFIELD is a duplicate of PRIMARY
# Key definitions:
#   KEY `IDX_AUTOFIELD` (`ID`),
#   PRIMARY KEY (`ID`),
# Column types:
#     `id` int(11) not null auto_increment comment '????'
# To remove this duplicate index, execute:
ALTER TABLE `qptreasurerecorddb`.`recorduserinout` DROP INDEX `IDX_AUTOFIELD`;
​
# ########################################################################
# Summary of indexes                                                      
# ########################################################################
​
# 连接上数据库之后执行上述的语句
mysql> ALTER TABLE `qptreasurerecorddb`.`recorduserinout` DROP INDEX `IDX_AUTOFIELD`;

2.pt-mysql-summary

比较mysql的配置和status信息进行汇总

$ pt-mysql-summary --user=USER --password='PASSWORD' --all-databases

3.pt-online-schema-change

原理:创建一个和你要执行alter操作的表一样的空表结构,执行表结构修改,然后从原表中copy原始数据到表结构修改后的表,当数据完成以后将会将原表移走,用新表替代原表,默认动作是将原表drop掉

PS:在copy数据过程中,任何在原表的更新操作都会更新到新表,这个工具会在原表上创建触发器,触发器会将 在原表上的更新的内容更新到新表。如果表中已经定义了触发器这个工具就不能工作。

$ pt-online-schema-change  --alter="ENGINE=InnoDB" D=database,t=table --execute
$ pt-online-schema-change  --alter="ADD COLUMN domain_id INT" D=database,t=table --execute

报错

Error creating new table: DBD::mysql::db do failed: Column 'sex' has duplicated value '?' in SET [for Statement "CREATE TABLE test._t1_new

image

字符集问题,可以在执行的时候指定与原表相同字符集--charset=utf8mb4

$ pt-online-schema-change  --alter="ENGINE=Myisam" --charset=utf8mb4  D=test,t=t1  --user=test --password='Qy123123.' --execute

说明:使用pt-osc时,原表不能存在触发器,

  • pt-osc会在原表创建3个触发器,而一个表上不能同时有两个相同类型的触发器,所以默认使用pt-osc不允许表上存在触发器

3.1 特殊的外键

假设t1 是要修改的表,t2有外键依赖于t1_t1_new是 alter t1 产生的新的临时表

这里的外键不是看t1上是否存在外键,而是作为子表的t2。 主要问题在renamet1时,t1“不存在”导致t2的外键认为参考失败,不允许rename

  • --alter-foreign-keys-method

    • rebuild_constraints

      • 先通过alter table t2 drop fk1,add _fk1重建外键参考,指向新表

      • rename t1 t1_old,_t1_new t1交换表名,不影响客户端

      • 删除旧表 t1_old

        如果t2字表太大,以致alter操作时间耗时过长,有可能会强制选择drop_swap

    • drop_swap

      • 禁用t2表外键约束检查FOREIGN_KEY_CHECKS=0

      • 然后drop t1原表

      • rename _t1_new t1

        速度快,也不会阻塞请求,但是有风险,

        • drop表的瞬间到rename的过程,原表t1是不存在的,遇到请求就会报错

        • 如果因为某种bug或某种原因,新表rename失败,那就太晚了,但是一般不会有这种情况

 以上只是我目前用到的一些工具,当然瑞士军刀中还有很多好用的工具,有兴趣的朋友可以访问官网查看。

猜你喜欢

转载自www.cnblogs.com/xll970105/p/12360201.html