【笔记】离线Ubuntu20.04+mysql 5.7.36 + xtrabackup定时增量备份脚本

news2025/1/9 6:08:04

一、环境

● 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=$2

if test ! -z "$(dpkg -l | grep -w $package)";then
	echo -e "$package exist "
	# dpkg -i ${path}/$package_deb
else
	dpkg -i ${path}/$package_deb
fi
}

install(){
	is_exist libdbi-perl libdbi-perl_1.643-1ubuntu0.1_amd64.deb
	is_exist libdbd-mysql-perl libdbd-mysql-perl_4.050-3ubuntu0.2_amd64.deb
    is_exist libcurl4-openssl libcurl4-openssl-dev_7.68.0-1ubuntu2.19_amd64.deb
    is_exist libev4:amd64 libev4_4.31-1_amd64.deb
    is_exist percona-xtrabackup-24 percona-xtrabackup-24_2.4.20-1.focal_amd64.deb
}

install


innobackupex --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 ]; then
    mkdir -p "$BASE_DIR"
	# 给权限
	cd $ROOT_PATH
	sudo chmod -R 777 "$BASE_DIR"
	cd $BASE_DIR
	
	mkdir -p "$INCREMENTAL_BACKUP_DIR"
	mkdir -p "$INCREMENTAL_DIR"
	sudo chmod -R 777 "$INCREMENTAL_BACKUP_DIR"
	sudo chmod -R 777 "$INCREMENTAL_DIR"
fi

INCREMENTAL_DIR="$INCREMENTAL_BACKUP_DIR/$INCREMENTAL_DATE"

# 检查全量备份是否需要准备
if [ ! -f "$FULL_BACKUP_DIR/xtrabackup_checkpoints" ]; then
  echo "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 ]; then
  echo "Incremental backup completed successfully." >> "$LOG_FILE"
