mysql分别在windows和linux下的备份策略

嗟乎!

一、概述

mysql数据库该怎么备份呢?

数据库备份有几个概念:全量备份、增量备份、差异备份。当然啦,数据库备份又有冷备份和热备份,即物理备份和逻辑备份之分。冷备份就是将mysql停了,然后直接拷贝它的数据文件,简单粗暴。问题是,数据库怎可轻易停止或重启?所以我们通常说的备份都是指热备份,即逻辑备份。逻辑备份包括全量备份、增量备份、差异备份。

全量备份就是整个库备份。增量备份是将上一次全量备份或增量备份后的变化备份。差异备份是将上次全量备份后的变化备份。所以增量备份和差异备份有重叠。由于mysql中,并不直接支持所谓增量备份或差异备份,所谓的加过滤条件简直就是瞎掰,根本不属于自动备份的概念,毫无意义。mysql只能通过拷贝二进制日志文件(BinLog)来实现增量备份的效果,聊胜于无。BinLog里面,记录了对mysql的增删改,而没有记录查,所以重新执行这个BinLog就可以达到增量备份的效果。有关BinLog,可以参考拙作(mysql的日志文件)

二、备份思路

将备份命令写到批处理文件,然后定期运行它们。windows的可以用操作系统的任务计划来定期执行批处理;linux可以设置定时器crontab。

另外,备份文件一般比较大,为长久计,备份之后,应将备份文件压缩。

三、windows

1、全量备份

@echo off
rem 设置 MySQL 用户名和密码
set MYSQL_USER=数据库账号
set MYSQL_PASSWORD=密码
set DATABASE=待备份的数据库名称
rem mysql数据文件路径。一般在mysql安装路径,可在mysql.ini里设置。
set MYSQL_BIN=e:\mysql\data\
rem 设置备份文件路径
set BACKUP_PATH=C:\temp\backuprem 获取当前时间戳作为备份文件名
for /f "delims=" %%a in ('powershell -command "Get-Date -Format 'yyyyMMdd_HHmmss'"') do set TIMESTAMP=%%aset FULL_BACKUP_FILE=%BACKUP_PATH%\full_backup_%TIMESTAMP%.sql
set COMPRESSED_FULL_BACKUP_FILE=%FULL_BACKUP_FILE%.ziprem 检查是否已存在该时刻的备份文件,如果存在则不备份
if not exist %COMPRESSED_FULL_BACKUP_FILE% (rem 执行全量备份mysqldump -u%MYSQL_USER% -p%MYSQL_PASSWORD% %DATABASE% --single-transaction --routines --triggers > %FULL_BACKUP_FILE%echo Full Backup completed: %FULL_BACKUP_FILE%rem 压缩备份文件。这里使用360zip360zip -ar %FULL_BACKUP_FILE% %COMPRESSED_FULL_BACKUP_FILE% rem 删除备份文件del %FULL_BACKUP_FILE%
) else (echo Full Backup file already exists: %COMPRESSED_FULL_BACKUP_FILE%
)

2、增量备份

rem 设置 MySQL 用户名和密码
set MYSQL_USER=数据库账号
set MYSQL_PASSWORD=密码
set DATABASE=待备份的数据库名称
rem mysql数据文件路径。一般在mysql安装路径,可在mysql.ini里设置。
set MYSQL_BIN=e:\mysql\data\
rem 设置备份文件路径
set BACKUP_PATH=C:\temp\backuprem 获取当前时间戳作为备份文件名
for /f "delims=" %%a in ('powershell -command "Get-Date -Format 'yyyyMMdd_HHmmss'"') do set TIMESTAMP=%%arem 生成的备份文件名称
set BINLOG_FILE=%BACKUP_PATH%\mysql-bin.%TIMESTAMP%
rem 压缩后的备份文件名称
set COMPRESSED_BINLOG_FILE=%BINLOG_FILE%.zip
rem 增量备份对应的position
set BINLOG_POSITION_FILE=%BACKUP_PATH%\binlog_position.txtrem 检查是否已存在该时刻的二进制日志文件,如果存在则不备份
if not exist %COMPRESSED_BINLOG_FILE% (rem 获取当前二进制日志文件名和位置for /f "tokens=1,2" %%i in ('mysql -u%MYSQL_USER% -p%MYSQL_PASSWORD% -e "SHOW MASTER STATUS" ^| find " " /v') do (set CURRENT_BINLOG_FILE=%%iset CURRENT_BINLOG_POSITION=%%j)rem 拷贝二进制日志文件到备份目录copy /Y %MYSQL_BIN%%CURRENT_BINLOG_FILE% %BINLOG_FILE%rem 压缩360zip -ar %BINLOG_FILE% %COMPRESSED_BINLOG_FILE%rem 删除备份文件del %BINLOG_FILE%rem 将二进制日志信息保存到文件,增量备份恢复时使用echo %COMPRESSED_BINLOG_FILE% %BINLOG_POSITION% > %BINLOG_POSITION_FILE%       
) else (echo Compressed Binary log file already exists: %COMPRESSED_BINLOG_FILE%
)

