MySQL备份和恢复

ops/2024/10/22 17:32:09/

        备份的目的是灾难恢复,此外还可以测试应用、回滚数据修改、查询历史数据、审计等。通常造成数据丢失的情况有如下几种:

  • 程序错误
  • 人为操作错误
  • 运算错误
  • 磁盘故障
  • 天灾

一、MySQL数据库备份概述

1.1 数据库的备份类型

        1.1.1 从物理和逻辑的角度分类

        可以分为物理备份和逻辑备份。物理备份是对数据库操作系统中的显式物理文件进行备份,适用于在出现问题时需要快速恢复的大型重要数据库

        物理备份又可以细分为冷备份(脱机备份)、热备份(联机备份)、温备份。

  • 冷备份:在数据库服务关闭的情况下进行备份。
  • 热备份:可以在数据库服务开启的情况下备份,该备份方法依赖数据库的日志文件。
  • 温备份:数据库锁定表格(只读不可写)的状态下进行备份。

        逻辑备份是对数据库逻辑组件的备份(如表结构、索引、数据),这种类型的备份适用于编辑数据值或表结构较小的数据量,或者在不同的机器体系结构上重新创建数据,

        1.1.2 从数据库的备份策略角度分类

        从策略角度分类的话可以分为完全备份、差异备份和增量备份。

        完全备份:每次都对数据进行完全的备份,是差异备份和增量备份的基础。

        差异备份:备份自上次完全备份之后被修改过的所有文件,例如一次完全备份后,先来第一次差异备份,这次是基于上次完全备份进行的备份,第二次的差异备份依然是用上次完全备份为基础而不是使用第一次差异备份为基础。备份的数据量会越来越大,恢复数据时,只恢复上次的完全备份与最近的一次差异备份。

        增量备份:备份上次完全备份或增量备份后修改过的文件。因为仅备份这之间的数据变化,因而备份的数据量小,占用空间小,备份速度快。但恢复时,需要从上一次的完整备份开始逐渐向后恢复每次的增量备份数据,若中间某次的备份备份数据损坏,会导致数据的丢失。

1.2 常见的备份和恢复方法

        1.2.1 物理冷备份

        物理冷备份需要在数据库服务关闭的状态下进行,一般用于非核心业务,特点就是速度快,恢复时也简单。通常通过直接打包数据库文件夹来实现备份。恢复时直接解压后返回原来的位置即可。

        1.2.2 专用备份数据mysqldump

        mysqldump是客户端常用逻辑备份程序,能够产生一组被执行以后再现原始数据库对象定义和表数据的SQL语句,它可以转储到一个或多个MySQL数据库,对其进行备份或传输到远程SQL服务器。具体的方式是使用mysqldump命令将指定的表或数据库通过重定向存放到其他的位置。

        使用mysqldump进行备份的语法为:

#备份指定库中的部分表

mysqldump [选项] 库名 [表名1] [表名2]...... >/备份文件存放路径

#备份一个或多个完整的库

mysqldump [选项] --databases 库名1 [库名2]......  >/备份文件存放路径

#备份mysql服务器中所有的库

mysqldump [选项] --all-databases > /备份文件存放路径

例如:

mysqldump -uroot -p123456 auth>/opt/auth.sql

#以root的身份将auth表存放到opt的目录下,重命名为auth.sql. 

#恢复

mysql -uroot -p123456 auth</opt/auth.sql

#以root的身份将opt下的auth.sql文件恢复到auth数据库中(mysql中必须存在auth库,不论是否为空)。

#若要恢复mysql服务器中的所有库,可以使用
mysql -uroot -p123456 < /服务器所有库的备份文件的路径

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

        MySQL支持增量备份,进行增量备份时必须启用二进制日志。该日志文件记录了用户在数据库进行的修改数据的操作,可以通过"mysqlbinlog [--no-defaults] 二进制日志文件名"命令查看日志文件的内容,再将这个文件中的内容导入到mysql数据库中(需要指定mysql的账号和密码)来再执行一次日志文件中记录的执行过的命令。该日志文件会在过大或使用"mysqladmin 指定用户名 密码 flush-logs"命令重新生成新的二进制文件。

        恢复的语法为:

msyqlbinlog [--no-defaults] 增量备份文件 | mysql -u用户名 -p密码

        在管理数据库时,有可能在同一时间点既有正确的操作又有错误的操作,通过基于位置继续恢复可以更加精准,就是从二进制文件中记录的命令中找到其中一条或几条命令执行,且执行的几条命令导致数据库数据有了修改,并不会记录到二进制的日志文件中。

        从二进制日志记录中的某个位置开始到某个位置结束,执行这中间的命令来恢复数据:

