【笔记】离线Ubuntu20.04+mysql 5.7.36 + xtrabackup定时增量备份脚本
一、环境
● Ubuntu版本查看
lsb_release -a
● mysql 版本查看
mysql --version
我的是ubuntu 20.04,mysql是5.7.36,所以要用 install_percona-xtrabackup-24
二、原理
备份
- 通过ubuntu自带的定时器运行增量备份脚本
- 备份文件可以存储在映射后的其他服务器目录,也可以存在数据库所在的本地服务器目录
- 只有在当日有新增数据库时才会产生新的备份路径
- 不可增量备份Myisam
恢复
- 是将全量备份与各个日期的增量备份合并导回数据库
三、准备
百度网盘总是和谐我的资源,所以现在我取消会员,直接改用移动硬盘了
各个包都可以从此处下载 https://ubuntu.pkgs.org/22.04/ubuntu-main-amd64/locales_2.35-0ubuntu3_all.deb.html
下载好后,统一放进一个文件夹内

1. 自动安装脚本 install_percona-xtrabackup-24.sh
#!/bin/bash
# -*- coding: utf-8 -*-
# @Time : 2023/09/18 14:38
# @Author: kudoxi
# @File : install_percona-xtrabackup-80.sh
# @Desc : 该安装脚本只适用于ubuntu20.04# 当前目录
path=$(pwd)# 判断是否已经安装了,安装过了最好谨慎安装,防止是系统库
is_exist(){
package=$1
package_deb=$2if test ! -z "$(dpkg -l | grep -w $package)";thenecho -e "$package exist "# dpkg -i ${path}/$package_deb
elsedpkg -i ${path}/$package_deb
fi
}install(){is_exist libdbi-perl libdbi-perl_1.643-1ubuntu0.1_amd64.debis_exist libdbd-mysql-perl libdbd-mysql-perl_4.050-3ubuntu0.2_amd64.debis_exist libcurl4-openssl libcurl4-openssl-dev_7.68.0-1ubuntu2.19_amd64.debis_exist libev4:amd64 libev4_4.31-1_amd64.debis_exist percona-xtrabackup-24 percona-xtrabackup-24_2.4.20-1.focal_amd64.deb
}installinnobackupex --version
2. 全量/增量备份脚本 mysql_incremental_backup.sh
#!/bin/bash# MySQL 用户名,密码和主机名。需要备份权限。
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_HOST="127.0.0.1"
# 是否自动 0为手动 1为定时自动
IS_TIMER_OPEN=1# 备份目录和日志文件的路径。确保这些目录存在并具有适当的权限。
ROOT_PATH="/home/kudoxi"
BASE_DIR="$ROOT_PATH/temp"
FULL_BACKUP_DIR="$BASE_DIR/full"
INCREMENTAL_BACKUP_DIR="$BASE_DIR/incremental"
LOG_FILE="$BASE_DIR/backup.log"
INCREMENTAL_DATE="$(date +%Y-%m-%d)"# 非定时任务创建增量备份目录
if [ $IS_TIMER_OPEN -eq 0 ]; thenmkdir -p "$BASE_DIR"# 给权限cd $ROOT_PATHsudo chmod -R 777 "$BASE_DIR"cd $BASE_DIRmkdir -p "$INCREMENTAL_BACKUP_DIR"mkdir -p "$INCREMENTAL_DIR"sudo chmod -R 777 "$INCREMENTAL_BACKUP_DIR"sudo chmod -R 777 "$INCREMENTAL_DIR"
fiINCREMENTAL_DIR="$INCREMENTAL_BACKUP_DIR/$INCREMENTAL_DATE"# 检查全量备份是否需要准备
if [ ! -f "$FULL_BACKUP_DIR/xtrabackup_checkpoints" ]; thenecho "Full backup needs to be prepared. Running prepare command..." >> "$LOG_FILE"innobackupex --defaults-file=/etc/mysql/my.cnf --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" --no-timestamp $FULL_BACKUP_DIR
fi# 执行增量备份
/usr/bin/xtrabackup --backup --target-dir="$INCREMENTAL_DIR" --incremental-basedir="$FULL_BACKUP_DIR" --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" --host="$MYSQL_HOST" >> "$LOG_FILE" 2>&1
# 检查备份结果
if [ $? -eq 0 ]; thenecho "Incremental backup completed successfully." >> "$LOG_FILE"
elseecho "Incremental backup failed. Please check the log for details." >> "$LOG_FILE"
fi
3. 备份恢复脚本 mysql_restore_backup.sh
#!/bin/bash# MySQL 用户名,密码和主机名
MYSQL_USER="root"
MYSQL_PASSWORD="123456"
MYSQL_HOST="127.0.0.1"# 备份目录和日志文件的路径
ROOT_PATH="/home/kudoxi"
BASE_DIR="$ROOT_PATH/temp"
FULL_BACKUP_DIR="$BASE_DIR/full"
INCREMENTAL_BACKUP_DIR="$BASE_DIR/incremental"
LOG_FILE="$BASE_DIR/restore.log"systemctl stop mysql
mv /var/lib/mysql "/var/lib/mysql_bak_$(date '+%Y-%m-%d-%H-%M-%S')"# 恢复到的数据库目录
RESTORE_DIR="$BASE_DIR/restore"# 清除之前的恢复目录
if [ -d "$RESTORE_DIR" ]; thenrm -rf "$RESTORE_DIR"
fi# 恢复全量备份
echo "Restoring full backup..." >> "$LOG_FILE"
innobackupex --defaults-file=/etc/mysql/my.cnf --copy-back --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" $FULL_BACKUP_DIR >> "$LOG_FILE" 2>&1# 检查是否成功恢复全量备份
if [ $? -eq 0 ]; then# 恢复增量备份echo "Applying incremental backups..." >> "$LOG_FILE"for dir in $(ls -d "$INCREMENTAL_BACKUP_DIR"/*/); doecho "Applying $dir..." >> "$LOG_FILE"innobackupex --defaults-file=/etc/mysql/my.cnf --apply-log --redo-only --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" --incremental-dir="$dir" $RESTORE_DIR >> "$LOG_FILE" 2>&1done# 合并增量备份echo "Merging incremental backups..." >> "$LOG_FILE"innobackupex --defaults-file=/etc/mysql/my.cnf --apply-log --user="$MYSQL_USER" --password="$MYSQL_PASSWORD" --redo-only $RESTORE_DIR >> "$LOG_FILE" 2>&1# 恢复完成后,将恢复的数据目录移动到MySQL的数据目录if [ -d "$RESTORE_DIR" ]; thenmv "$RESTORE_DIR"/* /var/lib/mysql/elseecho "Error: Restore directory does not exist or is empty." >> "$LOG_FILE"fi# 重新授权MySQL数据目录的权限chown -R mysql:mysql /var/lib/mysql# 重启MySQL服务systemctl restart mysql# 检查恢复结果if [ $? -eq 0 ]; thenecho "Database restore completed successfully." >> "$LOG_FILE"elseecho "Database restore failed. Please check the log for details." >> "$LOG_FILE"fi
elseecho "Error: Failed to restore full backup. Please check the log for details." >> "$LOG_FILE"
fi
四、安装 xtrabackup
- 把你设置的目录放到服务器根目录下,比如我把安装脚本和安装包都放在了mysql-5.7.36
进入目录
cd ~/mysql-5.7.36
- 执行安装
sudo bash install_percona-xtrabackup-24.sh
- 验证安装成功
innobackupex --version
五、设定定时
- 打开定时服务日志,系统会默认关闭定时服务的日志
sudo vim /etc/rsyslog.d/50-default.conf

