MySQL 备份恢复最佳实践:终极指南

随着企业和应用程序越来越依赖 MySQL 数据库来管理其关键数据,确保数据可靠性和可用性变得至关重要。在这个数字信息时代,强大的备份和恢复策略是应用程序稳定性的支柱。

本文中,我们将回顾所有常用的 MySQL 备份和恢复策略,它们是任何应用程序的基石。对应您的特定场景,有多个选项可供选择,每个选项都要求我们考虑相关问题以做出明智的决策。

作者:walter-garcia

本文和封面来源:https://www.percona.com/blog,爱可生开源社区翻译。

本文约 2500 字,预计阅读需要 7 分钟。

为什么 MySQL 备份很重要?

MySQL 备份在保护数据完整性、防止各种不可预见的灾难、硬件故障、数据丢失、损坏和意外删除方面发挥着关键作用。如果没有可靠的备份,数据丢失的后果可能会很严重。企业面临运营中断、财务损失、声誉受损甚至合规违规的风险。了解 MySQL 备份的重要性以及它们如何降低这些风险将有助于组织保证数据一致性、业务连续性,并确保数据在需要时安全且可恢复。

RTO 是什么?

RTO(RecoveryTimeObjective,恢复时间目标)是故障发生到业务恢复能时间点的最大长度。与之相关的问题是:

多久可以恢复?

RPO 是什么?

RPO(RecoveryPointObjective,恢复点目标)是故障发生后业务系统可容忍的数据丢失量。与之相关的问题是:

会丢失多少数据?

MySQL 备份类型有哪些?

MySQL 备份类型主要有两种:物理备份和逻辑备份。下面我们将提供对这两种备份类型以及其他一些策略的更多见解。

  • 物理(Percona XtraBackup、RDS/LVM 快照、MySQL Enterprise Backup),只要将 MySQL 服务关闭,也可以使用 cp 或 rsync 命令行来复制数据目录 datadir。
  • 逻辑(mysqldump、mydumper、mysqlpump、mysql shell 仅适用于 MySQL 8)。

此外,建议创建 binlog 文件的副本。这种做法有一个重要目的:它使我们能够将数据恢复到最后一个事务。

逻辑备份

这是逻辑数据库结构(CREATE DATABASE、CREATE TABLE 语句)和内容(INSERT 语句)的转储。建议将其用于较小量的数据。如果与物理备份相比,此方法的缺点是速度较慢(备份和恢复)。如果需要,您可以使用 mydumper 备份和恢复单个数据库或单个表,这对于将某些数据复制到不同的环境以运行测试非常有用。另外,mydumper 可以进行一致(只要所有表都是 InnoDB 引擎)备份并提供准确的主从日志位置。

输出比物理备份大,特别是以文本格式保存时,但它可以根据您使用的软件即时压缩。例如,mydumper 可以压缩,而 mysqldump 需要添加一个管道将输出重定向到 gzip 文件。

逻辑备份用于解决数据损坏或恢复表子集的需要。

物理备份

简而言之,它由数据库目录和文件的精确副本组成。这可以是 MySQL datadir 目录的全部或部分副本。这种备份最常用于轻松快速地恢复或创建新的副本节点,并用于解决主机故障。建议使用相同的 MySQL 版本进行恢复。建议使用 Percona XtraBackup,因为它可以包含任何相关文件,例如 cnf 配置文件等配置文件。

快照备份

某些文件系统实现允许存储“快照”。它们提供给定时间点的文件系统的逻辑副本,而不需要整个文件系统的物理副本。MySQL 本身不提供获取文件系统快照的功能,但可以使用 LVM 或 ZFS 等第三方解决方案来实现。

缺点是有时物理备份不会压缩太多,因为数据通常是二进制格式,有时表已经被压缩。

二进制日志备份

Binlog 备份专门针对 RPO。二进制日志文件包含执行的每个发生更改的 SQL 查询的记录。

从 MySQL 5.6 开始,您可以使用 mysqlbinlog 从远程服务器流式传输二进制日志。可以将二进制日志备份与 Percona XtraBackup 或 mydumper 备份结合起来,以允许恢复到最近备份的二进制日志的末尾。

增量/差异备份

