pt-online-schema-change使用

公司一个业务的DB表结构因为需求不断变动,表结构随着需求的变动不断需要修改,更改字段类型,增加字段。

最苦逼的是其中两个主表都特别大,一个5000W以上,另外一个更恐怖达到1亿多。以前都是采用分区,后面

考虑到分区字段没有实际意义,导致分区的优势没有体现出来,只是起了个心里作用而已,也不知道当时这个设计

是从哪里出发的,今年将分区全部去掉了。

切入主题:

这两个大表要加字段,又不能停机,业务发布时间紧迫。当时的构想是用standby来先操作,然后和master做切换。

然后再更改master。再切回master.这样来回折腾。但是这种方式是比较快的,同时我们也采用pt-online-schema-change来做

在线更改表结构。但是这样操作速度不够快,比直接更改慢了很多,直接更改5个小时。pt-online-schema-change需要15个小时。

当然时间增加了,但是对业务没有影响,还是值得推荐的,当么有standby的话,使用pt-online-schema-change还是不错的。

我们在做小表结构更改,就用的pt-online-schema-change。

简单说下用法:自己使用是在公司业务上,涉及到具体表,不方便透露:

下面来源网络:

 功能介绍:

  功能为在alter操作更改表结构的时候不用锁定表,也就是说执行alter的时候不会阻塞写和读取操作,注意执行这个工具的时候必须做好备份,操作之前最好详细读一下官方文档。

  工作原理是创建一个和你要执行alter操作的表一样的空表结构,执行表结构修改,然后从原表中copy原始数据到表结构修改后的表,当数据copy完成以后就会将原表移走,用新表代替原表,默认动作是将原表drop掉。在copy数据的过程中,任何在原表的更新操作都会更新到新表,因为这个工具在会在原表上创建触发器,触发器会将在原表上更新的内容更新到新表。如果表中已经定义了触发器这个工具就不能工作了。

  用法介绍:

  pt-online-schema-change [OPTIONS] DSN

  options可以自行查看help,DNS为你要操作的数据库和表。

  这里有两个参数需要介绍一下:

  --dry-run  这个参数不建立触发器,不拷贝数据,也不会替换原表。只是创建和更改新表。

  --execute  这个参数的作用和前面工作原理的介绍的一样,会建立触发器,来保证最新变更的数据会影响至新表。注意:如果不加这个参数,这个工具会在执行一些检查后退出。这一举措是为了让使用这充分了解了这个工具的原理,同时阅读了官方文档。

  使用示例:

  在线更改表的的引擎,这个尤其在整理innodb表的时候非常有用,示例如下:

  pt-online-schema-change --user=root --password=XXxx --host=localhost --lock-wait-time=120 --alter="ENGINE=InnoDB" D=test,t=oss_pvinfo2 --execute

  从下面的日志中可以看出它的执行过程:

  Altering `test`.`oss_pvinfo2`...

  Creating new table...

  Created new table test._oss_pvinfo2_new OK.

  Altering new table...

  Altered `test`.`_oss_pvinfo2_new` OK.

  Creating triggers...

  Created triggers OK.

  Copying approximately 995696 rows...

  Copied rows OK.

  Swapping tables...

  Swapped original and new tables OK.

  Dropping old table...

  Dropped old table `test`.`_oss_pvinfo2_old` OK.

  Dropping triggers...

  Dropped triggers OK.

  Successfully altered `test`.`oss_pvinfo2`.

  在来一个范例,大表添加字段的,语句如下:

  pt-online-schema-change --user=root --password=XXX --host=localhost --lock-wait-time=120 --alter="ADD COLUMN domain_id INT" D=test,t=oss_pvinfo2 --execute

时间: 2024-07-30 13:38:35

pt-online-schema-change使用的相关文章

案例 - percona-online-schema-change各种坑

线上环境复制使用ROW模式,对于上亿的表,使用pt online schema change 在把数据从旧表拷贝到临时表这步操作,会产生大量的binlog,这会导致主从延迟 在pt工具包2.1之前,pt-online-schema-change是不会打印binlog的,如果要在主从上加索引,需要分别在主库执行一次,在从库执行一次 它提供了一个--log-bin参数,并且默认是关闭binlog的 --bin-log Allow binary logging (SET SQL_LOG_BIN=1).

Replicate Schema Changes

