【数据库】Mysq备份与恢复

news2024/10/7 8:23:21

文章目录

  • 一、数据库备份的分类
    • 1. 数据备份的重要性
    • 2. 数据库备份的分类
    • 3. 常见的备份方法
  • 二、Mysql 完全备份与恢复
    • 1. Mysql 完全备份
    • 2. 数据库完全备份分类
      • 2.1 物理冷备份及恢复
      • 2.2 mysqldump 备份数据库
        • 完全备份一个或多个完整的库(包括其中所有的表)
        • 完全备份 MySQL 服务器中所有的库
        • 完全备份指定库中的部分表
        • 查看备份文件
      • 2.3 XtraBackup 备份数据库
    • 3. 恢复数据库及表的操作
      • 3.1 source命令恢复数据
      • 3.2 msyql命令恢复数据
  • 三、Mysql 增量备份与恢复
    • 1. Mysql 增量备份
    • 2. Mysql 增量备份的方法
      • 2.1 Mysql二进制日志对备份的意义
      • 2.2 Mysql 日志管理
      • 2.3 二进制日志
    • 3. Mysql增量恢复
      • 3.1 一般恢复
        • 模拟丢失更改的数据的恢复步骤
        • 模拟丢失所有数据的恢复步骤
      • 3.2 断点恢复
        • 基于位置恢复
        • 基于时间点恢复
  • 四、备份加入计划任务
    • 1.编写完全备份脚本和增量备份脚本
    • 2.加入计划任务
  • 总结
    • 1. 一般是生产环境如何进行备份
    • 2. mysql 免交互


一、数据库备份的分类

1. 数据备份的重要性

  备份的主要目的是灾难恢复。在生产环境中,数据的安全性至关重要,任何数据的丢失都可能产生严重的后果。

  造成数据丢失的原因有以下几点:程序错误、人为操作错误、运算错误、磁盘故障、灾难(如火灾、地震)和盗窃等等众多因素。

2. 数据库备份的分类

从物理与逻辑的角度,备份可分为物理备份和逻辑备份。

  • 物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份。物理备份有三种备份方法,分别是冷备份、热备份、温备份。冷备份(脱机备份)是在关闭数据库的时候进行的;热备份(联机备份)数据库处于运行状态,依赖于数据库的日志文件;温备份就是数据库锁定表格(不可写入但可读)的状态下进行备份操作。
  • 逻辑备份:对数据库逻辑组件(如:表等数据库对象)的备份。

从数据库的备份策略角度,备份可分为完全备份、差异备份和增量备份。

  • 完全备份:每次对数据库进行完整的备份。
  • 差异备份:备份自从上次完全备份之后被修改过的文件。
  • 增量备份:只有在上次完全备份或者增量备份后被修改的文件才会被备份。

3. 常见的备份方法

物理冷备

备份时数据库处于关闭状态,直接打包数据库文件。

备份速度快,恢复时也是最简单的。

专用备份工具mysqldump或mysqlhotcopy

mysqldump常用的逻辑备份工具

mysqlhotcopy仅拥有备份MyISAM和ARCHIVE表

启用二进制日志进行增量备份

进行增量备份,需要刷新二进制日志

第三方工具备份

免费的MySQL热备份软件Percona、XtraBackup

二、Mysql 完全备份与恢复

1. Mysql 完全备份

  完全备份是对整个数据库、数据库结构和文件结构的备份,保存的是备份完成时刻的数据库。完全是差异备份与增量备份的基础。

  完全备份的优点是备份与恢复操作简单方便;缺点是数据存在大量的重复、占用大量的备份空间、备份与恢复时间长。

2. 数据库完全备份分类

use CLASS;
create table if not exists info1 (
id int(4) not null auto_increment,
name varchar(10) not null,
sex char(10) not null,
hobby varchar(50),
primary key (id));

insert into info1 values(1,'user1','male','running');
insert into info1 values(2,'user2','female','singing');

在这里插入图片描述

2.1 物理冷备份及恢复

关闭MySQL数据库

使用tar命令直接打包数据库文件夹

直接替换现有MySQL目录即可

#关闭mysql,备份data目录
systemctl stop mysqld
yum -y install xz

在这里插入图片描述

#压缩备份data目录
tar Jcvf /opt/mysql_all_$(date +%F).tar.xz /usr/local/mysql/data/

