史上最简单的 MySQL 教程(二十六)「数据备份与还原」

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 史上最简单的 MySQL 教程(二十六)「数据备份与还原」

史上最简单的 MySQL 教程(二十六)「数据备份与还原」

基础概念:

  • 备份,将当前已有的数据或记录另存一份;
  • 还原,将数据恢复到备份时的状态。

为什么要进行数据的备份与还原?

防止数据丢失;

保护数据记录。


数据备份与还原的方式有很多种,具体可以分为:数据表备份、单表数据备份、SQL备份和增量备份。

数据表备份

数据表备份,不需要通过 SQL 来备份,我们可以直接进入到数据库文件夹复制对应的表结构以及数据; 在需要还原数据的时候,直接将备份(复制)的内容放回去即可。


不过想要进行数据表备份是有前提条件的,因为不同的存储引擎之间是有区别的。


对于存储引擎,MySQL 主要使用两种,分别为:InnoDB 和 Myisam,两者均免费。 在这里,咱们可以顺便科普一下存储引擎的知识:

image.png

其中,Myisam 和 InnoDB 的数据存储方法也有所区别:

  • Myisam:表、数据和索引全部单独分开存储;
  • InnoDB:只有表结构,数据全部存储到文件中。IBD

执行如下 SQL 语句,测试 Myisam 的数据存储方式:

-- 创建 Myisam 表
create table my_myisam(
  id int
)charset utf8 engine = myisam;
-- 显示表结构
show create table my_myisam;
-- 插入数据
insert into my_myisam values(1),(2),(3);
-- 显示数据
select * from my_myisam;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fq1AsGvM-1648096652849)(https://github.com/guobinhit/mysql-tutorial/blob/master/images/backup/create-myisam.png)]


如上图所示,我们创建了名为my_myisam,存储引擎为 Myisam 的数据表。 为了验证 Myisam 的存储特性,我们可以到data文件夹查看具体的数据存储情况:


如上图所示,我们仅仅创建了一个表my_myisam,但是 Myisam 对于会生成三个存储文件,分别为:


my_myisam.frm:存储表的结构;

my_myisam. MYD:存储表的数据;

my_myisam. MYI:存储表的索引。

现在,我们将这三个文件复制到testoo数据库(至于如何找到 MySQL 数据文件的存储位置,可以参考详述查看 MySQL 数据文件存储位置的方法):


执行如下 SQL 语句,进行测试:

-- 切换数据库
use testoo;
-- 查看 testoo 数据库中的表
show tables;
-- 查看表 my_myisam
select * from my_myisam;

如上图所示,显然我们已经通过复制文件的方式,完成了数据表的备份工作。


在这里,有一点需要我们注意,那就是:我们可以将通过 InnoDB 存储引擎产生的.frm和.idb文件复制到另一个数据库,也可以通过show tables命令查看复制过来的表名称,但是却无法获得数据。


执行如下 SQL 语句,进行测试:

-- 查看 testoo 数据库中的表
show tables;
-- 查看表 my_class
select * from my_class;

通过以上测试,显然数据表备份这种备份方式更适用于 Myisam 存储引擎,而且备份的方式也很简单,直接复制 Myisam 存储引擎产生的、和三个存储文件到新的数据库即可。.frm.呵呵。八一

单表数据备份

单表数据备份,每次只能备份一张表,而且只能备份数据,不能备份表结构。


通常的使用场景为:将表中的数据导出到文件。


备份方法:从表中选出一部分数据保存到外部的文件中,


select */字段列表 + into outfile + '文件存储路径' + from 数据源;

在这里,使用单表数据备份有一个前提,那就是:导出的外部文件不存在,即文件存储路径下的文件不存在。


执行如下 SQL 语句,进行测试:

-- 单表数据备份
select * into outfile 'D:/CoderLife/testMySQL/class.txt' from class;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OJpxUDEO-1648096652855)(https://github.com/guobinhit/mysql-tutorial/blob/master/images/backup/into-outfile.png)]


如上图所示,SQL 语句已经执行成功。 在这里,如果我们遇到:


错误 1290 (HY000): MySQL 服务器正在使用 –secure-file-priv 选项运行,因此无法执行此语句。


这个错误,可以通过查看「详述 MySQL 导出数据遇到 secure-file-priv 的问题」进行解决。


为了验证是否真的将class表中的数据导出到指定位置,我们可以到该路径下进行确认:


如上图所示,显然我们已经将class表中的数据导出到本地啦! 不过在这里,有一点需要我们特别注意,那就是:对于从数据库导出的文件,我们最好用EditPlus等编辑工具打开,防止乱码。


此外,对于上述用于导出表中数据的 SQL 语法,其实我们可以颠倒书写顺序,也没有问题,例如:


select */字段列表 + from 数据源 + into outfile + '文件存储路径';

执行如下 SQL 语句,进行测试:

-- 单表数据备份
select * from class into outfile 'D:/CoderLife/testMySQL/class2.txt';

接下来,我们学习一些用于单表数据备份的高级操作,即自己指定字段和行的处理方式。


基本语法:select */字段列表 + into outfile + '文件存储路径' + fields + 字段处理 + lines + 行处理 + from 数据源;

字段处理:


enclosed by:指定字段用什么内容包裹,默认是,空字符串;

terminated by:指定字段以什么结束,默认是\t,Tab键;

escaped by:指定特殊符号用什么方式处理,默认是\\,反斜线转义。

行处理:


starting by:指定每行以什么开始,默认是,空字符串;

terminated by:指定每行以什么结束,默认是\r\n,换行符。

执行如下 SQL 语句,进行测试:

-- 指定单表数据备份处理方式
select * into outfile 'D:/CoderLife/testMySQL/class3.txt'
-- 字段处理
fields
enclosed by '"'
terminated by '|'
lines
starting by 'START:'
from class ;

如上图所示,显然导出文件class3.txt按照我们指定的格式进行输出啦! 在前面,我们已经测试了各种单表数据备份的方式,现在我们删除数据,并尝试还原数据,即将保持在外部的数据重新恢复到数据表中。 But,由于单表数据备份仅能备份数据,因此如果表结构不存在,则不能进行还原。


基本语法:load data infile + '文件存储路径' + into table + 表名 + [字段列表] + fields + 字段处理 + lines + 行处理;

执行如下 SQL 语句,进行测试:

-- 删除表 class 中的数据
delete from class;
-- 查看表 class 中的数据
select * from class;
-- 还原表 class 中的数据
load  data infile 'D:/CoderLife/testMySQL/class3.txt'
into table class
-- 字段处理
fields
enclosed by '"'
terminated by '|'
lines
starting by 'START:';
-- 查看表 class 中的数据
select * from class;

如上图所示,显然在我们删除表中的数据之后,还原数据成功。.class

SQL 备份

SQL 备份,备份的是 SQL 语句。 在进行 SQL 备份的时候,系统会对表结构以及数据进行处理,变成相应的 SQL 语句,然后执行备份。 在还原的时候,只要执行备份的 SQL 语句即可,此种备份方式主要是针对表结构。


不过,MySQL 并没有提供 SQL 备份的指令,如果我们想要进行 SQL 备份,则需要利用 MySQL 提供的软件mysqldump.exe,而且mysqldump.exe也是一种客户端,因此在操作服务器的时候,必须进行认证。


基本语法:mysqldump.exe -hPup + 数据库名字 + [表名1 + [表名2]] > 备份文件目录

其中,-hPup分别表示


h:IP 或者localhost;

P:端口号;

u:用户名;

p:密码。

由于mysqldump.exe也是客户端,因此想执行上述命令,我们需要先退出 MySQL 客户端,然后在命令行窗口执行如下命令:

mysqldump.exe -uroot -pbin.guo test class > D:/CoderLife/testMySQL/classSQL.sql

如上图所示,虽然mysqldump给出了警告(在命令行中输入密码是不安全的),但是我们输入的命令已经成功执行啦!在这里,如果执行上述命令不成功的话,很有可能是我们没有配置环境变量的问题。


如上图所示,在testMySQL目录下,已经生产了对表class的 SQL 备份,至于 SQL 备份的内容到底是什么,我们可以打开classSQL.sql文件进行查看:


如上图所示,通过 SQL 备份的文件,包含了各种 SQL 语句,如创建表的语句以及插入数据的语句等等。


此外,在上面给出的执行 SQL 备份的基本语法中,我们可以看到表名都用[]括了起来,这表示可选项,如果不输入表名,则默认备份整个数据库。 执行过程和上面一样,因此我们就不予演示啦!


接下来,我们演示通过 SQL 备份的文件还原数据,有两种方式:


方式 1:使用mysql.exe客户端还原数据

基本语法mysql.exe/mysql -hPup 数据库名称 + 数据库名字 + [表名1 + [表名2]] < 备份文件目录

在命令行窗口执行如下命令,进行测试:

-- 登录 MySQL 客户端
mysql -uroot -p
-- 输入密码,切换数据库
use test;
-- 删除表 class 中的数据
delete from class;
-- 退出数据库
\q
-- 通过 SQL 备份的文件还原数据
mysql -uroot -pbin.guo test < D:/CoderLife/testMySQL/classSQL.sql

如上图所示,上述命令全部执行成功。 下面,我们检查还原结果,

如上图所示,显然表的数据在删除之后,我们通过 SQL 备份的文件还原了数据。.class

  • 方式 2:使用 SQL 命令还原数据
  • 基本语法source + 备份文件目录;

执行如上 SQL 语句,进行测试:

-- 查看表 class 数据
select * from class;
-- 删除表 class 数据
delete from class;
-- 查看表 class 数据
select * from class;
-- 通过 SQL 备份的文件还原数据
source D:/CoderLife/testMySQL/classSQL.sql;
-- 查看表 class 数据
select * from class;

如上图所示,显然表的数据在删除之后,我们通过 SQL 备份的文件利用第二种方式还原了数据。.class

通过上面的学习及测试,我们可以知道 SQL 备份的优缺点:

  • 优点:可以备份表结构;
  • 缺点:增加额外的 SQL 命令,会浪费磁盘空间。

增量备份

增量备份,不是针对数据或者 SQL 进行备份,而是针对 MySQL 服务器的日志进行备份,其日志内容包括了我们对数据库的各种操作的历史记录,如增删改查等。 此外,增量备份是指定时间段进行备份,因此备份的数据一般不会出现重复的情况,常用于大型项目的数据备份。 在此,我们就不详细的进行介绍了,至于这部分的内容,以后会单独写一篇关于如何进行增量备份的博文。


温馨提示:符号[]括起来的内容,表示可选项; 符号+,则表示连接的意思。


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
关系型数据库 MySQL 数据库
Docker下Mysql8数据备份与恢复
通过以上步骤,您可以在Docker环境下高效地备份和恢复MySQL 8数据库。备份数据时,使用 `mysqldump`工具生成逻辑备份文件,并存储到指定目录;恢复数据时,使用 `mysql`工具从备份文件中读取数据并恢复到数据库。自动化脚本和定时任务的配置可以进一步简化备份和恢复的管理过程。
152 41
|
7月前
|
关系型数据库 MySQL Java
centos7安装mysql教程及Navicat平替软件
【8月更文挑战第17天】本教程详述CentOS 7上安装MySQL的过程。首先确保移除任何预装的MySQL组件,然后通过wget获取并安装MySQL的YUM源。可以选择安装特定版本如5.7或8.0。安装MySQL服务器后,启动服务并查找初始密码。登录MySQL后应立即更改密码,并可根据需要设置远程访问权限。此外,还推荐使用免费开源的DBeaver作为数据库管理工具,提供了安装步骤以方便管理和操作MySQL数据库。
236 3
|
3月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
238 26
|
4月前
|
关系型数据库 MySQL Java
Servlet+MySQL增删改查 原文出自[易百教程] 转载请保留原文链接: https://www.yiibai.com/geek/1391
对于任何项目开发,创建,读取,更新和删除(CRUD)记录操作是应用程序的一个最重要部分。
132 20
|
5月前
|
tengine 关系型数据库 MySQL
Tengine、Nginx安装MySQL数据库命令教程
本指南详细介绍了在Linux系统上安装与配置MySQL数据库的步骤。首先通过下载并安装MySQL社区版本,接着启动MySQL服务,使用`systemctl start mysqld.service`命令。若启动失败,可尝试使用`sudo /etc/init.d/mysqld start`。利用`systemctl status mysqld.service`检查MySQL的服务状态,确保其处于运行中。通过日志文件获取初始密码,使用该密码登录数据库,并按要求更改初始密码以增强安全性。随后创建一个名为`tengine`的数据库,最后验证数据库创建是否成功以及完成整个设置流程。
|
5月前
|
存储 SQL 关系型数据库
【入门级教程】MySQL:从零开始的数据库之旅
本教程面向零基础用户,采用通俗易懂的语言和丰富的示例,帮助你快速掌握MySQL的基础知识和操作技巧。内容涵盖SQL语言基础(SELECT、INSERT、UPDATE、DELETE等常用语句)、使用索引提高查询效率、存储过程等。适合学生、开发者及数据库爱好者。
160 0
【入门级教程】MySQL:从零开始的数据库之旅
|
7月前
|
SQL 关系型数据库 MySQL
在Linux中,mysql 数据备份工具有哪些?
在Linux中,mysql 数据备份工具有哪些?
|
7月前
|
SQL 关系型数据库 MySQL
PHP与MySQL交互之基础教程
【8月更文挑战第31天】 在数字世界中,数据是推动一切的核心力量。本文将引导你探索PHP与MySQL的协同工作,通过实际代码示例,展示如何建立连接、执行查询以及处理结果集。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你提供宝贵的实践知识。
|
8月前
|
关系型数据库 MySQL Linux
Docker安装mysql详细教程, mysqld: Can‘t read dir of ‘/etc/mysql/conf.d/‘(报错已解决)
Docker安装mysql详细教程, mysqld: Can't read dir of '/etc/mysql/conf.d/' (Errcode: 2 - No such file or directory) 已解决
|
7月前
|
关系型数据库 MySQL 网络安全
MySQL主从复制详细教程
配置MySQL的主从复制是一个细致的过程,需要仔细遵循上述步骤进行。一旦配置完成并运行正常,主从复制将大大提高数据库的可用性和读写性能。在操作过程中,务必保持谨慎,确保数据的一致性和安全性。
715 0