增量备份是对自上次备份以来发生更改的所有内容的备份(二进制日志备份是增量备份的特殊情况)。如果数据集大小很大,这是一个非常好的选择,因为您可以在本周初进行完整备份并每天运行增量备份。此外,备份大小比完整备份小。

与增量备份相关的主要风险是:

  • 单个损坏的增量备份可能会使所有其他备份失效
  • 增量备份通常会对 RTO 产生负面影响

对于差异备份,它会复制与上次备份的差异,其优点是从一个备份到下一个备份的大量数据不会发生更改,因此结果可以是明显更小的备份。这可以节省磁盘空间。

Percona XtraBackup 支持增量备份和差异备份。

为什么需要 MySQL 备份?

当出现多种问题时,需要 MySQL 备份:

  • 主机故障:我们可能会因磁盘停滞或磁盘损坏而遇到多种问题。同样,在云服务中,我们的数据库实例可能会损坏并且无法访问。
  • 数据损坏:这可能发生在断电时,MySQL 无法正确写入并关闭文件,有时当 MySQL 再次启动时,由于数据损坏而无法启动,并且崩溃恢复过程无法修复它。
  • 数据不一致:当人犯错误时,通过主节点或副本节点删除/更新错误数据。
  • 数据中心故障:停电或互联网提供商问题。
  • 立法/法规:提供一致的商业价值和客户满意度。

MySQL 备份和恢复最佳实践

在本节中,我们将探讨基本的 MySQL 备份和恢复最佳实践,以保护您的数据并确保数据库顺利运行。

异地存储

强烈建议将所有备份方法复制到另一个地方,例如云或外部文件服务器,这样在主机故障或数据中心故障的情况下,确保还有另一个副本。

并非所有备份文件都需要上传到云端,有时您需要花费在下载上的时间比恢复过程中消耗的时间还要多。

一个好的方法是在备份服务器上本地保留 1-7 天,以便需要快速恢复,这取决于您的业务法规。

加密

备份包含敏感数据,因此强烈建议加密,尤其是异地存储。当您需要恢复备份时,这会增加更多时间,但可以保证数据安全。

GPG 是加密备份的一个不错的选择,如果您使用此选项或其他替代方案,请不要忘记获取密钥/密码的副本。如果丢失,您的备份将毫无用处。

恢复测试

根据您的业务,强烈建议每月至少测试一次备份。此操作可验证您的备份未损坏,并提供有关恢复时间的关键指标。此过程应该自动化,以获取完整备份、恢复它,并最终将此服务器配置为当前主服务器或另一个副本的副本。这也有助于验证复制过程没有错误。

许多客户正在使用这种方法来刷新他们的 QA/STG 环境,以便从生产备份中获取最新数据。

除了上述内容之外,建议创建手动或自动恢复文档流程,以将所有步骤放在一起,以便在发生灾难时,您可以遵循它而不会浪费时间。

保留要求

最后但并非最不重要的一点是,保留不同备份类型的多个副本非常重要。

我们最好的建议是:

  • 备份服务器本地的一到两个物理备份(只要空间允许)。
  • 备份服务器上本地的每日 7 次和每周 4 次逻辑备份。
  • 备份服务器本地 30 天的 binlog 备份。
  • 对于异地备份(如 S3、Google Cloud 等),每月备份保留一年或更长时间。

对于本地备份,请记住,您至少需要当前数据集大小 2.5 倍的可用磁盘空间来保存/满足这些保留策略。不要忘记加密所有备份类型!

法律或监管要求也可能规定数据必须存档多长时间。

验证 MySQL 备份

因此,您已经获得了遵循所有最佳实践的备份过程。那你怎么知道备份成功了?你看过文件大小吗?您是否只检查创建了一个文件?也许您只查看了您使用的工具的退出代码?

“在验证备份之前,你还没有进行备份。” 很好的建议。换句话说,您所做的每个备份都可以被视为薛定谔的备份;在你验证之前,能确定它有效吗?

这里的最佳实践是使用您创建的备份简单地恢复 MySQL 服务器;然而,你创造了它。处理此恢复的机器不需要像源一样强大;一个简单的虚拟机就可以管理这项任务,并且可以很好地实现自动化。

