当前位置: 首页 > news >正文

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨

💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️

💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖

    今天作为PXB系列的第三篇,这篇文章其实计划是在上周写的,奈何工作上的事情过于繁忙,就迟迟一直抽不出身来专注写作,不过,正所谓“好饭不怕晚”,今天难得下午有时间来兑现我的承诺,将这篇期待已久的文章呈现在大家面前,如标题所示今天带来的是——Percona XtraBackup标准化全库完整备份策略。 

    删过库跑过路的小伙伴都知道有备份是多么的重要😄,全库备份将作为最后的恢复手段。不是执行一个xtrabackup备份命令就完事了,xtrabackup备份需要备份哪些内容,xtrabackup输出的备份片名称应该怎么命名这些都是非常有讲究的,不能执行了一个全库备份命令,生成的备份没有命名,而是xtrabackup自己内部命名的,这让一个刚上手的小伙伴会感觉的很蒙蔽,不知道应该从那个备份开始恢复。所以今天就带着这些疑问开始今天的内容吧。

    用一篇文章是不能将Percona XtraBackup工具讲明白的,所以我将理论、命令、备份策略、异机恢复、使用场景等分成五篇去介绍,即使分为五篇也有部分内容没有涵盖到,但是这五篇文章都是精华,掌握了之后就可以轻松应对Percona XtraBackup工具的相关日常工作了,五篇文章的内容分别如下:

  • 第一篇:Percona XtraBackup物理备份工具的基础理论概述
  • 第二篇:Percona XtraBackup工具备份指南:常用备份命令详解与实践(当前篇)
  • 第三篇:Percona XtraBackup标准化全库完整备份策略
  • 第四篇:Percona XtraBackup全量+mysqlbinlog增量完成异机恢复:基于全库恢复 or 基于时间点恢复
  • 第五篇:物理克隆数据clone插件、逻辑备份工具mysqldump/mysqlpump和物理备份工具Percona XtraBackup这三种的区别和各自的使用场景总汇

           

xtrabackup备份应该哪些内容:

  • 备份内容一:参数文件。MySQL启动的第一步就是读取参数文件中的内容,备份他有多重要那么就不言而喻了。
  • 备份内容二:数据库对象、共享表空间(ibdata)、临时表空间(ibtmp)、undo文件。在MySQL中没有控制文件这个概念,所以读取完参数文件后,就开始打开数据库对象、共享表空间(ibdata)、临时表空间(ibtmp)、undo文件。备份他有多重要那么就不言而喻了。
  • 备份内容三:二进制日志。二进制日志记录mysql所有的DDL和DML(除了数据查询语句select)语句事件。用来记录数据库中发生的修改情况,数据的修改、表的创建及修改等。它既可以记录涉及修改的SQL,也可以记录数据修改的行变化记录,同时也记录了执行时间。类似于oracle的归档日志,二进制有可能会被重做日志替代(自己的猜测哦😁)。备份他有多重要那么就不言而喻了

上面我说了三个重要,所以xtrabackup备份少了那一个都不行滴!

                             

xtrabackup全库备份脚本:包括数据文件(数据库对象、共享表空间(ibdata)、临时表空间(ibtmp)、undo文件)、参数文件

Date=`date +%Y%m%d`
Begin=`date +"%Y-%m-%d %H:%M:%S"`        
Port=3306# 实例压缩备份(恢复时需要借助qpress-11-linux-x64.tar解压缩工具,备份时不需要)
/mysql/app/mysql/bin/xtrabackup/bin/xtrabackup --defaults-file=/mysql/data/3306/my.cnf --socket=/mysql/data/3306/mysql.sock --user=root --password=123456 --no-lock --backup --compress --compress-threads=2 --target-dir=/mysql/backup/full/xtrabackup_full_${Port}_${Date} --parallel=2 2> /mysql/backup/logs/xtrabackup_full_${Port}_${Date}_err.log#copy备份参数文件
cp /mysql/data/3306/my.cnf /mysql/backup/full/backup-my.cnf_${Port}_${Date}find /mysql/backup/logs/ -name "xtrabackup_*_${Port}_*_err.log" -mtime +14 -exec rm -rf {} \;
find /mysql/backup/full/ -name "xtrabackup_*_${Port}_*" -mtime +14 -exec rm -rf {} \;     
find /mysql/backup/full/ -name "backup-my.cnf_${Port}_*" -mtime +14 -exec rm -rf {} \;      ### -mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。

                             

二进制日志备份脚本:增量备份二进制日志(增量:只copy上次备份时没有的二进制日志)