在这里插入图片描述

#解压恢复
mv /usr/local/mysql/data/ ~
tar Jxvf /opt/mysql_all_2020-11-22.tar.xz
mv /opt/usr/local/mysql/data/ /usr/local/mysql/

在这里插入图片描述

#验证备份数据
systemctl restart mysqld
mysql -u root -p 123456
show databases;
use class;
select * from info1;

在这里插入图片描述

2.2 mysqldump 备份数据库

MySQL自带的备份工具,可方便实现对MySQL的备份

可以将指定的库、表导出为SQL脚本

使用命令mysql导入备份的数据

完全备份一个或多个完整的库(包括其中所有的表)

#导出的就是数据库脚本文件
mysqldump  -u 用户名 -p [密码][选项][数据库名] > /备份路径/备份文件

例如
mysqldump -u root -p 123456 --databses class > /opt/class.sql
mysqldump -u root -p 123456 --databses class school > /opt/class-school.sql

在这里插入图片描述

完全备份 MySQL 服务器中所有的库

mysqldump -u root -p[密码] --all-databases > /备份路径/备份文件名.sql

例如
mysqldump -uroot -p123456 --all-databases > /opt/all.sql             

在这里插入图片描述

完全备份指定库中的部分表

mysqldump -u root -p[密码] 库名 [表名1] [表名2] ... > /备份路径/备份文件名.sql

例如
mysqldump -uroot -p123456 [-d] info1 > /opt/class_info1.sql

使用-d选项,说明只保存数据库的表结构。不使用“-d”选项,说明表数据也进行备份。

在这里插入图片描述

查看备份文件

grep -v "^--" /opt/class_info1.sql | grep -v "^/" | grep -v "^$"

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yf0AW1QI-1687245943066)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230619144529438.png)]

2.3 XtraBackup 备份数据库

xtrabackup备份还原速度极快,备份的是ibd文件。mysql的db文件30GB左右,30分钟以内完成备份还原。

备份还原过程,测试环境和正式环境xtrabackup版本、mysql版本需保持一致。

#全量备份主库数据
xtrabackup --backup --user=root --password=xxx --port=3306 --targetdir=/comProject/backup/db/full_20220831
#将full_20220831文件上传到从库服务器上
#关闭存库服务
service mysqld stop
#对数据进行“预备”(Prepare)操作,使数据文件完全一致
xtrabackup --prepare --target-dir=/comproject/backup/db/full/
#复制数据到从库
xtrabackup --copy-back --target-dir=/comproject/full_20220831/
#修改用户和用户组权限
chown -R mysql:mysql /comproject/db
#启动数据库
service mysqld start

3. 恢复数据库及表的操作

3.1 source命令恢复数据

登录到mysql数据库

执行source命令备份sql脚本路径

source /备份路径/备份文件名.sql

例如
source /opt/class.sql
show databases;
select * from class.info1;

在这里插入图片描述

3.2 msyql命令恢复数据

mysql -u root -p [密码] < 库备份脚本的路径

例如
mysql -u root -p -e 'drop database class;'
mysql -u root -p -e 'show databases;'

mysql -u root -p class < /opt/class.sql
mysql -u root -p -e 'show databases;'
mysql -u root -p -e 'select * from class.info1;'

在这里插入图片描述

三、Mysql 增量备份与恢复

1. Mysql 增量备份

  使用mysqldump进行完全备份会存在问题,分别是备份数据中有重复数据和备份时间与恢复时间过长。

  这个时候就需要使用msyql增量备份,而增量备份是自上一次备份后增加/变化的文件或者内容。其主特点有以下两点:

  • 没有重复数据,备份量不大,时间短。
  • 恢复需要上次完全备份及完全备份之后所有的增量备份才能恢复,而且要对所有增量备份进行逐个反推恢复。

2. Mysql 增量备份的方法

  Mysql没有提供直接的增量备份方法,可通过Mysql提供的二进制日志间接实现增量备份.

2.1 Mysql二进制日志对备份的意义

  二进制日志保存了所有更新或者可能更新数据库的操作。

  二进制日志在启动MySQL服务器后开始记录,并在文件达到 max_binlog_size 所设置的大小或者接收到flush logs命令后重新创建新的日志文件。

  只需定时执行 flush logs 方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。

