摘要:

在主从复制的架构中,正常情况下主上操作的记录也会在从上进行操作,虽说是异步复制,但操作会“实时”的同步到从。比如在主上不小心误操作了,还没等反应过来从上也会马上执行误操作,后期只有通过二进制或则备份恢复数据了,费时,又费力,没有任何回旋的余地,而且也会影响到网站的功能。而pt-slave-delay故意让主上的操作延迟制定的时间写入到从,这样就可以快速的处理上面说的问题了。下面介绍下使用方法,其实挺简单的。

前提:

下载地址:wget www.percona.com/downloads/percona-toolkit/2.2.2/percona-toolkit-2.2.2.tar.gz

安装方法:perl Makefile.PL;make;make install

使用方法:

pt-slave-delay [OPTIONS] SLAVE_DSN [MASTER_DSN]

执行该命令链接数据库的账号需要有 PROCESS、REPLICATION CLIENT、and SUPER权限。他是通过Slave的relay log(中继日志)的position(偏移量),不断启动,关闭 replication SQL thread 来保持主从一直延时固定的时间来实现的,所以没有必要链接主服务器。如果想在运行中停止的话,按CTRL+C中断就可以了。具体执行的命令:

pt-slave-delay --delay=1m --interval=15s --run-time=10m u=root,p=123456,h=192.168.200.25,P=3307

#--delay     :从库延迟主库的时间,上面为1分钟。
#--interval :检查的间隔时间,上面为15s检查一次。(可选),不选则1分钟检查一次。
#--run-time :该命令运行时间,上面为该命令运行10分钟关闭。(可选),不选则永远运行。
#--ask-pass :隐性输入密码。
其他的为链接数据库的账号信息,账号要有PROCESS, REPLICATION CLIENT, and SUPER权限 注意:延迟的时间实际为 delay+interval,即该命令的让从延迟主75s。

还有一些具体的参数请见:http://www.percona.com/doc/percona-toolkit/2.2/pt-slave-delay.html

背景:

主:
root@localhost : aaa 02:37:21>select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
3 rows in set (0.00 sec) 从: root@192.168.200.25 : aaa 03:11:44>select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
3 rows in set (0.00 sec) root@192.168.200.25 : aaa 03:12:05>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.200.25
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000003
Read_Master_Log_Pos: 1919
Relay_Log_File: zhoujy-relay-bin.000131
Relay_Log_Pos: 1636
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB: aaa
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1919
Relay_Log_Space: 1951
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID:
Master_Info_File: /opt/mysql/mysql5.6/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0

执行:

session1:命令

zhoujy@zhoujy:~$ pt-slave-delay --delay=1m --interval=15s --run-time=10m --ask-pass u=root,h=192.168.200.25,P=3307
Enter password for 192.168.200.25:
2013-10-23T15:16:40 slave running 0 seconds behind
2013-10-23T15:16:40 STOP SLAVE until 2013-10-23T15:17:40 at master position mysql-bin.000003/1919
2013-10-23T15:16:55 slave stopped at master position mysql-bin.000003/1919
2013-10-23T15:17:10 slave stopped at master position mysql-bin.000003/1919
2013-10-23T15:17:25 slave stopped at master position mysql-bin.000003/1919
2013-10-23T15:17:40 no new binlog events

session2:主

root@localhost : aaa 03:17:34>insert into test(name) values('d'),('e');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0 root@localhost : aaa 03:17:44>select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
+----+------+
5 rows in set (0.00 sec)

session3:从

root@192.168.200.25 : aaa 03:17:31>select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
+----+------+
3 rows in set (0.00 sec)

从session3里面看到,数据还没有同步过来,因为在session2里插入了数据,继续看session1的输出日志:

