percona-tools工具在线DDL的使用

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

好久没有写博客了,今天发表一篇吧:)

通常的在线进行表字段的增减都会造成表所,如果表较小还能接受,如果过大则这个锁持续的时间会让人比较烦恼,对业务持续性影响较大。


Percona 提供了一款关于MySQL管理的工具集很强大,包括了在线DDL工具 pt-online-schema-change

安装就不介绍了,自行百度吧


下面的原理介绍摘自网络http://www.it165.net/pro/html/201312/8928.html,写的比较清晰,就不重复造轮子了。

+++++++++++++++++++++

模仿MySQL的alter,但不同的是在alter操作更改表结构的时候不用锁定表,也就是说执行alter的时候不会阻塞写和读取操作,客户端可以继续都和修改数据。注意执行这个工具的时候必须做好备份,操作之前最好详细读一下官方文档。


1、如果存在外键,根据alter-foreign-keys-method参数的值,检测外键相关的表,做相应设置的处理。没有使用 --alter-foreign-keys-method 指定特定的值,该工具不予执行

2、创建一个新的表,表结构为修改后的数据表,用于从源数据表向新表中导入数据。

3、创建触发器,用于记录从拷贝数据开始之后,对源数据表继续进行数据修改的操作记录下来,用于数据拷贝结束后,执行这些操作,保证数据不会丢失。如果表中已经定义了触发器这个工具就不能工作了。

4、拷贝数据,从源数据表中拷贝数据到新表中。

5、修改外键相关的子表,根据修改后的数据,修改外键关联的子表。

6、rename源数据表为old表,把新表rename为源表名,并将old表删除。

7、删除触发器。

+++++++++++++++++++

相关的参数请 --help

1. 进行--dry-run测试

[root@master ~]#  pt-online-schema-change  --user=root --password=root --host=localhost  --alter='ENGINE=Innodb' D=baby,t=baby_account --dry-run

Operation, tries, wait:

  analyze_table, 10, 1

  copy_rows, 10, 0.25

  create_triggers, 10, 1

  drop_triggers, 10, 1

  swap_tables, 10, 1

  update_foreign_keys, 10, 1

Child tables:

  `baby`.`baby_account_billing_contract` (approx. 21 rows)

  `baby`.`baby_account_tactics` (approx. 13308 rows)

  `baby`.`baby_account_tactics_bak` (approx. 1672 rows)

  `baby`.`baby_billing` (approx. 11856 rows)

  `baby`.`baby_billing_apply` (approx. 128 rows)

  `baby`.`baby_order_bak_haochongpei` (approx. 1 rows)

You did not specify --alter-foreign-keys-method, but there are foreign keys that reference the table. Please read the tool's documentation carefully.

##表有主键,对主键的处理方式需要明确指出

--alter-foreign-keys-method 说明:

如何把外键引用到新表?需要特殊处理带有外键约束的表,以保证它们可以应用到新表.当重命名表的时候,外键关系会带到重命名后的表上。

该工具有两种方法,可以自动找到子表,并修改约束关系。

auto 在rebuild_constraints和drop_swap两种处理方式中选择一个

rebuild_constraints使用 ALTER TABLE语句先删除外键约束,然后再添加.如果子表很大的话,会导致长时间的阻塞。

drop_swap 执行FOREIGN_KEY_CHECKS=0,禁止外键约束,删除原表,再重命名新表。这种方式很快,也不会产生阻塞,但是有风险:

1, 在删除原表和重命名新表的短时间内,表是不存在的,程序会返回错误。

2, 如果重命名表出现错误,也不能回滚了.因为原表已经被删除。

none 类似"drop_swap"的处理方式,但是它不删除原表,并且外键关系会随着重命名转到老表上面。

我这里指定的是auto自动选择,可以看到下文的提示


[root@master ~]#  pt-online-schema-change  --user=root --password=root --host=localhost  --alter='ENGINE=Innodb' D=baby,t=baby_account --alter-foreign-keys-method=auto --dry-run

Operation, tries, wait:

  analyze_table, 10, 1

  copy_rows, 10, 0.25

  create_triggers, 10, 1

  drop_triggers, 10, 1

  swap_tables, 10, 1

  update_foreign_keys, 10, 1