BinLogDir=/mysql/log/3306/binlog           ###二进制目录日志(实际路径,定义在my.cnf文件中)
BinIndexFile=/mysql/log/3306/binlog/itpuxdb-binlog.index    ###二进制索引输出路径(实际文件,定义在my.cnf文件中)
Date=`date +%Y%m%d`
Port=3306BinLogBakDir=/mysql/backup/binlog             ###备份二进制日志的路径
LogOutFile=/mysql/backup/logs/backup_mysql_binlog_${Port}_${Date}.log   ###日志信息
NextLogFile=`tail -n 1 $BinIndexFile`
LogCounter=`wc -l $BinIndexFile |awk '{print $1}'`          ###统计索引二进制文件数量
NextNum=0 
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
echo "--------------------------------------------------------------------" >> $LogOutFile
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Start... >> $LogOutFile
for binfile in `cat $BinIndexFile`
dobase=`basename $binfile`#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./NextNum=`expr $NextNum + 1`if [ $NextNum -eq $LogCounter ]thenecho $base skip! >> $LogOutFileelsedest=$BinLogBakDir/$baseif(test -e $dest)#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去thenecho $base exist! >> $LogOutFileelsecp $BinLogDir/$base $BinLogBakDirecho $base copying >> $LogOutFilefifi
done
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Complete! Next LogFile is: $NextLogFile  >> $LogOutFilefind /mysql/backup/logs -name "backup_mysql_binlog_${Port}_*.log" -mtime +14 -exec rm -rf {} \;
find $BinLogBakDir -name "*binlog.**" -mtime +14 -exec rm -rf {} \;       ###清理14天前的备份的binlog日志

                 

案例一:对MySQL实例进行xtrabackup全库备份。保留4份xtrabackup完整备份,14天的二进制日志备份

一、数据备份的路径规划:

[root@mysql1 ~]# mkdir -p /mysql/backup/full
[root@mysql1 ~]# mkdir -p /mysql/backup/logs
[root@mysql1 ~]# mkdir -p /mysql/backup/binlog
[root@mysql1 ~]# mkdir -p /mysql/backup/script
###full(mysqldump全备的数据)、script(备份脚本)、binlog(需要打开binlog日志功能)、logs(备份日志)[root@mysql1 ~]# chown -R mysql:mysql /mysql/backup/ 

二、xtrabackup全备脚本

[root@mysql1 ~]# cd script/
[root@mysql1 ~]# vi xtrabackup_full_3306.shDate=`date +%Y%m%d`
Begin=`date +"%Y-%m-%d %H:%M:%S"`        
Port=3306# 实例压缩备份(恢复时需要借助qpress-11-linux-x64.tar解压缩工具,备份时不需要)
/mysql/app/mysql/bin/xtrabackup/bin/xtrabackup --defaults-file=/mysql/data/3306/my.cnf --socket=/mysql/data/3306/mysql.sock --user=root --password=123456 --no-lock --backup --compress --compress-threads=2 --target-dir=/mysql/backup/full/xtrabackup_full_${Port}_${Date} --parallel=2 2> /mysql/backup/logs/xtrabackup_full_${Port}_${Date}_err.log#copy备份参数文件
cp /mysql/data/3306/my.cnf /mysql/backup/full/backup-my.cnf_${Port}_${Date}find /mysql/backup/logs/ -name "xtrabackup_*_${Port}_*_err.log" -mtime +14 -exec rm -rf {} \;
find /mysql/backup/full/ -name "xtrabackup_*_${Port}_*" -mtime +14 -exec rm -rf {} \;     
find /mysql/backup/full/ -name "backup-my.cnf_${Port}_*" -mtime +14 -exec rm -rf {} \;      ### -mtime +14 -exec rm -rf {} \; 表示删除目录下14天之前被修改过的文件。写为mtine是因为默认输入ls -l(ll)命令输出的内容中就是最后修改时间 (mtime)。

三、binlog日志增量脚本(增量:只copy上次备份时没有的二进制日志)

