设为首页 加入收藏

TOP

Percona-Toolkit 之 pt-online-schema-change 总结(一)
2019-09-17 18:54:07 】 浏览:171
Tags:Percona-Toolkit pt-online-schema-change 总结

pt-online-schema-change - ALTER tables without locking them.

pt-online-schema-change alters a table’s structure without blocking reads or writes. Specify the database and table in the DSN. Do not use this tool before reading its documentation and checking your backups carefully.

pt-online-schema-change是Percona-Toolkit工具集中的一个组件,很多DBA在使用Percona-Toolkit时第一个使用的工具就是它,同时也是使用最频繁的一个工具。它可以做到在修改表结构的同时(即进行DDL操作)不阻塞数据库表DML的进行,这样降低了对生产环境数据库的影响。在MySQL5.6之前是不支持Online DDL特性的,即使在添加二级索引的时候有FIC特性,但是在修改表字段的时候还是会有锁表并阻止表的DML操作,这样对于DBA来说是非常痛苦的,好在有pt-online-schema-change工具在没有Online DDL时解决了这一问题,关于Online DDL可以参考另一篇博文:MySQL InnoDB Online DDL学习

本文是关于之前有关pt-online-schema-change工具使用的学习笔记进行重新整理,使用最新版本的工具同时也进行原理知识的梳理。

安装

  • 获取

可以到官网:https://www.percona.com/downloads/percona-toolkit/LATEST/,选择适合的操作系统版本和工具版本进行下载:

# wget https://www.percona.com/downloads/percona-toolkit/3.0.13/binary/redhat/7/x86_64/percona-toolkit-3.0.13-1.el7.x86_64.rpm 

本文使用的安装包是:percona-toolkit-3.0.13-1.el7.x86_64.rpm

  • 安装

因为下载的是RPM安装包,所以采用本地安装的方式进行:

-- 如果只使用本地rpm安装的话,需要安装以下依赖的perl模块
# rpm -ivh percona-toolkit-3.0.13-1.el7.x86_64.rpm
warning: percona-toolkit-3.0.13-1.el7.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 8507efa5: NOKEY
error: Failed dependencies:
        perl(DBI) >= 1.13 is needed by percona-toolkit-3.0.13-1.el7.x86_64
        perl(DBD::mysql) >= 1.0 is needed by percona-toolkit-3.0.13-1.el7.x86_64
        perl(IO::Socket::SSL) is needed by percona-toolkit-3.0.13-1.el7.x86_64
        perl(Digest::MD5) is needed by percona-toolkit-3.0.13-1.el7.x86_64
        perl(Term::ReadKey) is needed by percona-toolkit-3.0.13-1.el7.x86_64

-- 如果配置了在线的yum源,则使用yum安装
# yum localinstall percona-toolkit-3.0.13-1.el7.x86_64.rpm

基本说明

pt-online-schema-change [OPTIONS] DSN

常用选项(OPTIONS)

--alter
变更结构选项,不需要ALTER TABLE关键字,如果表有多个变更可以使用逗号分隔。

限制:
1.在绝大部分情况下表都需要有主键或者是唯一索引。因为这个工具会在运行的时候创建一个DELETE触发器,这是为了保证在变更中新表能够与旧表保持更新一致性。值得注意的是,如果在需要变更的列上创建主键或是唯一索引时,则会以这些列创建触发器;
2.不能使用RENAME子句为表进行重命名;
3.字段不能通过删除再重添加的方式进行重命名,这种方式是不会拷贝原字段的数到新字段上;
4.如果新增NOT NULL的列并且没有指定default值,工具就会执行失败,它并不会指定默认值;
5.涉及到删除外键时,需要指定_constraint_name,工具会在新表上创建一个前面加了下划线的外键名称,这个外键名称与原致。如需要删除外键fk_foo,则指定'--alter "DROP FOREIGN KEY _fk_foo"'。

--alter-foreign-keys-method
采用何种方式修改外键以便关联到新表上。有外键约束的表需要被特殊处理,为了确保外键依然能够关联到正确的表上。当工具重命名外键关联的父表时,确保外键也必须关联到重命名后的父表。
主要有以下几种方式:

auto:让工具自动选择使用。优先选择rebuild_constraints,如果不成功,则选择drop_swap;
rebuild_constraints:这种方式使用ALTER TABLE先删除然后重建外键关联到新父表。这是首选的方式,如果一张或多张子表过大会导致ALTER需要很长时间,子表会被阻塞;

drop_swap:禁用外键约束(FOREIGN_KEY_CHECKS=0),在进行重命名新父表之前删除原父表,这与常规转换旧表与新表的方式不同,这个RENAME操作是原子性的并且对应用客户端无感知。
这种方式更快速并且不会阻塞,但是也有隐患:
1.删除原父表以及重命名新表这段时间很短,如果这段时间更改子表有可能会报错;
2.如果重命名新表发生失败,而原父表已经永久删除了,这时就需要人工进行干预了。
这种方式强制使用选项'--no-swap-tables'和'--no-drop-old-table'。

none:这种方式类似于drop_swap,不同在于不进行swap原父表。子表有任何外键关联父表都将变成关联一张不存在的表,这会使得子表的外键约束失效,可以通过SHOW ENGINE INNODB STATUS查看。

--[no]analyze-before-swap
默认值:yes
在新表与旧表完成转换之前对新表执行ANALYZE TABLE操作,默认会在MySQL5.6及之后版本并且开启innodb_stats_persistent的情况下执行。

--ask-pass
命令行提示密码输入,保护密码安全,前提需安装模块perl-TermReadKey。

--[no]check-alter
默认值:yes
解析变更选项的内容,发出表变更警告,主要警告项为:
1.字段重命名
在工具的早期版本中,通过指定CHANGE COLUMN name new_name进行字段重命名会导致数据库的丢失,现在的版本已经通过代码解决了数据一致性
首页 上一页 1 2 3 4 5 6 7 下一页 尾页 1/11/11
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇[MySQL] mysql int后面的数字与前.. 下一篇MongoDB数据库发展历程及商业模式

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目