您可以使用 mysql 客户端本身恢复 mysqldump:

zcat my_full_backup.sql.gz | mysql

使用 mydumper/myloader:

myloader --directory dump_dir --overwrite-tables --verbose=3

Percona XtraBackup:

# Prepare the backup
xtrabackup --prepare --parallel 4 --use-memory 4G --target-dir /var/backup# Copy backup to original location (ie: /var/lib/mysql), assuming backup taken on same host
xtrabackup --copy-back --target-dir /var/backup# Fix file permissions if necessary
chown -R mysql:mysql /var/lib/mysql# Start MySQL
systemctl start mysql

是的,Percona XtraBackup 确实需要更多步骤,但物理备份始终是最快的备份方式和最快的恢复方式。

更多技术文章,请访问:https://opensource.actionsky.com/

关于 SQLE

SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。

SQLE 获取

类型地址
版本库https://github.com/actiontech/sqle
文档https://actiontech.github.io/sqle-docs/
发布信息https://github.com/actiontech/sqle/releases
数据审核插件开发文档https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是代理模式,用 Python 如何实现 Proxy(代理 或 Surrogate)对象结构型模式?

什么是代理模式? 代理(Proxy)是一种结构型设计模式,其目的是通过引入一个代理对象来控制对另一个对象的访问。代理对象充当目标对象的接口,这样客户端就可以通过代理对象间接地访问目标对象,从而在访问过程…

【Python图像超分】Real-ESRGAN图像超分模型(超分辨率重建)详细安装和使用教程

1 前言 图像超分是一种图像处理技术,旨在提高图像的分辨率,使其具有更高的清晰度和细节。这一技术通常用于图像重建、图像恢复、图像增强等领域,可以帮助我们更好地理解和利用图像信息。图像超分技术可以通过多种方法实现,包括插值…

flutter报错: library “libflutter.so“ not found

修改android/app/build.gradle defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "cn.rentsoft.flutter.openim.consumer" // You can update the …

CSS 文字溢出省略号显示

1. 单行文本溢出显示省略号 需要满足三个条件,添加对应的代码: (1)先强制一行内显示文本; (2)超出的部分隐藏; (3)文字用省略号来替代省略的部分&#xf…

IDEA 使用Reset Current Branch to Here 进行git 版本控制,图文操作

文章目录 一、总结区别(只针对本地仓库操作)Soft详细解释文件版本冲突处理 Mixed详细解释Hard详细解释Keep详细解释文件版本冲突处理 二、其他Revert commit 参考文档 一、总结区别(只针对本地仓库操作) Soft详细解释 Soft操作只…

docker命令大全

1、查看Docker 容器占用的空间 docker ps -s2、查看所有容器 docker ps -a3、启动、关闭、重启一个已存在的容器 docker start <容器ID> docker stop <容器ID> docker restart <容器ID> 4、进入容器&#xff0c;退出终端的时候不会关闭container的ma…

龙讯旷腾PWmat:新的催化反应机理——瞬态相变,对多相电催化剂的设计和多相电催化机理的研究具有重要意义

研究背景 众所周知&#xff0c;材料的性质&#xff0c;包括催化活性都是相敏感的。而材料的相与外界条件有关&#xff0c;电催化反应过程中的外部条件与反应前后的外部条件不同&#xff0c;这自然导致了一个问题&#xff1a;在反应过程中电催化剂的相是否可以与反应前后的相不…

注册按钮的点击事件

// 注册> 点击事件registerFn() {// js的兜底校验this.$refs.form.validate(async (valid) > {if (valid) {// 通过校验console.log(this.form);// 1.调用注册接口// 这里又是一个解构赋值&#xff0c;把axios返回的数据对象里data字段对应的值保存在res上const { data: …

C 语言数组

C 语言数组 在本教程中&#xff0c;您将学习如何使用数组。您将借助示例学习如何声明&#xff0c;初始化和访问数组的元素。 数组是可以存储多个值的变量。例如&#xff0c;如果要存储100个整数&#xff0c;则可以为其创建一个数组。 示例 cint data[100];如何声明数组&…

顺丰接口对接-订单创建与取消(java单元测试)