[root@mysql1 ~]# cd script/
[root@mysql1 ~]# vi  backup_mysql_binlog_3306.shBinLogDir=/mysql/log/3306/binlog           ###二进制目录日志(实际路径,定义在my.cnf文件中)
BinIndexFile=/mysql/log/3306/binlog/itpuxdb-binlog.index    ###二进制索引输出路径(实际文件,定义在my.cnf文件中)
Date=`date +%Y%m%d`
Port=3306BinLogBakDir=/mysql/backup/binlog             ###备份二进制日志的路径
LogOutFile=/mysql/backup/logs/backup_mysql_binlog_${Port}_${Date}.log   ###日志信息
NextLogFile=`tail -n 1 $BinIndexFile`
LogCounter=`wc -l $BinIndexFile |awk '{print $1}'`          ###统计索引二进制文件数量
NextNum=0 
#这个for循环用于比对$Counter,$NextNum这两个值来确定文件是不是存在或最新的
echo "--------------------------------------------------------------------" >> $LogOutFile
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Start... >> $LogOutFile
for binfile in `cat $BinIndexFile`
dobase=`basename $binfile`#basename用于截取mysql-bin.00000*文件名,去掉./mysql-bin.000005前面的./NextNum=`expr $NextNum + 1`if [ $NextNum -eq $LogCounter ]thenecho $base skip! >> $LogOutFileelsedest=$BinLogBakDir/$baseif(test -e $dest)#test -e用于检测目标文件是否存在,存在就写exist!到$LogFile去thenecho $base exist! >> $LogOutFileelsecp $BinLogDir/$base $BinLogBakDirecho $base copying >> $LogOutFilefifi
done
echo binlog-backup---`date +"%Y-%m-%d %H:%M:%S"` Bakup Complete! Next LogFile is: $NextLogFile  >> $LogOutFilefind /mysql/backup/logs -name "backup_mysql_binlog_${Port}_*.log" -mtime +14 -exec rm -rf {} \;
find $BinLogBakDir -name "*binlog.**" -mtime +14 -exec rm -rf {} \;       ###清理14天前的备份的binlog日志

四、在root下添加全备脚本和binlog增量脚本的自动计划任务

[root@lf script]# chmod 775 /mysql/backup/script/*.sh   --确保root用户有执行权限
[root@lf script]# crontab -e
#xtrabackup_3306_full
00 23 * * 1,5 /mysql/backup/script/xtrabackup_full_3306.sh       ###每周一和周五执行一次全备,保留4份#mysql_3306_binlog
00 02 * * * /mysql/backup/script/backup_mysql_binlog_3306.sh     ###每天凌晨进行归档全备,保留14天

五、Root下测试脚本可用性,并查看日志

全备:

[root@lf script]# /mysql/backup/script/xtrabackup_full_3306.sh
[root@lf logs]$ tail -2000f /mysql/backup/logs/xtrabackup_full_3306_20240710_err.log

              

增量:

[root@mysql1 script]# /mysql/backup/script/backup_mysql_binlog_3306.sh
[root@mysql1 binlog]# tail -200f /mysql/backup/logs/backup_mysql_binlog_3306_20240710.log


    关于PXB标准化全库完整备份策略到这里就算完成了,淦了1个半小时,目前也就不到7千字,虽然字数不多,但是对于需要通过xtrabackup做备份策略的小伙伴而言是非常有用的一篇文章,当然备份策略也需要随着业务的发展而不断优化和调整,打造出最适合业务的备份方案。

    最后,感谢每一位集帅的阅读和支持。如果在备份过程中遇到了任何问题或有任何宝贵的建议,欢迎随时与我交流分享。

相关文章:

【MySQL篇】Percona XtraBackup标准化全库完整备份策略(第三篇,总共五篇)

💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...

背单词工具(C++)

功能分析 生词本管理: 创建生词本文件:在构造函数中创建了“生词本.txt”“背词历史.log”“历史记录.txt”三个文件。添加单词:用户可以输入单词、词性和解释,将其添加到生词本中。查询所有单词:展示生词本中所有的单…...

面试八股 | 数据库引擎 | InnoDB和myISAM的区别?

⭐️⭐️⭐️InnoDB和MyISAM的区别? InnoDB : 1、使用的是行锁,操作时候只锁一行数据,不会对其他有影响,适合高并发工作 2、支持事务 3、不仅缓存索引还要缓存真实数据,适合高并发 4、默认安装 5、支持外键 6、…...

GEE计算五种植被指数(NDVI、EVI2、RVI、MTVI2、OSAVI)

目录 计算公式源代码计算公式 源代码 // 定义感兴趣区域(这里以一个简单的矩形区域为例) var region = ee.FeatureCollection("projects/a-flyllf0313/assets/dachang"); // 定义时间范围 var startDate = 2023-04-18; var endDate &...

C/S架构和B/C架构

C/S架构(Client/Server Architecture)和B/C架构(Browser/Client Architecture)是两种不同 的软件架构模型,它们各自有不同的特点和应用场景。 一、C/S架构(Client/Server Architecture) 1. 定…...

音乐曲谱软件Guitar Pro 8.2 for Mac 中文破解版

Guitar Pro 8.2 for Mac 中文破解版是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧,重现喜爱的歌曲或陪伴自己。 Guitar Pro for Mac 是一款功能强大的音乐曲谱软件,非常适合学习如何玩,改进技巧&#xf…...

浅聊Web Storage(localStorage 和 sessionStorage)、cookie的使用场合