Child tables:

  `baby`.`baby_account_billing_contract` (approx. 21 rows)

  `baby`.`baby_account_tactics` (approx. 13308 rows)

  `baby`.`baby_account_tactics_bak` (approx. 1672 rows)

  `baby`.`baby_billing` (approx. 11856 rows)

  `baby`.`baby_billing_apply` (approx. 128 rows)

  `baby`.`baby_order_bak_haochongpei` (approx. 1 rows)

Will automatically choose the method to update foreign keys.

Starting a dry run.  `baby`.`baby_account` will not be altered.  Specify --execute instead of --dry-run to alter the table.

Creating new table...

Created new table baby._baby_account_new OK.

Altering new table...

Altered `baby`.`_baby_account_new` OK.

Not creating triggers because this is a dry run.

Not copying rows because this is a dry run.

Not determining the method to update foreign keys because this is a dry run.

Not swapping tables because this is a dry run.

Not updating foreign key constraints because this is a dry run.

Not dropping old table because this is a dry run.

Not dropping triggers because this is a dry run.

2016-08-29T14:31:59 Dropping new table...

2016-08-29T14:31:59 Dropped new table OK.

Dry run complete.  `baby`.`baby_account` was not altered.


执行操作,看到报错,因为我这环境是主从复制的环境,所以--check-replication-filters参数需要明确指出


[root@master ~]#  pt-online-schema-change  --user=root --password=root --host=localhost  --alter='ENGINE=Innodb' D=baby,t=baby_account --alter-foreign-keys-method=auto --execute

Found 2 slaves:

  client.wboy.com

  client1.wboy.com

Will check slave lag on:

  client.wboy.com

  client1.wboy.com

Replication filters are set on these hosts:

  client.wboy.com

    binlog_ignore_db = mysql,test,information_schema,performance_schema

  client1.wboy.com

    binlog_ignore_db = mysql,test,information_schema,performance_schema

Please read the --check-replication-filters documentation to learn how to solve this problem. at /usr/local/bin/pt-online-schema-change line 8493.



[root@master ~]#  pt-online-schema-change  --user=root --password=root --host=localhost  --alter='ENGINE=Innodb' D=baby,t=baby_account --alter-foreign-keys-method=auto --no-check-replication-filters --execute

Found 2 slaves:

  client.wboy.com

  client1.wboy.com

Will check slave lag on:

  client.wboy.com

  client1.wboy.com

Operation, tries, wait:

  analyze_table, 10, 1

  copy_rows, 10, 0.25

  create_triggers, 10, 1

  drop_triggers, 10, 1

  swap_tables, 10, 1

  update_foreign_keys, 10, 1

Child tables:

  `baby`.`baby_account_billing_contract` (approx. 21 rows)

  `baby`.`baby_account_tactics` (approx. 13308 rows)

  `baby`.`baby_account_tactics_bak` (approx. 1672 rows)

  `baby`.`baby_billing` (approx. 11856 rows)

  `baby`.`baby_billing_apply` (approx. 128 rows)

  `baby`.`baby_order_bak_haochongpei` (approx. 1 rows)

Will automatically choose the method to update foreign keys.

Altering `baby`.`baby_account`...

Creating new table...

Created new table baby._baby_account_new OK.

Waiting forever for new table `baby`.`_baby_account_new` to replicate to client1.wboy.com...

Waiting for client1.wboy.com:   0% 00:00 remain

Waiting for client1.wboy.com:   0% 00:00 remain

Altering new table...

Altered `baby`.`_baby_account_new` OK.

2016-08-29T14:54:50 Creating triggers...

2016-08-29T14:54:50 Created triggers OK.

2016-08-29T14:54:50 Copying approximately 20189 rows...

Replica lag is 32 seconds on client1.wboy.com.  Waiting.

Replica lag is 60 seconds on client1.wboy.com.  Waiting.

Copying `baby`.`baby_account`:  13% 06:43 remain

Replica lag is 32 seconds on client1.wboy.com.  Waiting.

Replica lag is 60 seconds on client1.wboy.com.  Waiting.

Copying `baby`.`baby_account`:  58% 01:33 remain

Replica lag is 31 seconds on client1.wboy.com.  Waiting.

Replica lag is 59 seconds on client1.wboy.com.  Waiting.

Copying `baby`.`baby_account`:  99% 00:01 remain

2016-08-29T14:58:04 Copied rows OK.

2016-08-29T14:58:04 Max rows for the rebuild_constraints method: 6168

Determining the method to update foreign keys...