api文档 下单接口 &#xff1a;https://qiao.sf-express.com/Api/ApiDetails?level3393&interName%E4%B8%8B%E8%AE%A2%E5%8D%95%E6%8E%A5%E5%8F%A3-EXP_RECE_CREATE_ORDER 取消订单接口&#xff1a; https://qiao.sf-express.com/Api/ApiDetails?level3339&interNa…

算法-算法的基本框架思想

本文目录 算法的基本框架思想一、二叉树的基本框架1、二叉树的前序遍历2、二叉树的前序遍历优化2、二叉树的遍历基本框架 二、回溯算法的基本框架1、基本框架2、核心框架3、全排列的核心框架4、核心思想 三、动态规划的基本框架1、自顶向下递归的动态规划2、自顶向下递归的动态…

线程池的使用

线程池的作用 降低线程创建和销毁的开销&#xff1a;线程的创建和销毁是比较昂贵的操作。通过使用线程池&#xff0c;可以避免频繁地创建和销毁线程&#xff0c;而是复用线程池中已经存在的线程&#xff0c;从而降低了开销。 控制并发度&#xff1a;通过控制线程池中线程的数量…

【华为OD题库-009】食堂供餐-Java

题目 某公司员工食堂以盒饭方式供餐。为将员工取餐排队时间降低为0&#xff0c;食堂的供餐速度必须要足够快。现在需要根据以往员工取餐的统计信息&#xff0c;计算出一个刚好能达成排队时间为0的最低供餐速度。即&#xff0c;食堂在每个单位时间内必须至少做出多少份盒饭才能满…

ADC、DMA以及串口之间的联系和区别?

ADC、DMA和串口都是嵌入式系统中常用的模块&#xff0c;它们之间有以下联系和区别&#xff1a; 联系&#xff1a; ADC和DMA都是用于数据采集和传输的模块&#xff0c;ADC可以将模拟信号转换为数字信号&#xff0c;DMA可以在不经过CPU的情况下实现数据的高速传输。而串口则是一…

同城服务共享台球室小程序系统:打造智能化的台球体验

一、引言 随着科技的发展和人们生活节奏的加快&#xff0c;对于休闲娱乐的需求也在不断增长。台球作为一种广受欢迎的休闲活动&#xff0c;其智能化和便利性的需求也日益凸显。本文将探讨如何通过同城服务共享台球室小程序系统&#xff0c;打造智能化的台球体验。 二、系统设…

MySQL(14):视图

数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&#xff0c;只…

mysql 讲解(1)

文章目录 前言一、基本的命令行操作二、操作数据库语句2.1、创建数据库2.2、删除数据库2.3、使用数据库2.4 查看所有数据库 三、列的数据类型3.1 字符串3.2 数值3.3 时间日期3.4 空3.5 int 和 varchar问题总结&#xff1a; 四、字段属性4.1 UnSigned4.2 ZEROFILL4.3 Auto_InCre…

ARPG----C++学习记录05 Section12 动画蒙太奇,收拿剑,MetaSound,调整动画

代码更新 https://github.com/BAOfanTing/ARPG_Game_Code/commit/c629270e49496ba1bcbaf03780d23c1842ca5e7a Animation Montages动画蒙太奇 蒙太奇的工作流程 新建一个鼠标左键的按键映射&#xff0c;下载一些攻击动画&#xff0c;重定向给我们的人物&#xff0c;新建一个动画…

PCL中的离群点去噪-StatisticalOutlierRemoval

作用是去除稀疏离群噪点。在采集点云的过程中&#xff0c;由于测量噪声的影响&#xff0c;会引入部分离群噪点&#xff0c;它们在点云空间中分布稀疏。在估算点云局部特征&#xff08;例如计算采样点处的法向量和曲率变化率&#xff09;时&#xff0c;这些噪点可能导致错误的计…

若依系统富文本框上传图片报错!

报错如下&#xff1a; 原因&#xff1a;如图&#xff0c;富文本路径中存在 / 字符&#xff0c;导致上传出错。 解决方案&#xff1a;将富文本框内容在前端进行加密&#xff0c;后端再解密。 前端&#xff1a; 安装 crypto-js 插件 npm install crypto-js 创建工具类 :在 sr…