RDS MySql支持online ddl

在日常和客户沟通的过程中发现,他们在做mysql ddl变更的时候由于MySql本身的缺陷不支持online ddl,导致他们的业务不得不hang住一会儿,表越大,时间影响越长,所以期待有更好的解决方法;有些用户也想了一些方法,比如通过主备切换的方法,先在备库进行ddl,然后在通过主备切换到原主库进行ddl,但由于RDS对外提供给用户的是一个dns加port,所以后端的主备对用户是透明的,此方法行不通。其实在开源社区中已经有比较成熟的方法,那就是percona的pt-online-schema-change工具是其中之一,下面通过测试主要了解该工具的可靠性以及存在的问题,是否在RDS上支持。

原理:
在线修改表结构的工具,基本处理方式类似,以下对pt-online-schema-change工具的工作原理进行分析:
1、如果存在外键,根据alter-foreign-keys-method参数的值,检测外键相关的表,做相应设置的处理。
2、创建一个新的表,表结构为修改后的数据表,用于从源数据表向新表中导入数据。
3、创建触发器,用于记录从拷贝数据开始之后,对源数据表继续进行数据修改的操作记录下来,用于数据拷贝结束后,执行这些操作,保证数据不会丢失。
4、拷贝数据,从源数据表中拷贝数据到新表中。
5、修改外键相关的子表,根据修改后的数据,修改外键关联的子表。
6、rename源数据表为old表,把新表rename为源表名,并将old表删除。
7、删除触发器。
3.RDS支持:
a.在现有的用户权限基础上开通replication slave权限
[root@testadmin bin]# ./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”add column is_sign_1 int(11)” D=test,t=t –execute
DBD::mysql::db selectall_arrayref failed: Access denied; you need the REPLICATION SLAVE privilege for this operation [for Statement “SHOW SLAVE HOSTS”] at ./pt-online-schema-change line 4051.

grant REPLICATION SLAVE ON *.* TO ‘test123’@’%’;

b.表中含有主键或者唯一索引
[root@testadmin bin]# ./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”add column is_sign_1 int(11)” D=test,t=t –execute
Cannot chunk the original table `test`.`t`: There is no good index and the table is oversized. at ./pt-online-schema-change line 5365.

4.测试:
在测试的过程中,测试插入数据,删除数据,更新数据,观察是否阻塞,同时对表进行不断的压测:
delimiter ;;
CREATE
PROCEDURE e_test()
BEGIN
WHILE 1 DO
insert into t(name,gmt_create,name2) values(‘xxx’,now(),’xxx’);
END WHILE;
END;
;;

call e_test();

mysql> insert into test(gmt_create) values(now());
Query OK, 1 row affected (0.12 sec)

mysql> delete from test where id=1;
Query OK, 1 row affected (0.01 sec)

mysql> update test set gmt_Create=now() where id=2;
Query OK, 1 row affected (0.30 sec)
Rows matched: 1 Changed: 1 Warnings: 0

添加字段:
./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”add column is_sign_2 int(11)” D=qianyi,t=test –execute
添加索引:
./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”add index ind_gmt_create(gmt_create)” D=qianyi,t=test –execute
修改字段:
./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”modify column is_sign_2 bigint” D=qianyi,t=test –execute
5.结果:
[root@testadmin bin]# ./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”add column is_sign_1 int(11)” D=qianyi,t=t –execute
Altering `qianyi`.`test`…
Creating new table…
Created new table qianyi._test_new OK.
Altering new table…
Altered `qianyi`.`_test_new` OK.
Creating triggers…
Created triggers OK.
Copying approximately 8388968 rows…
Copying `qianyi`.`test`: 52% 00:26 remain
Copied rows OK.
Swapping tables…
Swapped original and new tables OK.
Dropping old table…
Dropped old table `qianyi`.`_test_old` OK.
Dropping triggers…
Dropped triggers OK.
Successfully altered `qianyi`.`test`.
[root@testadmin bin]#
[root@testadmin bin]# ./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”modify column is_sign_2 bigint” D=qianyi,t=t –execute
Altering `qianyi`.`test`…
Creating new table…
Created new table qianyi._test_new OK.
Altering new table…
Altered `qianyi`.`_test_new` OK.
Creating triggers…
Created triggers OK.
Copying approximately 8388885 rows…
Copying `qianyi`.`t`: 53% 00:25 remain
Copied rows OK.
Swapping tables…
Swapped original and new tables OK.
Dropping old table…
Dropped old table `qianyi`.`_test_old` OK.
Dropping triggers…
Dropped triggers OK.
Successfully altered `qianyi`.`test`.