2016-08-29T14:58:04   `baby`.`baby_account_billing_contract`: 21 rows; can use rebuild_constraints

2016-08-29T14:58:04   `baby`.`baby_account_tactics`: too many rows: 13308; must use drop_swap

2016-08-29T14:58:04 Drop-swapping tables...

2016-08-29T14:58:04 Analyzing new table...

2016-08-29T14:58:05 Dropped and swapped tables OK.

Not dropping old table because --no-drop-old-table was specified.

2016-08-29T14:58:05 Dropping triggers...

2016-08-29T14:58:05 Dropped triggers OK.

Successfully altered `baby`.`baby_account`.


     本文转自andylhz 51CTO博客,原文链接:http://blog.51cto.com/andylhz2009/1843944,如需转载请自行联系原作者



相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
Oracle 关系型数据库 MySQL
迁移MariaDB审计插件(Audit Plugin)到MySQL 5.7---发表到爱可生开源社区
Oracle的MySQL社区版本不带审计插件(Audit Plugin),要想使用审计功能,你可以用Enterprise的版本,不过这需要银子。业界还有一些GPL协议的审计插件,这里我们选择MariaDB的审计插件。
254 0
|
SQL 存储 关系型数据库
MySQL基础(mysql下载,图形化界面工具,DDL)
1.Mysql下载安装启动 1.下载 2.安装 3.配置 4. 启动mysql 5.客户端连接 2.图形化界面工具 1.安装 2. 使用 3.SQL 1.SQL分类 1.DDL 1.数据库操作 2. 表操作 3.表操作-数据类型 4.表操作-案例
MySQL基础(mysql下载,图形化界面工具,DDL)
|
运维 监控 关系型数据库
MySQL数据归档实战-Python和pt-archiver的强强结合
一、引言 前段时间,在优雅的使用pt-archiver进行数据归档一文中介绍了pt-archiver的使用方法,也将pt-archiver部署到了生产环境,这时候问题来了~ 生产环境需要做归档的任务有十几个,如果要知道每个归档任务成功与否、跑了多长时间、归档了多少数据,就得手工逐个查看日志,非.
16054 0
|
IDE 关系型数据库 开发工具
PostgreSQL IDE pgadmin , edb postgres enterprise manager 查询慢的问题分析
PostgreSQL 的GUI客户端比较多,有开源的,也有商业的。用得比较多的可能是PgAdmin了,有些人可能会用EDB的PEM。但实际上这两个GUI都有一个小问题,在返回较大的结果集时,会非常的慢。例如 : 数据库端创建一个表,插入约30MB数据。 postgres=> create
5087 0
|
监控 关系型数据库 MySQL
MySQL percona-toolkit工具包的安装和使用(超详细版)
转载:https://www.cnblogs.com/zishengY/p/6852280.html 一.检查和安装与Perl相关的模块     PT工具是使用Perl语言编写和执行的,所以需要系统中有Perl环境。
2243 0
|
SQL 关系型数据库 索引
不用MariaDB/Percona也能查看DDL的进度
如何查看DDL的进度? 使用MariaDB/Percona版本的一个便利之处就是可以及时查看DDL的进度,进而预估DDL耗时。 其实,在官方版本里也是可以查看DDL进度的,认真看手册的同学就能发现手册中有提到过: You can monitor ALTER TABLE progress for InnoDB tables using Performance Schema. 应该怎么做呢,我们来大概说下。
4057 0
|
关系型数据库 MySQL Unix
MySQL中的Percona-toolkit工具由来漫谈
首先问一个问题,你听说过下面这两个工具吗? Maatkit 和Aspersa 如果听过,可能就暴露年龄了,你如果现在去查Aspersa相关的文章,会发现下载链接之类的都不可用了。
1716 0
|
关系型数据库 测试技术 PostgreSQL
PostgreSQL压测工具之pgbench-tools使用指南
最近一直在思考,到底贡献些什么给PG社区呢? 作为一名初学者,该给大家展现一些什么样的内容呢?曾经想过写一些入门指南,但是google一下发现已经有不少资料,并且好书也不少,那有什么是比较难找到的,没错,那就是实战经验,今天给大家介绍一个利器:pgbench-tools,有此利器,登上人生巅峰,当上CEO,迎娶白富美就不是梦了,废话不多说,请跟我一起来进入这神圣殿堂,享受这个美好的过程。
1893 0
|
关系型数据库 MySQL 数据库管理