基于Innobackupex的不完全恢复

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介:     对于MySQL的不完全恢复,我们可以借助于Innobackupex的多重备份加上binlog来将数据库恢复到任意时刻。这里的不完全恢复(也叫时点恢复)是相对于完全恢复。
    对于MySQL的不完全恢复,我们可以借助于Innobackupex的多重备份加上binlog来将数据库恢复到任意时刻。这里的不完全恢复(也叫时点恢复)是相对于完全恢复。本文主要演示了基于Innobackupex如何做一个不完全恢复,供大家参考。

    有关Innobackupex的备份恢复的知识点请参考以下链接:
        Innobackupex 全备数据库
        使用mysqlbinlog提取二进制日志
        基于Innobackupex的全备恢复
        基于Innobackupex的增备及恢复
        基于Innobackupex的完全恢复

1、不完全恢复的概念
    不完全恢复,即时点恢复,是指使用备份加上binlog日志将数据库恢复到任意指定的时间点。
    不完全恢复依赖于完整的数据库备份与binlog备份,只要2者存在,任意数据丢失,误操作,都可以恢复到任意指定的时间点。
    不完全恢复的概念不限于热备与逻辑备份(mysqldump)方式,都可以实现不完全恢复。

2、演示备份过程
a、创建演示环境
robin@localhost[(none)]> show variables like 'version';  --当前MySQL版本
+---------------+------------+
| Variable_name | Value      |
+---------------+------------+
| version       | 5.6.12-log |
+---------------+------------+

robin@localhost[(none)]> reset master;
Query OK, 0 rows affected (0.03 sec)

robin@localhost[(none)]> use tempdb;  
 
robin@localhost[tempdb]> create table tb(id smallint,val varchar(20));  
 
robin@localhost[tempdb]> insert into tb  values(1,'fullbak');  

--创建一个全备
SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \   
> /hotbak/full --no-timestamp   

b、创建一个增备
--在创建增备前插入一条记录到tb
robin@localhost[tempdb]> insert into tb values(2,'Incbak');  
 
SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \   
> --incremental /hotbak/inc --incremental-basedir=/hotbak/full --no-timestamp  

--再次新增一条记录
robin@localhost[tempdb]> insert into tb values(3,'pointrecover');
Query OK, 1 row affected (0.01 sec)

--记下当前的时间点用于后续的不完全恢复
robin@localhost[tempdb]> system date;
Thu Dec 25 11:53:54 CST 2014

--模拟误操作
robin@localhost[tempdb]> truncate table tb;
Query OK, 0 rows affected (0.01 sec)

c、再次全备
SHELL> innobackupex --user=robin -password=xxx --port=3606 --socket=/tmp/mysql3606.sock --defaults-file=/etc/my3606.cnf \
> /hotbak/full2 --no-timestamp

--全备后新增一张表
robin@localhost[tempdb]> create table tb_after_truncate(id int,val varchar(20));
Query OK, 0 rows affected (0.02 sec)
3、演示恢复过程
--下面理清一下思路:
--当前备份情况: 全备+增备+全备
--我们在增备之后truncate了表tb,然后又创建了一个全备,新建了一个表tb_after_truncate。
--此时我们需要将数据库恢复到truncate(误操作)之前
--解决方案:我们需要利用第一次的全备+增备+binglog来恢复到truncate前,当前第二次全备用不上。

a、先做基于全备的apply,注意,此时使用了--redo-only   
SHELL> innobackupex --apply-log --redo-only --user=robin -password=xxx --port=3606 \   
> --defaults-file=/etc/my3606.cnf /hotbak/full   

b、基于增备的apply,  
--此时没有--redo-only,如果有多个增备,仅仅最后一个增备无需指定--redo-only   
SHELL> innobackupex --apply-log --user=robin -password=xxx --port=3606 --defaults-file=/etc/my3606.cnf \   
> /hotbak/full --incremental-dir=/hotbak/inc   

c、进行copy back  
SHELL> mysqldown -P3606     --copy back前关闭实例   
SHELL> netstat -nltp|grep mysql|grep 3606  

SHELL>  mv /data/inst3606/data3606 /data/inst3606/data3606bk  
SHELL>  mkdir -p /data/inst3606/data3606  
 
SHELL> innobackupex --user=robin -password=xxx --port=3606 --copy-back /hotbak/full --defaults-file=/etc/my3606.cnf   
SHELL> chown -R mysql:mysql /data/inst3606/data3606    
 
d、启动恢复后的实例   
SHELL> mysqld_safe --defaults-file=/etc/my3606.cnf &

SHELL> mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock \
> -e "select * from tempdb.tb"
Warning: Using a password on the command line interface can be insecure.
+------+---------+
| id   | val     |
+------+---------+
|    1 | fullbak |
|    2 | Incbak  |
+------+---------+

--获取增量之后的log position
SHELL> cd /hotbak/inc/
SHELL> more xtrabackup_binlog_info
inst3606bin.000001      774

