Mysql数据库按时间点恢复实战记录

简介:Mysql数据库按时间点恢复实战

对于任何一家企业来讲,数据都是最宝贵的财富。

如何保护数据完整性,数据不受损坏,在发生故障时,如何保住数据,在发生误操作,黑客入侵,数据篡改等场景时,如何基于我们的备份来进行数据恢复,是每个技术人员需要关注的关键点。

阿里云致力于服务客户,为客户数据库提供连续数据保护、低成本的备份服务。它可以为多种环境的数据提供强有力的保护,以及强力恢复。在发生数据丢失、数据损坏的极端情况下,RDS管控平台具有一键还原的功能,基于客户设置的需要恢复的时间点,进行数据全方位恢复。

​​1. 按时间点恢复的技术实现​

如果客户在某时间节点由于误操作,导致数据丢失,RDS管控服务是如何进行恢复的呢?

按时间点恢复的整体思路如下:一次完整的数据恢复是由物理备份+binlog恢复+binlog裁剪构成的。

图1

首先获取到可用的备份集,将备份集应用到目标实例上,然后再目标实例重放需要恢复的binlog文件,最后通过binlog裁剪的形式应用sql文件,实现整体的恢复。

2. 按时间点恢复的管控流程

1. 创建用于恢复的目的实例

当我们需要整体恢复源数据库数据时,我们首先需要创建一个与源实例同规格、同网络环境的目标实例。

为什么要这样做?

因为备份恢复属于高危操作,如果直接还原到源实例,一旦出现备份集不可用、binlog缺失等等问题,那么不仅丢失数据无法找回,甚至原数据都无法完好保住,所以强烈建议使用新实例来进行恢复!

2. 明确备份恢复时间点

当客户在执行了一系列数据库操作之后,如误删除、误修改等,操作之后无感知,等到业务受损、故障发生时,如何定位到当时操作的准确时间点用于数据恢复呢?

方式1:可以通过日志审计功能找到对应的误操作时间点。

方式2:可以将binlog解析成文本,查询对应的误操作时间点。

3. 通过备份历史获取可用的备份集

一般情况下,基于业务的重要程度,客户在云上会规划好自己的数据库备份周期,RDS管控会基于用户选择的恢复时间点自动寻找可用的物理备份集。

可见备份对于数据库的高可用和灾难恢复是重中之重的!

4. 获取备份集对应的binlog点位

专有云的备份一般都基于xtrabackup工具进行备份。xtrabackup具有热备份、恢复快等特点,同时会将备份结束时应用binlog的文件和点位写入相应文件中。RDS管控会将该binlogfilebinlogpos等信息写入数据库,当需要备份恢复时,会直接获取该点位进行恢复。

如下图所示:

图2

5. 将备份集还原至目的实例

1-4步骤为准备工作,下面开始正式的恢复数据。恢复数据的第一步是将获取的可用的全量物理备份集下载至目的实例上,并使用xtrabackup工具进行还原。

//​​首先要停止目的实例上的mysql进程​

​systemctl stop mysql​

​//​​然后合并数据,假设备份解压在/root/backup/目录下,可以指定需要恢复的实例端口,需加--defaults-file参数指定,默认3306。​

​innobackupex ​​--​​apply​​-​​log ​​/​​root​​/​​backup​​/​

​//​​删除原目录文件​

​rm ​​-​​rf ​​/​​data​​/​​mysql​

​//​​还原数据集,还原数据到哪个目录是基于配置文件my.cnf的datadir决定的。该字段一定要检查是否准确​

​innobackupex ​​--​​copy​​-​​back ​​/​​root​​/​​backup​​/​

​//​​目录赋权​

​chown ​​-​​R mysql:mysql ​​/​​data​​/​​mysql

6. 验证还原是否成功

管控服务需要验证还原是否成功,再决定是否需要向下操作,验证步骤也很简单粗暴,直接检查备份恢复日志中是否有ERROR,并且最后一行是否为completed OK!

如下图,为一次成功的备份恢复。

图3

7. 获取用于恢复的binlog日志

此步骤至关重要,关乎恢复是否成功,数据是否完整。

那么RDS管控服务如何获取正确的binlog来进行恢复呢?我们来看下图。

图4

例如当前我们的备份中总共有8个binlog备份(000-008),首先通过物理备份记录的binlog的filename和pos来获取第一个binlog,如上图中的binlog004;然后通过客户设置的需要恢复的时间点的timestamp,来找到对应的最后一个binlog,如上图中的binlog007;最后将binlog004,binlog005,binlog006,binlog007这四个binlog备份下载到目的实例上进行恢复。