四、linux

1、全量备份

#!/bin/bash# 设置 MySQL 用户名和密码
MYSQL_USER=数据库账号
MYSQL_PASSWORD=密码
DATABASE=待备份的数据库名称
MYSQL_PORT=mysql端口
MYSQL_HOST=mysqlIP地址# 设置备份文件路径
BACKUP_PATH="/home/admin/db-backup/files"# 获取当前时间戳作为备份文件名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")# 备份文件名
FULL_BACKUP_FILE="$BACKUP_PATH/full_backup_$TIMESTAMP.sql"# 检查是否已存在备份文件,如果存在则不再创建
if [ ! -f "$FULL_BACKUP_FILE" ]; then# 执行全量备份mysqldump -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" "$DATABASE" --single-transaction --routines --triggers > "$FULL_BACKUP_FILE"# 压缩全量备份文件gzip "$FULL_BACKUP_FILE"echo "Full Backup completed: $FULL_BACKUP_FILE"
elseecho "Full Backup file already exists: $FULL_BACKUP_FILE"
fi

2、增量备份

获取当前二进制日志文件名和位置的时候,要使用mysql命令。由于该命令在bash文件中执行,可能系统会找不到mysql,提示未知命令,所以要指定mysql路径。如果不清楚mysql安装在什么地方,可以敲入:

which mysql

这样可以得到mysql所在路径,如:/usr/local/mysql/mysql-8.0/bin/mysql,
然后据此修改bash文件。

#!/bin/bash# 设置 MySQL 用户名和密码
MYSQL_USER=数据库账号
MYSQL_PASSWORD=密码
DATABASE=待备份的数据库名称
MYSQL_PORT=mysql端口
MYSQL_HOST=mysqlIP地址# MySQL 数据文件路径
MYSQL_BIN="/home/admin/mysql/data/"
# 设置备份文件路径
BACKUP_PATH="/home/admin/db-backup/files"
# 获取当前时间戳作为备份文件名
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")BINLOG_FILE="$BACKUP_PATH/mysql-bin.$TIMESTAMP"
COMPRESSED_BINLOG_FILE="$BINLOG_FILE.gz"
BINLOG_POSITION_FILE="$BACKUP_PATH/binlog_position.txt"# 检查是否已存在二进制日志文件,如果存在则不再创建
if [ ! -f "$COMPRESSED_BINLOG_FILE" ]; then# 获取当前二进制日志文件名和位置read -r CURRENT_BINLOG_FILE CURRENT_BINLOG_POSITION <<<$(/usr/local/mysql/mysql-8.0/bin/mysql -h"$MYSQL_HOST" -P"$MYSQL_PORT" -u"$MYSQL_USER" -p"$MYSQL_PASSWORD" -e "SHOW MASTER STATUS" | awk 'NR==2{print $1, $2}')# 拷贝并压缩二进制日志文件到备份目录cp "$MYSQL_BIN$CURRENT_BINLOG_FILE" "$BINLOG_FILE"gzip "$BINLOG_FILE"# 将二进制日志信息保存到文件,以备增量备份时使用echo "$COMPRESSED_BINLOG_FILE $BINLOG_POSITION" > "$BINLOG_POSITION_FILE"
elseecho "Compressed Binary log file already exists: $COMPRESSED_BINLOG_FILE"
fi

3、定时执行

1)首先将shell文件赋权为可执行文件。这一步好像不是必要的。

chmod 777 backup.sh

2)切换为超级管理员

su

3)设置定时器
输入命令

crontab -e

在打开的界面中输入