zhoujy@zhoujy:~$ pt-slave-delay --delay=1m --interval=15s --run-time=10m --ask-pass u=root,h=192.168.200.25,P=3307
Enter password for 192.168.200.25:
2013-10-23T15:16:40 slave running 0 seconds behind
2013-10-23T15:16:40 STOP SLAVE until 2013-10-23T15:17:40 at master position mysql-bin.000003/1919
2013-10-23T15:16:55 slave stopped at master position mysql-bin.000003/1919
2013-10-23T15:17:10 slave stopped at master position mysql-bin.000003/1919
2013-10-23T15:17:25 slave stopped at master position mysql-bin.000003/1919
2013-10-23T15:17:40 no new binlog events
-10-23T15:17:55 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:18:10 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:18:25 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:18:40 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:18:55 START SLAVE until master 2013-10-23T15:17:55 mysql-bin.000003/
2013-10-23T15:19:10 slave running 0 seconds behind

在日志里面看到了,在15:17:55的时候检测到了新的事件,在15:18:55的时候进行了同步,数据差不多在15:17:40写进去的,时间点刚好一致。15s后检测到了,1m后同步到从。

继续看从上的数据:

root@192.168.200.25 : aaa 03:18:57>select * from test;
+----+------+
| id | name |
+----+------+
| 1 | a |
| 2 | b |
| 3 | c |
| 4 | d |
| 5 | e |
+----+------+
5 rows in set (0.00 sec)

最后命令运行了10m后,自动结束:

2013-10-23T15:25:40 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:25:55 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:26:10 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:26:25 no new binlog events
2013-10-23T15:26:40 slave stopped at master position mysql-bin.000003/2142
2013-10-23T15:26:40 Setting slave to run normally

原理:

这个过程的实现:

pt-slave-delay –delay=10m 开始运行

(a)连接到从服务器
检测从服务器落后主服务器多少秒$behind,并输出。
然后记录当前时间,以及Slave_IO_Thread获取到的master_log_file与read_master_log_pos做为一个对象,保存到某数组@positions中。

情况一:
如果从服务器的Slave_SQL_Thread正在运行,并且$behind小于10分钟, STOP SLAVE SQL_THREAD,并计算出多长时间之后(now()-$behind+10分钟),
才需要再次START SLAVE。再次START的时间点称为$next_start。等待一分钟,再goto(a)

情况二:
如果从服务器的Slave_SQL_Thread正在运行,并且$behind超出10分钟, 那就什么也不做。

情况三:
如果从服务器的Slave_SQL_Thread已经被STOP了,并且当前时间没有达到$next_start, 那就等待一分钟,再goto(a)

情况四:
如果从服务器的Slave_SQL_Thread已经被STOP了,并且当前时间达到$next_start,说明从服务器已经休息够了,
就从数组@positions中挑选一个合适的对象出来,此对象记录的时间要比较接近当前时间的10分钟之前。
然后START SLAVE SQL_THREAD UNTIL 此对象的master_log_file与read_master_log_pos。等待一分钟,goto(a)

总结:

通过上面的方法很好的解决了主的误操作影响到从,前提是从允许延迟一定的时间。那如何解决呢?当在主上执行了误操作之后,回到从上

执行:

slave stop;

再执行:

MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos  Pos通过mysqlbinlog查看二进制日志获得。

这样就跳过了错误,最后通过切换主从或则把从的表覆盖到主上(需要关闭应用)让主的误操作的数据恢复,和通过binlog和备份比大大减少了恢复时间。

在5.6里面已经包含了延迟这个功能:

CHANGE MASTER TO MASTER_DELAY = N ...;