--这里使用了stop-datetime去将日志追加到truncate之前
SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-position=774 --stop-datetime="2014-12-25 11:53:54" \
> |mysql -urobin -pxxx -P3606 -S /tmp/mysql3606.sock

--验证结果如下,可以看到已经恢复到truncate之前了
SHELL> mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock \
> -e "select * from tempdb.tb"
Warning: Using a password on the command line interface can be insecure.
+------+--------------+
| id   | val          |
+------+--------------+
|    1 | fullbak      |
|    2 | Incbak       |
|    3 | pointrecover |
+------+--------------+

--如果我们需要继续恢复后面的事务,我们可以找出truncate前后位置,然后跳过这个position
SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-datetime="2014-12-25 11:53:54"|grep truncate -A5
truncate table tb
/*!*/;
# at 1180
#141225 11:55:35 server id 3606  end_log_pos 1260 CRC32 0x12f55fc5   Query  thread_id=928   exec_time=0   error_code=0
SET TIMESTAMP=1419479735/*!*/;
/*!\C latin1 *//*!*/;
--
create table tb_after_truncate(id int,val varchar(20))
/*!*/;
# at 1392
#141225 13:06:47 server id 3606  end_log_pos 1415 CRC32 0xf956f311      Stop
DELIMITER ;
# End of log file

--我们找出的position为1260,跳过1260之前的继续追加binlog
SHELL> mysqlbinlog /data/inst3606/log/bin/inst3606bin.000001 --start-position=1260 \
> |mysql -urobin -pxxx -P3606 -S /tmp/mysql3606.sock

--验证追加后的结果,可以看到表tb_after_truncate存在
[mysql@app ~]$ mysql -uroot -pxxx -P3606 -S /tmp/mysql3606.sock \
> -e "desc tempdb.tb_after_truncate"
Warning: Using a password on the command line interface can be insecure.
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| val   | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4、小结
a、不完全恢复(时点恢复)与完全恢复操作方式上基本等同
b、不完全恢复我们需要确定需要恢复到的时间点或binlog position
c、一旦确定了需要恢复的时间点,选择自上一次全备以来所有备份来进行恢复
d、恢复完成后再使用binlog日志追加到确定的时间点
e、追加binlog日志可以基于position,也可以基于datetime

f、也可以跳过故障点,继续追加后面的binlog日志至最新,如本文尾部的演示

鹏城DBA总群

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
IDE Java 开发工具
REDHAWK——组件结构
REDHAWK——组件结构
252 0
|
前端开发 数据可视化 JavaScript
探索前端可视化开发:低代码平台原理与实践
【4月更文挑战第7天】本文探讨了低代码平台在前端开发中的应用,介绍了其模型驱动、组件化和自动化部署的原理,强调了提升效率、降低技术门槛、灵活适应变更和保证一致性等优势。建议开发者明确适用场景,选择合适平台,并培养团队低代码技能,同时规划与现有技术栈的融合,实施持续优化治理。低代码平台正改变开发格局,为业务创新和数字化转型提供新途径。
614 0
|
缓存 网络协议 算法
Golang简单实现 分布式缓存+一致性哈希+节点再平衡(gossip + consistent + rebalance)
Golang简单实现 分布式缓存+一致性哈希+节点再平衡(gossip + consistent + rebalance)
506 0
|
关系型数据库 MySQL 测试技术
MySQL 报错 ERROR 1709: Index column size too large
MySQL 报错 ERROR 1709: Index column size too large
724 4
|
前端开发 JavaScript 中间件
基于最新koa的Node.js后端API架构与MVC模式
基于最新koa的Node.js后端API架构与MVC模式
548 1
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之数据库执行的是UPDATE操作,那么Flink监听到的类型是什么
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
机器学习/深度学习 数据可视化 数据挖掘
【视频】结构方程模型SEM分析心理学营销数据路径图可视化|数据分享
【视频】结构方程模型SEM分析心理学营销数据路径图可视化|数据分享
|
存储 人工智能 算法
30 个重要数据结构和算法完整介绍(建议收藏保存)
数据结构和算法 (DSA)通常被认为是一个令人生畏的话题——一种常见的误解。它们是技术领域最具创新性概念的基础,对于工作/实习申请者和有经验的程序员的职业发展都至关重要。掌握DSA意味着你能够使用你的计算和算法思维来解决前所未见的问题,并为任何科技公司的价值做出贡献(包括你自己的!)。通过了解它们,您可以提高代码的可维护性、可扩展性和效率。话虽如此,我决定在CSDN新星计划挑战期间将我所了解...
387 1
|
网络协议 Ubuntu Shell
translator-sudo-l
translator-sudo-l
144 1
|
负载均衡 安全 Java
nacos常见问题之nacos滚动重启时 服务实例大量下线如何解决
Nacos是阿里云开源的服务发现和配置管理平台,用于构建动态微服务应用架构;本汇总针对Nacos在实际应用中用户常遇到的问题进行了归纳和解答,旨在帮助开发者和运维人员高效解决使用Nacos时的各类疑难杂症。