2.2 Mysql 日志管理

MySQL 的日志默认保存位置为 /usr/local/mysql/data

mysql -u root -p
show variables like 'general%';									#查看通用查询日志是否开启
show variables like 'log_bin%';									#查看二进制日志是否开启
show variables like '%slow%';									#查看慢查询日功能是否开启

在这里插入图片描述

vim /etc/my.cnf
[mysqld]
##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启
log-error=/usr/local/mysql/data/mysql_error.log					#指定日志的保存位置和文件名

##通用查询日志,用来记录MySQL的所有连接和语句,默认是关闭的
general_log=ON
general_log_file=/usr/local/mysql/data/mysql_general.log

##二进制日志(binlog),用来记录所有更新了数据或者已经潜在更新了数据的语句,记录了数据的更改,可用于数据恢复,默认已开启
log-bin=mysql-bin												#也可以 log_bin=mysql-bin

##慢查询日志,用来记录所有执行时间超过long_query_time秒的语句,可以找到哪些查询语句执行时间长,以便于优化,默认是关闭的
slow_query_log=ON
slow_query_log_file=/usr/local/mysql/data/mysql_slow_query.log
long_query_time=5												#设置超过5秒执行的语句被记录,缺省时为10秒

在这里插入图片描述

systemctl restart mysqld

mysql -u root -p
show variables like 'general%';									#查看通用查询日志是否开启

show variables like 'log_bin%';									#查看二进制日志是否开启

show variables like '%slow%';									#查看慢查询日功能是否开启
show variables like 'long_query_time';							#查看慢查询时间设置

set global slow_query_log=ON;									#在数据库中设置开启慢查询的方法

在这里插入图片描述

ls /usr/local/mysql/data/

在这里插入图片描述

2.3 二进制日志

#二进制日志(binlog)有3种不同的记录格式:STATEMENT(基于SQL语句)、ROW(基于行)、MIXED(混合模式),默认格式是STATEMENT

ls /usr/local/mysql/data/

在这里插入图片描述

#可每周对数据库或表进行完全备份
mysqldump -u root -p123456 class info1 > /opt/class_info1_$(date +%F).sql
mysqldump -u root -p123456 --databases class > /opt/class_$(date +%F).sql

在这里插入图片描述

#可每天进行增量备份操作,生成新的二进制日志文件(例如 mysql-bin.000002)
mysqladmin -u root -p123456 flush-logs

在这里插入图片描述

#插入新数据,以模拟数据的增加或变更
use class;
insert into info1 values(3,'user3','male','game');
insert into info1 values(4,'user4','female','reading');

在这里插入图片描述

#再次生成新的二进制日志文件(例如 mysql-bin.000003)
mysqladmin -u root -p flush-logs
#之前的步骤4的数据库操作会保存到mysql-bin.000002文件中,之后数据库数据再发生变化则保存在mysql-bin.000003文件中

在这里插入图片描述

#查看二进制日志文件的内容
cp /usr/local/mysql/data/mysql-bin.000002 /opt/
mysqlbinlog --no-defaults --base64-output=decode-rows -v /opt/mysql-bin.000002
#--base64-output=decode-rows:使用64位编码机制去解码并按行读取
#-v:显示详细内容

在这里插入图片描述

3. Mysql增量恢复

3.1 一般恢复

模拟丢失更改的数据的恢复步骤

use class;
delete from t1 where id=3;
delete from t1 where id=4;

mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p123

模拟丢失所有数据的恢复步骤

use class;
drop table t1;

mysql -u root -p123 kb < /opt/kb_all_tables.sql
mysqlbinlog --no-defaults /opt/mysql-bin.000002 | mysql -u root -p

3.2 断点恢复

#查看
cat mysql-bin.000002 

在这里插入图片描述

基于位置恢复

mysqlbinlog --no-defaults --start-position=‘位置点’ 二进制日志文件 | mysql -u用户名 -p密码

在这里插入图片描述

基于时间点恢复

mysqlbinlog --no-defaults --start-datetime=‘时间点1’ 二进制日志文件 | mysql -u用户名 -p密码

在这里插入图片描述

四、备份加入计划任务

通常情况需要执行一次完全备份后,再定期执行增量备份。现需要实现今晚12:00做完全备份,之后每天执行增量备份。

1.编写完全备份脚本和增量备份脚本

