Percona-tookit学习笔记(六)

pt-variable-advisor

功能:

分析mysql的参数变量,并对可能存在的问题提出建议

例1:

    pt-variable-advisor --user=root--password=root localhost

例2:

    pt-variable-advisor --user=root--password=root  --source-of-variablesmy.cnf
# pt-variable-advisor --user=root--password=root localhost > pt-variables-adv.log

结果如下:

说明: 下面的只是提示,各位根据自己的业务需求来改即可。

# NOTE connect_timeout: A largevalue of this setting can create a denial of service vulnerability.

# WARN delay_key_write: MyISAMindex blocks are never flushed until necessary.   【设置delay_key_write = OFF 】

# NOTE log_warnings-2:Log_warnings must be set greater than 1 to log unusual events such as abortedconnections.

【可设置log_warnings = 2 】

# NOTE max_binlog_size: Themax_binlog_size is smaller than the default of 1GB.  【设置max_binlog_size = 1G】

# NOTE read_buffer_size-1: Theread_buffer_size variable should generally be left at its default unless anexpert determines it is necessary to change it.

# NOTE read_rnd_buffer_size-1: Theread_rnd_buffer_size variable should generally be left at its default unless anexpert determines it is necessary to change it.

# WARN slave_net_timeout: Thisvariable is set too high.    【根据这条提示,可以设置slave_net_timeout = 60】

# NOTE sort_buffer_size-1: Thesort_buffer_size variable should generally be left at its default unless anexpert determines it is necessary to change it. 【可以修改下innodb_data_file_path =ibdata1:1G:autoextend:max:2G】

# NOTE innodb_data_file_path:Auto-extending InnoDB files can consume a lot of disk space that is verydifficult to reclaim later.

# WARN key_buffer_size: The keybuffer size is set to its default value, which is not good  for most production systems. 【根据这条提示,可以设置key_buffer_size = 100M】

# WARN expire_logs_days: Binarylogs are enabled, but automatic purging is not enabled.【可设置expire_logs_days = 20解决】

# NOTE innodb_flush_method: Mostproduction database servers that use InnoDB should set innodb_flush_method toO_DIRECT to avoid double-buffering, unless the I/O system is very lowperformance. 【根据这条提示,可以设置innodb_flush_method =O_DIRECT】

# NOTE max_relay_log_size: Acustom max_relay_log_size is defined.

# WARN myisam_recover_options:myisam_recover_options should be set to some value such as BACKUP,FORCE toensure that table corruption is noticed.

# WARN sync_binlog: Binary loggingis enabled, but sync_binlog isn‘t configured so that every transaction isflushed to the binary log for durability. 【根据这条提示,为了更高的数据安全性,可以设置sync_binlog = 1】

pt-deadlock-logger

作用:

收集和保存mysql上最近的死锁信息,可以直接打印死锁信息和存储死锁信息到数据库中,死锁信息包括发生死锁的服务器、最近发生死锁的时间、死锁线程id、死锁的事务id、发生死锁时事务执行了多长时间等等非常多的信息。

范例1:打印本地mysql的死锁信息

# pt-deadlock-logger  --user=root --password=root h=localhost–print

范例2:将本地的mysql死锁信息记录到数据库的表中,也打印出来

# pt-deadlock-logger  --user=root --password=root h=localhost--print D=test,t=deadlocks

pt-fk-error-logger

作用:

记录外键错误信息。

通过SHOW INNODB STATUS提取和保存mysql数据库最近发生的外键错误信息。可以通过参数控制直接打印错误信息或者将错误信息存储到数据库的表中。

pt-mext

作用:

Lookat many samples of MySQL "SHOW GLOBAL STATUS" side-by-side

--relative  缩写为 -r  Subtract each column from the previous column

 范例:

获取系统消息(结果和show global status一样)

    #pt-mext -r -- mysqladmin ext -i10 -c3 --user=root --password=root

pt-heartbeat

说明:

监控mysql复制延迟。测量复制落后主mysql或者主PostgreSQL多少时间,你可以使用这个脚本去更新主或者监控复制。

pt-heartbeat measures replication lag on aMySQL or PostgreSQL server.  You can useit to update a master or monitor a replica. If possible, MySQL connectionoptions are read from your .my.cnf file.

在主节点执行pt-heartbeat这个命令。

原理:

pt-heartbeat通过真实的复制数据来确认mysql和postgresql复制延迟,这个避免了对复制机制的依赖,从而能得出准确的落后复制时间。

包含两部分:

第一部分在主上pt-heartbeat的--update线程会在指定的时间间隔更新一个时间戳;

第二部分是pt-heartbeat的--monitor线程或者--check线程连接到从上检查复制的心跳记录(前面更新的时间戳),并和当前系统时间进行比较,得出时间的差异。

