备份校验两不误,MySQL自动备份还原校验设计详解

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

作者介绍

庞阔优朋普乐传媒运维基础部经理。负责数据库运营管理及平台设计开发,监控设计改进,问题跟踪处理,机房网络维护管理,目前四个专利已在专利局申请中。擅长数据库运维管理及Shell、Perl、PHP编写。

 

背景
 

 

最近关于数据库故障出现的问题较多,不论大小公司对数据的备份要求都很高,但对校验数据备份的有效性要求更为迫切,很多公司对于自动备份和还原都已经形成体系,但对于还原后的备份有效性校验可能都不太完善,而且目前网上也没有较为完善的检验机制(可能我没找到)。

 

对数据库备份的有效性校验的方法或样例选择,直接关系到备份数据的质量指标。本文将分享我做的一个设计,此设计是直接采用线上执行的SQL提取出select,包括复杂join类型的SQL加上当前存在的库及表信息,提高了备份校验的准确性。

 

这是我在申请数据库相关专利时推演出来的方案,在寻找一个好的校验备份还原后的数据衡量指标,偶然地和备份还原进行结合时出现了这个设计。当数据库实例越来越多时,这个有效性校验的需求会越来越强。

 

下面将简单介绍一下我的校验数据的设计方案,或许它能给你一个思路或想法,当然我也希望能有其他好的方案出来,共同学习。(注:部分信息做了脱敏处理)

 

系统处理流程
 

 

程序处理流程如下:

 

 

根据上面的流程图,大致分为5个步骤,有6个脚本程序来完成这个流程,每个步骤其实不是很难,实际中可根据自己的业务特定进行完善,下面我简单介绍此流程中主要的几个功能。

 

功能介绍
 

 

  1. 自动备份功能

    (可自行设置,我是配置的定时任务,平台在对接中)

  2. 自动还原功能

    自动下载备份并还原。

  3. SQL及库表自动上报功能

    1)上报本机数据库的库表信息,主要用来比对还原后库表信息是否一一对应,如果对应正常,否则异常,进行报警处理。

    2)汇报SQL,为保证SQL的真实性,此方法是监听general_log,分析后获取Select 类型SQL,并执行此SQL 降获取到的sql 及查到的值 汇报到数据中心作为样例SQL使用。

  4. 还原后库表及SQL自动比对功能

    1)还原后自动调用数据库中心获取库表信息,进行一一比对。

    2)获取SQL信息进行原来和还原后数据值的匹配校验,如果对应则正常,否则为异常。

 

注:在下面演示过程中以手动形式,可根据公司具体情况设置为自动。

 

环境介绍
 

 

数据库机器:172.16.20.5

备份机器:172.16.20.6

还原机器:172.16.20.7

备份工具:mydumper

编程语言:Shell+Perl

备份传输工具:rsync

 

部署
 

 

1、备份机器rsync部署

 

对于数据中心做备份之前采取过如下几个方案。我简单概括一下:

 

  • NFS:由一块设备进行网络远程挂载,只需安装NFS服务即可,操作简单。但是有个问题就是当NFS服务出现问题或网络中断时你去使用磁盘会出现挂起的现象。

  • FTP:也用过FTP来做备份服务,但有时会出现登录失败的现象,对于不同目录权限设置较为复杂,不方便维护;上传下载编写脚本也不是太方便。

  • Rsync:改为Rsync,主要是配置简单,上传下载也简单的多,一条命令即可;对于增量的传输很有用。

 

重要部分如下:

[back5]

path = /opt/mysql_bak/172.16.20.5

comment = www file

ignore errors

read only = false

list = false

uid = root

gid = root

 

2、数据库机器和还原机器安装mydumper

 

mydumper第三方开用于对MySQL数据库进行多线程备份和恢复的开源工具。开发人员主要来自MySQL、Facebook和SkySQL公司,目前由Percona公司开发和维护,是Percona Remote DBA项目的重要组成部分;不同于官方的mysqldump、mysqlpump的是对库表备份和还原采用多线程,对于快速备份和恢复是不错的选择;当然还有percona的xtrabackup相当于物理备份的工具,但是耗费空间较大。

 


 

3、数据库上执行备份脚本

 

脚本如下:

\
 

4、数据中心表结构设计

 

在数据中心创建下面的表,这些表主要用来存储备份时上报的库表信息和SQL信息,用后续步骤还原校验时做提供样例值。

 

  • 库表汇报的表结构

 