percona-toolkit 之 【pt-slave-delay】说明的更多相关文章

  1. Percona Toolkit mysql辅助利器

    1 PT介绍 Percona Toolkit简称pt工具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在 ...

  2. Percona Toolkit工具使用

    Percona Toolkit简称pt工具-PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在线DDL等 下 ...

  3. Percona Toolkit工具集介绍

    部署mysql工具是一个非常重要的部分,所以工具的可靠性和很好的设计非常重要.percona toolkit是一个有30多个mysql工具的工具箱.兼容mysql,percona server,mar ...

  4. 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 ...

  5. Centos 安装Percona Toolkit工具集

    1.下载 下载地址:   https://www.percona.com/downloads/percona-toolkit/LATEST/ [root@bogon ~]# wget https:// ...

  6. RDS for MySQL 如何使用 Percona Toolkit

    Percona Toolkit 包含多种用于 MySQL 数据库管理的工具. 下面介绍常用的 pt-online-schema-change  和  pt-archiver 搭配 RDS MySQL ...

  7. 使用Percona Xtrabackup创建MySQL slave库

    一.使用Percona Xtrabackup创建MySQL slave库 MySQL Server 版本: Server version: 5.7.10-log MySQL Community Ser ...

  8. Percona Toolkit工具连接MySQL 8报错的解决方案

    使用Percona Toolkit的工具连接MySQL 8.x数据库时,会遇到类似"failed: Plugin caching_sha2_password could not be loa ...

  9. percona toolkit之slave工具

    1:pt-slave-find ,主要是查找MySQL的层级,其实我感觉这个用处不是很大,因为层级比较多架构本身就很少,查看从库的话一般情况我们可以通过show slave hosts查看(不过不能显 ...

  10. 使用Percona Toolkit解决Mysql主从不同步问题【备忘】

    由于各种原因,mysql主从架构经常会出现数据不一致的情况出现,大致归结为如下几类 1:备库写数据 2:执行non-deterministic query 3:回滚掺杂事务表和非事务表的事务 4:bi ...

随机推荐

  1. 【转】常用的shell脚本

    from:http://blog.sina.com.cn/s/blog_4152a9f501013r6c.html 常用的shell脚本 (2012-10-10 22:09:07) 转载▼ 标签: 杂 ...

  2. 用jquery写循环播放div -2

    前面所说的class html元素标签的写法也要有层次性, 这个层次性其实也就是常说的 css类写法要有一个"命名空间, 名字空间" "namespace" 在 ...

  3. django 文件上传

    模板文件: <form method='post' action='/script/upload/' enctype="multipart/form-data" accept ...

  4. 在Linux下和Windows下遍历目录的方法及如何达成一致性操作

    最近因为测试目的需要遍历一个目录下面的所有文件进行操作,主要是读每个文件的内容,只要知道文件名就OK了.在Java中直接用File类就可以搞定,因为Java中使用了组合模式,使得客户端对单个文件和文件 ...

  5. 使用mvvm框架avalon开发公司内部运营管理系统的一些心得

    接触avalon差不多有一年时间了,当时是看前端大牛司徒正美的博客才了解到还有这么一个高大上的玩意,然后就加入了avalon的讨论群.从群里零零散散的了解了avalon的一些特性,感觉很强大,感觉思想 ...

  6. UESTC 1852 Traveling Cellsperson

    找规律水题... Traveling Cellsperson Time Limit: 1000ms Memory Limit: 65535KB This problem will be judged ...

  7. Hadoop 之Mong DB 之CentOS 6 使用 yum 安装MongoDB及服务器端配置

    安装MongoDB的方法有很多种,可以源代码安装,在Centos也可以用yum源安装的方法.由于MongoDB更新得比较快,我比较喜欢用yum源安装的方法.64位Centos下的安装步骤如下: 1.准 ...

  8. DAY1 linux 50条命令

    1. tar压缩,解压缩 tar -cvf *** (压缩) tar -xvf ***  (解压缩) [root@bogon ~]# tar cvf test.tar test/ test/ test ...

  9. HDU 5033 Building

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5033 解题报告:在一条x轴上有n个建筑物,每个建筑物有一个高度h,然后现在有q次查询,查询的内容是假设 ...

  10. leetcode 215. Kth Largest Element in an Array

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...