格式:

pt-heartbeat-D test --update -h master-server --daemonize

pt-heartbeat-D test --monitor -h slave-server

pt-heartbeat-D test --check h=slave-server

实例:

1、在主节点192.168.2.11执行启动更新test.heartbeat表操作:

    #pt-heartbeat -D test --update --user=root --password=root -h 192.168.2.11--create-table –daemonize

2、在主节点192.168.2.11执行启动监控复制在slave上的落后程度(会一直监控):

    #pt-heartbeat -D test --monitor --user=root --password=root  -h 192.168.2.12   结果如下图所示:

3、检查Slave节点落于Master多长时间

    #pt-heartbeat -D test --check --user=root --password=root h=192.168.2.12        结果如下图所示,0表示没有延迟:

4、监控完毕,记得关闭第一步的pt-heartbeat后台进程

    #kill -9 `ps aux|grep pt-heartbeat|grep -v grep|awk ‘{print $2}‘`

pt-slave-delay

作用:

设置从服务器落后于主服务器指定时间。

Makea MySQL slave server lag behind its master

pt-slave-delaystarts and stops a slave server as needed to make it lag behind the master.TheSLAVE_DSN and MASTER_DSN use DSN syntax, and values are copied from theSLAVE_DSN to the MASTER_DSN if omitted.

原理:

通过启动和停止复制sql线程来设置从落后于主指定时间。默认是基于从上relay日志的二进制日志的位置来判断,因此不需要连接到主服务器,如果IO进程不落后主服务器太多的话,这个检查方式工作很好,如果网络通畅的话,一般IO线程落后主通常都是毫秒级别。一般是通过--delay and--delay"+"--interval来控制。--interval是指定检查是否启动或者停止从上sql线程的频繁度,默认的是1分钟检查一次。

例:

使主从之间延迟1分钟,每隔15秒检测一次,运行10分钟

    #pt-slave-delay --user=root --password=root --delay 1m --interval 15s --run-time10m --host=192.168.2.12

如果不加--run-time 参数,这个命令会一直在前台运行下去

--daemonize表示以后台守护进程执行

--quiet表示静默执行

--port=3306  指明端口

说明:用了这个工具的话,slave节点执行show slave status\G可以看到从节点的Slave_SQL_Running状态是在Yes和No之间不断切换的。

pt-slave-find

作用:找到主节点下的所有从节点

原理:连接mysql主服务器并查找其所有的从,然后打印出所有从服务器的层级关系

语法:pt-slave-find --user=xx --password=xxx --host=master_ip

示例:

# pt-slave-find --user=root --password=root --host=192.168.2.11

pt-slave-restart

作用:

监视mysql复制错误,当复制停止的时候尝试重启mysql复制。Watch and restart MySQLreplication after errors

示例:

监视IP为192.168.2.12的从节点,跳过1个错误

#pt-slave-restart --user=root --password=root --host=192.168.2.12 --skip-count=1

监视192.168.2.12的从节点,跳过错误代码为1062的错误。

#pt-slave-restart --user=root --password= root --host=192.168.2.12 --error-numbers=1062

--verbose  显示详细信息

pt-table-checksum

作用:

检查复制的完整性    VerifyMySQL replication integrity

原理:

pt-table-checksum在主上执行检查语句在线检查mysql复制的一致性,生成replace语句,然后通过复制传递到从,再通过update更新master_src的值。通过检测从上this_src和master_src的值从而判断复制是否一致。

注意:

使用的时候选择业务低谷的时候运行,因为运行的时候会造成表的部分记录锁定。此外,还要确保从库的IO/SQL线程都是YES状态的。

使用--max-load来指定最大的负载情况,如果达到那个负载这个暂停运行。如果发现有不一致的数据,可以使用pt-table-sync工具来修复。

示例:比较hellodb数据库下所有的表同步是否一致,结果显示hellodb库所有的表的校验和

首先,我们在Slave节点修改下hellodb.students一条数据,模拟出主从之间数据不一致的情况。

step1、在主节点执行:

# pt-table-checksum--nocheck-replication-filters --databases=hellodb--replicate=hellodb.checksums --host=192.168.2.11 --user=root--password=root --port 3306 --no-check-binlog-format

参数说明:

--host=主节点的IP地址

--no-check-binlog-format        :因为我们的日志用的MIXED格式,所有这里要加上不检查复制的binlog模式

--replicate-check-only          :只显示不同步的信息【对于需要比较大量数据库时候排除干扰的条目,很有用】

--replicate=db_name.tb_name     :把checksum的信息写入到指定表中,建议直接写到被检查的数据库当中。

--databases=db1,db2             :指定需要被检查的数据库,多个则用逗号隔开。