0 3 * * 6 sh /home/admin/db-backup/backup.sh

意思是每周六凌晨3点执行。

五、小结

mysql并不天然支持增量备份,这是我没想到的。之前sql server不论是全量、差异备份,都有直接的命令,可以交替执行。mysql吹得天上有,地上无,感觉有些基本的配套功能都没有。另外,mysql应该是国内最流行的数据库了,按说相关教程、方案都非常完备了,稍微搜一下,资料就会一大把,但事实上好像并非如此。尤其这个差异备份、增量备份,我还真没看到多少。这里面,原因可能是多方面的,一是mysql多用于互联网,互联网的特点就是迭代快,赶工厉害,很少有时间停下来总结一下。二是国内互联网日益封闭,质量越来越差,搜索引擎都没什么好搜的,也搜不到什么有价值的东西。如果不是chatGPT的指导,还真不容易写出上面的批处理。

相关文章
mysql备份及还原
linux下设置定期执行需要root权限的sh文件

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

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

相关文章

Python入门第2篇

pip包管理器 包管理器类似.NET下的nuget&#xff0c;主要用于管理引用依赖项。 安装Python的时候&#xff0c;已经默认安装了pip包管理器&#xff0c;因此无需单独安装 cmd&#xff0c;输入&#xff1a;pip --version 显示pip版本号信息&#xff0c;即代表pip安装成功&…

前端知识笔记(四十二)———http和https详细解析

HTTP&#xff08;Hypertext Transfer Protocol&#xff09;是一种用于在计算机网络中传输超文本的协议。它是一个客户端-服务器协议&#xff0c;用于从 Web 服务器传输超文本到本地浏览器。HTTP 使用 TCP/IP 协议作为底层传输协议&#xff0c;并使用默认端口号80。 HTTPS&…

8-tornado中模板的使用(通过字符串返回、通过模板Template返回、通过模板render返回)、模板案例

1 Template 1.1 通过字符串返回 import tornado class IndexHandler(web.RequestHandler):def get(self):arg Templateself.finish(f<h1>Hello {arg}!!</h1>)1.2 通过模板Template返回 tornado.template 一个简单的模板系统&#xff0c;将模板编译为Python代码。…

c 一,二,三维数组的定义和赋值

1. 定义数组必须指定数组的大小&#xff0c;也就是用多少存储空间来存储此数组 2.定义数组必须用数组的标准格式定义&#xff1a;数组名下标的形式 3.只有字符串可以用指针来定义 4.可以把c 中一切数和struct 理解为char 数组 比如int 就是4字节的char数组 #include <…

编程语言的演进历程与未来发展趋势

第一代 编程语言的发展历程起源于早期的机器语言阶段&#xff0c;这是一种由二进制代码构成的计算机能够直接解读并执行的语言。然而&#xff0c;鉴于其过于复杂且难以理解&#xff0c;故这一时代的语言并不常为人类所采纳。 第二代 紧接着产生的第二代语言旨在简化编程过程…

1001 害死人不偿命的(3n+1)猜想

卡拉兹(Callatz)猜想&#xff1a; 对任何一个正整数 n&#xff0c;如果它是偶数&#xff0c;那么把它砍掉一半&#xff1b;如果它是奇数&#xff0c;那么把 (3n1) 砍掉一半。这样一直反复砍下去&#xff0c;最后一定在某一步得到 n1。卡拉兹在 1950 年的世界数学家大会上公布了…

C++ //习题2.5 请写出下列表达式的值。

C程序设计 &#xff08;第三版&#xff09; 谭浩强 习题2.5 习题2.5 请写出下列表达式的值。 (1) 3.5 * 3 2 * 7 - ‘a’ (2) 26 / 3 34 % 3 2.5 (3) 45 / 2 (int)3.14159 / 2 (4) a b (c a 6) 设a的初值为3 (5) a 3 * 5, a b 3 * 2 (6) (int)(a 6.5) % 2 …

UI自动化测试工具的定义及重要性

UI自动化测试工具在现代软件开发中起着不可或缺的作用。它们能够提高测试效率、减少人为错误、提供全面的测试覆盖&#xff0c;并支持持续集成。通过有效使用UI自动化测试工具&#xff0c;开发团队可以提高软件质量&#xff0c;提供更可靠的应用程序&#xff0c;满足用户的需求…