Replication 能够将Article的Schema Change同步到Subscriber中,只需要将 Publication 的属性:Replicate Schema Changes 设置为Ture. 引用<Make Schema Changes on Publication Databases>: If you make the following schema changes to a published article, they are propagated, by defa

facebook开源项目集合

Facebook的开源大手笔 1. 开源Facebook平台代码 Facebook在2008年选择将该平台上的重要部分的代码和应用工具开源.Facebook称,平台已经基本发展成熟,此举可以让开发者更全面地理解整个Facebook平台,更容易地为Facebook开发应用软件,并可以回报社区. 该项目代号为“FBOpen”,其中包含了实现Facebook平台的一些基础设施.功能等,如API架构.FQL分析器.FBML分析器.FBJS,以及许多常用方法和标签的实现,代码基于PHP.这意味着其他开发者

sqlserver 存储过程中使用临时表到底会不会导致重编译

曾经在网络上看到过,SqlServer的存储过程中使用临时表,会导致执行计划无法重用, 运行时候会导致重编译的这么一个说法,自己私底下去做测试的时候,根据profile的跟踪结果, 如果不是统计信息变更导致导致的重编译,单单是使用临时表,并不会导致重编译, 但是对于一些特殊的情况,又确实会出现重编译的, 为了弄清楚这个问题,查阅了大量的资料,才把这个问题弄清楚,这里特意记录下来,希望武断地认为存储过程中使用了临时表就会导致重编译的这个观点得到纠正. 首先进行下面的测试,我们知道,导致临时表重编译

Mac OS 10.10 php不能连接mysql问题解决

php连接数据库都没问题,升级到10.10这后, 突然连接不上了. 这个问题放了很久, 今天突然搜索到一篇文章. 用链接的方式解决了. 原文如下: So you installed Ubuntu, got all excited about developing your Rails application on it, and then- No such file or directory - /tmp/mysql.sock) No matter what you do, database c

SQL Server 中WITH (NOLOCK)浅析

原文:SQL Server 中WITH (NOLOCK)浅析 概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如下所示(摘自MSDN): 1: 指定允许脏读.不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻碍当前事务读取锁定数据.允许脏读可能产生较多的并发操作,但其代价是读取以后会被其他事务回滚的数据修改.这可能会使您的

MyCat 学习笔记 第十一篇.数据分片 之 分片事务处理

1 环境说明 VM 模拟3台MYSQL 5.6 服务器 VM1 192.168.31.187:3307 VM2 192.168.31.212:3307 VM3 192.168.31.150:  3307 MYCAT 1.5 服务部署在宿主机上 MYCAT 192.168.31.207 :8806[SQL执行端口] / 9066[管理端口] 2 应用场景 2.0 MYCAT配置 schema.xml <schema name="TESTDB" checkSQLschema=&quo

《Mycat学习笔记》 番外篇一.客户端使用latin1字符集,后端MySQL为UTF8字符集,MyCat日志分析。

其实这个番外篇比较无聊——即客户端为lantin字符集,后面MySQL为U8字符集,MyCat在中间到底会起什么作用. 再说下本次验证的环境: Mac OS 10.11.2 MySQL 5.6 MyCat 1.5 OK,开始我们的验证工作. 1) 由于数据库与操作系统已被默认设置为U8编码,计划通过修改Mysql  “character_set_client” 参数调整客户端字符集配置进行验证. 关于MYSQL字符集较全面的介绍,请参考 <mysql_query("set names gb

SQL Server 中WITH (NOLOCK)浅析(转潇湘隐者)

博文出处:http://www.cnblogs.com/kerrycode/p/3946268.html 概念介绍 开发人员喜欢在SQL脚本中使用WITH(NOLOCK), WITH(NOLOCK)其实是表提示(table_hint)中的一种.它等同于 READUNCOMMITTED . 具体的功能作用如下所示(摘自MSDN): 1: 指定允许脏读.不发布共享锁来阻止其他事务修改当前事务读取的数据,其他事务设置的排他锁不会阻碍当前事务读取锁定数据.允许脏读可能产生较多的并发操作,但其代价是读取以

Svn Replacement For Git Stash

svn 实现git stash类似的功能 % svn diff > WorkInProgress.txt % svn revert -R . <make changes> % svn commit -m "Patched to support server schema change" % patch -p0 -i WorkInProgress.txt % rm WorkInProgress.txt Svn Replacement For Git Stash,布布扣,