实现MySQL延时备份的几个方案

背景

MySQL同步在快速的网络中是毫秒级的,如果有误操作,从库也很快变更了,对于一些频繁进行,不是经过严格测试的操作或者某些误操作,可能带来风险。而延时备份就可以解决这个问题,他会使从库落后主库一段时间,如果主库有误操作,完全有时间从从库恢复到误操作之前的状态。
要实现MySQL的延迟复制,方法主要有以下几种。

使用percona-toolkit工具集中pt-slave-delay延时备份工具来实现

percona-toolkit简介

MySQL数据库是轻量级、开源数据库的佼佼者,其功能和管理,健壮性与Oracle相比还是有相当的差距。因此有很多功能强大第三方的衍生产品,如percona-toolkit,XtraBackup等等。percona-toolkit是一组高级命令行工具的集合,可以查看当前服务的摘要信息,磁盘检测,分析慢查询日志,查找重复索引,实现表同步等等。这个工具套件对DBA及运维人员着实不可多得。

percona-toolkit的主要功能

Verify MySQL replication integrity by checking master and replica data consistency
Efficiently archive rows
Find duplicate indexes
Summarize MySQL servers
Analyze queries from logs and tcpdump
Collect vital system information when problems occur

实现原理

pt-slave-delay工具通过启动和停止复制sql线程来设置从库落后与主库的时间。默认是基于从库上relay日志的binlog的位置来判断,因此不需要连接到主库,如果IO进程不落后与主库太多的话这个方式有效 ,如果IO线程延时过大,pt-slave-delay也可以连接到主库来获取binlog的位置信息。pt-slave-delay一般是通过 –delay参数和–interval参数来控制。–delay参数控制延时时间,–interval参数控制是否启动或者停止从库上sql线程的频繁程度,默认是一分钟检查一次。如果正在运行这个工具,Ctrl+C后他是友好退出,在退出前他还启动复制sql线程。

安装需求及步骤

yum安装

#安装yum源
$ yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

#测试库
yum list | grep percona

# 安装
yum install percona-toolkit

# 数据库授权
mysql> GRANT PROCESS, REPLICATION CLIENT, SUPER ON *.* TO delay@127.0.0.1 identified by '123456';
mysql> FLUSH PRIVILEGES;

参考资料:
pt-slave-delay をcentos6.3で使う:http://spring-mt.tumblr.com/post/33227019581/pt-slave-delay-centos6-3

编译安装

下载链接:http://www.percona.com/software/percona-toolkit
需求
* Perl v5.8 or newer
* Bash v3 or newer
* Core Perl modules like Time::HiRes

#检查perl版本
# perl --version |head -2 
#检查bash版本
# bash --version          

安装依赖软件包

yum -y install perl-Time-HiRes perl-DBD-MySQL perl-DBI perl-CPAN

快速安装步骤(缺省/usr/local/bin路径下,过程略)
# wget -c http://www.percona.com/downloads/percona-toolkit/2.2.12/tarball/percona-toolkit-2.2.12.tar.gz
# tar zxvf percona-toolkit-.tar.gz
# cd percona-toolkit-
# perl Makefile.PL   (安装到非缺省目录 perl Makefile.PL PREFIX=${HOME})
# make
# make test (测试中提示:No tests defined for percona-toolkit extension.)
# make install

pt-slave-delay用法及参数介绍

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

选项值一般可以用默认的. 默认是延迟1小时.

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。

常用参数:

–config=A 以逗号分隔的配置文件,如果使用在第一个参数位置

–contiune 继续复制,正常退出(默认是yes)如果退出后重启线程没有until条件,他会正常运行追上master

–delay=m 从库延迟主库时长(默认是一小时)可选参数s=seconds,m=minutes,h=hours,d=days;如果没有参数默认是s

–help 查看帮助文档

–host 连接主机host

–interval 当需要启动或者停止slave时候对接检查一次(默认一分钟)可选参数s=seconds,m=minutes,h=hours,d=days

–log 打印所有输出到指定文件

–password 连接时所需密码

–port 端口号

–quite 静默模式,不打印输出到屏幕上

–run-time pt-slave-delay运行时长

–socket socket文件路径

–user 连接用户名

–version 显示版本号

帮助文档:

man /usr/bin/pt-slave-delay

pt-slave-delay --help

官方文档:http://www.percona.com/doc/percona-toolkit/2.2/pt-slave-delay.html

使用范例

使用范例:

使从库延后主库1小时,并且隔十分钟检查一次,运行10小时