#完全备份脚本
vim generalbak.sh
#!/bin/bash
mysqldump -uroot -p123123 --all-databases > /sqlbinlog/mysql_general_bak.sql
 
#增量备份脚本
vim addbak.sh
#!/bin/bash
mysqladmin -uroot -p123123 flush-logs
filename=$(tail -2 /usr/local/mysql/data/mysql-bin.index | head -1 |awk -F'/' '{print $2}')
mv /usr/local/mysql/data/$filename /sqlbinlog/mysql-bin-$(date +%Y%m%d)

2.加入计划任务

crontab -e
0 0 28 10 * /sqlbinlog/generalbak.sh
0 0 * * * /sqlbinlog/addbak.sh

在这里插入图片描述

总结

1. 一般是生产环境如何进行备份

设置一个周期性任务,每周二、三凌晨0点做数据库的完全备份,每天凌晨做增量备份。

2. mysql 免交互

mysql -uroot -pabc123 -e "show databases";

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

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

相关文章

基于YOLOv5实现安全帽检测识别

目录 1、作者介绍2、YOLOv5网络模型2.1 算法简介2.2 数据集介绍2.2.1 VOC数据集准备2.2.2 YOLOv5算法检测流程 3、代码实现3.1 数据集划分部分代码3.2 训练阶段3.3 测试阶段3.4 检测结果 4、问题与分析参考链接 1、作者介绍 陈梦丹&#xff0c;女&#xff0c;西安工程大学电子…

【6.20】sleep()和wait()的区别

sleep()和wait()的区别 1、wait()方法 1.1使用场景 当某个线程获取到锁后&#xff0c;却还是不满足执行的条件&#xff0c;就可以调用对象锁的wait方法&#xff0c;进入等待状态。 直到外在条件满足了&#xff0c;就可以由其它线程调用notify或者notifyAll方法&#xff0c;…

在软件研发排期中要求“倒推时间”,项目结束后悲剧了……

有没有遇到某个项目任务的研发周期已被各路boss定下&#xff0c;研发团队都觉得时间不合理&#xff0c;反馈给上级无果&#xff0c;而要求“倒推时间”进行任务排期的情况&#xff1f; 什么是“倒推时间”&#xff1f; 目标倒推法&#xff0c;从剩下的时间反推算出每天该做的事…

【Java】死锁问题及ThreadLocal

什么是死锁分析过程发生死锁的原因避免死锁ThreadLocal 什么是死锁 多个线程同时被阻塞&#xff0c;它们中的一个或者全部都在等待某个资源被释放。由于线程被无限期地阻塞&#xff0c;因此程序不可能正常终止。这是一个最严重的BUG之一。 分析过程 1.一个线程一把锁 一个线…

深入理解TDD(测试驱动开发):提升代码质量的利器

在日常的软件开发工作中&#xff0c;我们常常会遇到这样的问题&#xff1a;如何在繁忙的项目进度中&#xff0c;保证我们的代码质量&#xff1f;如何在不断的迭代更新中&#xff0c;避免引入新的错误&#xff1f;对此&#xff0c;有一种有效的开发方式能帮助我们解决这些问题&a…

14.处理大数据集

14.1 随机梯度下降 假设你正在使用梯度下降来训练一个线性回归模型 当m个样本的m很大时&#xff0c;求和计算量太大了。这种梯度下降算法有另外一个名字叫做批量梯度下降&#xff08;batch gradient desent&#xff09;。这种算法每次迭代需要使用全量训练集&#xff0c;直到算…

【代码阅读软件】Source Insight 4 使用教程 | 很详细——适合新手

目录 一、概述二、常用的几个窗口&#x1f449;2.1 符号窗口&#xff08;Symbol Window&#xff09;&#x1f449;2.2 项目文件窗口&#xff08;Project Window&#xff09;&#x1f449;2.3 关系窗口&#xff08;Relation Window&#xff09;&#x1f449;2.4 上下文窗口&…

STM32--基于固件库(Library Faction)的led灯点亮

目录 一、STM32芯片的简单介绍 二、基于固件库&#xff08;Library Faction&#xff09;的led灯点亮 这是一个学习stm32的开端&#xff0c;我们由简入难&#xff0c;之前学过C51/52或是其他型号的一般都是从led开始&#xff0c;也就是简单的输入输出端口的应用。&#xff08;想…