如果获取了错误的binlog日志用于恢复,比如误将binlog003/binlog005设置成了第一个binlog,那么binlog003/binlog005上执行的dml语句会在新实例上重新执行一次,恢复的数据就会增多或缺失;比如误将binlog0006或者binlog0008设置成了最后一个binlog,那么恢复的数据会缺失,且无法达到预期效果。

8. 重放relaylog

将下载的binlog复制到新实例的logdir中,并将除最后一个binlog(覆盖恢复时间点的binlog)之外的binlog重命名为relaylog,然后使用新实例重放这些relaylog。

​//​​将binlog重命名,relaylog文件名可在mysql实例中执行show variables like '%relay%'查看.​

​rename mysql​​-​​bin MySQL2​​-​​relay​​-​​bin mysql​​-​​bin​​*​

​//​​将relay信息初始化到index文件中​

​ls .​​/​​MySQL2​​-​​relay​​-​​bin.​​0000​​*​​​​>​​MySQL2​​-​​relay​​-​​bin.index​

​//​​将这些文件复制到data文件中​

​cp MySQL2​​-​​relay​​-​​bin.​​*​​​​/​​data​​/​​mysql​​/​

​//​​文件赋权​

​chown ​​-​​R mysql:mysql ​​/​​data​​/​​mysql​

​//​​启动mysql实例​

​systemctl start mysql​

​//change master to​​一个不存在的实例,模拟此实例为一个备库,指定一个空的主库,创建SQL线程,然后根据备份记录的binlogfile和binlogpos来设置。并启动slave的sql_thread​

​CHANGE MASTER TO MASTER_HOST​​=​​'1.1.1.1'​​,RELAY_LOG_FILE​​=​​'MySQL2-relay-bin.000011'​​,RELAY_LOG_POS​​=​​160338​​;​

​START SLAVE SQL_THREAD;​

​show slave status\G

9. 验证relaylog重放成功

通过show slave status\G,来进行验证,此步骤一般恢复较慢,取决于数据库binlog个数及binlog大小。

验证1:查看relay_log_file字段的值是否为我们在MySQL2-relay-bin.index文件中维护的最大的值,如果是的话,则证明所有的bilog已重放成功;

验证2:查看Slave_SQL_Running字段是否为YES。

如下图所示:

图5

10. 通过mysqlbinlog功能裁剪恢复时间点上的binlog,并生成sql文件

至此,1-9步骤已经恢复了绝大部分数据了,剩余了一个覆盖我们恢复时间点的binlog未进行恢复。

那么我们如何来进行操作呢?

如下图所示:

图6

根据客户的时间点(如需要恢复至15:00的数据),RDS管控需要将覆盖我们恢复时间点的binlog根据恢复时间进行裁剪,也就是只应用12:00-15:00的数据,15:00至18:00的数据属于误操作时间,不应该拿来应用。

//​​使用mysqlbinlog工具的裁剪功能对该binlog进行裁剪​

​mysqlbinlog ​​--​​start​​-​​position​​=​​4​​​​--​​stop​​-​​datetime​​=​​'2021-04-23 15:00:00'​​​​-​​R ​​-​​h127.​​0.0​​.​​1​​​​-​​uroot ​​-​​pxxxx ​​-​​P3306 mysql​​-​​bin.​​007​​​​>​​​​/​​tmp​​/​​mysql​​-​​bin.​​007.​​sql

11. 目的实例通过sql文件,执行需要恢复的数据

在目的实例上执行该sql文件。

//​​赋权​

​chown mysql:mysql ​​/​​tmp​​/​​mysql​​-​​bin.​​007.​​sql​

​//​​恢复数据​
​mysql ​​-​​uroot ​​-​​pxxxx ​​-​​h127.​​0.0​​.​​1​​​​-​​P3306 ​​-​​f ​​--​​max_allowed_packet​​=​​1073741824​​​​<​​​​/​​root​​/​​mysql​​-​​bin.​​007.​​sql

12. 验证数据

至此,整体的备份恢复就已经完成了,下面就需要客户来进行验证数据,已经将目的实例的数据恢复到源实例中。

我们是阿里云智能全球技术服务-SRE团队,我们致力成为一个以技术为基础、面向服务、保障业务系统高可用的工程师团队;提供专业、体系化的SRE服务,帮助广大客户更好地使用云、基于云构建更加稳定可靠的业务系统,提升业务稳定性。我们期望能够分享更多帮助企业客户上云、用好云,让客户云上业务运行更加稳定可靠的技术,您可用钉钉扫描下方二维码,加入阿里云SRE技术学院钉钉圈子,和更多云上人交流关于云平台的那些事。

原文链接:https://developer.aliyun.com/article/784887?

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