解开注释
保存退出
- 重启日志服务
sudo service rsyslog restart
- 过一段时间后定时日志就会刷新
tail -100 /var/log/cron.log
六、数据库权限
- 先尝试不使用sudo 直接执行mysql命令是否可以进入
mysql -uroot -p
如果失败,则说明当前用户没有权限直接执行mysql命令
如果成功,则跳过这一步
- 添加权限
将当前用户添加到名为"mysql"的组中,并重新加载用户组
sudo usermod -aG mysql $USERsudo newgrp mysql
七、全量备份
- 第一次安装好后,需要先手动运行一次全量备份,确定全量备份存储路径
比如我放在~/nas/164_mysql/里
cd ~/nas
sudo mkdir 164_mysql
修改备份脚本存储的真实路径
sudo vim /home/manteia/mysql-5.7.36/mysql_incremental_backup.sh
左下角输入:%s#temp#备份存放的路径#g

回车确定,全局替换

2. 然后设定为手动模式
把1改为0

然后按ESC后输入:x 回车保存退出
- 运行全量备份脚本
cd ~/mysql-5.7.36
sudo bash mysql_incremental_backup.sh
正常结果为

异常时可以查看日志
tail -100 ~/nas/164_mysql/backup.log
八、设置定时增量备份
- 打开定时设置脚本
crontab -e
选择习惯使用的编辑器

