RDS for MySQL 如何使用 Percona Toolkit

本期分享专家:田杰,专注在关系型数据库和NoSQL数据库技术领域,曾先后就职于路透社和渣打银行,目前在阿里云从事数据库技术支持工作,号称“数据库问题的终结者”。

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 for 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;

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 的方式来加速归档过程。

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 本次操作的统计信息。

时间: 2024-09-13 10:48:04

RDS for MySQL 如何使用 Percona Toolkit的相关文章

MySQL数据库一致性验证工具pt-table-checksum(Percona Toolkit )

https://www.percona.com/doc/percona-toolkit/2.2/pt-table-checksum.html Percona Toolkit 时 Percona公司提供的一个数据库管理工具包,包括常用的数据一致性验证.差异补齐.查找重复索引.分析二进制日志信息等,大大方便DBA查找和解决问题.优化数据库性能.但是作为一款工具,其使用仍然可能会对数据库产生影响,所以在使用该工具包执行任何操作执行,都需要完整的数据库备份. 以下内容主要从官档摘录. Percona T

Centos使用MySQL工具Percona Toolkit

安装Percona Toolkit 的Repo 得以支持直接用yum 安装二进制包 yum install -y https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-3.noarch.rpm yum install -y percona-toolkit 改MySQL表结构DDL pt-online-schema-change pt-online-schema-chang

RDS for MySQL Online DDL 使用

RDS for MySQL Online DDL 使用   Online DDL 的限制 Online DDL 建议的选项 异常处理 RDS for MySQL 5.6 支持 Online DDL 特性. Online DDL (在线 DDL)功能允许在表上执行 DDL 的操作(比如创建索引)的同时不阻塞并发的 DML 操作 和 查询(select)操作.  注: 从低版本(比如 RDS for MySQL 5.5)升级到 RDS for MySQL 5.6,第一次执行 DDL 时有可能会因为表

RDS for MySQL查询缓存 (Query Cache) 的设置和使用

功能和适用范围 原理 限制 设置 验证效果 1. 功能和适用范围 功能: 降低 CPU 使用率 降低 IOPS 使用率(某些情况下) 减少查询响应时间,提高系统的吞吐量 适用范围: 表数据修改不频繁.数据较静态 查询(Select)重复度高 查询结果集小于 1 MB 注: 查询缓存并不一定带来性能上的提升,在某些情况下(比如查询数量大,但重复的查询很少)开启查询缓存会带来性能的下降. 2. 原理 RDS for MySQL 对来自客户端的查询(Select)进行 Hash 计算得到该查询的Has

RDS for MySQL Mysqldump 常见问题和处理

RDS for MySQL Mysqldump 常见问题和处理   GTID 特性相关 避免表级锁等待 设置导出字符集 其他导出时需要注意的选项 举例 RDS for MySQL 不支持的选项 RDS for MySQL 逻辑备份 1. GTID 特性相关 MySQL 5.6 引入了 GTID 特性,因此随 5.6 版本分发的 mysqldump 工具增加了 --set-gtid-purged 选项. # 选项名称 默认值 可选值 作用 1 set-gtid-purged AUTO ON, OF

RDS for MySQL 字符序(collation)引发的性能问题

在帮客户排查问题的时候,经常会遇到的 RDS 实例性能问题(比如 RDS 实例 CPU 使用率高),而其中有一类是由于字符集的字符排序规则不一致导致的.从处理的过程中可以看出来,这类问题比较容易出现但不容易定位排查,所以今天通过两个实战案例来分析的下"RDS for MySQL 字符序(collation)引发的性能问题". 首先介绍下背景知识: 字符集 和 字符序. 1. 字符集(character set)和字符序(collation) 字符集是一组符号和编码,用来保存和解释 My

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情

RDS for MySQL 使用 utf8mb4 字符集存储 emoji 表情 1. 基本原则 2. 三个条件的说明 2.1 应用客户端 2.2 应用到 RDS MySQL 实例的连接 2.3 RDS 实例配置 3. 通过 set names 命令设置会话字符集 1. 基本原则 如果要实现存储 emoji 表情到 RDS for MySQL 实例,需要应用客户端.到 RDS for MySQL 实例的连接.RDS 实例内部 3 个方面统一使用或者支持 utf8mb4 字符集. 注:关于 utf8

RDS for MySQL CPU 性能问题浅析

RDS for MySQL CPU 性能问题浅析 1. 原因 1.1 应用负载高 1.2 查询执行成本高 2. 解决方法2.1 相关工具 2.2 应用负载高 2.3 查询语句执行成本高 3. 避免出现的一般原则 RDS for MySQL 实例在日常使用中,会碰到 CPU 使用率达到 100% 的情况.比如: 1. 原因 根本原因:应用提交的查询访问的 逻辑读(逻辑 IO) 总量 (需要访问的 表 数据) 过高. 大量逻辑读会导致数据缓存 Buffer Pool 中用于维护数据一致性的 Latc

RDS for MySQL InnoDB 行锁等待和锁等待超时的处理

RDS for MySQL InnoDB 行锁等待和锁等待超时的处理   1. InnoDB 引擎表行锁等待和等待超时发生的场景 2.InnoDB 引擎行锁等待情况的处理 2.1 InnoDB 行锁等待超时参数 innodb_lock_wait_timeout 2.2 大量行锁等待和行锁等待超时的处理 1. InnoDB 引擎表行锁等待和等待超时发生的场景 当一个 RDS for MySQL 连接会话等待另外一个会话持有的互斥行锁时,会发生 InnoDB 引擎表行锁等待情况. 通常情况下,持有该