else
  echo "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" ]; then
    rm -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"/*/); do
        echo "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>&1
    done

    # 合并增量备份
    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" ]; then
        mv "$RESTORE_DIR"/* /var/lib/mysql/
    else
        echo "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 ]; then
        echo "Database restore completed successfully." >> "$LOG_FILE"
    else
        echo "Database restore failed. Please check the log for details." >> "$LOG_FILE"
    fi
else
    echo "Error: Failed to restore full backup. Please check the log for details." >> "$LOG_FILE"
fi

四、安装 xtrabackup

  1. 把你设置的目录放到服务器根目录下,比如我把安装脚本和安装包都放在了mysql-5.7.36

进入目录

cd ~/mysql-5.7.36
  1. 执行安装
sudo bash install_percona-xtrabackup-24.sh
  1. 验证安装成功
innobackupex --version

五、设定定时

  1. 打开定时服务日志,系统会默认关闭定时服务的日志
sudo vim /etc/rsyslog.d/50-default.conf

在这里插入图片描述
解开注释
保存退出

  1. 重启日志服务
sudo service rsyslog restart
  1. 过一段时间后定时日志就会刷新
tail -100 /var/log/cron.log

六、数据库权限

  1. 先尝试不使用sudo 直接执行mysql命令是否可以进入
mysql -uroot -p

如果失败,则说明当前用户没有权限直接执行mysql命令
如果成功,则跳过这一步

  1. 添加权限
    将当前用户添加到名为"mysql"的组中,并重新加载用户组
  sudo usermod -aG mysql $USER
  sudo newgrp mysql

七、全量备份

  1. 第一次安装好后,需要先手动运行一次全量备份,确定全量备份存储路径
    比如我放在~/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 回车保存退出

  1. 运行全量备份脚本
cd ~/mysql-5.7.36
sudo bash mysql_incremental_backup.sh

正常结果为
在这里插入图片描述

异常时可以查看日志

tail -100 ~/nas/164_mysql/backup.log

八、设置定时增量备份

  1. 打开定时设置脚本
crontab -e

选择习惯使用的编辑器
在这里插入图片描述

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

从0改为1后保存退出
在这里插入图片描述

  1. 设置脚本可执行权限
sudo chmod +x /home/kudoxi/mysql-5.7.36/mysql_incremental_backup.sh
  1. 成功后每天这个时间~/nas/164_mysql/incremental目录下就可以自动生成一个新的当天日期命名的数据
  2. 如果失败,则可以查看日志
tail -100 ~/nas/164_mysql/backup.log

九、数据库恢复

  1. 执行备份脚本
sudo bash /home/kudoxi/mysql-5.7.36/mysql_restore_backup.sh
  1. 成功后可以查看日志
tail -100 ~/nas/164_mysql/restore.log

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

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

相关文章

成集云 | 用友NC集成旺店通ERP(旺店通主管供应链)| 解决方案

源系统成集云目标系统 方案介绍 用友NC是用友NC产品的全新系列,是面向集团企业的世界级高端管理软件。它以“全球化集团管控、行业化解决方案、全程化电子商务、平台化应用集成”的管理业务理念而设计,采用J2EE架构和先进开放的集团级开发平台…

SQL Server 数据库变成单个用户怎么办

参考技术A 1、首先我们打开SQL SERVER的管理控制台,找到一个要设置角色的用户。 2、下面我们将为这个用户赋予创建数据库的角色,我们先用这个用户登录管理工具看一下是否具有创建用户的权限。 3、进行数据库创建的时候,提示如下的错误&…

JavaBean文字格斗游戏(面向对象编程)的个人重写以及个人解释

题目和个人思路: 先写role类(对象)和构造方法(要按照标准的JavaBean来写) 根据题意,类中要有一个行为(方法)->攻击 开始进入main中, 首先当然是要创建两个对象,然后调用(攻击)attack方法 以上都是个人经过学习后重新又写的代码. 望各位指出不足.

Git错误解决:如何处理“could not determine hash algorithm“问题

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…

在 Linux 上运行 macOS?OSX-KVM 助你梦想成真!| 开源日报 No.36

isocpp/CppCoreGuidelines Stars: 39.4k License: NOASSERTION C Core Guidelines 是一个由 Bjarne Stroustrup 领导的协作项目,旨在帮助人们有效地使用现代 C。该指南侧重于较高级别的问题,如接口、资源管理、内存管理和并发性,并鼓励应用程…

界面组件DevExpress WinForms v23.1 - 富文本编辑器等功能升级

DevExpress WinForms拥有180组件和UI库,能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office风格的界面,还是分析处理大批量的业务数据,它都能轻松胜…

8b10b 64b/66b/ 究竟是什么作用呢?

下图是8/10B编码前后的频谱图:  首先,8B-10B的目的是为了直流平衡,其目的在于让频谱图更加的稳定,是一个高通的形式,从而受低频信号干扰小,使得眼图扩大,减小码间串扰因为CDR(时钟…

如何使用微信文件传输助手?看这里!

微信文件传输助手在哪里?为什么我找不到?有哪位朋友能够告诉我吗? 微信文件传输助手是微信官方推出的一款辅助工具,为用户提供了便捷的文件传输方式。用户在使用微信的过程中,可以随时随地通过该功能在手机和电脑之间任…

如何使用 Humata.ai:快速理解和总结文献

链接: Humata 简介 Humata.ai 是一个人工智能驱动的文献阅读助手,可以帮助用户快速理解和总结文献。它可以提取文献的关键信息,并以简洁易懂的语言生成摘要。此外,Humata.ai 还可以回答用户关于文献的问题,帮助用户…

如何在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…

2023华为杯研究生数学建模竞赛选题建议+初步分析

如下为C君的2023华为杯研究生数学建模竞赛&#xff08;研赛&#xff09;选题建议初步分析 2023华为杯研究生数学建模竞赛&#xff08;研赛&#xff09;选题建议 提示&#xff1a;DS C君认为的难度&#xff1a;CE<D<F&#xff0c;开放度&#xff1a;CDE<F。 华为专项…

python绘制三维图片(二维+一维颜色)

目录 data_3d_new 是一个dataframe数据&#xff0c;包括了&#xff40;Bin_ws_hub&#xff40;、&#xff40;ws_up/ws_down&#xff40;、&#xff40;TI&#xff40;三列数据&#xff0c;其中TI的大小用作颜色显色。 # 重新加载Excel文件 data_3d_new pd.read_excel(/mnt/da…

ORA-03113:通信通道的文件结尾-完美解决方案

oracle 文档中对这个错误这样解释&#xff1a; ORA-03113 错误就是说连接到数据库的网络中断了。有些错误由于频繁出现、原因复杂而被 Oracle DBA 们戏称之为"经典的错误"。 完美解决方案&#xff1a; 1、查看系统表空间用量&#xff1a; SELECTa.tablespace_name…

220V转12V芯片-交流45v-265v输入,固定12v输出峰值电流600MA

标题&#xff1a;220V转12V芯片&#xff0c;实现宽电压输入和固定12V输出 摘要&#xff1a;本文介绍了一款具备宽电压输入范围&#xff08;45V-265V&#xff09;和固定12V输出的220V转12V芯片。该芯片内置了650V高压MOS管&#xff0c;并通过CS电阻调节输出电流&#xff0c;最大…

在已知的二维坐标里找到最接近的点

一、业务场景 最近在研发的项目&#xff0c;在做可视化层&#xff0c;在全球地图上&#xff0c;对我们的国家的陆地地图经纬度按照步长为1的间隔做了二维处理。在得到一组整数的点位信息后&#xff0c;需要将我们已有的数据库数据(业务项目)按照地址的经纬度&#xff0c;映射到…

如何使用ArcGIS Pro自动矢量化道路

对于已经制作好的电子地图&#xff0c;我们可以通过像素识别的方式将其中的要素提取出来&#xff0c;比如本教程要讲到的道路数据&#xff0c;这里为大家介绍一下在ArcGIS Pro中如何自动矢量化道路&#xff0c;希望能对你有所帮助。 栅格计算 在工具箱中点击“Spatial Analys…

全国职业技能大赛云计算--高职组赛题卷⑤(容器云)

全国职业技能大赛云计算--高职组赛题卷⑤&#xff08;容器云&#xff09; 第二场次题目&#xff1a;容器云平台部署与运维任务2 基于容器的web应用系统部署任务&#xff08;15分&#xff09;任务3 基于容器的持续集成部署任务&#xff08;15分&#xff09;任务4 Kubernetes容器…

IntelliJ IDEA使用——常规设置

文章目录 版本说明主题设置取消检查更新依赖自动导入禁止import xxx.*、允许import内部类显示行号、方法分割线、空格代码提示&#xff08;匹配所有字母&#xff09;自定义注释颜色添加头部注释自定义字体设置字符编码关联本地GitJDK编译版本Maven配置Tomcat配置代码注释设置头…

37.流光溢彩的渐变加载条动画效果

特效 源码 index.html <!DOCTYPE html> <html> <head> <title>Glowing Gradient Loading Animation</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body><…

DEA一直updating index,这样无法使用其内部各种方法跳转,而且持续时间特别长

IDEA一直updating index&#xff0c;这样无法使用其内部各种方法跳转&#xff0c;而且持续时间特别长 解决方案 点击File菜单&#xff0c;点击子菜单Invalid Caches,弹出弹窗后选择Invalid Caches And Restart重启后就可以了 问题原因 分析了一下&#xff0c;这次引起的原因…