C语言之数组精讲(2)

目录 数组的复制 输入数组元素的值 对数组的元素进行倒序排列 使用数组进行成绩处理 对象式宏 数组元素的最大值和最小值 赋值表达式的判断 数组的元素个数 结语 数组的复制 我们把数组中的元素全部复制到另一个数组中。 #include<stdio.h>int main() {int i;int…

SwinIR: Image Restoration Using Swin Transformer

SwinIR 简介 论文地址&#xff1a;SwinIR: Image Restoration Using Swin Transformer 代码&#xff1a;SwinIR ​ 本文提出了一个基于swin transformer的图像超分模型swinIR。其中SwinIR分为三部分&#xff1a;浅层特征提取、深层特征提取和高质量图像重建模块。 现阶段问…

WordPress如何通过header给页面发送原生HTTP头

在WordPress中&#xff0c;你可以使用header() 函数来发送原生HTTP头。这个函数通常在主题文件&#xff08;例如header.php&#xff09;或者插件中使用。以下是一个简单的例子&#xff0c;演示如何在WordPress中使用header() 函数发送原生HTTP头&#xff1a; <?php // 在主…

19.java程序设计-基于SpringBoot的博客管理系统的设计与实现

摘要 随着信息技术的迅速发展&#xff0c;博客作为一种重要的信息传播和交流工具&#xff0c;逐渐在互联网上占据重要地位。为了满足用户对个性化博客管理的需求&#xff0c;本研究设计并实现了一种基于Spring Boot框架的博客管理系统。 本系统通过采用前后端分离的架构&…

【算法题】密钥格式化 (js)

!](https://img-blog.csdnimg.cn/direct/bf9a3d781a8043c997593260c0a8306f.png) 第一部分的字符可以少于… const str "5F3Z-2e-9w"; const str1 "2-5g-3-J"; function solution(num, str) {const arr str.split("-");const head arr[0];…

【C++11(三)】智能指针详解--RAII思想循环引用问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; C11 1. 前言2. 为什么要有智能指针?3. RAII思想…

30.如何在Spring所有Bean创建完后做扩展?

如何在Spring所有Bean创建完后做扩展? 哪里才算所有的bean创建完了。 首先是所有的配置bean会注册成BeanDefinition 然后根据BeanDefinition进行循环调用一个一个的getBean进行生产。 循环完所有的BeanDefiniton,通过BeanFactory的getBean方法生成所有的Bean 这个循环结…

LightDB - 支持substring_index 函数[mysql兼容]

从 23.4 版本开始&#xff0c; LightDB 支持 mysql 的substring_index 函数。下面对这个函数进行介绍 substring_index(str, delim, count ) 这个函数用于从指定字符串str中返回到达分隔符delim出现次数(count)之前的子字符串。。具体见之后用例&#xff1a; mysql 中介绍&a…

【BUG】微信小程序image不会随着url动态变化

问题描述&#xff1a; 第一次打开界面&#xff0c;显示的是默认头像而不是用户头像&#xff0c;似乎image里面的src只要第一次有值就不会再更新了 解决 不要给src里面的变量设置初始值&#xff0c;而是直接赋空值

信息安全、网络安全和数据安全的相互关系

最近正在开展安全方面的相关工作&#xff0c;因此就对这些概念做了一些分析&#xff0c;参考各种介绍和书籍&#xff0c;结合自身的认识&#xff0c;总结起来如下&#xff0c;信息安全、网络安全、数据安全和基础设施安全的关系究竟是什么&#xff0c;信息安全概念最大&#xf…

DevOps搭建(七)-安装Jenkins详细步骤

这里我们用Docker进行安装 1、拉取Jenkins镜像 Jenkins download and deployment 选择LTS长期支持的版本,接着点击Docker链接进入 找到上面的版本,并copy拉取镜像的命令 docker pull jenkins/jenkins:2.426.1-lts 2、docker-compose安装Jenkins 首先创建安装目录/home/f…

STM32 cubeMX 呼吸灯实验

文章代码使用 HAL 库。 文章目录 一、1.PWM原理二、LED 原理图三、使用cubemx 配置 led四、PWM 相关函数五、PWM占空比占空比计算六、PWM 呼吸灯重要代码总结 呼吸灯 一、1.PWM原理 PWM全称为脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种常…