RDS for MySQL 如何使用 Percona Toolkit
Percona Toolkit 包含多种用于 MySQL 数据库管理的工具。
下面介绍常用的 pt-online-schema-change 和 pt-archiver 搭配 RDS MySQL 的使用方法。
注:
- pt-online-schema-change 和 pt-archiver 工具均须指定 --no-version-check 选项方能搭配 RDS MySQL 实例使用。
- 本文样例使用 Percona Toolkit 2.2.17 版本测试。
- 本文样例仅做为样例使用,不承担任何因此示范导致的问题责任。具体操作手册请参考 Percona Toolkit 的相关文档。
1. pt-online-schema-change
pt-online-schema-change 提供在线修改表结构等功能,搭配 RDS MySQL 5.5 使用可以避免在修改表结构的过程中阻塞应用对表数据的访问。
由于 RDS MySQL 5.6 支持 online-ddl 功能,可以直接在业务低峰期进行操作,也可以结合 pt-online-schema-change 使用。
注:
- 无论 RDS MySQL 5.5 还是 5.6 版本,也无论是否使用 pt-online-schema-change,在修改表结构过程中都有可能遇到等待表元数据锁的情况(waiting for table metadata lock)。如果出现这种情况,请参考 RDS MySQL 表上 Metadata lock 的产生和处理 http://www.linuxidc.com/Linux/2016-08/134767.htm。
- 表及数据维护操作请在业务低峰期进行。
样例用表:
CREATE TABLE `x` ( `id` int(11) NOT NULL AUTO_INCREMENT, `password` varchar(10) DEFAULT NULL, `recommend_level` double(5,0) DEFAULT NULL, `name` varchar(30) DEFAULT '101' COMMENT 'change', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
1.1 增加字段
pt-online-schema-change --no-version-check --execute --alter "add column c1 int" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x # h=xxx.mysql.rds.aliyuncs.com -- RDS 实例地址 # P=3306 -- RDS 实例端口 # u=jacky -- RDS 实例用户 # p=xxx -- RDS 实例用户密码 # D=jacky -- RDS 实例数据库 # t=x -- RDS 实例表名称
1.2 删除字段
pt-online-schema-change --no-version-check --execute --alter "drop column c1" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
1.3 修改字段类型
pt-online-schema-change --no-version-check --execute --alter "modify column c1 bigint unsigned" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
1.4 添加索引
pt-online-schema-change --no-version-check --execute --alter "add key idx_c1 (c1)" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
1.5 删除索引
pt-online-schema-change --no-version-check --execute --alter "drop key idx_c1" h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=x
2. pt-archiver
pt-archiver 是 Percona 官方提供的归档工具,用于归档大型表中的记录到另一个表或文件。
样例用表:
CREATE TABLE `my_tab` ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `areaID` varchar(50) DEFAULT NULL, `area` varchar(60) DEFAULT NULL COMMENT '中文注释测试', `father` varchar(12) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_area` (`area`) ) ENGINE=InnoDB AUTO_INCREMENT=3162 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT KEY_BLOCK_SIZE=8;
2.1 归档到操作系统文件
pt-archiver --source h=xxx.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --charset=utf8 --file '/var/tmp/%Y-%m-%d-%D.%t' --where "id > 3008" --limit 1000 --commit-each --no-version-check # h=xxx.mysql.rds.aliyuncs.com -- RDS 实例地址 # P=3306 -- RDS 实例端口 # u=jacky -- RDS 实例用户 # p=xxx -- RDS 实例用户密码 # D=jacky -- RDS 实例数据库 # t=my_tab -- RDS 实例表名称 # --source -- 指定要被归档的数据源 # --charset=utf8 -- 使用的字符集,需与表字符集一致;否则指定 --no-check-charset 参数 # --file -- 指定目标操作系统文件名 # --where "id > 3008" -- 指定 where 过滤条件,过滤出要归档的数据 # --limit 1000 -- 每条语句读取和归档的数据行数,默认是 1 # --commit-each -- 每次获取和归档数据后,commit提交 # --no-version-check -- 不做版本检查,RDS MySQL 必须设置
归档后,源表数据减少 150 行。
归档操作系统文件中,包含 150 行数据。
2.2 归档到另外一个表中
可以将数据归档到同实例不同库下的表中,也可以将数据归档到不同实例下的表中。
归档操作前,目标表要存在。
2.2.1 归档到同实例不同库下的表
pt-archiver --source h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --charset=utf8 --dest h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=my_db,t=my_tab --where "id > 2000" --limit 1000 --commit-each --no-version-check # --dest -- 指定归档到的目标表
目标表中增加了 1008 行数据。
源表中减少了 1008 行数据,剩余 2000 行数据。
2.2.2 归档到不同实例下的表
pt-archiver --source h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --charset=utf8 --dest h=rds02.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=my_tab --where "id > 500" --limit 1000 --commit-each --no-version-check
目标表中增加了 1500 行数据。
源表中减少了 1500 行数据,剩余 500 行数据。
2.2.3 通过 bulk insert 加速归档过程
当需要���档的数据量很大,比如第一次做归档的时候,可以考虑通过尝试 bulk insert 的方式来加速归档过程。
相关推荐
heavstar 2019-06-26
wanjichun 2020-07-18
xiaoxiangyu 2020-06-16
wenjieyatou 2020-06-12
onlykg 2020-02-17
糊一笑 2019-11-21
思维的世界 2019-10-30
鲁氏汤包王 2019-04-21
liang枫 2019-06-29
狗蛋的窝 2019-06-28
zyjj 2019-06-28
狗蛋的窝 2019-06-26
moguibeijing 2019-06-21
wodetian 2019-06-21
数据库之扑朔迷离 2019-05-30
kuwoyinlehe 2016-06-14
86622317 2015-03-01
Enn的数据库 2014-03-05