[root@testadmin bin]# ./pt-online-schema-change –u=test123 –host=test.mysql.rds.aliyuncs.com –port=3306 –password=hell05a –alter=”add index ind_gmt_create(gmt_create)” D=qianyi,t=t –execute
Altering `qianyi`.`test`…
Creating new table…
Created new table qianyi._test_new OK.
Altering new table…
Altered `qianyi`.`_test_new` OK.
Creating triggers…
Created triggers OK.
Copying approximately 8388785 rows…
Copying `qianyi`.`test`: 41% 00:42 remain
Copying `qianyi`.`test`: 83% 00:12 remain
Copied rows OK.
Swapping tables…
Swapped original and new tables OK.
Dropping old table…
Dropped old table `qianyi`.`_test_old` OK.
Dropping triggers…
Dropped triggers OK.
Successfully altered `qianyi`.`test`.

6结论:
1.RDS开通用户帐号replication slave权限支持pt-online-ddl,用户的表必须要有主键或者唯一索引;
2.当业务量较大时,修改操作会等待没有数据修改后,执行最后的rename操作。因此,在修改表结构时,应该尽量选择在业务相对空闲时,至少修改表上的数据操作较低时,执行较为妥当。

附:pt-online-schema-change

下载地址:http://www.percona.com/redir/downloads/percona-toolkit/2.2.1/percona-toolkit-2.2.1.tar.gz

时间: 2024-11-28 23:34:51

RDS MySql支持online ddl的相关文章

RDS MySQL空间优化最佳实践

在前三期介绍了RDS for MySQL参数优化,锁问题以及延迟优化最佳实践之后,本期将介绍存储空间相关的最佳实践. 存储空间是RDS很重要的一个指标,在RDS的工单问题中,空间问题的咨询可以排在top 5,当RDS的实际使用空间超过了购买的空间后,实例就会被锁定了,这样就会导致应用无法再写入,更新数据,造成应用的报错.在RDS的控制台中可以设定空间的报警阀值,当实例空间到达报警阀值后用户就会收到报警短信,这个时候用户则需要对判断当前的空间增长是否合理.如果增长合理则需要对实例的进行弹性升级,这

RDS MYSQL(5.1/5.5) RELEASE NOTES

RDS源码团队会不定期对线上MySQL(覆盖5.1.5.5)版本升级,修复最近一段时间用户遇到的bug,以及满足用户新的需求,如果是紧急bug或是安全漏洞,我们会第一时间修复掉,如果是某个客户碰到些比较紧急的bug,我们也会针对某个客户进行快速fixed,确保不影响到客户的业务运行.   2014年5月份,我们会进行新一轮的RDS MySQL版本升级和bug fixed,详细列表见下面: 新增特性: feature:新增加archive和blackhole引擎支持 feature:引入双写机制严

视频出炉:4月15日《阿里云RDS MySQL分支深度定制实战分享》