--tables=                       :指定需要被检查的表,多个用逗号隔开[不写就是检查给出的库里涉及到的所有表]

h=127.0.0.1   :Master的地址

u=root        :用户名

p=123456      :密码

P=3306        :端口

执行结果如下图所示,我们可以看到有一个DIFFS:

TS            :完成检查的时间。

ERRORS        :检查时候发生错误和警告的数量。

DIFFS         :0表示一致,1表示不一致。当指定--no-replicate-check时,会一直为0,当指定--replicate-check-only会只显示不同的信息。

ROWS          :表的行数。

CHUNKS        :被划分到表中的块的数目。

SKIPPED       :由于错误或警告或过大,则跳过块的数目。

TIME          :执行的时间。

TABLE         :被检查的表名。

说明:如果加上--replicate-check-only 参数的话,只会显示有不同的表的地方。如下图:

另外,操作完成后,会在hellodb库下生成一个checksums表。

step2、到Slave节点上查询下结果如下

[因为在Master节点查看的话this_crc和master_crc是一样的,没比较的意义]:

MySQL [test] >select * fromhellodb.checksums\G  可以看到主从的students的行数不一样

MySQL [test] >select * fromhellodb.checksums;

pt-table-sync

功能:

高效地同步MySQL Table表数据。他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。

说明:

为了安全起见,建议修改前先备份数据。

原理:

总是在主上执行数据的更改,再同步到从上,不会直接更改成从的数据,在主上执行更改是基于主上现在的数据,不会更改主上的数据。注意使用之前先备份你的数据,避免造成数据的丢失.执行execute之前最好先换成--print或--dry-run查看一下会变更哪些数据。

范例1:同步从的test库的aaa表到主的,在执行之前可以用--execute参数换成--print来查看会变更什么东西,后面那个主机必须是master

pt-table-sync--user=root --password=root h=192.168.2.12,D=hellodb,t=students h=192.168.2.11 --print

pt-table-sync --user=root--password=root h=192.168.2.12,D=hellodb,t=students h=192.168.2.11 --execute

范例2:将主的test数据库同步到从节点192.168.2.12,使从上具有一样的数据   [在主节点执行该命令]

pt-table-sync --sync-to-master--user=root --password=root  h=192.168.2.12 --database test --execute

范例3:只同步指定的表[在主节点执行该命令]

pt-table-sync --sync-to-master--user=root --password=root  h=192.168.2.12,D=test,t=aaa --execute

范例4:根据pt-table-checksum的结果进行数据同步,使得从节点数据能和主节点数据一致  [在主节点执行该命令]

pt-table-sync --replicatetest.checksums --user=root --password=root  h=192.168.2.11 --execute

范例5:根据pt-table-checksum使从的数据和主的数据一致

pt-table-sync --replicatetest.checksums --user=root --password=root \

--sync-to-master h=192.168.2.12,D=test,t=aaa--execute

同步host1上的db.tbl到host2:

# pt-table-sync --executeh=host1,D=db,t=tbl h=host2

同步host1上的所有表到host2和host3:

# pt-table-sync --execute host1host2 host3

Same as above butonly resolve differences on slave1:

# pt-table-sync --sync-to-master --replicatetest.checksum slave1 --execute

Sync master2 in amaster-master replication configuration, where master2’s copy of db.tbl isknown or suspected to be incorrect:

# pt-table-sync --execute--sync-to-master h=master2,D=db,t=tbl

下面补充一个很不错的主从数据不一致的数据修复案例:

step0、修改从节点数据让主从不一致

> delete from hellodb.studentswhere StuID=24;   # 在从节点执行删除行操作

step1、发现主从数据不一致 [该命令在主节点执行]

# pt-table-checksum--nocheck-replication-filters --databases=hellodb --replicate=test.checksums --host=192.168.2.11 --user=root--password=root --port 3306 --no-check-binlog-format

step2、输出不一致的数据条目  [该命令在主节点执行]

# pt-table-sync --replicate=test.checksums h=192.168.2.11,u=root,p=root h=192.168.2.12,u=root,p=root --print

step3、修复操作,确保主从数据一致 [该命令在主节点执行]

# pt-table-sync--replicate=test.checksums  h=192.168.2.11,u=root,p=rooth=192.168.2.12,u=root,p=root --execute

step4、再次检查主从数据是否一致

# pt-table-checksum--nocheck-replication-filters --databases=hellodb --replicate=test.checksums --host=192.168.2.11 --user=root--password=root --port 3306 --no-check-binlog-format

这样就数据同步了,如果不放心的话可以到从节点去看下hellodb.students的数据是否和主节点的一致了。

时间: 2024-10-10 17:28:17

Percona-tookit学习笔记(六)的相关文章

python之raw_input()(学习笔记六)

