数据库原理与应用
1 / 6
引入

硬盘坏了,数据还找得回来吗?

引例 一个月的毕业设计

你花了一个月做毕业设计,文件都存在 D 盘。今天开机,D 盘坏了——一个月的心血一下子全没了。这时才后悔:当初为什么不复制一份到 U 盘或网盘?

数据库里存的是成绩、订单、账户余额,丢了更找不回来。所以要提前备份,出了事再用备份还原。

重点备份是存档,还原是读档。备份是基础,还原是目的。
备份

把数据库的数据复制一份保存起来,以防万一。例如导出成一个 .sql 文件,放到另一台电脑或网盘上。

还原

数据库出了事,用备份把数据恢复回来。也叫恢复。一般是把 .sql 文件重新导入 MySQL。

备份的两个原则:尽早、经常——越早开始越好,定期做;多地、多份——不要只放在数据库这一台机器上。

动手看一周之后,硬盘坏了
周一周二周三周四
数据库
0
条记录
备份
—
还没有备份
每天新增 200 条记录。点「开始这一周」。
1

备份的分类

引例 饭店大扫除

饭店做大扫除,可以关门停业彻底打扫;也可以照常营业但暂时不接新客;还可以边营业边打扫。打扫的范围也可以不同:每次全店都扫,或者只扫上次之后弄脏的地方。

备份数据库也一样,可以从三个角度来分。

重点按内容分:物理、逻辑。按是否停机分:冷、温、热。按范围分:完全、差异、增量。
按内容:备份的是什么
物理备份

直接复制数据库在硬盘上的文件。好比把 Word 文件本身拷走。

逻辑备份

导出成 SQL 语句:怎么建表、插入哪些数据。本章的 mysqldump 就是逻辑备份。

按是否停机:备份时数据库在不在工作
冷备份关掉数据库再备份。最稳妥,但要停止服务。
温备份数据库在运行,只能读,不能写。
热备份数据库照常读写,同时备份。技术要求最高。
按范围:每次备份多少
完全备份

每次备份全部数据。

差异备份

备份自上一次完全备份以来变化的部分。

增量备份

备份自上一次备份(不管哪种)以来变化的部分。

动手看周日完全备份,之后每天备份一次

易混差异备份以上一次完全备份为准,越往后越大,还原只要两个文件;增量备份以上一次备份为准,每次都小,还原要把每一份按顺序用上。

2

用 mysqldump 备份

引例 搬家前列一张清单

搬家前,把书架上每一格放了哪些书写成一张清单。到了新家,照着清单一本本摆回去,书架就和原来一模一样。

mysqldump 做的就是这张清单:把建表语句和每一行数据,写成一个 .sql 文本文件。

重点mysqldump -u 用户 -p 库名 [表名…] > 文件.sql,在系统命令行里执行,不是在 MySQL 里。
一条备份命令
mysqldump备份程序 -u root用户 -p要输口令 teaching库 s c表,不写=整个库 >写到 D:/db_backup/t.sql备份文件
几种特殊写法
想备份加上
几个库--databases 库1 库2
所有库--all-databases
只要表结构--no-data
在哪执行?看开头
命令行 cmd以 mysqldump、mysql、mysqlbinlog 开头的程序
Workbench以 SELECT、SHOW、CREATE 等开头的 SQL 语句
动手看想备份什么?
命令
生成的文件 
3

用 mysql 还原

引例 游戏读档

打 boss 失败了,从存档点重来。备份出来的 .sql 文件里全是 CREATE TABLE 和 INSERT 语句,把它们再执行一遍,表就重新建起来,数据也插回去了。

还原就是「读档」:让 mysql 程序把备份文件读进去执行。

重点mysql -u 用户 -p 库名 < 文件.sql。备份用 mysqldump 和 >,还原用 mysql 和 <。
备份和还原,只差两处
备份还原
程序mysqldumpmysql
符号><
方向数据库 → 文件文件 → 数据库
命令行 cmd 中执行
mysqldump -u root -p teaching > D:/db_backup/teaching.sql
mysql -u root -p teaching < D:/db_backup/teaching.sql

注意备份时没加 --databases,文件里就没有 CREATE DATABASE。还原前要先在 MySQL 里建好空库,否则报错 1049。

动手看删库之后,把它救回来
teaching 5 张表
先点 ① 制造一场事故,再按 ② ③ ④ 救回来。也可以故意跳过 ②,看看会怎样。
4

导入导出、数据库迁移

引例 把课程表发给别的部门

别的部门想要一份课程表,用 Excel 打开。可 .sql 备份文件只有 MySQL 认得。给别的程序用,就要导出成普通的文本文件:一行一条记录,字段之间用逗号隔开。

备份还原是 MySQL 自己用;导入导出是和外面交换数据。

重点导出:SELECT … INTO OUTFILE,表 → 文件。导入:LOAD DATA INFILE,文件 → 表。
Workbench 中执行
-- 导出:把 c 表写成文本文件
SELECT * FROM teaching.c
  INTO OUTFILE
  'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/c.txt'
  FIELDS TERMINATED BY ',';

-- 导入:把文本文件读进已经建好的表
LOAD DATA INFILE
  'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/c.txt'
  INTO TABLE teaching.c_copy
  FIELDS TERMINATED BY ',';

注意MySQL 只允许读写指定文件夹里的文件,用 SHOW VARIABLES LIKE 'secure_file_priv'; 查看是哪个。导出、导入的 FIELDS 写法要一致。

迁移:把数据库搬到别处
情况做法
同一版本,换服务器停掉 MySQL,复制整个数据目录,再启动
升级 MySQL 版本mysqldump 备份 → 装新版本 → mysql 还原
换成别的数据库系统数据类型、SQL 写法都不同,要借助专门工具

大多数时候,迁移就是「在旧服务器备份,到新服务器还原」。

动手看导出,再导入
字段之间用
表 c(前 4 行)
c1Java程序设计40
c2程序设计基础48
c3线性代数48
c4数据结构64
文本文件 c.txt
还没有导出
表 c_copy(结构和 c 一样,先建好)
空表
先「导出」,再「导入到 c_copy」。
5

日志:数据库的黑匣子

引例 飞机的黑匣子

飞机上的黑匣子记录着飞行中的重要事件,出了事故,靠它还原经过。MySQL 运行时也在不停地记录:出了什么错,改了哪些数据,执行了哪些语句,哪条语句跑得特别慢。

这些记录就是日志。四种日志,各记各的事。

重点错误日志、二进制日志默认开;通用查询日志、慢查询日志默认关。恢复数据靠二进制日志。
错误日志

启动、停止、运行出错的信息。默认开数据库启动不了、突然崩溃,先看它。

二进制日志

所有修改数据的操作。默认开和备份配合,能把数据恢复到某个时间点。最重要。

通用查询日志

所有操作,包括每一条 SELECT。默认关用来审计;数据量很大,平时不开。

慢查询日志

执行时间超过阈值(默认 10 秒)的语句。默认关用来找出拖慢系统的 SQL。

Workbench 中执行
-- 二进制日志开了没有,有哪些文件
SHOW VARIABLES LIKE 'log_bin';
SHOW BINARY LOGS;
-- 打开慢查询日志,超过 2 秒就算慢
SET GLOBAL slow_query_log = ON;
SET GLOBAL long_query_time = 2;
动手看遇到问题,查哪个日志?
点一个问题,日志列表里会标出该查的那一种。
动手看周三 10:00 误删了数据
周日 完全备份 周一 周二 周三 9:30 10:00 误删
只有周日的备份,周一到周三上午的修改怎么找回来?按 ①、② 的顺序点。