暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

表复制工具pt-archiver基本使用

表复制工具pt-archiver基本使用

1 percona-toolkit安装

1.1 下载地址:

源码下载地址:
https://www.percona.com/downloads/percona-toolkit/3.0.9/source/tarball/percona-toolkit-3.0.9.tar.gz

1.2 安装依赖包

yum install perl perl-DBI perl-DBD-MySQL perl-IO-Socket-SSL perl-Time-HiRes perl-devel -y

1.3 安装percona-toolkit工具包

[root@node1 software]# tar -zxvf percona-toolkit-3.0.9_x86_64.tar.gz
[root@node1 software]# cd percona-toolkit-3.0.9/
[root@node1 percona-toolkit-3.0.9]# perl Makefile.PL
[root@node1 percona-toolkit-3.0.9]# make && make install

1.4 验证是否安装成功

[root@node1 ~]# pt-summary --version
pt-summary 3.0.9

1.5 工具命令及作用

工具类别 工具命令 工具作用 备注
开发类 pt-duplicate-key-checker 列出并删除重复的索引和外键 -
pt-online-schema-change 在线修改表结构 -
pt-query-advisor 分析查询语句,并给出建议,有bug 已废弃
pt-show-grants 规范化和打印权限 -
pt-upgrade 在多个服务器上执行查询,并比较不同 -
性能类 pt-index-usage 分析日志中索引使用情况,并出报告 -
pt-pmp 为查询结果跟踪,并汇总跟踪结果 -
pt-visual-explain 格式化执行计划 -
pt-table-usage 分析日志中查询并分析表使用情况 pt 2.2新增命令
配置类 pt-config-diff 比较配置文件和参数 -
pt-mysql-summary 对mysql配置和status进行汇总 -
pt-variable-advisor 分析参数,并提出建议 -
监控类 pt-deadlock-logger 提取和记录mysql死锁信息 -
pt-fk-error-logger 提取和记录外键信息 -
pt-mext 并行查看status样本信息 -
pt-query-digest 分析查询日志,并产生报告 常用命令
pt-trend 按照时间段读取slow日志信息 已废弃
复制类 pt-heartbeat 监控mysql复制延迟 -
pt-slave-delay 设定从落后主的时间 -
pt-slave-find 查找和打印所有mysql复制层级关系 -
pt-slave-restart 监控salve错误,并尝试重启salve -
pt-table-checksum 校验主从复制一致性 -
pt-table-sync 高效同步表数据 -
系统类 pt-diskstats 查看系统磁盘状态 -
pt-fifo-split 模拟切割文件并输出 -
pt-summary 收集和显示系统概况 -
pt-stalk 出现问题时,收集诊断数据 -
pt-sift 浏览由pt-stalk创建的文件 pt 2.2新增命令
pt-ioprofile 查询进程IO并打印一个IO活动表 pt 2.2新增命令
实用类 pt-archiver 将表数据归档到另一个表或文件中 -
pt-find 查找表并执行命令 -
pt-kill Kill掉符合条件的sql 常用命令
pt-align 对齐其他工具的输出 pt 2.2新增命令
pt-fingerprint 将查询转成密文 pt 2.2新增命令

2.工具用法说明及举例

2.1 pt-align

pt-align - Align output from other tools to columns.(按行对齐其他工具的输出)

Usage:

pt-align [FILES]

[root@node1 ~]# cat a.txt
id name age
1 ‘aaaa’ 11
2 ‘bbbbb’ 23
3 ‘cccccc’ 5

[root@node1 ~]# pt-align a.txt
id name age
1 ‘aaaa’ 11
2 ‘bbbbb’ 23
3 ‘cccccc’ 5

2.2 pt-archiver

(1)pt-archiver - Archive rows from a MySQL table into another table or a file.

(将MySQL表中的行存档到另一个表或文件中,可以理解为归档)

Usage:

pt-archiver [OPTIONS] --source DSN --where WHERE

eg:

(2) 基础环境准备

源数据库:
set global innodb_flush_log_at_trx_commit=0;
create database db1 charset=utf8;
use db1;
create table t(id int primary key, a int, b int, index(a)) engine=innodb;
delimiter ;;
create procedure idata()
begin
declare i int;
set i=1;
while(i<=100000) do
insert into t values(i,i,i);
set i=i+1;
end while;
end;;
delimiter ;
call idata();

目标数据库:
create database db1 charset=utf8;
use db1;
create table t_bak(id int primary key, a int, b int, index(a))engine=innodb;


**(3)参数详解**

