在维护数据库时,有一个非常好的工具推荐给大家,可能会对大家有一定的帮助。
PT工具是由Percona公司开发的一款开源软件,大家可以去官网查看https://www.percona.com/。
首先介绍一下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
安装时报错
$ rpm -qa | grep mysql
如果少了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
字符集问题,可以在执行的时候指定与原表相同字符集--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失败,那就太晚了,但是一般不会有这种情况
-
-
-
以上只是我目前用到的一些工具,当然瑞士军刀中还有很多好用的工具,有兴趣的朋友可以访问官网查看。