- 设置定时备份时间,比如每天早上10点30分执行,保存退出
30 10 * * * /bin/bash /home/kudoxi/mysql-5.7.36/mysql_incremental_backup.sh
- 重启服务立刻生效
sudo service cron restart
- 重设置增量脚本模式
sudo vim /home/kudoxi/mysql-5.7.36/mysql_incremental_backup.sh
从0改为1后保存退出

- 设置脚本可执行权限
sudo chmod +x /home/kudoxi/mysql-5.7.36/mysql_incremental_backup.sh
- 成功后每天这个时间
~/nas/164_mysql/incremental目录下就可以自动生成一个新的当天日期命名的数据 - 如果失败,则可以查看日志
tail -100 ~/nas/164_mysql/backup.log
九、数据库恢复
- 执行备份脚本
sudo bash /home/kudoxi/mysql-5.7.36/mysql_restore_backup.sh
- 成功后可以查看日志
tail -100 ~/nas/164_mysql/restore.log
相关文章:
【笔记】离线Ubuntu20.04+mysql 5.7.36 + xtrabackup定时增量备份脚本
一、环境 ● Ubuntu版本查看 lsb_release -a● mysql 版本查看 mysql --version我的是ubuntu 20.04,mysql是5.7.36,所以要用 install_percona-xtrabackup-24 二、原理 备份 通过ubuntu自带的定时器运行增量备份脚本备份文件可以存储在映射后的其他…...
树哈希与换根dp:CF763D
采用的树哈希函数是: d p x w x ∑ y ∈ x d p y 2 w x 2 \Large dp_xw_x\times \sum_{y\in x}dp_y^2w_x^2 dpxwxy∈x∑dpy2wx2 发现从 x x x 到 y y y 时只有 x x x 与 y y y 的哈希值会变化,分别维护即可 #include<bits/stdc.h&…...
npm、yarn、pnpm如何清除缓存?
前端工程化创建项目会经常使用各种安装包管理工具,安装各种前端依赖包。例如,npm、yarn、pnpm等。时间一长,各种安装包管理工具的在安装依赖时,留下的缓存文件就会变得很大,以至于影响系统的运行,因此必要时…...
12款最火的AI画图软件,助你探索创新设计
ChatGPT火爆出圈,AI画图软件也如雨后春笋般流行起来。各类AI画图的软件工具横空出世,设计师与其焦虑工作会不会被人工智能取代,不如践行“工欲善其事必先利其器”,开拓思路,打开格局,好好地探索下如何利用好…...
cookie信息无法获取问题研究
背景 在oneapi这个前后端都有的开源项目中,我想接入chatnextweb到oneapi的后端。 由于需要二开chatnextweb,添加登录注册功能,考虑到java后端的性能问题和内存占用,决定不重启写个服务,而是将登录注册接入到oneapi的…...
Linux:冯诺依曼系统和操作系统的概念
文章目录 冯诺依曼体系结构冯诺依曼体系的理解 操作系统操作系统的基本定位操作系统的理解1 操作系统的理解2总结 本篇主要总结的是操作系统的基本认知和一些概念 冯诺依曼体系结构 那么上图表示的就是冯诺依曼体系结构,那这个体系结构是什么?为什么要先…...
【操作系统笔记十一】进程间通信
Linux文件系统 inode 节点 (index node):给每个文件赋予一个称为 i 节点的数据结构。 inode 一开始是存储在硬盘中的,只有当文件被打开的时候,其对应的 i 节点才加载到内存中。 总结: Linux 中,…...
【操作系统】聊聊Linux软中断
什么是中断 中断是系统用来响应硬件设备请求的一种机制,会打断进程的正常调度和执行,转而去执行内核中的中断处理程序。 比如你正在看书,你女朋友叫你出去逛街。你就需要先放下手里的事情,然后逛街。回来之后,在接着看…...
公众号迁移个人可以迁移吗?
公众号账号迁移的作用是什么?只能变更主体吗?很多小伙伴想做公众号迁移,但是不知道公众号迁移有什么作用,今天跟大家具体讲解一下。首先公众号迁移最主要的就是修改公众号的主体了,比如我们公众号原来是A公司的&#x…...
全国职业技能大赛云计算--高职组赛题卷⑤(容器云)
全国职业技能大赛云计算--高职组赛题卷⑤(容器云) 第二场次题目:容器云平台部署与运维任务2 基于容器的web应用系统部署任务(15分)任务3 基于容器的持续集成部署任务(15分)任务4 Kubernetes容器…...
支撑位和阻力位在Renko和烛台图如何使用?FPmarkets澳福3秒回答
很多投资者都知道,Renko图表和普通日本烛台都会采用相同的交易信号,即支撑位和阻力位。那么支撑位和阻力位在Renko和烛台图如何使用?FPmarkets澳福3秒回答。 这些信号在任何时间框架上都会出现,且在蜡烛图交易中颇受欢迎。对于Renko图表而言…...
如何在32位MCU用printf()函数打印64位数据
1. 在32位MCU上定义64位变量: unsigned long long time_base; unsigned long long temp_time;2. 调用打印函数: printf("RFID:time_base:%d\r\n",time_base); printf("RFID:temp_time:%d\r\n",temp_time); printf("RFID:Ru…...
Python爬虫程序设置代理常见错误代码及解决方法
Python爬虫程序设置代理是爬虫程序中常用的技巧,可以有效地绕过IP限制,提高爬虫程序的稳定性和效率。然而,在设置代理时,常会出现各种错误代码,这些错误代码可能会影响程序的正常运行,甚至导致程序崩溃。本…...
3D点云目标检测:Centerformer训练waymo数据集
一、环境准备 项目地址:centerformer 1.0、基础环境 python 3.8.0 torch 1.9.1cu111 waymo-open-dataset-tf-2-6-0 1.4.9 spconv 1.2.1 其余按照requirement.txt里安装就行 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt由于我本人是在…...
火山引擎DataLeap推出两款大模型应用: 对话式检索与开发 打破代码语言屏障
更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 自上世50年代,以“计算机”作为代表性象征的信息革命开始,社会对于先进生产力的认知便开始逐步更迭——从信息化(通常认为是把企…...
windows上配置vscode C/C++代码跳转
windows上配置vscode C/C代码跳转 安装插件 C/C 官方的 C/C 插件,必备的插件,是代码跳转、自动补全、代码大纲显示等功能的基础。 Gtags C/C GNU Global GNU Global除了安装该插件之外,还需要在本地下载安装GNU Global工具。多看下插件…...
【Xilinx】基于MPSoC的OpenAMP实现(一)
【Xilinx】基于MPSoC的OpenAMP实现(一) 一、开发环境1、开发思路2、下载官方bsp包 二、编译Linux1、配置petalinux环境变量2、创建工程3、进入目录4、设置缓存目录(重点:可离线编译,加快编译速度)5、配置u-…...
代码随想录算法训练营总结篇|完结撒花
完结撒花,真不敢相信60天坚持下来了。 算法一直是我的超级超级弱项,属于小白中的小白。一开始是想自己刷的,打开leetcode第一题,吼哟好家伙,梦开始的地方直接破碎。之前刷B站的时候就有学习up推荐算法可以看看代码随想…...
uniapp、vue实现滑动拼图验证码
uniapp、vue实现滑动拼图验证码 实际开发工作中,在登陆的时候需要短信验证码,但容易引起爬虫行为,需要用到反爬虫验证码,今天介绍一下拼图验证码,解决验证码反爬虫中的滑动验证码反爬虫。滑动拼图验证码是在滑块验证码…...
【ArcGIS】土地利用变化分析详解(矢量篇)
土地利用变化分析详解-矢量篇 土地利用类型分类1 统计不同土地利用类型的面积/占比1.1 操作步骤Step1:Step2:计算面积Step3:计算占比 2 统计不同区域各类土地利用类型的面积2.1 操作步骤 3 土地利用变化转移矩阵3.1 研究思路3.2 操作步骤 4 分…...
三菱PLC与MCGS组态农田智能灌溉系统:后发送产品梯形图原理图及IO分配与组态画面解析
基于三菱PLC和MCGS组态农田智能灌溉系统 我们主要的后发送的产品有,带解释的梯形图接线图原理图图纸,io分配,组态画面上周刚把农田智能灌溉的项目收尾,把资料打包发给客户的时候,终于能瘫在椅子上喝杯冰可乐了。这个…...
AI Agent架构入门到精通:LangChain重磅DeepAgents深度拆解,看这一篇就够了!
引言:为什么传统Agent总是"浅尝辄止"? 你有没有遇到过这样的尴尬场景: 让AI助手帮你完成一个复杂任务,比如"调研一下LangGraph技术,写一份技术报告,并创建相应的代码示例"。刚开始&a…...
从原理到代码:手把手教你用Fmask实现卫星影像云检测(含Python示例)
从原理到实战:Fmask算法在遥感影像云检测中的深度应用指南 遥感影像处理领域,云层遮挡一直是影响数据质量的关键问题。想象一下,当你花费数周时间规划卫星拍摄任务,最终拿到的数据却被大片云层覆盖——这种挫败感每位遥感从业者都…...
一种风速测量仪的设计与制作
风速、风向的测量在气象预报、环境监测、风力发电、航空航天等领域中有着重要意义。随着传感器技术、微处理器技术和网络通信技术的发展,相比传统的人工观测,数字化、智能化的气象仪器在观测精度、速度和稳定性等方面都有较大优势,因此针对数…...
2025届必备的五大降重复率平台实测分析
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 于学术写作和论文创作的范畴之内,维普检测是颇为常见的查重办法。当遭遇人工智能…...
终极Label Studio数据标注指南:从零开始构建AI训练数据集
终极Label Studio数据标注指南:从零开始构建AI训练数据集 【免费下载链接】label-studio Label Studio is a multi-type data labeling and annotation tool with standardized output format 项目地址: https://gitcode.com/GitHub_Trending/la/label-studio …...
CSS移动端解决阴影遮挡效果_利用box-shadow设置外扩散距离
box-shadow外扩散失效主因是父容器overflow隐藏、层叠上下文触发或参数误设;需检查overflow/transform/filter影响,用translateZ(0)强制分层,伪元素移出阴影,合理组合inset与外扩,并控制扩散距离≤8px。box-shadow 外扩…...
MogFace人脸检测模型-WebUI多场景:儿童早教APP中注意力区域动态追踪
MogFace人脸检测模型在儿童早教APP中的实战应用:注意力区域动态追踪 1. 引言:从“看见”到“理解”,AI如何守护孩子的专注力? 想象这样一个场景:在儿童早教APP的互动学习环节,一个5岁的孩子正跟着屏幕上的…...
直播技术:B站第三方推流方案的实现与应用探索
直播技术:B站第三方推流方案的实现与应用探索 【免费下载链接】bilibili_live_stream_code 用于在准备直播时获取第三方推流码,以便可以绕开哔哩哔哩直播姬,直接在如OBS等软件中进行直播,软件同时提供定义直播分区和标题功能 项…...
cpp学习——类的封装
#include <iostream> using namespace std; #define PI 3.14class Circle { public:double Radius;double calculateZC(){return 2 * PI * Radius;} };int main() {Circle C1;//类的实例化cout << "请输入半径:";cin >> C1.Radius;cou…...