```html
 --limit 10000       每次取1000行数据用pt-archive处理,Number of rows to fetch and archive per statement.
--txn-size  1000   设置1000行为一个事务提交一次,Number of rows pertransaction.
--where‘id<3000‘   设置操作条件
--progress5000     每处理5000行输出一次处理信息
--statistics       输出执行过程及最后的操作统计。(只要不加上--quiet,默认情况下pt-archive都会输出执行过程的)
--charset=UTF8     指定字符集为UTF8
--bulk-delete      批量删除source上的旧数据(例如每次1000行的批量删除操作)
--bulk-insert      批量插入数据到dest主机 (看dest的general log发现它是通过在dest主机上LOAD DATA LOCAL INFILE插入数据的)
--replace          将insert into 语句改成replace写入到dest库
--sleep120         每次归档了limit个行记录后的休眠120秒(单位为秒)
--file‘/root/test.txt‘
--purge             删除source数据库的相关匹配记录
--header            输入列名称到首行(和--file一起使用)
--no-check-charset  不指定字符集
--check-columns    检验dest和source的表结构是否一致,不一致自动拒绝执行(不加这个参数也行。默认就是执行检查的)
--no-check-columns    不检验dest和source的表结构是否一致,不一致也执行(会导致dest上的无法与source匹配的列值被置为null或者0)
--chekc-interval      默认1s检查一次
--local            不把optimize或analyze操作写入到binlog里面(防止造成主从延迟巨大)
--retries         超时或者出现死锁的话,pt-archiver进行重试的间隔(默认1s)
--no-version-check   目前为止,发现部分pt工具对阿里云RDS操作必须加这个参数
--analyze=ds      操作结束后,优化表空间(d表示dest,s表示source)
默认情况下,pt-archiver操作结束后,不会对source、dest表执行analyze或optimize操作,因为这种操作费时间,并且需要你提前预估有足够的磁盘空间用于拷贝表。一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以回收表空间。
复制

(3)常用操作
1)删除老数据(单独的删数据操作不用指定字符集)

192.168.100.33:

pt-archiver --source h=localhost,u=pt_user,p=pt_pass,P=3306,D=db1,t=t --progress 5000 --where ‘id<=10000’ --no-check-charset --where ‘id<=10000’ --limit=10000 --txn-size 1000 --purge

[root@node1 ~]# pt-archiver --source h=localhost,u=pt_user,p=pt_pass,P=3306,D=db1,t=t --progress 5000 --where ‘id<=10000’ --no-check-charset --where ‘id<=10000’ --limit=10000 --txn-size 1000 --purge
TIME ELAPSED COUNT
2024-07-01T01:51:41 0 0
2024-07-01T01:51:42 1 5000
2024-07-01T01:51:43 2 10000
2024-07-01T01:51:43 2 10000

2)复制数据到其他mysql实例,且不删除source的数据(指定字符集):

192.168.100.33:

[root@node1 ~]# mysql -uroot -p123456

root@db 23:37: [test]> create user ‘pt_user’@’%’ identified with mysql_native_password by ‘pt_pass’;

GRANT all privileges ON . TO ‘pt_user’@’%’;

flush privileges;

验证远程登陆是否成功:

[root@node1 ~]# mysql -upt_user -ppt_pass -h192.168.100.55 -P3306

192.168.100.55:

[root@node2 ~]# mysql -uroot -p123456

[root@node2 ~]# mysql -upt_user -ppt_pass -h192.168.100.55 -P3306

root@db 23:37: [test]> create user ‘pt_user’@’%’ identified with mysql_native_password by ‘pt_pass’;

验证远程登陆是否成功:

[root@node2 ~]# mysql -upt_user -ppt_pass -h192.168.100.33 -P3306

ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

pt-archiver --source h=localhost,u=pt_user,p=pt_pass,P=3306,D=db1,t=t --dest h=192.168.100.55,P=3306,u=pt_user,p=pt_pass,D=db1,t=t_bak --progress 5000 --where 'id<=100000' --statistics --charset=UTF8 --limit=10000 --txn-size 1000 --no-delete
复制

A software update is available:

TIME ELAPSED COUNT
2024-07-01T01:38:30 0 0
2024-07-01T01:38:34 4 5000
2024-07-01T01:38:38 8 10000
2024-07-01T01:38:44 13 15000
2024-07-01T01:38:47 17 20000
2024-07-01T01:38:51 21 25000
2024-07-01T01:38:55 25 30000
2024-07-01T01:38:58 28 35000
2024-07-01T01:39:02 32 40000
2024-07-01T01:39:07 36 45000
2024-07-01T01:39:10 40 50000
2024-07-01T01:39:14 44 55000
2024-07-01T01:39:20 50 60000
2024-07-01T01:39:24 54 65000
2024-07-01T01:39:28 58 70000
2024-07-01T01:39:32 62 75000
2024-07-01T01:39:36 65 80000
2024-07-01T01:39:39 69 85000
2024-07-01T01:39:43 73 90000
2024-07-01T01:39:48 77 95000
2024-07-01T01:39:51 81 100000
2024-07-01T01:39:51 81 100000
Started at 2024-07-01T01:38:30, ended at 2024-07-01T01:39:51
Source: A=UTF8,D=db1,P=3306,h=localhost,p=…,t=t,u=pt_user
Dest: A=UTF8,D=db1,P=3306,h=192.168.100.55,p=…,t=t_bak,u=pt_user
SELECT 100000
INSERT 100000
DELETE 0
Action Count Time Pct
inserting 100000 71.3730 87.68
commit 202 0.3057 0.38
select 11 0.2292 0.28
other 0 9.4937 11.66
[root@node1 ~]#

3)复制数据到其他mysql实例,并删source上的旧数据(指定字符集):

pt-archiver --source h=localhost,u=pt_user,p=pt_pass,P=3306,D=db1,t=t --dest h=192.168.100.55,P=3306,u=pt_user,p=pt_pass,D=db1,t=t_bak --progress 5000 --where ‘id<=100000’ --statistics --charset=UTF8 --limit=10000 --txn-size 1000 --bulk-delete

[root@node1 ~]# pt-archiver --source h=localhost,u=pt_user,p=pt_pass,P=3306,D=db1,t=t --dest h=192.168.100.55,P=3306,u=pt_user,p=pt_pass,D=db1,t=t_bak --progress 5000 --where ‘id<=100000’ --statistics --charset=UTF8 --limit=10000 --txn-size 1000 --bulk-delete
TIME ELAPSED COUNT
2024-07-01T01:57:48 0 0
2024-07-01T01:57:51 3 5000
2024-07-01T01:57:56 8 10000
2024-07-01T01:58:02 14 15000
2024-07-01T01:58:06 18 20000
2024-07-01T01:58:12 24 25000
2024-07-01T01:58:16 27 30000
2024-07-01T01:58:22 34 35000
2024-07-01T01:58:26 38 40000
2024-07-01T01:58:33 44 45000
2024-07-01T01:58:36 48 50000
2024-07-01T01:58:42 53 55000
2024-07-01T01:58:45 57 60000
2024-07-01T01:58:52 63 65000
2024-07-01T01:58:55 67 70000
2024-07-01T01:59:02 73 75000
2024-07-01T01:59:05 77 80000
2024-07-01T01:59:11 83 85000
2024-07-01T01:59:14 86 90000
2024-07-01T01:59:14 86 90000
Started at 2024-07-01T01:57:48, ended at 2024-07-01T01:59:15
Source: A=UTF8,D=db1,P=3306,h=localhost,p=…,t=t,u=pt_user
Dest: A=UTF8,D=db1,P=3306,h=192.168.100.55,p=…,t=t_bak,u=pt_user
SELECT 90000
INSERT 90000
DELETE 90000
Action Count Time Pct
inserting 90000 76.0220 87.69
bulk_deleting 9 2.0191 2.33
commit 182 0.3646 0.42
select 10 0.0813 0.09
other 0 8.2112 9.47

源端:192.168.100.33:

root@db 01:35: [db1]> select count(*) from t;
Current database: db1

±---------+
| count(*) |
±---------+
| 0 |
±---------+
1 row in set (0.01 sec)

目标库:192.168.100.55

root@db 01:57: [db1]> select count() from t_bak;
±---------+
| count(
) |
±---------+
| 90000 |
±---------+
1 row in set (0.07 sec)

4)复制数据到其他mysql实例,不删除source数据,但是使用批量插入dest上新的数据(指定字符集):效率更高,使用bulk-insert用时7秒钟。而常规insert用时40秒。

pt-archiver --source h=192.168.100.55,u=pt_user,p=pt_pass,P=3306,D=db1,t=t_bak --dest h=192.168.100.33,P=3306,u=pt_user,p=pt_pass,D=db1,t=t --progress 5000 --where ‘id<=100000’ --statistics --charset=UTF8 --limit=10000 --txn-size 1000 --no-delete --bulk-insert

最后修改时间:2024-06-30 18:18:53
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 表复制工具pt-archiver基本使用
    • 1 percona-toolkit安装
      • 1.1 下载地址:
      • 1.2 安装依赖包
      • 1.3 安装percona-toolkit工具包
      • 1.4 验证是否安装成功
      • 1.5 工具命令及作用
    • 2.工具用法说明及举例
      • 2.1 pt-align
      • 2.2 pt-archiver