到此这篇关于Mysql数据库按时间点恢复实战的文章就介绍到这了,更多相关Mysql恢复数据库内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于mysql数据库误删除后的数据恢复操作说明

    在日常运维工作中,对于mysql数据库的备份是至关重要的!数据库对于网站的重要性使得我们对mysql数据的管理不容有失! 然后,是人总难免会犯错误,说不定哪天大脑短路了来个误操作把数据库给删除了,怎么办??? 下面,就mysql数据库误删除后的恢复方案进行说明. 一.工作场景 (1)MySQL数据库每晚12:00自动完全备份. (2)某天早上上班,9点的时候,一同事犯晕drop了一个数据库! (3)需要紧急恢复!可利用备份的数据文件以及增量的binlog文件进行数据恢复. 二.数据恢复思路 (1

  • 详解如何通过Mysql的二进制日志恢复数据库数据

    经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响.所以本文我们将和大家一起分享学习下如何通过Mysql的二机制日志(binlog)来恢复数据. 系统环境: 操作系统:CentOS 6.5 X64  (虚拟机): WEB服务:PHP+Mysql+apache: 网站:为方便,直接在本地用蝉知系统搭建一个DEMO站点: 操作步骤: 1.开启binlog功能及基本操作: 2.往站点添加数据: 3.刷新binlog日志: 4.删除

  • MySQL数据库运维之数据恢复的方法

    之前三篇文章分别介绍了MySQL数据库常见的备份方法,其中包括逻辑备份和物理备份,本篇将总结一下MySQL数据库的数据恢复相关内容.这些数据恢复方案在之前备份内容介绍时,此处总结一下恢复方案,并结合数据库的二进制日志做下数据恢复的示范! 一.恢复方案 1.数据量不是特别大,可以将mysqldump命令备份的数据使用mysql客户端命令或者source命令完成数据的恢复: 2.使用Xtrabackup完成数据库的物理备份恢复,期间需要重启数据库服务: 3.使用LVM快照卷完成数据库物理备份恢复,期

  • 教你自动恢复MySQL数据库的日志文件(binlog)

    如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点的数据."mysqlbinlog:用于处理二进制日志文件的实用工具". 要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名.一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径.如果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的形式给出.启用二进制日志的选项为 --log-b

  • Navicat for MySQL定时备份数据库及数据恢复详解

    在做数据库修改或删除操作中,可能会导致数据错误,甚至数据库奔溃,而有效的定时备份能很好地保护数据库.本篇文章主要讲述Navicat for MySQL定时备份数据库和数据恢复等功能,同时可以定时播放电影等设置,希望对您有所帮助,如果文章中存在错误或不足之处,还请海涵~ 一. 设置计划任务定时备份数据库 计划任务就是让电脑在指定的时间内执行指定的动作,这些动作可以是一个程序,也可以是一个批处理,但是至少是可以运行的!其实再通俗一点也就是相当于你在那个时间里面进行了对某个东西对鼠标双击的操作. 1.

  • 浅谈mysqldump使用方法(MySQL数据库的备份与恢复)

    #mysqldump --help 1.mysqldump的几种常用方法: (1)导出整个数据库(包括数据库中的数据) mysqldump -u username -p dbname > dbname.sql    (2)导出数据库结构(不含数据) mysqldump -u username -p -d dbname > dbname.sql    (3)导出数据库中的某张数据表(包含数据) mysqldump -u username -p dbname tablename > tabl

  • Mysql的Binlog数据恢复:不小心删除数据库详解

    Mysql的Bin log数据恢复:不小心删除数据库 前言:因为不小心删除了测试机器上Mysql的一整个数据库Schema,因为是测试机所以没有做备份,现在通过MySQL的Bin log方式恢复到删除以前的数据库. 当然做Bin log的数据恢复前提是已经打开Bin log的功能,如果又没做数据备份,又没打开Bin log日志,那你就可能需要考虑快照等其它方式从系统的角度去恢复. Bin log 常用于数据增量备份和恢复,以及数据库主从复制.如果没有开启,可以通过如下方式打开: 1.打开mysq

  • mysql二进制日志文件恢复数据库

    二进制日志的文件的作用 mysql二进制日志文件用来记录所有用户对数据库操作,即记录用户对数据库操作的sql语句.如果有此文件,当数据库发生意外时,可以通过此文件查看到用户在此文件记录的时间段内用户所做的操作,再和数据库备份配合使用,即可再现用户操作,使数据库恢复. 二进制日志文件的弊端 二进制日志文件开启后,所有对数据库操作的记录均会被记录到此文件, 所以,当长时间开启之后,日志文件会变得很大,占用磁盘空间. 使用二进制日志文件恢复数据库 开启日志文件 mysql默认是不开启日志文件的功能的,

  • Mysql数据库按时间点恢复实战记录

    简介:Mysql数据库按时间点恢复实战 对于任何一家企业来讲,数据都是最宝贵的财富. 如何保护数据完整性,数据不受损坏,在发生故障时,如何保住数据,在发生误操作,黑客入侵,数据篡改等场景时,如何基于我们的备份来进行数据恢复,是每个技术人员需要关注的关键点. 阿里云致力于服务客户,为客户数据库提供连续数据保护.低成本的备份服务.它可以为多种环境的数据提供强有力的保护,以及强力恢复.在发生数据丢失.数据损坏的极端情况下,RDS管控平台具有一键还原的功能,基于客户设置的需要恢复的时间点,进行数据全方位

  • Node.js对MySQL数据库的增删改查实战记录

    目录 在项目中操作数据库的三大步骤 操作数据库的具体步骤 一:安装MySQL模块及express模块 二:通过express创建一个服务器 三:配置MySQL模块 四:测试 mysql 模块能否正常工作 SELECT:查询one数据表中所有的数据: INSERT INTO:向数据库中添加数据: UPADTE:修改数据库中的数据: DELETE:删除数据库中的数据: 总结 在项目中操作数据库的三大步骤 安装操作 MySQL 数据库的第三方模块(mysql) 通过 mysql 模块连接到 MySQL

  • 记一次MySQL Slave库恢复实战记录

    状况描述: 今天登录一个MySQL数据库slave节点主机发现/var/lib/mysql下存放大量的mysql-relay-bin文件,最早的文件创建日期甚至是2018年,我记得在slave库同步完master的日志操作记录后,会删除这些文件(默认设置不会删除,我记错了),于是便查看了slave库的状态,发现如下报错: mysql> show slave status\G; *************************** 1. row *************************

  • MySQL 数据库两台主机同步实战(linux)

    当一个从服务器连接到主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置.从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知下一次更新. 在实际项目中,两台分布于异地的主机上安装有MySQL数据库,两台服务器互为主备,客户要求当其中一台机器出现故障时,另外一台能够接管服务器上的应用,这就需要两台数据库的数据要实时保持一致,在这里使用MySQL的同步功能实现双机的同步复制. 以下是操作实例: 1.数据库同步设置 主机操作系统:RedHat Enterprise Lin

  • 一次MySql重置root密码无效的实战记录

    目录 前言 项目场景: 问题描述 原因分析: 解决方案: 1.正常关闭mysql服务 2.设置跳过权限启动mysql 3. 修改密码 4. 尝试登陆 总结 前言 说起这个事情吧也相对来说比较尴尬,对于一个技术来说忘记密码然后找回密码都是相当简单的一个事情,但是在生产环境中没有保存记录只能是自己的失职,尴尬就尴尬在明明重置成功了却没有生效,弄得好几个工程师在哪里挠头!!!也是经过不断得摸索测试方案最后也是解决了这个问题,下面就简单跟大家分享一下: 项目场景: 这个场景比较简单,因为我们是测试环境嘛

  • Oracle数据库丢失表排查思路实战记录

    目录 说明: 写在最后: 总结 说明: 由于系统采用ID取模分表法进行Oracle数据存储,某日发现Oracle数据库中缺少对应的几张业务数据表,遂进行相关问题查询,简单记录一下排查思路: 由于我们代码中实现思路是判断如果没有对应的表会自动创建,所以首先需要查询一下缺失数据库表的创建时间 SELECT * FROM dba_objects where OBJECT_NAME LIKE 'LOG_5%' AND owner = 'Geoff'; 通过查询Oracle执行SQL历史记录,数据库表的删

  • Python接入MySQL实现增删改查的实战记录

    前言 我们经常需要将大量数据保存起来以备后续使用,数据库是一个很好的解决方案.在众多数据库中,MySQL数据库算是入门比较简单.语法比较简单,同时也比较实用的一个.本文主要介绍了Python接入MySQL实现增删改查的相关内容,下面话不多说,一起来看看详细的介绍吧 打开数据库连接,创建数据库和表 基本语法如下: execute(query, args=None) # query为字符串类型的sql语句 # args:可选的序列或映射,用于query的参数值. # 如果args为序列,query中

  • Mysql在线回收undo表空间实战记录

    1 Mysql5.6 1.1 相关参数 MySQL 5.6增加了参数innodb_undo_directory.innodb_undo_logs和innodb_undo_tablespaces这3个参数,可以把undo log从ibdata1移出来单独存放. innodb_undo_directory:指定单独存放undo表空间的目录,默认为.(即datadir),可以设置相对路径或者绝对路径.该参数实例初始化之后虽然不可直接改动,但是可以通过先停库,修改配置文件,然后移动undo表空间文件的方

  • 教会你完全搞定MySQL数据库 轻松八句话

    一.连接MYSQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MySQL: 首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>. 2.例2:连接到远程主机上的MYSQL.假设远程主机的IP为:110.110.110.110,用户名为root,密码为abcd123.则键

随机推荐