InnoDB集群节点的恢复

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: nnodb集群是有多个节点组成的,这些节点的数据是同步的

nnodb集群是有多个节点组成的,这些节点的数据是同步的。对于Innodb集群的备份,通常只需要在一个节点上进行备份。当需要恢复时,可以把备份集恢复到集群中的任意一个节点上。下面通过实验说明在同一节点和不同节点上进行恢复的方法。

01

实验环境

实验的集群是有3个沙箱实例组成的一个InnoDB集群,集群的成员信息如下:

mysql> select MEMBER_ID,MEMBER_HOST,MEMBER_PORT,MEMBER_STATE,MEMBER_ROLE  FROM performance_schema.replication_group_members;+--------------------------------------+-------------+-------------+--------------+-------------+| MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE |+--------------------------------------+-------------+-------------+--------------+-------------+| 79db1af9-8c9e-11ec-b19d-fa163ea83c5b | 127.0.0.1   |        3310 | ONLINE       | SECONDARY   || 97421a78-8c9e-11ec-b6e3-fa163ea83c5b | 127.0.0.1   |        3320 | ONLINE       | SECONDARY   || a292a14a-8c9e-11ec-ba94-fa163ea83c5b | 127.0.0.1   |        3330 | ONLINE       | PRIMARY     |+--------------------------------------+-------------+-------------+--------------+-------------+3 rows in set (0.00 sec)

备份软件使用国产的鼎甲迪备8.0。

02

同一个节点的恢复

在同一个节点上进行备份和恢复比较简单,例如备份在端口为3310的沙箱实例上进行,恢复也在同一个节点。在恢复过程中可以使用下面的命令启动和停止节点:

/usr/bin/mysqlsh -- dba startSandboxInstance 3310 /usr/bin/mysqlsh -- dba stopSandboxInstance 3310 --password='yaoyuan'

在选择恢复类型时注意不要选择“恢复到指定时间点”,而要选择“恢复到备份状态(最短恢复时间)”,如下图:

也就是只恢复备份集,不前滚二进制日志。这样恢复完成后,端口为3310的沙箱实例的数据落后与另外两个示例,但MySQL组复制的分布恢复特性(Distributed Recovery https://dev.mysql.com/doc/refman/8.0/en/group-replication-distributed-recovery.html ),会对落后的节点自动进行恢复,从而实现集群中所有节点的数据一致。在分布恢复完全之前,检查集群中节点的状态如下:

mysql> select MEMBER_ID,MEMBER_HOST,MEMBER_PORT,MEMBER_STATE FROM performance_schema.replication_group_members;+--------------------------------------+-------------+-------------+--------------+| MEMBER_ID                            | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE |+--------------------------------------+-------------+-------------+--------------+| 79db1af9-8c9e-11ec-b19d-fa163ea83c5b | 127.0.0.1   |        3310 | RECOVERING   ||  97421a78-8c9e-11ec-b6e3-fa163ea83c5b | 127.0.0.1   |        3320 | ONLINE       || a292a14a-8c9e-11ec-ba94-fa163ea83c5b | 127.0.0.1   |        3330 | ONLINE       |+--------------------------------------+-------------+-------------+--------------+3 rows in set (0.00 sec)

以看到刚刚恢复的节点的状态是RECOVERING,待分布恢复完成后会变成ONLINE。

由于InnoDB组复制的自动容错特性,对单个节点进行恢复的过程中不需要关闭集群,这样恢复完成后也不需要执行 START GROUP_REPLICATION。

03

不同节点的恢复

MySQL数据库的恢复是恢复数据目录(datadir),由于InnoDB集群的各个节点之间的数据是自动同步的,因此不同节点之间的数据目录中的内容绝大部分是一致,但需要注意数据目录下的两个文件在不同节点是不同的:一个是auto.cnf文件,另一个是mysqld-auto.cnf。

auto.cnf文件

auto.cnf文件中保存着实例的UUID,不同实例的UUID是不同的,例如端口为3310的沙箱实例的UUID如下:

# cat /root/mysql-sandboxes/3310/sandboxdata/auto.cnf [auto]server-uuid=79db1af9-8c9e-11ec-b19d-fa163ea83c5b

端口为3320的沙箱实例的UUID如下:

# cat /root/mysql-sandboxes/3320/sandboxdata/auto.cnf [auto]server-uuid=97421a78-8c9e-11ec-b6e3-fa163ea83c5b

如果要把3310的备份集恢复到3320,注意要先备份3320的auto.cnf文件。在恢复完成后,启动实例之前恢复3320的auto.cnf文件。如果没有将3320节点中的auto.cnf文件中保存的UUID,再启动时错误日志中会记录到下面的错误提示:

2022-02-15T03:01:35.269051Z 0 [ERROR] [MY-011516] [Repl] Plugin group_replication reported: 'There is already a member with server_uuid 79db1af9-8c9e-11ec-b19d-fa163ea83c5b. The member will now exit the group.'2022-02-15T03:01:38.426638Z 0 [System] [MY-011504] [Repl] Plugin group_replication reported: 'Group membership changed: This member has left the group.'

如果没有备份auto.cnf文件,也可以手工修改auto.cnf文件,3320的UUID在其他节点中也可以查到:

mysql> select instance_id,mysql_server_uuid from mysql_innodb_cluster_metadata.instances where instance_id=2;+-------------+--------------------------------------+| instance_id | mysql_server_uuid                    |+-------------+--------------------------------------+|           2 | 97421a78-8c9e-11ec-b6e3-fa163ea83c5b |+-------------+--------------------------------------+1 row in set (0.00 sec)

mysqld-auto.cnf 文件

mysqld-auto.cnf 文件中以JSON格式保存着持久化参数,不同节点的持久化参数是不同的。这个文件可以先手工备份,在恢复完数据目录后,再恢复这个文件的备份。也可以手工修改这个文件,根据不同的节点进行响应的调整。

04

总结

单实例的恢复通常有两步,第一步是恢复备份集,第二步是使用二进制日志前滚到指定的时间点。而InnoDB的集群中节点恢复实际上比单实例的恢复要简单,因为不需要执行第二步,恢复的节点的数据同步可以使用其他节点的二进制日志自动完成,这是InnoDB组复制的分布恢复特性(Distributed Recovery)。

由于集群里的节点的数据是自动同步的,只需要在一个节点上进行备份即可。恢复到不同节点时,注意在加入集群前修改auto.cnf文件的对应节点的UUID和mysqld-auto.cnf 文件中的持久化参数。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 关系型数据库 MySQL
MYSQL INNODB 组合索引分支节点数据解析
1、本文证明组合索引的所有键值在分支节点(非叶子结点也进行了存储)。 2、本文给出B+ 索引如何进行验证其B+树结构 关于B树结构(不是B+树)可以参考: http://blog.
1325 0
|
存储 关系型数据库
INNODB 页节点数据的存储方式、数据链、删除链的学习和实验总结
前文: 关于MYSQL INNODB index page header学习和实验总结  http://blog.itpub.net/7728585/viewspace-2063921/ 关于INNODB SYSTEM RECORD infimum和supremum的学习和实验研究  http://blog.
1040 0
|
6天前
|
存储 SQL 关系型数据库
MySQL底层概述—2.InnoDB磁盘结构
InnoDB磁盘结构主要包括表空间(Tablespaces)、数据字典(Data Dictionary)、双写缓冲区(Double Write Buffer)、重做日志(redo log)和撤销日志(undo log)。其中,表空间分为系统、独立、通用、Undo及临时表空间,分别用于存储不同类型的数据。数据字典从MySQL 8.0起不再依赖.frm文件,转而使用InnoDB引擎存储,支持事务原子性DDL操作。
164 100
MySQL底层概述—2.InnoDB磁盘结构
|
6天前
|
缓存 算法 关系型数据库
MySQL底层概述—1.InnoDB内存结构
本文介绍了InnoDB引擎的关键组件和机制,包括引擎架构、Buffer Pool、Page管理机制、Change Buffer、Log Buffer及Adaptive Hash Index。
153 97
MySQL底层概述—1.InnoDB内存结构
|
3天前
|
SQL 关系型数据库 MySQL
MySQL底层概述—10.InnoDB锁机制
本文介绍了:锁概述、锁分类、全局锁实战、表级锁(偏读)实战、行级锁升级表级锁实战、间隙锁实战、临键锁实战、幻读演示和解决、行级锁(偏写)优化建议、乐观锁实战、行锁原理分析、死锁与解决方案
MySQL底层概述—10.InnoDB锁机制
|
5天前
|
存储 缓存 关系型数据库
MySQL底层概述—5.InnoDB参数优化
本文介绍了MySQL数据库中与内存、日志和IO线程相关的参数优化,旨在提升数据库性能。主要内容包括: 1. 内存相关参数优化:缓冲池内存大小配置、配置多个Buffer Pool实例、Chunk大小配置、InnoDB缓存性能评估、Page管理相关参数、Change Buffer相关参数优化。 2. 日志相关参数优化:日志缓冲区配置、日志文件参数优化。 3. IO线程相关参数优化: 查询缓存参数、脏页刷盘参数、LRU链表参数、脏页刷盘相关参数。
MySQL底层概述—5.InnoDB参数优化
|
6天前
|
存储 SQL 关系型数据库
MySQL底层概述—4.InnoDB数据文件
本文介绍了InnoDB表空间文件结构及其组成部分,包括表空间、段、区、页和行。表空间是最高逻辑层,包含多个段;段由若干个区组成,每个区包含64个连续的页,页用于存储多条行记录。文章还详细解析了Page结构,分为通用部分(文件头与文件尾)、数据记录部分和页目录部分。此外,文中探讨了行记录格式,包括四种行格式(Redundant、Compact、Dynamic和Compressed),重点介绍了Compact行记录格式及其溢出机制。最后,文章解释了不同行格式的特点及应用场景,帮助理解InnoDB存储引擎的工作原理。
MySQL底层概述—4.InnoDB数据文件
|
6天前
|
存储 缓存 关系型数据库
MySQL底层概述—3.InnoDB线程模型
InnoDB存储引擎采用多线程模型,包含多个后台线程以处理不同任务。主要线程包括:IO Thread负责读写数据页和日志;Purge Thread回收已提交事务的undo日志;Page Cleaner Thread刷新脏页并清理redo日志;Master Thread调度其他线程,定时刷新脏页、回收undo日志、写入redo日志和合并写缓冲。各线程协同工作,确保数据一致性和高效性能。
MySQL底层概述—3.InnoDB线程模型
|
11天前
|
存储 SQL 缓存
MySQL原理简介—2.InnoDB架构原理和执行流程
本文介绍了MySQL中更新语句的执行流程及其背后的机制,主要包括: 1. **更新语句的执行流程**:从SQL解析到执行器调用InnoDB存储引擎接口。 2. **Buffer Pool缓冲池**:缓存磁盘数据,减少磁盘I/O。 3. **Undo日志**:记录更新前的数据,支持事务回滚。 4. **Redo日志**:确保事务持久性,防止宕机导致的数据丢失。 5. **Binlog日志**:记录逻辑操作,用于数据恢复和主从复制。 6. **事务提交机制**:包括redo日志和binlog日志的刷盘策略,确保数据一致性。 7. **后台IO线程**:将内存中的脏数据异步刷入磁盘。
|
2月前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)