percona toolkit for mysql_RDS 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的相关文档。

详细信息

阿里云提醒您:

如果您对实例或数据有修改、变更等风险操作,务必注意实例的容灾、容错能力,确保数据安全。

如果您对实例(包括但不限于ECS、RDS)等进行配置与数据修改,建议提前创建快照或开启RDS日志备份等功能。

如果您在阿里云平台授权或者提交过登录账号、密码等安全信息,建议您及时修改。

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的产生和处理。

表及数据维护操作请在业务低峰期进行。

样例用表

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;

增加字段

登录服务器,执行如下命令,增加字段。

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实例表名称。

系统显示类似如下。

33d35b61a56f12f1204e86b93c73bbd4.png

登录数据库,执行如下SQL语句,确认添加成功。

show create table x \G

系统显示类似如下。

0f241a3b328ded81fd8e999f3af3b849.png

删除字段

登录服务器,执行如下命令,删除字段。

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

登录数据库,执行如下SQL语句,确认删除字段成功。

show create table x \G

系统显示类似如下。

985f7e36962254e98dbb38c396ab071b.png

修改字段类型

登录服务器,执行如下命令,修改字段类型。

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

登录数据库,执行如下SQL语句,确认修改字段类型成功。

show create table x \G

系统显示类似如下。

af2331f48468441988e9f4d94f6d2b3b.png

添加索引

登录服务器,执行如下命令,添加索引。

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

登录数据库,执行如下SQL语句,确认添加索引成功。

show create table x \G

系统显示类似如下。

675d29f12c40c52d1e63e851e1d7011a.png

删除索引

登录服务器,执行如下命令,删除索引。

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

登录数据库,执行如下SQL语句,确认删除索引成功。

show create table x \G

系统显示类似如下。

945fe9b6027ed93542e49cdb9d2ca83f.png

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;

归档到操作系统文件

登录数据库,执行如下SQL语句,确认源表数据的行数。

select count(*) from my_tab;

系统显示类似如下。

1c8dc00a4df8ece1dfcce3f06d9e89c7.png

登录服务器,执行如下命令,归档到操作系统文件。

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必须设置。

归档后,登录数据库,执行如下SQL语句,确认数据行数减少150行。

select count(*) from my_tab;

系统显示类似如下。

a611b6bbfb3ec2e7af9d31aa510326a7.png

登录服务器,执行如下命令,发现归档操作系统文件中,包含150行数据。

wc -l /var/tmp/xxx-jacky.my_tab

系统显示类似如下。

b593f6a46a1794931f605a3417a42ddd.png

归档到另外一个表中

可以将数据归档到同实例不同库下的表中,也可以将数据归档到不同实例下的表中。归档操作前,目标表要存在。

归档到同实例不同库下的表

登录服务器,执行如下命令,归档到同实例不同库下的表。

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为指定归档到的目标表。

登录数据库,执行如下SQL语句,发现目标表中增加了1008行数据。

select count(*) from my_tab;

系统显示类似如下。

ed67f955e36b6055276ec75aaf5c9237.png

登录数据库,执行如下SQL语句,源表中减少了1008行数据,剩余2000行数据。

select count(*) from jacky.my_tab;

系统显示类似如下。

8d888f61f12ee41074fcd94fab7b6dc3.png

归档到不同实例下的表

登录服务器,执行如下命令,归档到不同实例下的表。

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

登录数据库,执行如下SQL语句,发现目标表中增加了1500行数据。

select count(*) from my_tab;

系统显示类似如下。

f4a5063d2d0e41345b96b8f2dac554b6.png

执行如下SQL语句,源表中减少了1500行数据,剩余500行数据。

select count(*) from jacky.my_tab;

系统显示类似如下。

73115d092e57d9a76ff55816c7c972e0.png

通过bulk insert加速归档过程

当需要归档的数据量很大,比如第一次做归档的时候,可以考虑通过尝试bulk insert的方式来加速归档过程,命令如下所示。

pt-archiver --source h=rds01.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=rd_test,t=large_tab_04 --charset=utf8 --dest h=rds02.mysql.rds.aliyuncs.com,P=3306,u=jacky,p=xxx,D=jacky,t=large_tab_04 --where "1=1"  --limit 5000 --commit-each --bulk-insert --no-version-check --statistics

注:

--bulk-insert:批量插入数据,会自动启用--bulk-delete和--commit-each,每次插入行数通过--limit选项指定。

--statistics:显示pt-archiver本次操作的统计信息。

适用于

云数据库 RDS MySQL 版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值