开发者社区> 玄惭> 正文

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Mysql 的InnoDB引擎下支持hash索引吗?
Mysql 的InnoDB引擎下支持hash索引吗?
198 0
请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别?
34 0
MYSQL支持事务吗?
MYSQL支持事务吗?
29 0
MySQL---决策支持的基本测试标准TPC-DS测试数据的生成及导入
TPC-DS是tpc组织提供的官方决策支持基本测试标准,这个标准的数据对于决策支持的学习和测试很有帮助,怎样生成测试数据及将测试数据导入到MySQL数据库,可以参阅本文。
421 0
mysql支持哪些复制
mysql支持哪些复制
97 0
《MySQL数据操作与查询》- 维护学生信息、老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息
《MySQL数据操作与查询》- 维护学生信息、老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息
66 0
MySQL 数据库支持国密算法
数据库加密,作为杀手锏,是数据库底线防守的秘密武器,通过在数据库存储层进行数据加密处理,达到即使数据被黑客盗取也无法解密的效果,从根源上解决数据泄露问题。 近年,市场对于数据库加密产品的需求呈上升趋势,但由于技术门槛极高,国内真正能够提供此类产品的企业本就寥寥无几,尤其针对全球份额排名第二的MySQL数据库,能够对其支持的加密产品一直没有出现。 不同于传统的视图+触发器模式的透明加密方式,本文所提MySQL国密加密产品采用数据库引擎代码改造技术,真正实现数据在存储层的加、解密功能,避免以往加密过程中,数据库文件导入导出的繁琐方法,最大程度减少性能损失。 产品是为用户需求而生,而我们要做的
947 0
PolarDB-X 1.0-常见问题-数据兼容问题-PolarDB-X支持MySQL的存储过程、跨库外键和级联删除等高级特性吗?
目前PolarDB-X不支持存储过程、跨库外键和级联删除。如果需要自定义函数,请尝试通过组合MySQL标准函数解决。详情请参见SQL使用限制。
111 0
yugong阿里巴巴去Oracle数据迁移同步工具(全量+增量,目标支持MySQL/DRDS)
2008年,阿里巴巴开始尝试使用 MySQL 支撑其业务,开发了围绕 MySQL 相关的中间件和工具,Cobar/TDDL(目前为阿里云DRDS产品),解决了单机 Oracle 无法满足的扩展性问题,当时也掀起一股去IOE项目的浪潮,愚公这项目因此而诞生,其要解决的目标就是帮助用户完成从 Oracle 数据迁移到 MySQL 上,完成去 IOE 的重要一步工作。
835 0
+关注
玄惭
RDS DBA
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
让 MySQL 原生分布式触手可及
立即下载
好的 MySQL 兼容可以做到什么程度
立即下载
云数据库RDS MySQL从入门到高阶
立即下载