\

 

  • SQL 表结构

 


\

 

5、数据库机器上汇报

 

1)库表汇报程序地址:自行下载和修改

https://github.com/kevin6386/db_table_report/blob/master/db_table_report

运行即可。

 

2)SQL汇报程序

程序地址:https://github.com/kevin6386/db_sql_report/blob/master/db_sql_report

运行即可。

 

6、数据库备份还原

 

下载备份并还原(简单分解介绍):

 

用 rsync 下载备份到本地,并解压

rsync -zrtoapg --progress  root@172.16.20.6::back5/备份文件名 ./

 

恢复命令:

/usr/local/bin/myloader  -u user -p pass -o  -d 备份地址 -t 8

 

7、校验

 

此时才是整个流程设计的重点,针对还原后的数据,怎么做校验才是重要的,而且校验的样例或方法直接关系数据备份有效性的指标。

 

1)还原后数据库表的校验

 

程序地址:https://github.com/kevin6386/db_table_diff/blob/master/db_table_diff

 

比较结果如下:

 

邮件截图

 

2)还原后数据SQL的校验

 

程序地址:https://github.com/kevin6386/db_sql_diff

 

比较结果如下:

 

邮件截图:如果正常则附件会有SQL,否则为空。

 

 

异常截图

 

出现异常有如下几种情况:

  1. 备份时和general_log提取有时间的差异;当获取SQL出现在备份前或备份后有数据修改的情况下会出现。(可采用低峰时或很少修改的字段进行提取样例)

  2. 某些表还原异常,数据丢失。(比如我遇到过触发器的情况,表与表有依赖)

  3. 我用从库的备份比对主库的SQL。(有可能从库和主库不一致)

  4. 备份时有丢失的表或记录。(有时备份的命令问题或漏备份)

 

附件SQL信息

 

 

8、关于备份的汇报   

 

我是汇报每天的备份大小及文件名,然后写SQL比对今天的备份和前2天的信息。

 

如下:

 

 

 

总结
 

 

设计完这个方案后开始编写分程序花了一段时间,同时感谢我的同事帮我重复测试这个设计方案,发现之前备份还原过程中出现的问题改善了很多,重要的是不用人工去抽取还原后的数据结果。当这个方案固定后基本上很少有人工的参与,减少了人工还原备份和校验备份重复的工作;并且可以准确地知道哪部分有问题,减少了对数据库备份是否正常的担忧。当然还有很多要完善的方面,欢迎有兴趣的朋友在留言区提出建议,一起交流。

原文发布时间为:2017-03-28

本文来自云栖社区合作伙伴DBAplus

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
77 4
|
10天前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
28 3
|
10天前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
24 3
|
1月前
|
安全 关系型数据库 MySQL
MySQL用户备份
【10月更文挑战第2天】MySQL用户备份
53 3
|
1月前
|
存储 关系型数据库 MySQL
MySQL如何备份?
【10月更文挑战第2天】MySQL如何备份?
95 3
|
2月前
|
NoSQL 关系型数据库 MySQL
当Redis与MySQL数据一致性校验中Redis数据量小于MySQL时的全量查询处理方法
保持Redis和MySQL之间的数据一致性是一个需要细致规划和持续维护的过程。通过全量数据同步、建立增量更新机制,以及定期执行数据一致性校验,可以有效地管理和维护两者之间的数据一致性。此外,利用现代化的数据同步工具可以进一步提高效率和可靠性。
57 6
|
3月前
|
数据可视化 关系型数据库 MySQL
Mysql8 如何在 Window11系统下完成跳过密钥校验、完成数据库密码的修改?
这篇文章介绍了如何在Windows 11系统下跳过MySQL 8的密钥校验,并通过命令行修改root用户的密码。
Mysql8 如何在 Window11系统下完成跳过密钥校验、完成数据库密码的修改?
|
3月前
|
SQL 关系型数据库 MySQL
在Linux中,如何备份和恢复MySQL数据库?
在Linux中,如何备份和恢复MySQL数据库?
|
3月前
|
存储 关系型数据库 MySQL
MySQL备份与恢复
MySQL备份与恢复
59 0
|
3月前
|
关系型数据库 MySQL Shell
分享一篇mysql数据库备份脚本
分享一篇mysql数据库备份脚本
32 0