17、percona-toolkit
1.percona-toolkit(在http://www.percona.com下载)
2.安装该工具依赖的perl组件
yum install perl-IO-Socket-SSL perl-DBD-MySQL perl-Time-HiRes -y
root@localhost 22:57:02 [(none)]> GRANT SELECT, insert,update,delete,create,PROCESS, SUPER, REPLICATION SLAVE ON *.* TO 'lk'@'%' identified by 'lk';
主库:root@localhost 13:28:47[db1]> select * from test2;+----+------+| id | name |+----+------+| 1| a || 2| a || 3| a |+----+------+3 rows in set(0.00 sec)从库:mysql> select * from test2;+----+------+| id | name |+----+------+| 1| a || 2| bbbb || 4| a |+----+------+3 rows in set(0.00 sec)
[root@likun ~]# pt-table-checksum h='192.168.1.20',u='lk',p='lk',P=3306-d db1 --nocheck-replication-filters --replicate=db1.checksums --create-replicate-table --no-check-binlog-formatTS ERRORS DIFFS ROWS CHUNKS SKIPPED TIME TABLE09-09T23:50:00 0 1 1 1 0 0.521 db1.test09-09T23:50:01 0 1 2 1 0 0.278 db1.test2
其次是 ERRORS
[root@likun data]# pt-table-sync --replicate=db1.checksums --databases=db1 --charset=utf8 h='192.168.1.20',u='lk',p='lk'--printCan't make changes on the master because no unique index exists at /usr/bin/pt-table-sync line 10648. while doing db1.test on 192.168.1.25DELETE FROM `db1`.`test2` WHERE `id`='4' LIMIT 1/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3669 user:root host:likun.com*/;REPLACE INTO `db1`.`test2`(`id`,`name`) VALUES ('2','a')/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3669 user:root host:likun.com*/;REPLACE INTO `db1`.`test2`(`id`,`name`) VALUES ('3','a')/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3669 user:root host:likun.com*/;
DELETE FROM `db1`.`test2` WHERE `id`='4' LIMIT 1/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3697 user:root host:likun.com*//*!*/;# at 558#140917 13:35:11 server id 1 end_log_pos 952 Query thread_id=1749 exec_time=0 error_code=0SET TIMESTAMP=1410932111/*!*/;REPLACE INTO `db1`.`test2`(`id`,`name`) VALUES ('2','a')/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3697 user:root host:likun.com*//*!*/;# at 952#140917 13:35:11 server id 1 end_log_pos 1346 Query thread_id=1749 exec_time=0 error_code=0SET TIMESTAMP=1410932111/*!*/;REPLACE INTO `db1`.`test2`(`id`,`name`) VALUES ('3','a')/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3697 user:root host:likun.com*//*!*/;# at 1346#140917 13:35:11 server id 1 end_log_pos 1373 Xid = 5490152COMMIT/*!*/;
DELETE FROM `db1`.`test2` WHERE `id`='4' LIMIT 1/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3697 user:root host:likun.com*//*!*/;# at 704#140917 13:35:11 server id 1 end_log_pos 952 Query thread_id=1749 exec_time=0 error_code=0SET TIMESTAMP=1410932111/*!*/;REPLACE INTO `db1`.`test2`(`id`,`name`) VALUES ('2','a')/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3697 user:root host:likun.com*//*!*/;# at 1098#140917 13:35:11 server id 1 end_log_pos 1346 Query thread_id=1749 exec_time=0 error_code=0SET TIMESTAMP=1410932111/*!*/;REPLACE INTO `db1`.`test2`(`id`,`name`) VALUES ('3','a')/*percona-toolkit src_db:db1 src_tbl:test2 src_dsn:A=utf8,h=192.168.1.20,p=...,u=lk dst_db:db1 dst_tbl:test2 dst_dsn:A=utf8,h=192.168.1.25,p=...,u=lk lock:1 transaction:1 changing_src:db1.checksums replicate:db1.checksums bidirectional:0 pid:3697 user:root host:likun.com*//*!*/;# at 1492#140917 13:35:11 server id 1 end_log_pos 1373 Xid = 5490152COMMIT/*!*/;
+----+------+| id | name |+----+------+| 1| a || 2| a || 3| a |+----+------+
--recursion-method="processlist" 发现从库的方法(processlist要求主从的端口一样)其他方式:METHOD USES=========== =============================================processlist SHOW PROCESSLISThosts SHOW SLAVE HOSTScluster SHOW STATUS LIKE 'wsrep\_incoming\_addresses'dsn=DSN DSNs from a tablenone Do not find slaves
[root@likun data]# pt-ioprofile --profile-pid=2679--cell=sizes --run-time=10WedSep1714:30:29 CST 2014Tracing process ID 2679total read pwrite write fsync filename65536 0 65536 0 0/mysql/data/ibdata11536 0 1536 0 0/mysql/data/ib_logfile1512 0 512 0 0/mysql/data/ib_logfile0374 187 0 187 0/mysql/data/mysql-bin.00004595 0 0 95 0/mysql/data/likun.log
[root@likun data]# pt-query-digest --user=lk --password=lk --review h=192.168.1.20,D=db1,t=query --history h=192.168.1.20,D=db1,t=query_history --no-report --limit=0%--filter=" \$event->{Bytes} = length(\$event->{arg}) and \$event->{hostname}=\"$HOSTNAME\""/mysql/data/likun-slow.logroot@localhost 16:16:56[db1]>select*from query;+----------------------+----------------------------------------+---------------------------------------------+-------------------| checksum | fingerprint | sample | first_seen+----------------------+----------------------------------------+---------------------------------------------+-------------------| 3835665160750404163|set@master_heartbeat_period=? | SET @master_heartbeat_period=1799999979520|2014-09-1716:06:3| 4080254502890102626|select user() |select USER() |2014-09-1716:05:5| 4757751776728164035|setglobal long_query_time=? |setglobal long_query_time=1 |2014-09-1716:06:4| 6323544616612860337|select@@long_query_time |select@@long_query_time |2014-09-1716:05:5| 8071533740163008823|select count(*)from d?test where id=?|select count(*)from db1.test where id=1 |2014-09-1716:06:2| 8281087749045658124|select unix_timestamp() | SELECT UNIX_TIMESTAMP() |2014-09-1716:06:3| 9067424411701554875| show variables like ? | SHOW VARIABLES LIKE 'SERVER_ID' |2014-09-1716:06:3|12264768829628632244| administrator command:Quit | administrator command:Quit |2014-09-1716:06:4|14719931978391102173|set names utf? | SET NAMES utf8 |2014-09-1716:06:3|16403064890596278669|select@@version_comment limit ? |select@@version_comment limit 1 |2014-09-1716:05:5|17087051866937599150| administrator command:RegisterSlave | administrator command:RegisterSlave |2014-09-1716:06:3+----------------------+----------------------------------------+---------------------------------------------+-------------------11 rows inset(0.00 sec)
[root@likun ~]# pt-duplicate-key-checker --host=192.168.1.20--port=3306--user=lk --password=lk# ######################################################################### world.CountryLanguage# ######################################################################### CountryCode is a left-prefix of PRIMARY# Key definitions:# KEY `CountryCode` (`CountryCode`),# PRIMARY KEY (`CountryCode`,`Language`),# Column types:# `countrycode` char(3) not null default ''# `language` char(30) not null default ''# To remove this duplicate index, execute:ALTER TABLE `world`.`CountryLanguage` DROP INDEX `CountryCode`;# ######################################################################### Summary of indexes# ######################################################################### Size Duplicate Indexes 4038# Total Duplicate Indexes 1# Total Indexes 48
大概工作原理:
(1)如果存在外键,根据alter-foreign-keys-method参数的值,检测外键相关的表,针对相应的设置进行处理。
(2)创建一个新的表,表结构为修改后的数据表,用于从源数据表向新表中导入数据。
(3)创建触发器,在复制数据开始之后,将对源数据表继续进行数据修改的操作记录下来,以便在数据复制结束后执行这些操作,保证数据不会丢失。
(4)复制数据,从源数据表中复制数据到新表中。
(5)修改外键相关的子表,根据修改后的数据,修改外键关联的子表。
(6)更改源数据表为old表,把新表改为源表名,并将old表删除。
(7)删除触发器。
存在如下限制:
(1)对操作的表必须要有主键或者唯一键
(2)增加的字段如果为NOT NULL,会报错,需要添加默认值才可以成功。
[root@likun ~]# pt-online-schema-change --alter="add column addr char(20)"--user=lk --password=lk --host=192.168.1.20 D=db1,t=test2 --executeFound1 slaves:mysql1.comWill check slave lag on:mysql1.comOperation, tries, wait:copy_rows,10,0.25create_triggers,10,1drop_triggers,10,1swap_tables,10,1update_foreign_keys,10,1Altering`db1`.`test2`...Creatingnew table...Creatednew table db1._test2_new OK.Alteringnew table...Altered`db1`.`_test2_new` OK.2014-09-18T08:09:15Creating triggers...2014-09-18T08:09:15Created triggers OK.2014-09-18T08:09:15Copying approximately 4 rows...2014-09-18T08:09:15Copied rows OK.2014-09-18T08:09:15Swapping tables...2014-09-18T08:09:15Swapped original and new tables OK.2014-09-18T08:09:15Dropping old table...2014-09-18T08:09:15Dropped old table `db1`.`_test2_old` OK.2014-09-18T08:09:15Dropping triggers...2014-09-18T08:09:15Dropped triggers OK.Successfully altered `db1`.`test2`.
17、percona-toolkit的更多相关文章
- Percona Toolkit mysql辅助利器
1 PT介绍 Percona Toolkit简称pt工具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在 ...
- Centos 安装Percona Toolkit工具集
1.下载 下载地址: https://www.percona.com/downloads/percona-toolkit/LATEST/ [root@bogon ~]# wget https:// ...
- RDS for MySQL 如何使用 Percona Toolkit
Percona Toolkit 包含多种用于 MySQL 数据库管理的工具. 下面介绍常用的 pt-online-schema-change 和 pt-archiver 搭配 RDS MySQL ...
- Percona Toolkit工具集介绍
部署mysql工具是一个非常重要的部分,所以工具的可靠性和很好的设计非常重要.percona toolkit是一个有30多个mysql工具的工具箱.兼容mysql,percona server,mar ...
- Want to archive tables? Use Percona Toolkit’s pt-archiver--转载
原文地址:https://www.percona.com/blog/2013/08/12/want-to-archive-tables-use-pt-archiver/ Percona Toolkit ...
- Zabbix--05 Grafana、percona、自动发现和自动注册
目录 一. Grafana自定义图形 1.安装grafana 2.安装并激活zabbix插件 3.数据展示 4.自定义图形仪表盘 5.自定义图形饼图 二. percona模版监控mysql 1.安装p ...
- Percona Toolkit工具使用
Percona Toolkit简称pt工具-PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在线DDL等 下 ...
- ABP(现代ASP.NET样板开发框架)系列之17、ABP应用层——参数有效性验证
点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之17.ABP应用层——参数有效性验证 ABP是“ASP.NET Boilerplate Project (ASP. ...
- [安卓] 17、一个简单的例子学安卓侧滑设计——用开源slidingmenu
效果如下: 下面是工程结构: 整个工程包括android-v7.SlidingMenu-lib和主工程SlidingMenuTest部分 其中前两个作为lib,后一个为主工程 主工程包含两个lib工程 ...
- 《TCP/IP详解卷1:协议》第17、18章 TCP:传输控制协议(1)-读书笔记
章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...
随机推荐
- Flexigrid-Web2.0 jQuery
一.参考资料 1.jQuery插件flexiGrid的完全使用,附代码下载 2.修改flexigrid源码一(json,checkbox)[原创] 3.jQuery +UI + flexigrid做的 ...
- 一款你不容错过的Laravel后台管理扩展包 —— Voyager
http://laravelacademy.org/post/6401.html Posted on 2016年11月1日 by 学院君 1.简介 Voyager是一个你不容错过的Laravel后 ...
- Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
为什么要这样做? 默认情况下,Redis 服务会提供 16 个数据库,Laravel 使用数据库 0 (请见 Redis 文档)作为缓存和 Session 的存储. 在使用的过程中觉得这个默认的设置挺 ...
- HDU 1002.A + B Problem II-数组模拟-大数相加
A + B Problem II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) ...
- 推荐开源靶场Vulhub
转:https://github.com/phith0n/vulhub Vulhub - Some Docker-Compose files for vulnerabilities environme ...
- 【SQL】ORACLE在sqlplus中使用spool方式生成建表语句
在实际生产中有时我们需要将一张表的数据导入到另外一张表,如果有PLSQL,我们可以通过PLSQL工具将数据导出为sql脚本,然后再在另外一个数据库中执行这个脚本.但有时在实际生产中我们没有PLSQL这 ...
- python实现RabbitMQ同步跟异步消费模型
1,消息推送类 import pika # 同步消息推送类 class RabbitPublisher(object): # 传入RabbitMQ的ip,用户名,密码,实例化一个管道 def __in ...
- Flask实战第46天:完成前台登录功能
后台逻辑 首先进行表单验证, 编辑front.froms.py ... class SignInForm(BaseForm): telephone = StringField(validators=[ ...
- Python开发基础-Day2-流程控制、数字和字符串处理
流程控制 条件判断 if单分支:当一个“条件”成立时执行相应的操作. 语法结构: if 条件: command 流程图: 示例:如果3大于2,那么输出字符串"very good" ...
- 连接LilyPad之Windows平台的驱动
连接LilyPad之Windows平台的驱动 LilyPad和其他的Arduino控制板的不同之处是它是为电子织物和可穿戴设计的.那么,它的大小就必须要紧凑.所以,它并没有板载其他大多数板子都具有的U ...