Web Storage(localStorage 和 sessionStorage)、cookie 一、Cookie二、Web StoragelocalStoragesessionStorage与 Cookies 的比较 一、Cookie Cookies 主要用于以下几种情况: 会话管理(Session Management): 登录、购…...

C语言输入输出缓冲机制

文章目录 输入输出缓冲机制概述为什么要有缓冲区缓冲区的类型引发缓冲区的刷新 原理实现 输入输出缓冲机制 概述 缓冲区又称为缓存,它是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入 或者输出的数…...

javaEE-03-cookie与session

文章目录 Cookie创建Cookie获取Cookie更新CookieCookie 生命控制Cookie 有效路径 Session 会话创建和获取sessionSession 域数据的存取Session 生命周期控制浏览器和 Session 之间关联 Cookie Cookie 是服务器通知客户端保存键值对的一种技术,客户端有了 Cookie 后&#xff0c…...

EtherNet/IP转Profinet协议网关(经典配置案例)

怎么样才能把EtherNet/IP和Profinet网络连接起来呢?这几天有几个朋友问到了这个问题,作者在这里统一为大家详细说明一下。其实有一个设备可以很轻松地解决这个问题,名为JM-PN-EIP,下面是详细介绍。 一,设备主要功能 1、捷米特J…...

华为云依赖引入错误

问题:记录一次项目加在华为云依赖错误,如下: 错误信息:Could not find artifact com.huawei.storage:esdk-obs-java:pom:3.1.2.1 in bintray-qcloud-maven-repo (https://dl.bintray.com/qcloud/maven-repo/) 找到本地仓库&#…...

【Ubuntu】Ubuntu 配置镜像源(ARM)

【Ubuntu】Ubuntu 配置镜像源(ARM) 零、起因 最近在QEMU中安装了个ubuntu-24.04-live-server-arm64,默认是国外的软件源,很慢,故替换到国内。 壹、替换 源地址(清华源) https://mirror.tun…...

速腾聚创激光雷达复现FAST-LIO

目录 1.软件环境 2.测试执行 3.代码学习 3.1.找主节点代码文件 3.2.整体流程结构 3.3.具体函数理解 记录复现FAST-LIO算法的过程和,代码梳理和理解 1.软件环境 Windows 10(64bits) VMware 16 Pro Ubuntu 20.04 ROS Noetic FAST-LIO的简化版、注释版。感谢…...

k8s核心知识总结

写在前面 时间一下子到了7月份尾;整个7月份都乱糟糟的,不管怎么样,日子还是得过啊, 1、7月份核心了解个关于k8s,iceberg等相关技术,了解了相关的基础逻辑,虽然和数开主线有点偏,但是…...

语言模型及数据集

一、定义 1、语言模型的目标是估计序列的联合概率,一个理想的语言模型就能够基于模型本身生成自然文本。 2、对一个文档(词元)序列进行建模, 假设在单词级别对文本数据进行词元化。 3、计数建模 (1)其中…...

linux如何卸载python3.5

卸载: 1、卸载python3.5 sudo apt-get remove python3.5 2、卸载python3.5及其依赖 sudo apt-get remove --auto-remove python3.5 3、清除python3.5 sudo apt-get purge python3.5 或者 sudo apt-get purge --auto-remove python3.5...

【BUG】已解决:TypeError: expected string or bytes-like object

TypeError: expected string or bytes-like object 目录 TypeError: expected string or bytes-like object 【常见模块错误】 【解决方案】 常见原因及解决方法 示例代码 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰…...

在linux上面用drissionpage自动化遇到反爬?

目录 一、反爬内容1、案例12、案例2 二、后来发现的问题解决 一、反爬内容 1、案例1 反爬的响应文本返回如下:爬虫均能精准识别,测试链接:https://ziyuan.baidu.com/crawltools/index)非正常爬虫访问时:返回的压缩报文内容无法直接识别,可一定程度上保护站点信息安…...

vue3大事件管理系统 === 首页 layout 文章分类页面 -

目录 首页 layout 架子 [element-plus 菜单] 基本架子拆解 登录访问拦截 用户基本信息获取&渲染 退出功能 [element-plus 确认框] 文章分类页面 - [element-plus 表格] 基本架子 - PageContainer 文章分类渲染 封装API - 请求获取表格数据 el-table 表格动态渲染 …...

堆的基本实现

一、堆的概念 在提出堆的概念之前,首先要了解二叉树的基本概念 一颗二叉树是节点的有限集合,该集合: 1、或者为空; 2、或者由一个根节点加上两颗分别称为左子树和右子树的两颗子树构成; 堆就是一颗完全二叉树&…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...