percona-toolkit 之 【pt-slave-delay】说明
摘要:
在主从复制的架构中,正常情况下主上操作的记录也会在从上进行操作,虽说是异步复制,但操作会“实时”的同步到从。比如在主上不小心误操作了,还没等反应过来从上也会马上执行误操作,后期只有通过二进制或则备份恢复数据了,费时,又费力,没有任何回旋的余地,而且也会影响到网站的功能。而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】说明的更多相关文章
- Percona Toolkit mysql辅助利器
1 PT介绍 Percona Toolkit简称pt工具—PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在 ...
- Percona Toolkit工具使用
Percona Toolkit简称pt工具-PT-Tools,是Percona公司开发用于管理MySQL的工具,功能包括检查主从复制的数据一致性.检查重复索引.定位IO占用高的表文件.在线DDL等 下 ...
- 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 ...
- 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 Xtrabackup创建MySQL slave库
一.使用Percona Xtrabackup创建MySQL slave库 MySQL Server 版本: Server version: 5.7.10-log MySQL Community Ser ...
- Percona Toolkit工具连接MySQL 8报错的解决方案
使用Percona Toolkit的工具连接MySQL 8.x数据库时,会遇到类似"failed: Plugin caching_sha2_password could not be loa ...
- percona toolkit之slave工具
1:pt-slave-find ,主要是查找MySQL的层级,其实我感觉这个用处不是很大,因为层级比较多架构本身就很少,查看从库的话一般情况我们可以通过show slave hosts查看(不过不能显 ...
- 使用Percona Toolkit解决Mysql主从不同步问题【备忘】
由于各种原因,mysql主从架构经常会出现数据不一致的情况出现,大致归结为如下几类 1:备库写数据 2:执行non-deterministic query 3:回滚掺杂事务表和非事务表的事务 4:bi ...
随机推荐
- linux下如何使用sftp命令【转】
linux下如何使用sftp命令 from: http://www.cnblogs.com/chen1987lei/archive/2010/11/26/1888391.html sftp 是一个 ...
- Vim 的 tab 设置
文章转自:http://blog.csdn.net/shell_picker/article/details/6033023 摘自 Vim 手册: 选项:1. tabstop:表示一个 tab 显示出 ...
- ExtJS -- ArrayStore
ArrayStore : // Store for array var myStore = new Ext.data.ArrayStore({ storeId: "arrayStore&qu ...
- 关于IE7 默认有边框的解决方案
这个问题出现在IE7中,因为body有默认的border.这个原因是由于声明引起的. 加了这个头就可以了 * {border:0;} 以上的 CSS 在 XHTML 下是无效果的,将 DOCTYPE ...
- Nginx如何隐藏index.html
我要隐藏目录下的index.html,修改Nginux配置如下: 1.修改文档顺序 index index.html index.php 2.开启目录流量 在server或location 段里添加 ...
- 透过统计力学,模拟软物质——EPJE专访2016年玻尔兹曼奖得主Daan Frenkel
原文来源:Eur. Phys. J. E (2016) 39: 68 2016年玻尔兹曼奖得主Daan Frenkel接受欧洲物理学报E专访,畅谈统计物理在交叉科学研究中的前所未有的重要性. 统计物理 ...
- HDU 2010
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int Is_SXH(int num); int main() { int in1, ...
- BSA混合分离分析法
BSA(Bulked Segregant Analysis)又称混合群体分离分析法,是利用极端性状进行功能基因挖掘的一种方法.主要思想是将两个具有极端性状的群体进行混池测序,比较两个群体在多态位点(S ...
- PHP安装laravel(win+linux)
作为一名不优秀的程序猿,忙碌的四月终于结束了,五一大假的最后一天,终于有时间来整理整理这段时间的收获了. 一.laravel介绍 首先看看http://www.sitepoint.com/网站做的一个 ...
- 【bzoj3631】[JLOI2014]松鼠的新家
题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树"上.松 ...