python之raw_input()(学习笔记六) 我们经常使用raw_input()读取用户的输入,如下例子所示: >>> name = raw_input('please input your name:'),截图如下: 下面简单说下,raw_input()与if搭配使用,脚本如下: #!/usr/bin/env python # -*- coding:utf-8 -*- birth = raw_input('birth:') if birth < 2000: print '0

swift学习笔记(六)析构过程和使用闭包对属性进行默认值赋值

一.通过闭包和函数实现属性的默认值 当某个存储属性的默认值需要定制时,可以通过闭包或全局函数来为其提供定制的默认值. 注:全局函数结构体和枚举使用关键字static标注    函数则使用class关键字标注 当对一个属性使用闭包函数进行赋值时,每当此属性所述的类型被创建实例时,对应的闭包或函数会被调用,而他们的返回值会被作为属性的默认值. ESC: Class SomeCLass{ let someProperty:SomeType={ //给someProperty赋一个默认值 //返回一个与

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

初探swift语言的学习笔记六(ARC-自动引用计数,内存管理)

Swift使用自动引用计数(ARC)来管理应用程序的内存使用.这表示内存管理已经是Swift的一部分,在大多数情况下,你并不需要考虑内存的管理.当实例并不再被需要时,ARC会自动释放这些实例所使用的内存. 另外需要注意的: 引用计数仅仅作用于类实例上.结构和枚举是值类型,而非引用类型,所以不能被引用存储和传递. swift的ARC工作过程 每当创建一个类的实例,ARC分配一个内存块来存储这个实例的信息,包含了类型信息和实例的属性值信息. 另外当实例不再被使用时,ARC会释放实例所占用的内存,这些

Linux System Programming 学习笔记(六) 进程调度

1. 进程调度 the process scheduler is the component of a kernel that selects which process to run next. 进程调度器需要使 处理器使用率最大化,并且提供 使多个进程并发执行的虚拟 Deciding which processes run, when, and for how long is the process scheduler's fundamental responsibility. 时间片:th

Lua学习笔记(六):函数-续

Lua中的函数是带有词法定界(lexical scoping)的第一类值(first-class values).第一类值指:在Lua中函数和其他值(数值.字符串)一样,函数可以被存放在变量中,也可以存放在表中,可以作为函数的参数,还可以作为函数的返回值.词法定界指:嵌套的函数可以访问他外部函数中的变量.这一特性给Lua提供了强大的编程能力. Lua中关于函数稍微难以理解的是函数也可以没有名字,匿名的.当我们提到函数名(比如print),实际上是说一个指向函数的变量,像持有其他类型的变量一样:

laravel3学习笔记(六)

原作者博客:ieqi.net ==================================================================================================== ORM Laravel3中MVC体系中Model里最重要的组成部分无疑是ORM了,ORM — object-relational mapper — 将数据操作面向对象化,使得整个web框架的核心风格统一,降低整体复杂度,为开发者提供便利. Laravel3中的ORM叫

IBatis.Net学习笔记六--再谈查询

在IBatis.Net学习笔记五--常用的查询方式 中我提到了一些IBatis.Net中的查询,特别是配置文件的写法. 后来通过大家的讨论,特别是Anders Cui 的提醒,又发现了其他的多表查询的方式.在上一篇文章中我提到了三种方式,都是各有利弊:第一种方式当数据关联很多的情况下,实体类会很复杂:第二种方式比较灵活,但是不太符合OO的思想(不过,可以适当使用):第三种方式最主要的问题就是性能不太理想,配置比较麻烦. 下面是第四种多表查询的方式,相对第二种多了一点配置,但是其他方面都很好(当然

[傅里叶变换及其应用学习笔记] 六. 热方程讨论

这份是本人的学习笔记,课程为网易公开课上的斯坦福大学公开课:傅里叶变换及其应用. 上节课讲到,在对非周期函数进行傅里叶分析时,有 $C_k = \displaystyle{\frac{1}{T}\int_{-\frac{T}{2}}^{\frac{T}{2}}f(t)e^{-2\pi i\frac{k}{T}t}dt }$ $f(t) = \displaystyle{\sum_{k=-\infty}^{\infty}C_ke^{2\pi i\frac{k}{T}t} }$ 我们希望仅让$T\to

ActiveMQ学习笔记(六)——JMS消息类型

1.前言 ActiveMQ学习笔记(四)--通过ActiveMQ收发消息http://my.oschina.net/xiaoxishan/blog/380446 和ActiveMQ学习笔记(五)--使用Spring JMS收发消息http://my.oschina.net/xiaoxishan/blog/381209   中,发送和接受的消息类型都是TextMessage,即文本消息(如下面的代码所示).显然消息类型只有文本类型是不能满足要求的. //发送文本消息  session.create