pt-slave-delay --user=root   --passsword=*********  --port=****  --host=*.*.*.*  --delay=1h   --interval=10m  --run-time=10h

生产环境示例:
./pt-slave-delay u=xxxx,S=/tmp/mysql.sock,p=d1\\ccc(\* –log /home/mysql/scripts/log/delay.log –daemonize

测试
详情请参考:
percona-toolkit 之 【pt-slave-delay】说明:http://www.cnblogs.com/zhoujinyi/p/3384283.html

延时备份监控

监控用到两个脚本,一个脚本负责启动延时备份,另一个脚本负责监控延时备份的进程和从库的延时时间,如果检测到没有启动或者延时超时,即发出报警。这个监控脚本添加到定时任务cron中。启动时需要三个参数:host、port、delaytime,使用这些参数增大了监控脚本的使用范围并且可批量执行延时备份。

脚本一:

这个脚本负责启动延时备份,默认传入三个参数:host 、port、delaytime。delaytime默认使用“h”。

脚本二:

这个脚本添加到定时任务cron中,传入启动脚本中的三个默认参数:host、port、delaytime。监控两个状态

(1)pt-slave-delay进程是否在正常执行,如果检测不到pt-slave-delay进程则报警。

(2)对比从库监控表的 onlinetime 和主库时间戳,看是否时差超过延时时长delaytime,如果超出delaytime 则报警。

使用maatkit工具集中mk-slave-delay来实现延时备份

Maatkit已成为Percona的工具包的一部分,并且将不会有进一步的开发或分支从Percona的工具包中分离出来。支持是通过Percona的商业MySQL的支持和咨询服务提供。
具体实现步骤请参考:
MySQL延时备份之实现:http://blog.sina.com.cn/s/blog_502c8cc40100orrx.html

升级到MySQL 5.6以上版本

从 MySQL 5.6开始支持延时备份,增加了新参数MASTER_DELAY:

change master to master_delay = N;

N为从库延迟主库的秒数,默认是0。如果想要从库延迟一小时,则可:

stop slave;
change master to master_delay = 3600;
start slave;

一小时后从库才会开始同步数据。

这个是官方文档:http://dev.mysql.com/doc/refman/5.6/en/replication-delayed.html

扩展阅读:
rhel6系统中,mysql 5.6复制新特性下主从复制配置[基于GTID]:http://634871.blog.51cto.com/624871/1330643
MySQL 5.6 复制介绍:http://blog.itpub.net/24945919/viewspace-765032/

对旧版的MySQL打补丁

对旧版的mysql打补丁,比较复杂。
扩展阅读:
Delayed Replication:http://dev.mysql.com/doc/refman/5.6/en/replication-delayed.html

自己写脚本实现

自己写脚本实现,其实只要理解复制的原理,就知道如何实现了。
MySQL AB复制原理:
Master 服务器 (主服务器) 通过把所有涉及到数据库更新操作都记录到二进制日志当中,
然后Slave 服务器(从服务器)就会通过IO_THREAD线程如连接主服务器,然后主服务器会通过IO_THREAD应答从服务器,然后开始传输二进制日志。从服务器接受到相应的日志记录之后,就会通过SQL_THREAD线程去执行日志当中记录的更改.

这里只是简单提示一下,就不贴出详细的脚本代码了。只要用脚本登陆从服务器,把SQL_THREAD线程停止就行了,等到一定时间间隔后,恢复该线程,而IO_THREAD还是继续问主服务器下载二进制变更信息。

mysql> STOP SLAVE SQL_THREAD;

总结

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

执行:

slave stop;

再执行:

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

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

附录:
1、经测试,发现MariaDB 10.0.x 版本目前还暂不支持MySQL 5.6 中的MASTER_DELAY选项。
参考资料:
How to set delayed replication with MariaDB 10.0.11:http://dba.stackexchange.com/questions/81150/how-to-set-delayed-replication-with-mariadb-10-0-11
2、percona工具包主要工具介绍
如果是非源码安装或源码安装是未指定路径,缺省情况下所有的pt相关的工具位于/usr/local/bin目录下(如果是yum安装,则在/usr/bin目录下),以pt-开头。
获取有关命令行的帮助信息,直接在shell提示符下输入命令行与–hlep即可。如: /usr/bin/pt-upgrade –help
# ls -hltr /usr/bin/pt-*
pt-upgrade
#该命令主要用于对比不同mysql版本下SQL执行的差异,通常用于升级前进行对比。
#会生成SQL文件或单独的SQL语句在每个服务器上执行的结果、错误和警告信息等。

pt-online-schema-change
#功能为支持在线变更表构,且不锁定原表,不阻塞原表的DML操作。
#该特性与Oracle的dbms_redefinition在线重定义表原理基本类似。

pt-mysql-summary
#对连接的mysql服务器生成一份详细的配置情况以及sataus信息
#在尾部也提供当前实例的的配置文件的信息

pt-mext
#并行查看SHOW GLOBAL STATUS的多个样本的信息。
#pt-mext会执行你指定的COMMAND,并每次读取一行结果,把空行分割的内容保存到一个一个的临时文件中,最后结合这些临时文件并行查看结果。

pt-kill
#Kill掉符合指定条件mysql语句

pt-ioprofile
#pt-ioprofile的原理是对某个pid附加一个strace进程进行IO分析

pt-fingerprint
#用于生成查询指纹。主要将将sql查询生成queryID,pt-query-digest中的ID即是通过此工具来完成的。
#类似于Oracle中的SQL_ID,涉及绑定变量,字面量等

pt-find
#用与查找mysql表并执行指定的命令,类似于find命令

pt-fifo-split
#模拟切割文件并通过管道传递给先入先出队列而不用真正的切割文件

pt-deadlock-logger
#用于监控mysql服务器上死锁并输出到日志文件,日志包含发生死锁的时间、死锁线程id、死锁的事务id、发生死锁时事务执行时间等详细信息。

pt-archiver
#将mysql数据库中表的记录归档到另外一个表或者文件
#该工具只是归档旧的数据,对线上数据的OLTP查询几乎没有影响。
#可以将数据插入另外一台服务器的其他表中,也可以写入到一个文件中,方便使用load data infile命令导入数据。

pt-agent
#基于Percona Cloud的一个客户端代理工具

pt-visual-explain
#用于格式化explain的输出

pt-variable-advisor
#用于分析mysql系统变量可能存在的一些问题,可以据此评估有关参数的设置正确与否。

pt-stalk
#用于收集mysql数据库故障时的相关信息便于后续诊断处理。

pt-slave-delay
#用于设定从服务器落后于主服务器的时间间隔。
#该命令行通过启动和停止复制sql线程来设置从落后于主指定时间。

pt-sift
#用于浏览pt-stalk生成的文件。

pt-show-grants
#将当前实例的用户权限全部输出,可以用于迁移数据库过程中重建用户。

pt-query-digest
#用于分析mysql服务器的慢查询日志,并格式化输出以便于查看和分析。

pt-pmp
#为查询程序执行聚合的GDB堆栈跟踪,先进性堆栈跟踪,然后将跟踪信息汇总。

pt-index-usage
#从log文件中读取查询语句,并用分析当前索引如何被使用。
#完成分析之后会生成一份关于索引没有被查询使用过的报告,可以用于分析报告考虑剔除无用的索引。

pt-heartbeat
#用于监控mysql复制架构的延迟。
#主要是通过在主库上的–update线程持续更新指定表上的一个时间戳,从库上–monitor线程或者–check线程检查主库更新的时间戳并与当前系统时间对比,得到延迟值。

pt-fk-error-logger
#将外键相关的错误信息记录到日志或表。

pt-duplicate-key-checker
#功能为从mysql表中找出重复的索引和外键,这个工具会将重复的索引和外键都列出来
#同时也可以生成相应的drop index的语句

pt-diskstats
#类似于iostat,打印磁盘io统计信息,但是这个工具是交互式并且比iostat更详细。可以分析从远程机器收集的数据。

pt-config-diff
#用于比较mysql配置文件和服务器变量
#至少2个配置源需要指定,可以用于迁移或升级前后配置文件进行对比

pt-align
#格式化输出

pt-slave-find
#连接mysql主服务器并查找其所有的从,然后打印出所有从服务器的层级关系。

pt-table-checksum
#用于校验mysql复制的一致性。
#该工具主要是高效的查找数据差异,如果存在差异性,可以通过pt-table-sync来解决。

参考资料:
percona-toolkit的安装及简介:http://blog.csdn.net/leshami/article/details/41315139
pt-slave-delay延时备份原理、实现及监控:http://blog.chinaunix.net/uid-24485075-id-3528826.html
实现Mysql延迟复制,用于逻辑误操作恢复:http://www.tanpao.com/archives/147

发表评论?

0 条评论。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据