活动视频 <阿里云RDS MySQL分支深度定制实战分享> PDF地址:https://oss.aliyuncs.com/yqfiles/a5344b5961b367786a95620c636c4640.pdf 分享简介:阿里云RDS MySQL经过多年的积累,不断的进行性能优化,并定制了适合不同行业需求的功能,同时也向官方和社区贡献力量.本次主题主要介绍RDS MySQL分支的深度定制,包括功能扩展.资源管控.性能优化.数据安全.行业解决方案等. 分享者:赵建伟,现任阿里云数据库内核资深研发

php 之 没有mysql支持时的替代方案

mysql 一般个人免费主页空间都不会提供mysql支持,就是提供也很苛刻,所以寻找也个良好的替代方案很重要哦! PHP的文件处理功能很强大,所以可以用文件的存取来代替来! (要知道没有数据库的时候,什么都是用文件组织的哦!呵呵!),其中个数据项用特殊符号分割,我采用的是"||",方便通过explode()函数读取单个记录! 其实这里数据库的思想还是可以用到的!象数据库的索引! 所以必须先做个索引文件!(这样说也并不正确) 就以留言本来说吧: 主要文件是: index.database

MySQL支持多线程复制

我们知道从5.6开始,MySQL支持多线程复制,到5.7版本又引入了基于GROUP COMMIT的并发事务分发机制.这意味着没有冲突的事务可以在备库并发执行.很显然,备库的事务提交顺序和主库是不能保证一致的. 这可能带来一些问题,尤其是事务之间有一定的业务关联时,提供读访问时可能会带来业务上的不一致问题.因此在MySQL 5.7.6版本,引入了一个新的特性,来保证主库和备库的commit顺序是一致的. 对应的changelog: Replication: Multi-threaded slave

请问mysql支持with...as...语法么

问题描述 请问mysql支持with...as...语法么 解决方案 不支持你也可以参考下面http://stackoverflow.com/questions/1382573/how-do-you-use-the-with-clause-in-mysqlhttp://stackoverflow.com/questions/324935/mysql-with-clause

MySQL · 参数优化 ·RDS MySQL参数调优最佳实践

前言 很多时候,RDS用户经常会问如何调优RDS MySQL的参数,为了回答这个问题,写一篇blog来进行解释: 哪一些参数不能修改,那一些参数可以修改: 这些提供修改的参数是不是已经是最佳设置,如何才能利用好这些参数: 哪些参数可以改 细心的用户在购买RDS的时候都会看到,不同规格能够提供的最大连接数以及内存是不同的,所以这一些产品规格的限制参数:连接数.内存用户是不能够修改的,如果内存或者连接数出现了瓶颈: 内存瓶颈:实例会出现OOM,然后导致主备发生切换 连接数瓶颈:应用不能新建立连接到数

RDS MySQL参数调优最佳实践

前言 很多时候,RDS用户经常会问如何调优RDS MySQL的参数,为了回答这个问题,写一篇blog来进行解释: 哪一些参数不能修改,那一些参数可以修改: 这些提供修改的参数是不是已经是最佳设置,如何才能利用好这些参数: 哪些参数可以改 细心的用户在购买RDS的时候都会看到,不同规格能够提供的最大连接数以及内存是不同的,所以这一些产品规格的限制参数:连接数.内存用户是不能够修改的,如果内存或者连接数出现了瓶颈: 内存瓶颈:实例会出现OOM,然后导致主备发生切换 连接数瓶颈:应用不能新建立连接到数

实践 —— 亲测从 RDS MySQL 通过数据集成导入 MaxCompute

我们今天要试的,是从RDS 的MySQL数据库到MaxCompute的 ODPS 的数据同步过程. 往简单了说,就是把源数据库(Read)里的数据,转移到目标数据库(Write). DataWorks 产品组里的 数据集成 提供了数据一次性搬移,以及周期性搬移的功能,搬移的细节可以在数据同步任务中设置. 一. 数据源 1. 来源数据源 申请RDS 上的MySQL就不多说了,此处的注意事项是,数据集成服务连接RDS MySQL数据库属于远程连接,需要添加连通允许的白名单,如下图所示设置: 参考链接