mysqlbinlog [--no-defaults] --start-position=‘操作id’ --stop-position=‘操作id’ 二进制日志文件 | mysql -u用户名 -p密码

如下图:

 at 876就是开始位置的操作id,而at 1021就是结束位置的操作id,之所以选择1021不是990是因为提交操作是在990之后执行,若不提交,数据就存储在内存中,而不再磁盘上。

        若去掉开始位置和结束位置,表示该日志文件中的所有操作都要再执行一次;若只去掉开始位置,则从日志文件的开头开始执行,直到指定的结束位置;去掉结束位置则从指定的开始位置执行到日志文件的末尾。

        此外,也可以指定二进制日志文件中的时间作为位置信息,时间信息显示在at位置的下面,在语句中的语法为:

 mysqlbinlog [--no-defaults] --start-datetime=‘年-月-日 小时:分钟:秒’ --stop-datetime=‘年-月-日 小时:分钟:秒’ 二进制日志文件 | mysql -u用户名 -p密码


http://www.ppmy.cn/ops/53078.html

相关文章

MySQL数据库(三):读取数据库数据

上一节&#xff0c;我们介绍了数据库的基本操作&#xff0c;以及最后演示了如何使用库来连接数据库&#xff0c;在实际应用中&#xff0c;我们通常需要按照指定的条件对数据库进行操作&#xff0c;即增删改查操作&#xff0c;这是非常重要的&#xff01;这一节我们继续通过一个…

【Java设计模式从入门到精通1】设计模式的定义、分类及七大设计原则

引言 Java设计模式从入门到精通-设计模式的定义、设计模式分类及七大设计原则 设计模式简介 在软件开发中&#xff0c;设计模式是解决常见设计问题的最佳实践。它们为开发者提供了一种通用的解决方案&#xff0c;使得代码更加灵活、可复用和可维护。在Java编程语言中&#x…

[分布式网络通讯框架]----RpcProvider实现

在上一节userservice.cc的主函数中&#xff0c;我们初始化以后实例化了一个RpcProvider对象provider。接着调用了它的NotifyService(new UserService)方法&#xff0c;将UserService服务对象及其提供的方法进行预备发布。发布完服务对象后再调用Run()就将预备发布的服务对象及方…

STM32HAL库 -- RS485 开发板通信(速记版)

在本章中&#xff0c; 我们将使用 STM32F429的串口 2 来实现两块开发板之间的 485 通信(半双工)。 RS485 简介 485&#xff08;一般称作 RS485/EIA-485&#xff09;隶属于 OSI 模型物理层&#xff0c;是串行通讯的一种。电气特性规定为 2 线&#xff0c;半双工&#xff0c;多…

DiAtom 共生菌固氮作用产生的碳输出(ANACONDAS)

Amazon iNfluence on the Atlantic: CarbOn export from Nitrogen fixation by DiAtom Symbioses (ANACONDAS) 亚马逊对大西洋的影响&#xff1a;DiAtom 共生菌固氮作用产生的碳输出&#xff08;ANACONDAS&#xff09; 简介 该研究项目探讨了亚马逊河羽流对热带北大西洋西部…

Shell编程之免交互

一、Here Document免交互 1&#xff1a;概述 Here Document 是一个特殊用途的代码块&#xff0c;它在 Linux Shell 中使用 I/O 重定向的方式将命令列表提供给交互式程序或命令&#xff0c;比如 ftp、cat 或 read 命令&#xff0c;Here Document 是标准输入的一种替代品 语法…

分数限制下,选好专业还是选好学校?

24年高考帷幕落下&#xff0c;一场新的思考与选择悄然来临。对于每一位高考考生&#xff0c;学校和专业都是开启大学新生活的两个前置必选项。但有时候“鱼与熊掌不可兼得”&#xff0c;在分数受限的条件下&#xff0c;是选择一个心仪的专业还是选择一个知名度更高的学校&#…

鸿蒙期末项目(4)

day4 页面的设计与编写基本完成&#xff0c;接下来使用我们之前搭建好的服务器与相关的网络接口将鸿蒙中的逻辑真正实现一下。 在实现购物车页面展示功能时&#xff0c;使用了如下代码&#xff1a; getCartList(uid: number): Promise<CartItem[]> {return new Promise…