目录
- 1. 前言
- 2. 物理备份与逻辑备份
- 3. mysqldump实现逻辑备份
- 4. 逻辑恢复
1. 前言
- 最近在学黑马的《瑞吉外卖》,前期的基础版本一致在 Windows 电脑上开发,包括 MySQL 数据库也是安装在 Windows 电脑上。最近才学到优化篇,安装了 Linux 虚拟机作为服务器来模拟生产环境,所以想把项目的所有数据都迁移到 Linux 虚拟机上。
- 笔者在 Windows 和 Linux 上所用的 MySQL 版本均为 8.0.28 。
2. 物理备份与逻辑备份
- 物理备份:备份数据文件,转储数据库物理文件到某一目录。物理备份恢复速度比较快,但占用空间比较大,MySQL 中可以用
xtrabackup
工具来进行物理备份。 - 逻辑备份:对数据库对象利用工具进行导出工作,汇总入备份文件内。逻辑备份恢复速度慢,但占用空间小,更灵活。MySQL 中常用的逻辑备份工具为
mysqldump
。逻辑备份就是备份 SQL 语句,在恢复的时候执行备份的 SQL 语句实现数据库数据的重现。本篇博文就是用这种方式进行迁移。
3. mysqldump实现逻辑备份
-
mysqldump
是 MySQL 提供的一个非常有用的数据库备份工具。 -
比如说,我想把《瑞吉外卖》项目的数据库
reggie
备份,就适合这种情况: -
mysqldump 命令执行时,可以将数据库备份成一个文本文件,该文件中实际上包含多个
CREATE
和INSERT
语句,使用这些语句可以重新创建表和插入数据。其备份过程主要分成两步:- 查出需要备份的表的结构,在文本文件中生成一个
CREATE
语句; - 将表中的所有记录转换成一条
INSERT
语句。
- 查出需要备份的表的结构,在文本文件中生成一个
-
基本语法:
mysqldump -u 用户名称 -H 主机名称 -p密码 待备份的数据库名称[tbname, [tbname...]]> 备份文件名称.sql
【说明】
- 备份的文件并非一定要求后缀名为
.sql
,例如后缀名为.txt
的文件也是可以的。
-
举例:我在 Windows 系统下的 MySQL 使用 root 用户备份 reggie 数据库:
-
打开 Windows 的 cmd 命令行:
-- 备份文件存储在当前目录下 mysqldump -uroot -p你的MySQL密码 reggie>reggie.sql
-- 备份到具体的目录下 mysqldump -uroot -p你的MySQL密码 reggie > G:\MySQL-backup\reggie.sql
-
备份完成,在对应目录下可以看到 SQL 文件:
4. 逻辑恢复
-
使用
mysqldump
命令将数据库中的数据备份成一个文本文件 (xxx.sql
) 。需要恢复时,可以使用 MySQL 命令来恢复备份的数据。 -
MySQL 命令可以执行备份文件中的
CREATE
语句和INSERT
语句。通过CREATE
语句来创建数据库和表。通过INSERT
语句来插入备份的数据。 -
基本语法:
mysql -u root -p [dbname] < backup.sql
-
其中,
dbname
参数表示数据库名称。该参数是可选参数,可以指定数据库名,也可以不指定。指定数据库名时,表示还原该数据库下的表。此时需要确保 MySQL 服务器中已经创建了该名的数据库。不指定数据库名时,表示还原文件中所有的数据库。此时 SQL 文件中包含有CREATE
DATABASE
语句,不需要 MySQL 服务器中已存在这些数据库。
-
使用 root 用户,将之前举例中在 Windows 下备份的
reggie.sql
文件中的备份导入到 Linux 服务器上的 MySQL 数据库中。步骤如下: -
在 Linux 服务器上的
/var/lib/mysql
目录下创建文件夹backup
存放 MySQL 的备份文件:mkdir /var/lib/mysql/backup
-
然后把 Windows 上的
reggie.sql
文件上传至 Linux 服务器上的/var/lib/mysql/backup
目录下。 -
如果备份文件中包含了创建数据库的语句,则恢复的时候不需要指定数据库名称,如下所示:
mysql -uroot -p < reggie.sql
-
否则需要指定数据库名称,如下所示:
mysql -uroot -p reggie < reggie.sql
-
因此我们打开
reggie.sql
文件查看:发现没有包含创建数据库的语句,因此我们下一步是先进入 Linux 服务器上的 MySQL 数据库来创建对于的数据库。
-
在 Linux 命令行窗口中输入下面语句来进入 MySQL:
mysql -uroot -p你的密码
-
创建瑞吉外卖的数据库
reggie
:CREATE DATABASE IF NOT EXISTS reggie CHARACTER SET 'utf8';
-
查询所有的数据库:
SHOW DATABASES;
-
接着,我们退出 MySQL :
QUIT
-
进入
/var/lib/mysql/backup/
目录下:cd /var/lib/mysql/backup/
-
然后,我们就可以开始逻辑恢复数据库了:
mysql -uroot -p你的密码 reggie < reggie.sql
-
再次进入 MySQL :
mysql -uroot -p你的密码
-
进入
reggie
数据库:USE reggie;
-
查看
reggie
数据库中的数据表:SHOW tables;
-
随便查看一个数据库表:
SELECT * FROM user;
-
数据全部都对,说明
reggie
数据库中的所有数据都成功迁移到 Linux 服务器上了。