SpringBoot整合模板引擎Thymeleaf(1)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Thymeleaf概述 Thymeleaf是一种用于Web和独立环境的现代服务器端的Java模板引擎&#xff0c;主要目标是将优雅的自然模板带到开发工作流程中&#xff0c;并将HTML在浏览器中…

【kubernetes】Etcd集群部署与验证

前言:二进制部署kubernetes集群在企业应用中扮演着非常重要的角色。无论是集群升级,还是证书设置有效期都非常方便,也是从事云原生相关工作从入门到精通不得不迈过的坎。通过本系列文章,你将从虚拟机准备开始,到使用二进制方式从零到一搭建起安全稳定的高可用kubernetes集…

吐血整理,性能测试Jmeter分布式压测遇坑总结+解决

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 为什么要使用分布…

JSON.parse() 全面用法介绍

JSON 通常用于与服务端交换数据。在接收服务器数据时一般是字符串。我们可以使用 JSON.parse() 方法将数据转换为 JavaScript 对象。 语法 JSON.parse(text[, reviver]) text:必需&#xff0c; 一个有效的 JSON 字符串。 reviver: 可选&#xff0c;一个转换结果的函数&#xf…

SPI协议解析

SPI协议介绍 引言介绍SPI简介物理层协议层通讯的起始和停止信号SPI 模式 优缺点优点缺点 使用例程基于STM32的SPI通信准备硬件连接 软件实现 总结 引言 SPI是串行外设接口的缩写&#xff0c;是一种高速的&#xff0c;全双工&#xff0c;同步的通信总线。由于SPI高速和同步的特…

vite环境变量与模式

环境变量 Vite 在一个特殊的 import.meta.env 对象上暴露环境变量。这里有一些在所有情况下都可以使用的内建变量&#xff1a; import.meta.env.MODE: {string} 应用运行的模式。 import.meta.env.BASE_URL: {string} 部署应用时的基本 URL。他由base 配置项决定。 import.m…

【ESP8266】使用MQTT协议 连接华为云iotDA,实现设备属性上报

相关资料&#xff1a;https://github.com/CQUPTLei/ESP8266 往期文章&#xff1a;【ESP8266】基础AT指令和常用WIF指令 【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构 一、华为云iotDA1.1 什么是iotDA1.2 创建 iotDA 产品 二、使用ESP8266上报设备…

【杂谈理解】STM32F10X标准库工程模板

前言 基于STM官网的STM32F10x标准外设库V3.6.0版本&#xff0c;文件的操作流程是参考江科大的。记录下此文方便学习和回忆。文章后也会放置完整的工程文件和意法官网下载STM32F10x标准外设库的压缩包。 流程 到意法官网下载STM32F10x标准外设库的压缩包。先找到压缩包的地址&a…

CMake详解

file文件操作 cmake的file命令_cmake file_物随心转的博客-CSDN博客 set指令 CMake中的set指令详解_cmake set_guanguanboy的博客-CSDN博客 include_directories指令 Cmake命令之include_directories介绍 - 简书 add_subdirectory Cmake命令之add_subdirectory介绍 - 简书…

两台电脑用网线传输文件的一些问题解决

两台电脑用网线传输文件 步骤如下&#xff1a; 一、两台电脑插上网线 网线568A和568B可能没什么影响 二、 ipv4地址配置 两个网线插上电脑会自动生成一个ipv4地址 cmd里使用ipconfig查看 用这个就行了如果不想用自动生成的ip地址 也可以自己配置ipv4地址和网关&#xff08…

升级Nginx

目录 前言 一、升级Nginx 1&#xff09;首先在官网下载一个新版本的Nginx 2&#xff09;首先将下载的压缩包进行解包 3&#xff09;进入已解包的目录中 4&#xff09;配置安装路径 5&#xff09;make 6&#xff09;备份原来Nginx的资源 7&#xff09;重启Nginx服务 8&#…

面向对象程序设计|运算符重载

题目一&#xff1a;分数的加减乘除&#xff08;运算符重载&#xff09; 题目描述&#xff1a; Fraction类的基本形式如下&#xff1a; 要求如下&#xff1a; 1.实现Fraction类&#xff1b;common_divisor()和contracted()函数体可为空&#xff0c;不实现具体功能。 2.编写m…